diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/coreplugin/editormanager/editormanager.cpp | 64 | ||||
-rw-r--r-- | src/plugins/coreplugin/editormanager/editormanager_p.h | 3 | ||||
-rw-r--r-- | src/plugins/coreplugin/editormanager/editorview.cpp | 32 |
3 files changed, 73 insertions, 26 deletions
diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 9041d2bd4a..95eb0def6c 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -1724,6 +1724,8 @@ void EditorManagerPrivate::setCurrentEditor(IEditor *editor, bool ignoreNavigati updateActions(); + if (QTC_GUARD(!d->m_currentView.isEmpty()) && d->m_currentView.constFirst() != previousView) + emit d->currentViewChanged(); if (d->m_currentEditor != previousEditor) emit m_instance->currentEditorChanged(d->m_currentEditor); } @@ -1742,6 +1744,8 @@ void EditorManagerPrivate::setCurrentView(EditorView *view) previousView->update(); if (d->m_currentView.constFirst()) view->update(); + + emit d->currentViewChanged(); } setCurrentEditor(view->currentEditor()); @@ -1869,6 +1873,8 @@ void EditorManagerPrivate::addEditorArea(EditorArea *area) // If we didn't find a better view, so be it }, Qt::QueuedConnection); + connect(area, &SplitterOrView::splitStateChanged, d, &EditorManagerPrivate::viewCountChanged); + emit d->viewCountChanged(); } void EditorManagerPrivate::splitNewWindow(EditorView *view) @@ -2280,31 +2286,33 @@ void EditorManagerPrivate::editorAreaDestroyed(QObject *area) } } // check if the destroyed editor area had the current view or current editor - if (currentEditorView()) - return; - // we need to set a new current editor or view - if (!newActiveArea) { - // some window managers behave weird and don't activate another window - // or there might be a Qt Creator toplevel activated that doesn't have editor windows - newActiveArea = d->m_editorAreas.first(); - } - - // check if the focusWidget points to some view - SplitterOrView *focusSplitterOrView = nullptr; - QWidget *candidate = newActiveArea->focusWidget(); - while (candidate && candidate != newActiveArea) { - if ((focusSplitterOrView = qobject_cast<SplitterOrView *>(candidate))) - break; - candidate = candidate->parentWidget(); + if (!currentEditorView()) { + // we need to set a new current editor or view + if (!newActiveArea) { + // some window managers behave weird and don't activate another window + // or there might be a Qt Creator toplevel activated that doesn't have editor windows + newActiveArea = d->m_editorAreas.first(); + } + + // check if the focusWidget points to some view + SplitterOrView *focusSplitterOrView = nullptr; + QWidget *candidate = newActiveArea->focusWidget(); + while (candidate && candidate != newActiveArea) { + if ((focusSplitterOrView = qobject_cast<SplitterOrView *>(candidate))) + break; + candidate = candidate->parentWidget(); + } + // focusWidget might have been 0 + if (!focusSplitterOrView) + focusSplitterOrView = newActiveArea->findFirstView()->parentSplitterOrView(); + QTC_ASSERT(focusSplitterOrView, focusSplitterOrView = newActiveArea); + EditorView *focusView + = focusSplitterOrView->findFirstView(); // can be just focusSplitterOrView + QTC_ASSERT(focusView, focusView = newActiveArea->findFirstView()); + if (QTC_GUARD(focusView)) + EditorManagerPrivate::activateView(focusView); } - // focusWidget might have been 0 - if (!focusSplitterOrView) - focusSplitterOrView = newActiveArea->findFirstView()->parentSplitterOrView(); - QTC_ASSERT(focusSplitterOrView, focusSplitterOrView = newActiveArea); - EditorView *focusView = focusSplitterOrView->findFirstView(); // can be just focusSplitterOrView - QTC_ASSERT(focusView, focusView = newActiveArea->findFirstView()); - QTC_ASSERT(focusView, return); - EditorManagerPrivate::activateView(focusView); + emit viewCountChanged(); } void EditorManagerPrivate::autoSave() @@ -2665,6 +2673,14 @@ QList<EditorView *> EditorManagerPrivate::allEditorViews() return views; } +bool EditorManagerPrivate::hasMoreThanOneview() +{ + if (d->m_editorAreas.size() > 1) + return true; + QTC_ASSERT(d->m_editorAreas.size() > 0, return false); + return d->m_editorAreas.constFirst()->isSplitter(); +} + /*! Returns the pointer to the instance. Only use for connecting to signals. */ diff --git a/src/plugins/coreplugin/editormanager/editormanager_p.h b/src/plugins/coreplugin/editormanager/editormanager_p.h index 789acd16e1..db5bf759ae 100644 --- a/src/plugins/coreplugin/editormanager/editormanager_p.h +++ b/src/plugins/coreplugin/editormanager/editormanager_p.h @@ -61,6 +61,7 @@ public: static EditorArea *mainEditorArea(); static EditorView *currentEditorView(); static QList<EditorView *> allEditorViews(); + static bool hasMoreThanOneview(); static void setCurrentEditor(IEditor *editor, bool ignoreNavigationHistory = false); static IEditor *openEditor(EditorView *view, const Utils::FilePath &filePath, @@ -137,6 +138,8 @@ public slots: signals: void placeholderTextChanged(const QString &text); + void currentViewChanged(); + void viewCountChanged(); private: static void gotoNextDocHistory(); diff --git a/src/plugins/coreplugin/editormanager/editorview.cpp b/src/plugins/coreplugin/editormanager/editorview.cpp index 6aa20510cb..ae9c047a77 100644 --- a/src/plugins/coreplugin/editormanager/editorview.cpp +++ b/src/plugins/coreplugin/editormanager/editorview.cpp @@ -14,10 +14,11 @@ #include <utils/algorithm.h> #include <utils/infobar.h> -#include <utils/qtcassert.h> -#include <utils/theme/theme.h> #include <utils/layoutbuilder.h> #include <utils/link.h> +#include <utils/overlaywidget.h> +#include <utils/qtcassert.h> +#include <utils/theme/theme.h> #include <utils/utilsicons.h> #include <QFileInfo> @@ -125,6 +126,33 @@ EditorView::EditorView(SplitterOrView *parentSplitterOrView, QWidget *parent) : this, &EditorView::openDroppedFiles); updateNavigatorActions(); + + auto currentViewOverlay = new OverlayWidget; + currentViewOverlay->attachToWidget(this); + currentViewOverlay->setPaintFunction([this](QWidget *w, QPainter &p, QPaintEvent *) { + const int width = 2; + const QPoint margin{0, width}; + p.setPen({w->palette().color(QPalette::Highlight), width}); + p.drawLine( + m_toolBar->geometry().bottomLeft() + margin, + m_toolBar->geometry().bottomRight() + margin); + }); + currentViewOverlay->setVisible(false); + const auto updateCurrentViewOverlay = [this, currentViewOverlay] { + currentViewOverlay->setVisible( + EditorManagerPrivate::hasMoreThanOneview() + && EditorManagerPrivate::currentEditorView() == this); + }; + connect( + EditorManagerPrivate::instance(), + &EditorManagerPrivate::currentViewChanged, + currentViewOverlay, + updateCurrentViewOverlay); + connect( + EditorManagerPrivate::instance(), + &EditorManagerPrivate::viewCountChanged, + currentViewOverlay, + updateCurrentViewOverlay); } EditorView::~EditorView() = default; |