From 36bcbded54321d617951517232d18847cb07af51 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Tue, 19 May 2020 20:26:57 +0200 Subject: [PATCH] Fixed showing of dock area when inserting a dock widget into a hidden dock area fixed setting of DockAreaTabBar index to prevent showing of tab 0 when inserting a dock widget into an area with no current index tab --- examples/deleteonclose/deleteonclose.pro | 39 ++++++++++++++++++++++ examples/deleteonclose/main.cpp | 41 ++++++++++++++++++++++++ examples/examples.pro | 3 +- src/DockAreaTabBar.cpp | 8 +++-- src/DockAreaWidget.cpp | 8 ++++- src/DockWidgetTab.cpp | 2 +- 6 files changed, 96 insertions(+), 5 deletions(-) create mode 100644 examples/deleteonclose/deleteonclose.pro create mode 100644 examples/deleteonclose/main.cpp diff --git a/examples/deleteonclose/deleteonclose.pro b/examples/deleteonclose/deleteonclose.pro new file mode 100644 index 0000000..e2d2e69 --- /dev/null +++ b/examples/deleteonclose/deleteonclose.pro @@ -0,0 +1,39 @@ +ADS_OUT_ROOT = $${OUT_PWD}/../.. + +QT += core gui widgets + +TARGET = DeleteOnCloseTest +DESTDIR = $${ADS_OUT_ROOT}/lib +TEMPLATE = app +CONFIG += c++14 +CONFIG += debug_and_release +adsBuildStatic { + DEFINES += ADS_STATIC +} + +DEFINES += QT_DEPRECATED_WARNINGS + +SOURCES += main.cpp + + +LIBS += -L$${ADS_OUT_ROOT}/lib + +# Dependency: AdvancedDockingSystem (shared) +CONFIG(debug, debug|release){ + win32 { + LIBS += -lqtadvanceddockingd + } + else:mac { + LIBS += -lqtadvanceddocking_debug + } + else { + LIBS += -lqtadvanceddocking + } +} +else{ + LIBS += -lqtadvanceddocking +} + +INCLUDEPATH += ../../src +DEPENDPATH += ../../src + diff --git a/examples/deleteonclose/main.cpp b/examples/deleteonclose/main.cpp new file mode 100644 index 0000000..0d60fc1 --- /dev/null +++ b/examples/deleteonclose/main.cpp @@ -0,0 +1,41 @@ +#include +#include +#include +#include +#include +#include "DockManager.h" + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + QMainWindow w; + + auto dockManager = new ads::CDockManager(&w); + + QAction *action = new QAction("New Delete On Close", &w); + w.menuBar()->addAction(action); + + int i = 0; + QObject::connect(action, &QAction::triggered, [&]() { + auto dw = new ads::CDockWidget(QStringLiteral("test doc %1").arg(i++), &w); + auto editor = new QTextEdit(QStringLiteral("lorem ipsum..."), dw); + dw->setWidget(editor); + dw->setFeature(ads::CDockWidget::DockWidgetDeleteOnClose, true); + auto area = dockManager->addDockWidgetTab(ads::CenterDockWidgetArea, dw); + qDebug() << "doc dock widget created!" << dw << area; + }); + + action = new QAction("New", &w); + w.menuBar()->addAction(action); + QObject::connect(action, &QAction::triggered, [&]() { + auto dw = new ads::CDockWidget(QStringLiteral("test %1").arg(i++), &w); + auto editor = new QTextEdit(QStringLiteral("lorem ipsum..."), dw); + dw->setWidget(editor); + auto area = dockManager->addDockWidgetTab(ads::CenterDockWidgetArea, dw); + qDebug() << "dock widget created!" << dw << area; + }); + + w.show(); + + return a.exec(); +} diff --git a/examples/examples.pro b/examples/examples.pro index 418dd9d..68419c9 100644 --- a/examples/examples.pro +++ b/examples/examples.pro @@ -2,4 +2,5 @@ TEMPLATE = subdirs SUBDIRS = \ simple \ - sidebar + sidebar \ + deleteonclose diff --git a/src/DockAreaTabBar.cpp b/src/DockAreaTabBar.cpp index 53096b7..4e68727 100644 --- a/src/DockAreaTabBar.cpp +++ b/src/DockAreaTabBar.cpp @@ -205,10 +205,14 @@ void CDockAreaTabBar::insertTab(int Index, CDockWidgetTab* Tab) connect(Tab, SIGNAL(elidedChanged(bool)), this, SIGNAL(elidedChanged(bool))); Tab->installEventFilter(this); emit tabInserted(Index); - if (Index <= d->CurrentIndex || d->CurrentIndex == -1) + if (Index <= d->CurrentIndex) { setCurrentIndex(d->CurrentIndex + 1); - } + } + else if (d->CurrentIndex == -1) + { + setCurrentIndex(Index); + } updateGeometry(); } diff --git a/src/DockAreaWidget.cpp b/src/DockAreaWidget.cpp index a6e6f1f..3c3931c 100644 --- a/src/DockAreaWidget.cpp +++ b/src/DockAreaWidget.cpp @@ -429,6 +429,12 @@ void CDockAreaWidget::insertDockWidget(int index, CDockWidget* DockWidget, setCurrentIndex(index); } DockWidget->setDockArea(this); + // If this dock area is hidden, then we need to make it visible again + // by calling DockWidget->toggleViewInternal(true); + if (!this->isVisible() && d->ContentsLayout->count() > 1 && !dockManager()->isRestoringState()) + { + DockWidget->toggleViewInternal(true); + } d->updateTitleBarButtonStates(); } @@ -448,7 +454,7 @@ void CDockAreaWidget::removeDockWidget(CDockWidget* DockWidget) { setCurrentDockWidget(NextOpenDockWidget); } - else if (d->ContentsLayout->isEmpty() && DockContainer->dockAreaCount() > 1) + else if (d->ContentsLayout->isEmpty() && DockContainer->dockAreaCount() >= 1) { ADS_PRINT("Dock Area empty"); DockContainer->removeDockArea(this); diff --git a/src/DockWidgetTab.cpp b/src/DockWidgetTab.cpp index 2061997..6a33e3f 100644 --- a/src/DockWidgetTab.cpp +++ b/src/DockWidgetTab.cpp @@ -570,7 +570,7 @@ void CDockWidgetTab::mouseDoubleClickEvent(QMouseEvent *event) void CDockWidgetTab::setVisible(bool visible) { // Just here for debugging to insert debug output - Super::setVisible(visible); + Super::setVisible(visible); }