diff --git a/examples/autohide/mainwindow.cpp b/examples/autohide/mainwindow.cpp index 9669268..42dc49c 100644 --- a/examples/autohide/mainwindow.cpp +++ b/examples/autohide/mainwindow.cpp @@ -12,6 +12,7 @@ #include #include +#include "AutoHideDockContainer.h" #include "DockAreaWidget.h" #include "DockAreaTitleBar.h" @@ -44,10 +45,9 @@ CMainWindow::CMainWindow(QWidget *parent) CDockWidget* TableDockWidget = new CDockWidget("Table 1"); TableDockWidget->setWidget(table); TableDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget); - TableDockWidget->resize(250, 150); TableDockWidget->setMinimumSize(200,150); - TableDockWidget->setDefaultAutoHideDockProportion(0.5); - DockManager->addAutoHideDockWidget(SideBarLocation::Left, TableDockWidget, CDockWidget::Last); + const auto autoHideContainer = DockManager->addAutoHideDockWidget(SideBarLocation::Left, TableDockWidget, CDockWidget::Last); + autoHideContainer->setSize(480, 100); ui->menuView->addAction(TableDockWidget->toggleViewAction()); table = new QTableWidget(); diff --git a/src/AutoHideDockContainer.cpp b/src/AutoHideDockContainer.cpp index aa183ca..954f2a5 100644 --- a/src/AutoHideDockContainer.cpp +++ b/src/AutoHideDockContainer.cpp @@ -47,7 +47,7 @@ namespace ads { -static const int ResizeMargin = 4; +static const int ResizeMargin = 30; //============================================================================ bool static isHorizontalArea(SideBarLocation Area) @@ -136,8 +136,9 @@ struct AutoHideDockContainerPrivate void updateResizeHandleSizeLimitMax() { auto Rect = _this->parentContainer()->contentRect(); - ResizeHandle->setMaxResizeSize(ResizeHandle->orientation() == Qt::Horizontal - ? Rect.width() : Rect.height()); + const auto maxResizeHandleSize = ResizeHandle->orientation() == Qt::Horizontal + ? Rect.width() : Rect.height(); + ResizeHandle->setMaxResizeSize(maxResizeHandleSize - ResizeMargin); } /** @@ -216,18 +217,18 @@ void CAutoHideDockContainer::updateSize() switch (sideTabBarArea()) { case SideBarLocation::Top: - resize(rect.width(), qMin(rect.height(), d->Size.height())); + resize(rect.width(), qMin(rect.height(), d->Size.height() - ResizeMargin)); move(rect.topLeft()); break; case SideBarLocation::Left: - resize(qMin(d->Size.width(), rect.width()), rect.height()); + resize(qMin(d->Size.width(), rect.width() - ResizeMargin), rect.height()); move(rect.topLeft()); break; case SideBarLocation::Right: { - resize(qMin(d->Size.width(), rect.width()), rect.height()); + resize(qMin(d->Size.width(), rect.width() - ResizeMargin), rect.height()); QPoint p = rect.topRight(); p.rx() -= (width() - 1); move(p); @@ -236,7 +237,7 @@ void CAutoHideDockContainer::updateSize() case SideBarLocation::Bottom: { - resize(rect.width(), qMin(rect.height(), d->Size.height())); + resize(rect.width(), qMin(rect.height(), d->Size.height() - ResizeMargin)); QPoint p = rect.bottomLeft(); p.ry() -= (height() - 1); move(p); @@ -293,7 +294,7 @@ void CAutoHideDockContainer::addDockWidget(CDockWidget* DockWidget) // Prevent overriding of d->Size parameter when this function is called during // state restoring - if (!DockWidget->dockManager()->isRestoringState()) + if (!DockWidget->dockManager()->isRestoringState() && OldDockArea) { // The initial size should be a little bit bigger than the original dock // area size to prevent that the resize handle of this auto hid dock area @@ -321,7 +322,7 @@ CDockAreaWidget* CAutoHideDockContainer::dockAreaWidget() const void CAutoHideDockContainer::moveContentsToParent() { cleanupAndDelete(); - // If we unpin the auto hide tock widget, then we insert it into the same + // If we unpin the auto hide dock widget, then we insert it into the same // location like it had as a auto hide widget. This brings the least surprise // to the user and he does not have to search where the widget was inserted. d->DockWidget->setDockArea(nullptr); @@ -438,6 +439,12 @@ void CAutoHideDockContainer::toggleCollapseState() collapseView(isVisible()); } +void CAutoHideDockContainer::setSize(int width, int height) +{ + d->Size = QSize(width, height); + updateSize(); +} + //============================================================================ bool CAutoHideDockContainer::eventFilter(QObject* watched, QEvent* event) @@ -510,7 +517,7 @@ void CAutoHideDockContainer::resizeEvent(QResizeEvent* event) Super::resizeEvent(event); if (d->ResizeHandle->isResizing()) { - d->Size = this->size(); + d->Size = this->size(); d->updateResizeHandleSizeLimitMax(); } } diff --git a/src/AutoHideDockContainer.h b/src/AutoHideDockContainer.h index b684bb4..c55f9cc 100644 --- a/src/AutoHideDockContainer.h +++ b/src/AutoHideDockContainer.h @@ -99,7 +99,7 @@ public: */ void addDockWidget(CDockWidget* DockWidget); - /** + /** * Returns the side tab bar area of this Auto Hide dock container */ SideBarLocation sideTabBarArea() const; @@ -146,6 +146,13 @@ public: * Toggles the current collapse state */ void toggleCollapseState(); + + /** + * Use this instead of resize. This will ensure the size is consistent internally. + * E.g. If you set a height less than the parent height when it's vertical + * It will simply be rescaled to the parent height while the width will be resized + */ + void setSize(int width, int height); }; } diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 355f523..70c0276 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -31,6 +31,7 @@ set(ads_SRCS DockWidgetSideTab.cpp AutoHideDockContainer.cpp PushButton.cpp + ResizeHandle.cpp ads.qrc ) set(ads_HEADERS @@ -56,6 +57,7 @@ set(ads_HEADERS DockWidgetSideTab.h AutoHideDockContainer.h PushButton.h + ResizeHandle.h ) add_compile_options("$<$:/utf-8>") if (UNIX AND NOT APPLE) diff --git a/src/DockContainerWidget.cpp b/src/DockContainerWidget.cpp index 2fe9e05..f6b15ed 100644 --- a/src/DockContainerWidget.cpp +++ b/src/DockContainerWidget.cpp @@ -1537,7 +1537,7 @@ CAutoHideDockContainer* CDockContainerWidget::createAndSetupAutoHideContainer( { if (d->DockManager != DockWidget->dockManager()) { - DockWidget->setDockManager(d->DockManager); // Overlay Dock Container needs a valid dock manager + DockWidget->setDockManager(d->DockManager); // Auto hide Dock Container needs a valid dock manager } if (!CDockManager::testConfigFlag(CDockManager::AutoHideFeatureEnabled)) { @@ -1550,11 +1550,10 @@ CAutoHideDockContainer* CDockContainerWidget::createAndSetupAutoHideContainer( sideTabBar(area)->insertSideTab(insertOrder == CDockWidget::First ? 0 : -1, DockWidget->sideTabWidget()); DockWidget->sideTabWidget()->show(); - auto AutoHideContainer = new CAutoHideDockContainer(DockWidget, area, this); + const auto AutoHideContainer = new CAutoHideDockContainer(DockWidget, area, this); AutoHideContainer->hide(); d->DockManager->dockFocusController()->clearDockWidgetFocus(DockWidget); - //auto AutoHideContainer = sideTabBar(area)->insertDockWidget(insertOrder == CDockWidget::First ? 0 : -1, DockWidget); return AutoHideContainer; } diff --git a/src/DockWidget.cpp b/src/DockWidget.cpp index 9611f7c..031be22 100644 --- a/src/DockWidget.cpp +++ b/src/DockWidget.cpp @@ -94,7 +94,6 @@ struct DockWidgetPrivate QList TitleBarActions; CDockWidget::eMinimumSizeHintMode MinimumSizeHintMode = CDockWidget::MinimumSizeHintFromDockWidget; WidgetFactory* Factory = nullptr; - double DefaultAutoHideDockProportion = 0.25; CDockWidget::eAutoHideInsertOrder AutoHideInsertOrder = CDockWidget::Last; QPointer SideTabWidget; @@ -1133,20 +1132,6 @@ bool CDockWidget::isCurrentTab() const } -//============================================================================ -void CDockWidget::setDefaultAutoHideDockProportion(float Proportion) -{ - d->DefaultAutoHideDockProportion = Proportion; -} - - -//============================================================================ -float CDockWidget::DefaultAutoHideDockProportion() const -{ - return d->DefaultAutoHideDockProportion; -} - - //============================================================================ void CDockWidget::setAutoHideInsertOrder(eAutoHideInsertOrder insertOrder) {