Add insert order for overlayed widget to the side tab bar

- Set the default insert order to append
This commit is contained in:
Syarif Fakhri 2022-09-14 15:52:34 +08:00
parent 5df2467592
commit 06bcf2cd48
8 changed files with 52 additions and 15 deletions

View File

@ -1097,7 +1097,7 @@ void CDockAreaWidget::onAutoHideToggleRequested(CDockWidget* DockWidget, bool En
{ {
if (Enable) if (Enable)
{ {
dockContainer()->createAndInitializeDockWidgetOverlayContainer(area, DockWidget); dockContainer()->createAndInitializeDockWidgetOverlayContainer(area, DockWidget, DockWidget->overlayInsertOrder());
} }
else else
{ {

View File

@ -1485,7 +1485,7 @@ CDockAreaWidget* CDockContainerWidget::addDockWidget(DockWidgetArea area, CDockW
//============================================================================ //============================================================================
COverlayDockContainer* CDockContainerWidget::createAndInitializeDockWidgetOverlayContainer(CDockWidgetSideTab::SideTabBarArea area, CDockWidget* DockWidget) COverlayDockContainer* CDockContainerWidget::createAndInitializeDockWidgetOverlayContainer(CDockWidgetSideTab::SideTabBarArea area, CDockWidget* DockWidget, CDockWidget::eOverlayInsertOrder insertOrder)
{ {
if (d->DockManager != DockWidget->dockManager()) if (d->DockManager != DockWidget->dockManager())
{ {
@ -1498,7 +1498,7 @@ COverlayDockContainer* CDockContainerWidget::createAndInitializeDockWidgetOverla
return nullptr; return nullptr;
} }
sideTabBar(area)->insertSideTab(0, DockWidget->sideTabWidget()); sideTabBar(area)->insertSideTab(insertOrder == CDockWidget::First ? 0 : -1, DockWidget->sideTabWidget());
DockWidget->sideTabWidget()->show(); DockWidget->sideTabWidget()->show();
const auto dockContainer = new COverlayDockContainer(DockWidget, area, this); const auto dockContainer = new COverlayDockContainer(DockWidget, area, this);
@ -1800,7 +1800,7 @@ void CDockContainerWidget::dropFloatingWidget(CFloatingDockContainer* FloatingWi
auto overlayWidgets = FloatingWidget->dockContainer()->overlayWidgets(); auto overlayWidgets = FloatingWidget->dockContainer()->overlayWidgets();
for (const auto overlayWidget : overlayWidgets) for (const auto overlayWidget : overlayWidgets)
{ {
createAndInitializeDockWidgetOverlayContainer(overlayWidget->sideTabBarArea(), overlayWidget->dockWidget()); createAndInitializeDockWidgetOverlayContainer(overlayWidget->sideTabBarArea(), overlayWidget->dockWidget(), overlayWidget->dockWidget()->overlayInsertOrder());
} }
if (DockArea) if (DockArea)

View File

@ -95,13 +95,12 @@ protected:
*/ */
QSplitter* rootSplitter() const; QSplitter* rootSplitter() const;
/** /**
* Creates and initializes a dockwidget overlay container into the given area. * Creates and initializes a dockwidget overlay container into the given area.
* Initializing inserts the tabs into the side tab widget and hides it * Initializing inserts the tabs into the side tab widget and hides it
* Returns nullptr if you try and insert into an area where the configuration is not enabled * Returns nullptr if you try and insert into an area where the configuration is not enabled
*/ */
COverlayDockContainer* createAndInitializeDockWidgetOverlayContainer(CDockWidgetSideTab::SideTabBarArea area, CDockWidget* DockWidget); COverlayDockContainer* createAndInitializeDockWidgetOverlayContainer(CDockWidgetSideTab::SideTabBarArea area, CDockWidget* DockWidget, CDockWidget::eOverlayInsertOrder insertOrder);
/** /**
* Helper function for creation of the root splitter * Helper function for creation of the root splitter
@ -198,7 +197,6 @@ protected:
public: public:
/** /**
* Default Constructor * Default Constructor
*/ */

View File

@ -864,16 +864,16 @@ CDockAreaWidget* CDockManager::addDockWidgetToContainer(DockWidgetArea area,
} }
//============================================================================ //============================================================================
COverlayDockContainer* CDockManager::addOverlayDockWidget(CDockWidgetSideTab::SideTabBarArea area, CDockWidget* Dockwidget) COverlayDockContainer* CDockManager::addOverlayDockWidget(CDockWidgetSideTab::SideTabBarArea area, CDockWidget* Dockwidget, CDockWidget::eOverlayInsertOrder insertOrder)
{ {
return addOverlayDockWidgetToContainer(area, Dockwidget, this); return addOverlayDockWidgetToContainer(area, Dockwidget, this, insertOrder);
} }
//============================================================================ //============================================================================
COverlayDockContainer* CDockManager::addOverlayDockWidgetToContainer(CDockWidgetSideTab::SideTabBarArea area, CDockWidget* Dockwidget, CDockContainerWidget* DockContainerWidget) COverlayDockContainer* CDockManager::addOverlayDockWidgetToContainer(CDockWidgetSideTab::SideTabBarArea area, CDockWidget* Dockwidget, CDockContainerWidget* DockContainerWidget, CDockWidget::eOverlayInsertOrder insertOrder)
{ {
d->DockWidgetsMap.insert(Dockwidget->objectName(), Dockwidget); d->DockWidgetsMap.insert(Dockwidget->objectName(), Dockwidget);
auto container = DockContainerWidget->createAndInitializeDockWidgetOverlayContainer(area, Dockwidget); auto container = DockContainerWidget->createAndInitializeDockWidgetOverlayContainer(area, Dockwidget, insertOrder);
container->collapseView(true); container->collapseView(true);
Q_EMIT dockWidgetAdded(Dockwidget); Q_EMIT dockWidgetAdded(Dockwidget);

View File

@ -341,14 +341,14 @@ public:
* An overlay widget is used for auto hide functionality * An overlay widget is used for auto hide functionality
* \return Returns the COverlayDockContainer that contains the new DockWidget * \return Returns the COverlayDockContainer that contains the new DockWidget
*/ */
COverlayDockContainer* addOverlayDockWidget(CDockWidgetSideTab::SideTabBarArea area, CDockWidget* Dockwidget); COverlayDockContainer* addOverlayDockWidget(CDockWidgetSideTab::SideTabBarArea area, CDockWidget* Dockwidget, CDockWidget::eOverlayInsertOrder insertOrder = CDockWidget::Last);
/** /**
* Adds dock widget overlayed into the given container based on the CDockWidgetSideTab::SideTabBarArea. * Adds dock widget overlayed into the given container based on the CDockWidgetSideTab::SideTabBarArea.
* An overlay widget is used for auto hide functionality * An overlay widget is used for auto hide functionality
* \return Returns the COverlayDockContainer that contains the new DockWidget * \return Returns the COverlayDockContainer that contains the new DockWidget
*/ */
COverlayDockContainer* addOverlayDockWidgetToContainer(CDockWidgetSideTab::SideTabBarArea area, CDockWidget* Dockwidget, CDockContainerWidget* DockContainerWidget); COverlayDockContainer* addOverlayDockWidgetToContainer(CDockWidgetSideTab::SideTabBarArea area, CDockWidget* Dockwidget, CDockContainerWidget* DockContainerWidget, CDockWidget::eOverlayInsertOrder = CDockWidget::Last);
/** /**
* This function will add the given Dockwidget to the given dock area as * This function will add the given Dockwidget to the given dock area as

View File

@ -96,6 +96,7 @@ struct DockWidgetPrivate
CDockWidget::eMinimumSizeHintMode MinimumSizeHintMode = CDockWidget::MinimumSizeHintFromDockWidget; CDockWidget::eMinimumSizeHintMode MinimumSizeHintMode = CDockWidget::MinimumSizeHintFromDockWidget;
WidgetFactory* Factory = nullptr; WidgetFactory* Factory = nullptr;
double DefaultOverlayDockProportion = 0.25; double DefaultOverlayDockProportion = 0.25;
CDockWidget::eOverlayInsertOrder OverlayInsertOrder = CDockWidget::Last;
/** /**
* Private data constructor * Private data constructor
@ -1149,6 +1150,18 @@ double CDockWidget::DefaultOverlayDockProportion() const
} }
//============================================================================
void CDockWidget::setOverlayInsertOrder(eOverlayInsertOrder insertOrder)
{
d->OverlayInsertOrder = insertOrder;
}
CDockWidget::eOverlayInsertOrder CDockWidget::overlayInsertOrder() const
{
return d->OverlayInsertOrder;
}
//============================================================================ //============================================================================
void CDockWidget::raise() void CDockWidget::raise()
{ {

View File

@ -229,6 +229,17 @@ public:
ActionModeShow //!< ActionModeShow ActionModeShow //!< ActionModeShow
}; };
/**
* This mode configures the order of pinning and unpinning overlayed widgets
* First will add it to the top of the SideTabBar, while last will append it to the end
*/
enum eOverlayInsertOrder
{
First,
Last
};
/** /**
* This constructor creates a dock widget with the given title. * This constructor creates a dock widget with the given title.
@ -524,6 +535,16 @@ public:
*/ */
double DefaultOverlayDockProportion() const; double DefaultOverlayDockProportion() const;
/*
* Set overlay insertion mode
*/
void setOverlayInsertOrder(eOverlayInsertOrder insertOrder);
/*
* Get overlay insertion mode
*/
eOverlayInsertOrder overlayInsertOrder() const;
public: // reimplements QFrame ----------------------------------------------- public: // reimplements QFrame -----------------------------------------------
/** /**
* Emits titleChanged signal if title change event occurs * Emits titleChanged signal if title change event occurs

View File

@ -71,12 +71,17 @@ CSideTabBar::CSideTabBar(CDockContainerWidget* parent, Qt::Orientation orientati
d->ContainerWidget = parent; d->ContainerWidget = parent;
d->Orientation = orientation; d->Orientation = orientation;
auto mainLayout = new QBoxLayout(d->Orientation == Qt::Vertical ? QBoxLayout::TopToBottom : QBoxLayout::LeftToRight);
d->TabsLayout = new QBoxLayout(d->Orientation == Qt::Vertical ? QBoxLayout::TopToBottom : QBoxLayout::LeftToRight); d->TabsLayout = new QBoxLayout(d->Orientation == Qt::Vertical ? QBoxLayout::TopToBottom : QBoxLayout::LeftToRight);
d->TabsLayout->setContentsMargins(0, 0, 0, 0); d->TabsLayout->setContentsMargins(0, 0, 0, 0);
d->TabsLayout->setSpacing(0); d->TabsLayout->setSpacing(0);
d->TabsLayout->addStretch(1); mainLayout->addLayout(d->TabsLayout);
setLayout(d->TabsLayout); mainLayout->setContentsMargins(0, 0, 0, 0);
mainLayout->setSpacing(0);
mainLayout->addStretch(1);
setLayout(mainLayout);
setFocusPolicy(Qt::NoFocus); setFocusPolicy(Qt::NoFocus);
} }