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)
{
dockContainer()->createAndInitializeDockWidgetOverlayContainer(area, DockWidget);
dockContainer()->createAndInitializeDockWidgetOverlayContainer(area, DockWidget, DockWidget->overlayInsertOrder());
}
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())
{
@ -1498,7 +1498,7 @@ COverlayDockContainer* CDockContainerWidget::createAndInitializeDockWidgetOverla
return nullptr;
}
sideTabBar(area)->insertSideTab(0, DockWidget->sideTabWidget());
sideTabBar(area)->insertSideTab(insertOrder == CDockWidget::First ? 0 : -1, DockWidget->sideTabWidget());
DockWidget->sideTabWidget()->show();
const auto dockContainer = new COverlayDockContainer(DockWidget, area, this);
@ -1800,7 +1800,7 @@ void CDockContainerWidget::dropFloatingWidget(CFloatingDockContainer* FloatingWi
auto overlayWidgets = FloatingWidget->dockContainer()->overlayWidgets();
for (const auto overlayWidget : overlayWidgets)
{
createAndInitializeDockWidgetOverlayContainer(overlayWidget->sideTabBarArea(), overlayWidget->dockWidget());
createAndInitializeDockWidgetOverlayContainer(overlayWidget->sideTabBarArea(), overlayWidget->dockWidget(), overlayWidget->dockWidget()->overlayInsertOrder());
}
if (DockArea)

View File

@ -95,13 +95,12 @@ protected:
*/
QSplitter* rootSplitter() const;
/**
* Creates and initializes a dockwidget overlay container into the given area.
* 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
*/
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
@ -198,7 +197,6 @@ protected:
public:
/**
* 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);
auto container = DockContainerWidget->createAndInitializeDockWidgetOverlayContainer(area, Dockwidget);
auto container = DockContainerWidget->createAndInitializeDockWidgetOverlayContainer(area, Dockwidget, insertOrder);
container->collapseView(true);
Q_EMIT dockWidgetAdded(Dockwidget);

View File

@ -341,14 +341,14 @@ public:
* An overlay widget is used for auto hide functionality
* \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.
* An overlay widget is used for auto hide functionality
* \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

View File

@ -96,6 +96,7 @@ struct DockWidgetPrivate
CDockWidget::eMinimumSizeHintMode MinimumSizeHintMode = CDockWidget::MinimumSizeHintFromDockWidget;
WidgetFactory* Factory = nullptr;
double DefaultOverlayDockProportion = 0.25;
CDockWidget::eOverlayInsertOrder OverlayInsertOrder = CDockWidget::Last;
/**
* 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()
{

View File

@ -229,6 +229,17 @@ public:
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.
@ -524,6 +535,16 @@ public:
*/
double DefaultOverlayDockProportion() const;
/*
* Set overlay insertion mode
*/
void setOverlayInsertOrder(eOverlayInsertOrder insertOrder);
/*
* Get overlay insertion mode
*/
eOverlayInsertOrder overlayInsertOrder() const;
public: // reimplements QFrame -----------------------------------------------
/**
* 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->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->setContentsMargins(0, 0, 0, 0);
d->TabsLayout->setSpacing(0);
d->TabsLayout->addStretch(1);
setLayout(d->TabsLayout);
mainLayout->addLayout(d->TabsLayout);
mainLayout->setContentsMargins(0, 0, 0, 0);
mainLayout->setSpacing(0);
mainLayout->addStretch(1);
setLayout(mainLayout);
setFocusPolicy(Qt::NoFocus);
}