diff --git a/bin/app/data/color_schemes/bad_rainbow.xml b/bin/app/data/color_schemes/bad_rainbow.xml index 1375f3d3..9ae6aa10 100644 --- a/bin/app/data/color_schemes/bad_rainbow.xml +++ b/bin/app/data/color_schemes/bad_rainbow.xml @@ -100,17 +100,18 @@ #494949 #CCCCCC - #CCCCCC + #FFF - #CCCCCC + #AAAAAA + #999999 <text>black</text> <normal>#CCCCCC</normal> - <hover>#BBBBBB</hover> - <press>#AAAAAA</press> + <hover>#CCCCCC</hover> + <press>#CCCCCC</press> <icon>black</icon> <border>#B1B1B1</border> <hatching>grey</hatching> diff --git a/bin/app/data/color_schemes/bright.xml b/bin/app/data/color_schemes/bright.xml index 23afac14..c73d4ca1 100644 --- a/bin/app/data/color_schemes/bright.xml +++ b/bin/app/data/color_schemes/bright.xml @@ -105,6 +105,7 @@ <file> <background>#D0D0D0</background> + <hover>#D9D9D9</hover> <title> <text>black</text> diff --git a/bin/app/data/color_schemes/dark.xml b/bin/app/data/color_schemes/dark.xml index 08ba3907..984180c8 100644 --- a/bin/app/data/color_schemes/dark.xml +++ b/bin/app/data/color_schemes/dark.xml @@ -100,11 +100,12 @@ <navigation> <background>#272728</background> <text>#C5C5C5</text> - <line>#CCC</line> + <line>#999</line> </navigation> <file> <background>#5C5C5C</background> + <hover>#6C6C6C</hover> <title> <text>#F7F7F7</text> diff --git a/bin/app/data/gui/code_view/code_view.css b/bin/app/data/gui/code_view/code_view.css index 9400e2a2..ea577524 100644 --- a/bin/app/data/gui/code_view/code_view.css +++ b/bin/app/data/gui/code_view/code_view.css @@ -116,10 +116,9 @@ #code_file { background-color: <color:code/snippet/background>; - border: 2px solid <color:code/file/background>; - border-radius: 12px; + margin-bottom: 0px; + border-bottom: 1px solid <color:code/file/background>; /* last file only */ font-size: <setting:font_size>px; - padding-bottom: 7px; } #title_bar, #title_bar_single { @@ -128,9 +127,12 @@ border: none; } +#title_bar:hover { + background-color: <color:code/file/hover>; +} + #title_bar[hovering=false] { - border-top-left-radius: 7px; - border-top-right-radius: 7px; + border-top: 1px solid <color:code/navigation/line>; } #title_bar_single { @@ -143,13 +145,13 @@ } #title_button { - background-color: <color:code/file/title/normal>; + background-color: transparent; border: none; border-radius: 3px; color: <color:code/file/title/text>; font-size: <setting:font_size>px; padding: 2px 4px; - margin: 1px 8px; + margin: 1px 8px 1px 2px; } #title_bar_single #title_button { @@ -180,7 +182,7 @@ #code_file #code_snippet { background-color: <color:code/snippet/background>; - border-top: 2px solid <color:code/file/background>; + border-top: 1px solid <color:code/file/background>; font-size: <setting:font_size>px; } @@ -190,6 +192,7 @@ color: <color:code/snippet/title/text>; font-family: "<setting:font_name>"; font-size: <setting:font_size>px; + padding-bottom: 2px; } #code_file #code_snippet #scope_name:hover { @@ -222,6 +225,16 @@ selection-background-color: <color:code/snippet/selection/background>; } +#title_bar #expand_button, #title_bar_single #expand_button { + background: transparent; + border: none; + margin: 3px; + max-height: 16px; + max-width: 16px; + margin-left: 8px; + margin-right: 0px; +} + #title_bar #file_button, #title_bar_single #file_button { background: transparent; border: none; diff --git a/bin/app/data/gui/code_view/images/minimize_active.png b/bin/app/data/gui/code_view/images/minimize_active.png deleted file mode 100644 index f423fc42..00000000 Binary files a/bin/app/data/gui/code_view/images/minimize_active.png and /dev/null differ diff --git a/bin/app/data/gui/code_view/images/minimize_inactive.png b/bin/app/data/gui/code_view/images/minimize_inactive.png deleted file mode 100644 index 113d8aa5..00000000 Binary files a/bin/app/data/gui/code_view/images/minimize_inactive.png and /dev/null differ diff --git a/bin/app/data/gui/code_view/images/snippet_arrow_down.png b/bin/app/data/gui/code_view/images/snippet_arrow_down.png new file mode 100644 index 00000000..2f5c56c8 Binary files /dev/null and b/bin/app/data/gui/code_view/images/snippet_arrow_down.png differ diff --git a/bin/app/data/gui/code_view/images/snippet_arrow_right.png b/bin/app/data/gui/code_view/images/snippet_arrow_right.png new file mode 100644 index 00000000..f12ba7df Binary files /dev/null and b/bin/app/data/gui/code_view/images/snippet_arrow_right.png differ diff --git a/src/lib_gui/qt/element/QtCodeArea.cpp b/src/lib_gui/qt/element/QtCodeArea.cpp index a07bcea7..99d7bd04 100644 --- a/src/lib_gui/qt/element/QtCodeArea.cpp +++ b/src/lib_gui/qt/element/QtCodeArea.cpp @@ -131,13 +131,12 @@ QSize QtCodeArea::sizeHint() const width = std::max(rect.width(), width); } - int scrollHeight = 0; - if (horizontalScrollBar()->minimum() != horizontalScrollBar()->maximum()) + if (horizontalScrollBar()->minimum() != horizontalScrollBar()->maximum() && utility::getOsType() != OS_MAC) { - scrollHeight = horizontalScrollBar()->height(); + height += horizontalScrollBar()->height(); } - return QSize(width + lineNumberAreaWidth() + 1, height + scrollHeight + 5); + return QSize(width + lineNumberAreaWidth() + 1, height + 5); } void QtCodeArea::lineNumberAreaPaintEvent(QPaintEvent *event) diff --git a/src/lib_gui/qt/element/QtCodeFile.cpp b/src/lib_gui/qt/element/QtCodeFile.cpp index 318232fd..e8390d9c 100644 --- a/src/lib_gui/qt/element/QtCodeFile.cpp +++ b/src/lib_gui/qt/element/QtCodeFile.cpp @@ -9,7 +9,7 @@ #include "QtCodeNavigator.h" #include "QtCodeSnippet.h" -QtCodeFile::QtCodeFile(const FilePath& filePath, QtCodeNavigator* navigator) +QtCodeFile::QtCodeFile(const FilePath& filePath, QtCodeNavigator* navigator, bool isFirst) : QFrame() , m_navigator(navigator) , m_filePath(filePath) @@ -25,7 +25,7 @@ QtCodeFile::QtCodeFile(const FilePath& filePath, QtCodeNavigator* navigator) layout->setAlignment(Qt::AlignTop); setLayout(layout); - m_titleBar = new QtCodeFileTitleBar(); + m_titleBar = new QtCodeFileTitleBar(this, isFirst); layout->addWidget(m_titleBar); if (!m_filePath.empty()) @@ -331,8 +331,6 @@ void QtCodeFile::setMinimized() } m_titleBar->setMinimized(); - - setStyleSheet("#code_file { padding-bottom: 0; } #code_file #title_bar { border-radius: 7px; }"); } void QtCodeFile::setSnippets() @@ -343,8 +341,6 @@ void QtCodeFile::setSnippets() } m_titleBar->setSnippets(); - - setStyleSheet(""); } void QtCodeFile::setMaximized() diff --git a/src/lib_gui/qt/element/QtCodeFile.h b/src/lib_gui/qt/element/QtCodeFile.h index 8211d4d3..4d75fe47 100644 --- a/src/lib_gui/qt/element/QtCodeFile.h +++ b/src/lib_gui/qt/element/QtCodeFile.h @@ -25,7 +25,7 @@ class QtCodeFile Q_OBJECT public: - QtCodeFile(const FilePath& filePath, QtCodeNavigator* navigator); + QtCodeFile(const FilePath& filePath, QtCodeNavigator* navigator, bool isFirst); virtual ~QtCodeFile(); void setModificationTime(const TimeStamp modificationTime); diff --git a/src/lib_gui/qt/element/QtCodeFileList.cpp b/src/lib_gui/qt/element/QtCodeFileList.cpp index 83c7967e..80d7a5d3 100644 --- a/src/lib_gui/qt/element/QtCodeFileList.cpp +++ b/src/lib_gui/qt/element/QtCodeFileList.cpp @@ -32,8 +32,8 @@ QtCodeFileList::QtCodeFileList(QtCodeNavigator* navigator) m_filesArea->setObjectName("code_file_list"); QVBoxLayout* innerLayout = new QVBoxLayout(); - innerLayout->setSpacing(8); - innerLayout->setContentsMargins(8, 8, 8, 8); + innerLayout->setSpacing(0); + innerLayout->setContentsMargins(0, 0, 0, 0); innerLayout->setAlignment(Qt::AlignTop); m_filesArea->setLayout(innerLayout); @@ -105,7 +105,7 @@ QtCodeFile* QtCodeFileList::getFile(const FilePath filePath) if (!file) { - file = new QtCodeFile(filePath, m_navigator); + file = new QtCodeFile(filePath, m_navigator, !m_files.size()); m_files.push_back(file); m_filesArea->layout()->addWidget(file); @@ -236,9 +236,19 @@ void QtCodeFileList::updateFiles() { for (QtCodeFile* file : m_files) { + if (file != m_files.back()) + { + file->setStyleSheet("#code_file { border: none; }"); + } + file->updateContent(); } + if (m_files.size()) + { + m_files.back()->setStyleSheet(""); + } + // Perform delayed so all widgets are already visible QTimer::singleShot(100, this, &QtCodeFileList::updateSnippetTitleAndScrollBarSlot); } @@ -399,12 +409,12 @@ void QtCodeFileList::updateSnippetTitleAndScrollBar(int value) { QRect fileRect = getFocusRectForWidget(file, m_filesArea); - if (!firstFile && visibleRect.top() > fileRect.top() + 2 && - visibleRect.top() < fileRect.bottom() - 10 && + if (!firstFile && visibleRect.top() > fileRect.top() && + visibleRect.top() < fileRect.bottom() + 1 && file->getVisibleSnippets().size()) { firstFile = file; - fileTitleBarOffset = std::min(0, fileRect.bottom() - 10 - (visibleRect.top() + m_firstSnippetTitleBar->height())); + fileTitleBarOffset = std::min(0, fileRect.bottom() + 1 - (visibleRect.top() + m_firstSnippetTitleBar->height())); } if (visibleRect.bottom() > fileRect.top() && fileRect.bottom() > visibleRect.bottom()) diff --git a/src/lib_gui/qt/element/QtCodeFileTitleBar.cpp b/src/lib_gui/qt/element/QtCodeFileTitleBar.cpp index 5a95e01e..2b6f9004 100644 --- a/src/lib_gui/qt/element/QtCodeFileTitleBar.cpp +++ b/src/lib_gui/qt/element/QtCodeFileTitleBar.cpp @@ -17,8 +17,6 @@ QtCodeFileTitleBar::QtCodeFileTitleBar(QWidget* parent, bool isHovering, bool is if (!isSingle) { connect(this, &QPushButton::clicked, this, &QtCodeFileTitleBar::clickedTitleBar); - connect(this, &QtHoverButton::hoveredIn, this, &QtCodeFileTitleBar::enteredTitleBar); - connect(this, &QtHoverButton::hoveredOut, this, &QtCodeFileTitleBar::leftTitleBar); } QHBoxLayout* titleLayout = new QHBoxLayout(); @@ -27,6 +25,24 @@ QtCodeFileTitleBar::QtCodeFileTitleBar(QWidget* parent, bool isHovering, bool is titleLayout->setAlignment(Qt::AlignLeft); setLayout(titleLayout); + FilePath imageDir = ResourcePaths::getGuiPath().concatenate(L"code_view/images/"); + + m_expandButton = new QtSelfRefreshIconButton("", imageDir.getConcatenated(L"snippet_arrow_right.png"), "code/file/title", this); + m_collapseButton = new QtSelfRefreshIconButton("", imageDir.getConcatenated(L"snippet_arrow_down.png"), "code/file/title", this); + + m_expandButton->setToolTip("expand"); + m_collapseButton->setToolTip("collapse"); + + for (QtSelfRefreshIconButton* button : { m_expandButton, m_collapseButton }) + { + button->setIconSize(QSize(9, 9)); + button->setObjectName("expand_button"); + titleLayout->addWidget(button); + } + + connect(m_expandButton, &QtSelfRefreshIconButton::clicked, this, &QtCodeFileTitleBar::clickedExpandButton); + connect(m_collapseButton, &QtSelfRefreshIconButton::clicked, this, &QtCodeFileTitleBar::clickedCollapseButton); + m_titleButton = new QtCodeFileTitleButton(this); QSizePolicy policy = m_titleButton->sizePolicy(); policy.setRetainSizeWhenHidden(true); @@ -56,15 +72,8 @@ QtCodeFileTitleBar::QtCodeFileTitleBar(QWidget* parent, bool isHovering, bool is } ); - FilePath imageDir = ResourcePaths::getGuiPath().concatenate(L"code_view/images/"); QColor inactiveColor(0x5E, 0x5D, 0x5D); - m_minimizeButton = new QtIconStateButton(this); - m_minimizeButton->addState(QtIconStateButton::STATE_DEFAULT, imageDir.getConcatenated(L"minimize_active.png")); - m_minimizeButton->addState(QtIconStateButton::STATE_HOVERED, imageDir.getConcatenated(L"minimize_inactive.png"), inactiveColor); - m_minimizeButton->addState(QtIconStateButton::STATE_DISABLED, imageDir.getConcatenated(L"minimize_inactive.png")); - m_minimizeButton->setToolTip("minimize"); - m_snippetButton = new QtIconStateButton(this); m_snippetButton->addState(QtIconStateButton::STATE_DEFAULT, imageDir.getConcatenated(L"snippet_active.png")); m_snippetButton->addState(QtIconStateButton::STATE_HOVERED, imageDir.getConcatenated(L"snippet_inactive.png"), inactiveColor); @@ -77,31 +86,29 @@ QtCodeFileTitleBar::QtCodeFileTitleBar(QWidget* parent, bool isHovering, bool is m_maximizeButton->addState(QtIconStateButton::STATE_DISABLED, imageDir.getConcatenated(L"maximize_inactive.png")); m_maximizeButton->setToolTip("maximize"); - for (QtIconStateButton* button : { m_minimizeButton, m_snippetButton, m_maximizeButton }) + for (QtIconStateButton* button : { m_snippetButton, m_maximizeButton }) { button->setIconSize(QSize(16, 16)); button->setObjectName("file_button"); button->setEnabled(false); titleLayout->addWidget(button); - - if (!isSingle) - { - connect(button, &QtIconStateButton::hoveredIn, this, &QtCodeFileTitleBar::leftTitleBar); - connect(button, &QtIconStateButton::hoveredOut, this, &QtCodeFileTitleBar::enteredTitleBar); - } } - connect(m_minimizeButton, &QtIconStateButton::clicked, this, &QtCodeFileTitleBar::clickedMinimizeButton); connect(m_snippetButton, &QtIconStateButton::clicked, this, &QtCodeFileTitleBar::clickedSnippetButton); connect(m_maximizeButton, &QtIconStateButton::clicked, this, &QtCodeFileTitleBar::clickedMaximizeButton); if (isSingle) { - m_minimizeButton->hide(); + m_expandButton->hide(); + m_collapseButton->hide(); m_maximizeButton->hide(); } + else + { + m_snippetButton->hide(); + } - titleLayout->addSpacing(3); + titleLayout->addSpacing(5); } QtCodeFileTitleButton* QtCodeFileTitleBar::getTitleButton() const @@ -150,33 +157,33 @@ void QtCodeFileTitleBar::updateRefCount(int refCount, bool hasErrors, size_t fat void QtCodeFileTitleBar::setMinimized() { - m_minimizeButton->setEnabled(false); + m_expandButton->setVisible(true); + m_collapseButton->setVisible(false); m_snippetButton->setEnabled(true); m_maximizeButton->setEnabled(true); - m_minimizeButton->hoverOut(); m_snippetButton->hoverOut(); m_maximizeButton->hoverOut(); } void QtCodeFileTitleBar::setSnippets() { - m_minimizeButton->setEnabled(true); + m_expandButton->setVisible(false); + m_collapseButton->setVisible(true); m_snippetButton->setEnabled(false); m_maximizeButton->setEnabled(true); - m_minimizeButton->hoverOut(); m_snippetButton->hoverOut(); m_maximizeButton->hoverOut(); } void QtCodeFileTitleBar::setMaximized() { - m_minimizeButton->setEnabled(false); + m_expandButton->setVisible(false); + m_collapseButton->setVisible(false); m_snippetButton->setEnabled(true); m_maximizeButton->setEnabled(false); - m_minimizeButton->hoverOut(); m_snippetButton->hoverOut(); m_maximizeButton->hoverOut(); } @@ -197,28 +204,26 @@ void QtCodeFileTitleBar::updateFromOther(const QtCodeFileTitleBar* other) m_referenceCount->hide(); } - m_minimizeButton->setEnabled(other->m_minimizeButton->isEnabled()); + m_expandButton->setVisible(other->m_expandButton->isVisible()); + m_collapseButton->setVisible(other->m_collapseButton->isVisible()); m_snippetButton->setEnabled(other->m_snippetButton->isEnabled()); m_maximizeButton->setEnabled(other->m_maximizeButton->isEnabled()); - m_minimizeButton->hoverOut(); m_snippetButton->hoverOut(); m_maximizeButton->hoverOut(); disconnect(); connect(this, &QPushButton::clicked, this, &QtCodeFileTitleBar::clickedTitleBar); - connect(this, &QtHoverButton::hoveredIn, this, &QtCodeFileTitleBar::enteredTitleBar); - connect(this, &QtHoverButton::hoveredOut, this, &QtCodeFileTitleBar::leftTitleBar); } void QtCodeFileTitleBar::clickedTitleBar() { - if (m_minimizeButton->isEnabled()) + if (m_collapseButton->isVisible()) { emit minimize(); } - else if (m_snippetButton->isEnabled()) + else if (m_expandButton->isVisible()) { emit snippet(); } @@ -228,48 +233,12 @@ void QtCodeFileTitleBar::clickedTitleBar() } } -void QtCodeFileTitleBar::enteredTitleBar(QPushButton* button) +void QtCodeFileTitleBar::clickedExpandButton() { - if (m_minimizeButton->isEnabled()) - { - m_minimizeButton->hoverIn(); - } - else if (m_snippetButton->isEnabled()) - { - m_snippetButton->hoverIn(); - } - else if (m_maximizeButton->isEnabled()) - { - m_maximizeButton->hoverIn(); - } + emit snippet(); } -void QtCodeFileTitleBar::leftTitleBar(QPushButton* button) -{ - if (m_minimizeButton->isEnabled()) - { - if (m_minimizeButton != button) - { - m_minimizeButton->hoverOut(); - } - } - else if (m_snippetButton->isEnabled()) - { - if (m_snippetButton != button) - { - m_snippetButton->hoverOut(); - } - } - else if (m_maximizeButton->isEnabled()) - { - if (m_maximizeButton != button) - { - m_maximizeButton->hoverOut(); - } - } -} - -void QtCodeFileTitleBar::clickedMinimizeButton() +void QtCodeFileTitleBar::clickedCollapseButton() { emit minimize(); } diff --git a/src/lib_gui/qt/element/QtCodeFileTitleBar.h b/src/lib_gui/qt/element/QtCodeFileTitleBar.h index b1a7d31a..e75436e1 100644 --- a/src/lib_gui/qt/element/QtCodeFileTitleBar.h +++ b/src/lib_gui/qt/element/QtCodeFileTitleBar.h @@ -35,11 +35,8 @@ public: private slots: void clickedTitleBar(); - - void enteredTitleBar(QPushButton* button); - void leftTitleBar(QPushButton* button); - - void clickedMinimizeButton(); + void clickedExpandButton(); + void clickedCollapseButton(); void clickedSnippetButton(); void clickedMaximizeButton(); @@ -48,7 +45,9 @@ private: QPushButton* m_showErrorsButton; QLabel* m_referenceCount; - QtIconStateButton* m_minimizeButton; + QtSelfRefreshIconButton* m_expandButton; + QtSelfRefreshIconButton* m_collapseButton; + QtIconStateButton* m_snippetButton; QtIconStateButton* m_maximizeButton; };