diff --git a/examples/dockwidgets/main.cpp b/examples/dockwidgets/main.cpp index 130c9aac..f4a9c0d5 100644 --- a/examples/dockwidgets/main.cpp +++ b/examples/dockwidgets/main.cpp @@ -16,8 +16,6 @@ #include #include -#include "kddockwidgets/controllers/MainWindow.h" - #include #include #include @@ -334,8 +332,7 @@ int main(int argc, char **argv) false, false, restoreIsRelative, false, false, affinity); - dockableMainWindow->mainWindow()->setAffinities({ affinity }); // TODOm2: Add the MainWindow API to the views too - + dockableMainWindow->setAffinities({ affinity }); dockableMainWindow->setStyleSheet(QStringLiteral("background: yellow")); dockableMainWindow->setWindowTitle("Dockable Main Window"); diff --git a/examples/mdi_with_docking/main.cpp b/examples/mdi_with_docking/main.cpp index 04f73be0..7b47bd44 100644 --- a/examples/mdi_with_docking/main.cpp +++ b/examples/mdi_with_docking/main.cpp @@ -11,13 +11,10 @@ #include "MyWidget.h" -#include #include #include #include -#include "kddockwidgets/controllers/MainWindow.h" - #include #include #include @@ -66,10 +63,10 @@ int main(int argc, char **argv) dock2->setWidget(widget2); // # 3. Dock them - mainWindow.mainWindow()->addDockWidget(dock1->dockWidget(), KDDockWidgets::Location_OnLeft, - nullptr, KDDockWidgets::InitialOption(QSize(300, 0))); - mainWindow.mainWindow()->addDockWidget(dock2->dockWidget(), KDDockWidgets::Location_OnBottom, - nullptr, KDDockWidgets::InitialOption(QSize(0, 300))); + mainWindow.addDockWidget(dock1, KDDockWidgets::Location_OnLeft, + nullptr, KDDockWidgets::InitialOption(QSize(300, 0))); + mainWindow.addDockWidget(dock2, KDDockWidgets::Location_OnBottom, + nullptr, KDDockWidgets::InitialOption(QSize(0, 300))); KDDockWidgets::Controllers::DockWidget::Options options = {}; if (parser.isSet(nestedDocking)) { @@ -89,10 +86,9 @@ int main(int argc, char **argv) auto mdiArea = new KDDockWidgets::MDIArea(); mainWindow.setPersistentCentralWidget(mdiArea); - mdiArea->addDockWidget(mdiWidget1->dockWidget(), QPoint(10, 10)); - mdiArea->addDockWidget(mdiWidget2->dockWidget(), QPoint(50, 50)); - mdiArea->addDockWidget(mdiWidget3->dockWidget(), QPoint(110, 110)); - + mdiArea->addDockWidget(mdiWidget1, QPoint(10, 10)); + mdiArea->addDockWidget(mdiWidget2, QPoint(50, 50)); + mdiArea->addDockWidget(mdiWidget3, QPoint(110, 110)); return app.exec(); } diff --git a/examples/minimal/main.cpp b/examples/minimal/main.cpp index 7469fec0..d846911f 100644 --- a/examples/minimal/main.cpp +++ b/examples/minimal/main.cpp @@ -11,12 +11,10 @@ #include "MyWidget.h" -#include +#include // TODOm2 #include #include -#include "kddockwidgets/controllers/MainWindow.h" - #include #include @@ -72,16 +70,16 @@ int main(int argc, char **argv) dock5->setWidget(widget5); // 3. Add them to the main window - mainWindow.mainWindow()->addDockWidget(dock1->dockWidget(), KDDockWidgets::Location_OnLeft); - mainWindow.mainWindow()->addDockWidget(dock2->dockWidget(), KDDockWidgets::Location_OnTop); + mainWindow.addDockWidget(dock1, KDDockWidgets::Location_OnLeft); + mainWindow.addDockWidget(dock2, KDDockWidgets::Location_OnTop); // 4. Add dock3 to the right of dock2 - mainWindow.mainWindow()->addDockWidget(dock3->dockWidget(), KDDockWidgets::Location_OnRight, dock2->dockWidget()); + mainWindow.addDockWidget(dock3, KDDockWidgets::Location_OnRight, dock2); // 5. dock4 is docked at the bottom, with 200px height const QSize preferredSize(QSize(/*ignored*/ 0, 200)); - mainWindow.mainWindow()->addDockWidget(dock4->dockWidget(), KDDockWidgets::Location_OnBottom, - nullptr, preferredSize); + mainWindow.addDockWidget(dock4, KDDockWidgets::Location_OnBottom, + nullptr, preferredSize); // 5. dock5 will be its own top level (floating window) diff --git a/examples/qtquick/customtitlebar/main.cpp b/examples/qtquick/customtitlebar/main.cpp index dbb8df2c..f3be0e48 100644 --- a/examples/qtquick/customtitlebar/main.cpp +++ b/examples/qtquick/customtitlebar/main.cpp @@ -65,7 +65,7 @@ int main(int argc, char *argv[]) auto dw3 = new KDDockWidgets::Views::DockWidget_qtquick("Dock #3"); dw3->setGuestItem(QStringLiteral("qrc:/Guest3.qml")); - dw1->dockWidget()->addDockWidgetToContainingWindow(dw3->dockWidget(), KDDockWidgets::Location_OnRight); + dw1->addDockWidgetToContainingWindow(dw3, KDDockWidgets::Location_OnRight); // Access the main area we created in QML with DockingArea {} auto mainArea = KDDockWidgets::DockRegistry::self()->mainDockingAreas().constFirst(); diff --git a/examples/qtquick/dockwidgets/main.cpp b/examples/qtquick/dockwidgets/main.cpp index 044b478a..c3552a54 100644 --- a/examples/qtquick/dockwidgets/main.cpp +++ b/examples/qtquick/dockwidgets/main.cpp @@ -106,11 +106,11 @@ int main(int argc, char *argv[]) auto dw3 = new KDDockWidgets::Views::DockWidget_qtquick("Dock #3"); dw3->setGuestItem(QStringLiteral("qrc:/Guest3.qml")); - dw1->dockWidget()->addDockWidgetToContainingWindow(dw3->dockWidget(), KDDockWidgets::Location_OnRight); + dw1->addDockWidgetToContainingWindow(dw3, KDDockWidgets::Location_OnRight); // Access the main area we created in QML with DockingArea {} auto mainArea = KDDockWidgets::DockRegistry::self()->mainDockingAreas().constFirst(); - mainArea->addDockWidget(dw2->dockWidget(), KDDockWidgets::Location_OnTop); + mainArea->addDockWidget(dw2->dockWidget(), KDDockWidgets::Location_OnTop); // TODOm3: Don't require the ctrl return app.exec(); } diff --git a/src/controllers/DockWidget.h b/src/controllers/DockWidget.h index 4ae7709c..f48a0682 100644 --- a/src/controllers/DockWidget.h +++ b/src/controllers/DockWidget.h @@ -121,8 +121,8 @@ public: * shown. * @sa MainWindow::addDockWidget(), DockWidget::addDockWidgetToContainingWindow() */ - Q_INVOKABLE void addDockWidgetAsTab(KDDockWidgets::Controllers::DockWidget *other, - KDDockWidgets::InitialOption initialOption = {}); + void addDockWidgetAsTab(KDDockWidgets::Controllers::DockWidget *other, + KDDockWidgets::InitialOption initialOption = {}); /** * @brief docks @p other widget into the window that contains this one. @@ -136,7 +136,7 @@ public: * @param initialOption Allows to specify some extra options that are used while docking. * @sa MainWindow::addDockWidget(), DockWidget::addDockWidgetAsTab() */ - Q_INVOKABLE void + void addDockWidgetToContainingWindow(KDDockWidgets::Controllers::DockWidget *other, KDDockWidgets::Location location, KDDockWidgets::Controllers::DockWidget *relativeTo = nullptr, diff --git a/src/qtwidgets/MDIArea.cpp b/src/qtwidgets/MDIArea.cpp index a3e2ab1c..72be691e 100644 --- a/src/qtwidgets/MDIArea.cpp +++ b/src/qtwidgets/MDIArea.cpp @@ -12,6 +12,7 @@ #include "MDIArea.h" #include "kddockwidgets/ViewFactory.h" +#include "kddockwidgets/views/DockWidgetViewInterface.h" #include "kddockwidgets/controllers/DockWidget.h" #include "kddockwidgets/controllers/MDILayout.h" #include "kddockwidgets/controllers/DropArea.h" @@ -82,6 +83,24 @@ void MDIArea::resizeDockWidget(Controllers::DockWidget *dw, QSize size) d->layout->resizeDockWidget(dw, size); } +void MDIArea::addDockWidget(Views::DockWidgetViewInterface *dwView, QPoint localPt, InitialOption addingOption) +{ + auto dw = dwView ? dwView->dockWidget() : nullptr; + addDockWidget(dw, localPt, addingOption); +} + +void MDIArea::moveDockWidget(Views::DockWidgetViewInterface *dwView, QPoint pos) +{ + auto dw = dwView ? dwView->dockWidget() : nullptr; + moveDockWidget(dw, pos); +} + +void MDIArea::resizeDockWidget(Views::DockWidgetViewInterface *dwView, QSize size) +{ + auto dw = dwView ? dwView->dockWidget() : nullptr; + resizeDockWidget(dw, size); +} + QList MDIArea::frames() const { return d->layout->frames(); diff --git a/src/qtwidgets/MDIArea.h b/src/qtwidgets/MDIArea.h index fa19ddfa..721fdace 100644 --- a/src/qtwidgets/MDIArea.h +++ b/src/qtwidgets/MDIArea.h @@ -24,6 +24,9 @@ class DockWidget; class MDILayout; } +namespace Views { +class DockWidgetViewInterface; +} /** * @brief MDIArea allows to host dock widget in MDI mode. * This is an alternative to using a full blown MainWindowMDI. @@ -49,6 +52,11 @@ public: /// @brief Sets the size of dock widget @p dw to @p size void resizeDockWidget(Controllers::DockWidget *dw, QSize size); + /// @brief overloads + void addDockWidget(Views::DockWidgetViewInterface *, QPoint localPt, InitialOption addingOption = {}); + void moveDockWidget(Views::DockWidgetViewInterface *, QPoint pos); + void resizeDockWidget(Views::DockWidgetViewInterface *, QSize size); + /// @brief Returns the list of frames in this MDI Area /// Each Frame object represents a 'window' emebedded in the MDI Area QList frames() const; diff --git a/src/qtwidgets/views/MainWindow_qtwidgets.h b/src/qtwidgets/views/MainWindow_qtwidgets.h index 3031eef3..0acbe390 100644 --- a/src/qtwidgets/views/MainWindow_qtwidgets.h +++ b/src/qtwidgets/views/MainWindow_qtwidgets.h @@ -41,6 +41,8 @@ class DOCKS_EXPORT MainWindow_qtwidgets : public View_qtwidgets, pu { Q_OBJECT public: + using MainWindowViewInterface::addDockWidget; // don't consider QMainWindow's one + ///@brief Constructor. Use it as you would use QMainWindow. ///@param uniqueName Mandatory name that should be unique between all MainWindow instances. /// This name won't be user visible and just used internally for the save/restore. diff --git a/src/views/DockWidgetViewInterface.cpp b/src/views/DockWidgetViewInterface.cpp index 534f15e5..ae1dc7f9 100644 --- a/src/views/DockWidgetViewInterface.cpp +++ b/src/views/DockWidgetViewInterface.cpp @@ -109,4 +109,21 @@ void DockWidgetViewInterface::moveToSideBar() m_dockWidget->moveToSideBar(); } +void DockWidgetViewInterface::addDockWidgetAsTab(DockWidgetViewInterface *other, + KDDockWidgets::InitialOption initialOption) +{ + Controllers::DockWidget *dw = other ? other->dockWidget() : nullptr; + m_dockWidget->addDockWidgetAsTab(dw, initialOption); +} + +void DockWidgetViewInterface::addDockWidgetToContainingWindow(DockWidgetViewInterface *other, + KDDockWidgets::Location location, + DockWidgetViewInterface *relativeTo, + KDDockWidgets::InitialOption initialOption) +{ + Controllers::DockWidget *dw = other ? other->dockWidget() : nullptr; + Controllers::DockWidget *relativeToDw = relativeTo ? relativeTo->dockWidget() : nullptr; + m_dockWidget->addDockWidgetToContainingWindow(dw, location, relativeToDw, initialOption); +} + } // namespace diff --git a/src/views/DockWidgetViewInterface.h b/src/views/DockWidgetViewInterface.h index 282ef678..407f436c 100644 --- a/src/views/DockWidgetViewInterface.h +++ b/src/views/DockWidgetViewInterface.h @@ -49,6 +49,15 @@ public: void raise(); void moveToSideBar(); + void addDockWidgetAsTab(DockWidgetViewInterface *other, + KDDockWidgets::InitialOption initialOption = {}); + + void + addDockWidgetToContainingWindow(DockWidgetViewInterface *other, + KDDockWidgets::Location location, + DockWidgetViewInterface *relativeTo = nullptr, + KDDockWidgets::InitialOption initialOption = {}); + protected: Controllers::DockWidget *const m_dockWidget; }; diff --git a/src/views/MainWindowViewInterface.cpp b/src/views/MainWindowViewInterface.cpp index 96bcf8d7..27ba1163 100644 --- a/src/views/MainWindowViewInterface.cpp +++ b/src/views/MainWindowViewInterface.cpp @@ -10,6 +10,7 @@ */ #include "MainWindowViewInterface.h" +#include "DockWidgetViewInterface.h" #include "kddockwidgets/controllers/MainWindow.h" namespace KDDockWidgets::Views { @@ -76,9 +77,61 @@ void MainWindowViewInterface::layoutEqually() m_mainWindow->layoutEqually(); } +void MainWindowViewInterface::addDockWidgetAsTab(DockWidgetViewInterface *dockView) +{ + auto dw = dockView ? dockView->dockWidget() : nullptr; + m_mainWindow->addDockWidgetAsTab(dw); +} + +void MainWindowViewInterface::addDockWidget(DockWidgetViewInterface *dockView, + KDDockWidgets::Location location, + DockWidgetViewInterface *relativeToDockView, + KDDockWidgets::InitialOption initialOption) +{ + auto dw = dockView ? dockView->dockWidget() : nullptr; + auto relativeTo = relativeToDockView ? relativeToDockView->dockWidget() : nullptr; + m_mainWindow->addDockWidget(dw, location, relativeTo, initialOption); +} + bool MainWindowViewInterface::anySideBarIsVisible() const { return m_mainWindow->anySideBarIsVisible(); } +void MainWindowViewInterface::moveToSideBar(DockWidgetViewInterface *dockView) +{ + auto dw = dockView ? dockView->dockWidget() : nullptr; + m_mainWindow->moveToSideBar(dw); +} + +void MainWindowViewInterface::moveToSideBar(DockWidgetViewInterface *dockView, KDDockWidgets::SideBarLocation loc) +{ + auto dw = dockView ? dockView->dockWidget() : nullptr; + m_mainWindow->moveToSideBar(dw, loc); +} + +void MainWindowViewInterface::restoreFromSideBar(DockWidgetViewInterface *dockView) +{ + auto dw = dockView ? dockView->dockWidget() : nullptr; + m_mainWindow->restoreFromSideBar(dw); +} + +void MainWindowViewInterface::overlayOnSideBar(DockWidgetViewInterface *dockView) +{ + auto dw = dockView ? dockView->dockWidget() : nullptr; + m_mainWindow->overlayOnSideBar(dw); +} + +void MainWindowViewInterface::toggleOverlayOnSideBar(DockWidgetViewInterface *dockView) +{ + auto dw = dockView ? dockView->dockWidget() : nullptr; + m_mainWindow->toggleOverlayOnSideBar(dw); +} + +void MainWindowViewInterface::layoutParentContainerEqually(DockWidgetViewInterface *dockView) +{ + auto dw = dockView ? dockView->dockWidget() : nullptr; + m_mainWindow->layoutParentContainerEqually(dw); +} + } diff --git a/src/views/MainWindowViewInterface.h b/src/views/MainWindowViewInterface.h index 2af91690..67ffdc8a 100644 --- a/src/views/MainWindowViewInterface.h +++ b/src/views/MainWindowViewInterface.h @@ -26,6 +26,8 @@ class MainWindow; namespace Views { +class DockWidgetViewInterface; + /// @brief The interface that MainWindow views should implement class DOCKS_EXPORT MainWindowViewInterface { @@ -54,6 +56,19 @@ public: Q_INVOKABLE void layoutEqually(); Q_INVOKABLE bool anySideBarIsVisible() const; + void addDockWidgetAsTab(DockWidgetViewInterface *dockwidget); + void addDockWidget(DockWidgetViewInterface *dockWidget, + KDDockWidgets::Location location, + DockWidgetViewInterface *relativeTo = nullptr, + KDDockWidgets::InitialOption initialOption = {}); + + void moveToSideBar(DockWidgetViewInterface *); + void moveToSideBar(DockWidgetViewInterface *, KDDockWidgets::SideBarLocation); + void restoreFromSideBar(DockWidgetViewInterface *); + void overlayOnSideBar(DockWidgetViewInterface *); + void toggleOverlayOnSideBar(DockWidgetViewInterface *); + void layoutParentContainerEqually(DockWidgetViewInterface *); + protected: void init(const QString &name); Controllers::MainWindow *const m_mainWindow;