diff --git a/shell/ktexteditorpluginintegration.h b/shell/ktexteditorpluginintegration.h --- a/shell/ktexteditorpluginintegration.h +++ b/shell/ktexteditorpluginintegration.h @@ -30,6 +30,8 @@ #include +class QStackedLayout; + namespace KDevelop { class ObjectListTracker; class MainWindow; @@ -80,8 +82,10 @@ void splitView(Qt::Orientation orientation); QWidget *createViewBar(KTextEditor::View *view); - void deleteViewBar(KTextEditor::View *view); + void showViewBar(KTextEditor::View *view); + void hideViewBar(KTextEditor::View *view); + void addWidgetToViewBar(KTextEditor::View *view, QWidget *widget); public: KTextEditor::MainWindow *interface() const; @@ -93,6 +97,8 @@ KDevelop::MainWindow *m_mainWindow; KTextEditor::MainWindow *m_interface; QHash> m_pluginViews; + QStackedLayout *m_viewBarContainerLayout; + QHash m_viewBars; }; class Plugin : public KDevelop::IPlugin diff --git a/shell/ktexteditorpluginintegration.cpp b/shell/ktexteditorpluginintegration.cpp --- a/shell/ktexteditorpluginintegration.cpp +++ b/shell/ktexteditorpluginintegration.cpp @@ -22,6 +22,7 @@ #include #include +#include #include #include @@ -167,6 +168,27 @@ } } +class ViewBarStackedLayout : public QStackedLayout +{ + Q_OBJECT +public: + QSize sizeHint() const override + { + if (currentWidget()) { + return currentWidget()->sizeHint(); + } + return QStackedLayout::sizeHint(); + } + + QSize minimumSize() const override + { + if (currentWidget()) { + return currentWidget()->minimumSize(); + } + return QStackedLayout::minimumSize(); + } +}; + } namespace KTextEditorIntegration { @@ -208,14 +230,23 @@ : QObject(mainWindow) , m_mainWindow(mainWindow) , m_interface(new KTextEditor::MainWindow(this)) + , m_viewBarContainerLayout(new ViewBarStackedLayout) { + auto viewBarContainer = m_mainWindow->viewBarContainer(); + viewBarContainer->setLayout(m_viewBarContainerLayout); + connect(mainWindow, &Sublime::MainWindow::viewAdded, this, [this] (Sublime::View *view) { if (auto kteView = toKteView(view)) { emit m_interface->viewCreated(kteView); } }); connect(mainWindow, &Sublime::MainWindow::activeViewChanged, this, [this] (Sublime::View *view) { - emit m_interface->viewChanged(toKteView(view)); + auto kteView = toKteView(view); + emit m_interface->viewChanged(kteView); + + if (auto viewBar = m_viewBars.value(kteView)) { + m_viewBarContainerLayout->setCurrentWidget(viewBar); + } }); } @@ -266,17 +297,48 @@ return m_pluginViews.value(id); } -QWidget *MainWindow::createViewBar(KTextEditor::View* view) +QWidget *MainWindow::createViewBar(KTextEditor::View *view) { Q_UNUSED(view); - // TODO - return nullptr; + // we reuse the central view bar for every view + return m_mainWindow->viewBarContainer(); } -void MainWindow::deleteViewBar(KTextEditor::View* view) +void MainWindow::deleteViewBar(KTextEditor::View *view) { - Q_UNUSED(view); - // TODO + auto viewBar = m_viewBars.take(view); + if (viewBar == m_viewBarContainerLayout->currentWidget()) { + m_mainWindow->viewBarContainer()->hide(); + } + delete viewBar; +} + +void MainWindow::showViewBar(KTextEditor::View *view) +{ + auto viewBar = m_viewBars.value(view); + Q_ASSERT(viewBar); + m_viewBarContainerLayout->setCurrentWidget(viewBar); + viewBar->show(); + + m_mainWindow->viewBarContainer()->show(); +} + +void MainWindow::hideViewBar(KTextEditor::View *view) +{ + auto viewBar = m_viewBars.value(view); + Q_ASSERT(viewBar); + m_viewBarContainerLayout->setCurrentWidget(viewBar); + viewBar->hide(); + + m_mainWindow->viewBarContainer()->hide(); +} + +void MainWindow::addWidgetToViewBar(KTextEditor::View *view, QWidget *widget) +{ + Q_ASSERT(widget); + m_viewBars[view] = widget; + + m_viewBarContainerLayout->addWidget(widget); } KTextEditor::MainWindow *MainWindow::interface() const diff --git a/sublime/mainwindow.h b/sublime/mainwindow.h --- a/sublime/mainwindow.h +++ b/sublime/mainwindow.h @@ -106,6 +106,9 @@ */ void setBackgroundCentralWidget(QWidget* w); + /**Returns a widget that can hold a centralized view bar*/ + QWidget *viewBarContainer() const; + public Q_SLOTS: /**Shows the @p view and makes it active, focusing it by default).*/ void activateView(Sublime::View *view, bool focus = true); diff --git a/sublime/mainwindow.cpp b/sublime/mainwindow.cpp --- a/sublime/mainwindow.cpp +++ b/sublime/mainwindow.cpp @@ -387,6 +387,11 @@ return d->idealController->statusBarLocation(); } +QWidget *MainWindow::viewBarContainer() const +{ + return d->viewBarContainer; +} + void MainWindow::setTabBarLeftCornerWidget(QWidget* widget) { d->setTabBarLeftCornerWidget(widget); diff --git a/sublime/mainwindow_p.h b/sublime/mainwindow_p.h --- a/sublime/mainwindow_p.h +++ b/sublime/mainwindow_p.h @@ -102,6 +102,7 @@ QWidget *centralWidget; QWidget* bgCentralWidget; + QWidget* viewBarContainer; QSplitter* splitterCentralWidget; IdealController *idealController; diff --git a/sublime/mainwindow_p.cpp b/sublime/mainwindow_p.cpp --- a/sublime/mainwindow_p.cpp +++ b/sublime/mainwindow_p.cpp @@ -149,11 +149,26 @@ // this doesn't work well with toolbars added via xmlgui centralWidget = new QWidget; + centralWidget->setObjectName(QStringLiteral("centralWidget")); QVBoxLayout* layout = new QVBoxLayout(centralWidget); - centralWidget->setLayout(layout); layout->setMargin(0); + centralWidget->setLayout(layout); + splitterCentralWidget = new QSplitter(centralWidget); - layout->addWidget(splitterCentralWidget); + // take as much space as possible + splitterCentralWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + layout->addWidget(splitterCentralWidget, 2); + + // this view bar container is used for the ktexteditor integration to show + // all view bars at a central place, esp. for split view configurations + viewBarContainer = new QWidget; + viewBarContainer->setObjectName(QStringLiteral("viewBarContainer")); + // hide by default + viewBarContainer->setVisible(false); + // only take as much as needed + viewBarContainer->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); + layout->addWidget(viewBarContainer); + m_mainWindow->setCentralWidget(centralWidget); connect(idealController,