Skip to content

Commit 4bdc04e

Browse files
Implemented Pin To functionality for Auto Hide Tabs
1 parent 1c6d86e commit 4bdc04e

9 files changed

+121
-29
lines changed

src/AutoHideDockContainer.cpp

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ struct AutoHideDockContainerPrivate
117117
CResizeHandle* ResizeHandle = nullptr;
118118
QSize Size; // creates invalid size
119119
QPointer<CAutoHideTab> SideTab;
120+
QSize OriginalDockWidgetSize;
120121

121122
/**
122123
* Private data constructor
@@ -214,7 +215,9 @@ CAutoHideDockContainer::CAutoHideDockContainer(CDockWidget* DockWidget, SideBarL
214215
d->ResizeHandle->setMinResizeSize(64);
215216
bool OpaqueResize = CDockManager::testConfigFlag(CDockManager::OpaqueSplitterResize);
216217
d->ResizeHandle->setOpaqueResize(OpaqueResize);
218+
std::cout << "d->DockArea->size(); " << d->DockArea->size().width() << std::endl;
217219
d->Size = d->DockArea->size();
220+
d->OriginalDockWidgetSize = DockWidget->size();
218221

219222
addDockWidget(DockWidget);
220223
parent->registerAutoHideWidget(this);
@@ -303,7 +306,7 @@ CAutoHideDockContainer::~CAutoHideDockContainer()
303306
}
304307

305308
//============================================================================
306-
CAutoHideSideBar* CAutoHideDockContainer::sideBar() const
309+
CAutoHideSideBar* CAutoHideDockContainer::autoHideSideBar() const
307310
{
308311
if (d->SideTab)
309312
{
@@ -312,7 +315,7 @@ CAutoHideSideBar* CAutoHideDockContainer::sideBar() const
312315
else
313316
{
314317
auto DockContainer = dockContainer();
315-
return DockContainer ? DockContainer->sideTabBar(d->SideTabBarArea) : nullptr;
318+
return DockContainer ? DockContainer->autoHideSideBar(d->SideTabBarArea) : nullptr;
316319
}
317320
}
318321

@@ -657,5 +660,19 @@ bool CAutoHideDockContainer::event(QEvent* event)
657660
return Super::event(event);
658661
}
659662

663+
664+
//============================================================================
665+
QSize CAutoHideDockContainer::originalDockWidgetSize() const
666+
{
667+
return d->OriginalDockWidgetSize;
668+
}
669+
670+
671+
//============================================================================
672+
Qt::Orientation CAutoHideDockContainer::orientation() const
673+
{
674+
return autoHideSideBar()->orientation();
675+
}
676+
660677
}
661678

src/AutoHideDockContainer.h

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ class ADS_EXPORT CAutoHideDockContainer : public QFrame
9393
/**
9494
* Get's the side tab bar
9595
*/
96-
CAutoHideSideBar* sideBar() const;
96+
CAutoHideSideBar* autoHideSideBar() const;
9797

9898
/**
9999
* Returns the side tab
@@ -166,6 +166,21 @@ class ADS_EXPORT CAutoHideDockContainer : public QFrame
166166
* of this auto hide container.
167167
*/
168168
void setSize(int Size);
169+
170+
/**
171+
* Returns the original size of the dock widget at the time it has been
172+
* added to this auto hide widget
173+
*/
174+
QSize originalDockWidgetSize() const;
175+
176+
/**
177+
* Returns orientation of this container.
178+
* Left and right containers have a Qt::Vertical orientation and top / bottom
179+
* containers have a Qt::Horizontal orientation.
180+
* The function returns the orientation of the corresponding auto hide
181+
* side bar.
182+
*/
183+
Qt::Orientation orientation() const;
169184
};
170185
} // namespace ads
171186

src/AutoHideTab.cpp

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@
4242

4343
namespace ads
4444
{
45+
static const char* const LocationProperty = "Location";
46+
4547
/**
4648
* Private data class of CDockWidgetTab class (pimpl)
4749
*/
@@ -83,6 +85,20 @@ struct AutoHideTabPrivate
8385
DockContainer->handleAutoHideWidgetEvent(event, _this);
8486
}
8587
}
88+
89+
/**
90+
* Helper function to create and initialize the menu entries for
91+
* the "Auto Hide Group To..." menu
92+
*/
93+
QAction* createAutoHideToAction(const QString& Title, SideBarLocation Location,
94+
QMenu* Menu)
95+
{
96+
auto Action = Menu->addAction(Title);
97+
Action->setProperty("Location", Location);
98+
QObject::connect(Action, &QAction::triggered, _this, &CAutoHideTab::onAutoHideToActionClicked);
99+
Action->setEnabled(Location != _this->sideBarLocation());
100+
return Action;
101+
}
86102
}; // struct DockWidgetTabPrivate
87103

88104

@@ -299,10 +315,10 @@ void CAutoHideTab::contextMenuEvent(QContextMenuEvent* ev)
299315

300316
auto menu = Menu.addMenu(tr("Pin To..."));
301317
menu->setEnabled(IsPinnable);
302-
//d->createAutoHideToAction(tr("Top"), SideBarTop, menu);
303-
//d->createAutoHideToAction(tr("Left"), SideBarLeft, menu);
304-
//d->createAutoHideToAction(tr("Right"), SideBarRight, menu);
305-
//d->createAutoHideToAction(tr("Bottom"), SideBarBottom, menu);
318+
d->createAutoHideToAction(tr("Top"), SideBarTop, menu);
319+
d->createAutoHideToAction(tr("Left"), SideBarLeft, menu);
320+
d->createAutoHideToAction(tr("Right"), SideBarRight, menu);
321+
d->createAutoHideToAction(tr("Bottom"), SideBarBottom, menu);
306322

307323
/*Menu.addSeparator();
308324
Action = Menu.addAction(tr("Close"), this, SIGNAL(closeRequested()));
@@ -316,21 +332,31 @@ void CAutoHideTab::contextMenuEvent(QContextMenuEvent* ev)
316332

317333

318334
//============================================================================
319-
void CAutoHideTab::mouseDoubleClickEvent(QMouseEvent *event)
335+
void CAutoHideTab::setDockWidgetFloating()
320336
{
321-
if (event->button() == Qt::LeftButton)
337+
/*auto DockArea = dockWidget()->dockAreaWidget();
338+
auto AutoHideContainer = dockWidget()->autoHideDockContainer();
339+
auto OriginalSize = AutoHideContainer->originalDockWidgetSize();
340+
auto DockAreaSize = DockArea->size();
341+
if (ads::internal::isHorizontalSideBarLocation(sideBarLocation()))
322342
{
323-
setDockWidgetFloating();
343+
DockAreaSize.setHeight(OriginalSize.height());
324344
}
325-
326-
Super::mouseDoubleClickEvent(event);
345+
else
346+
{
347+
DockAreaSize.setWidth(OriginalSize.width());
348+
}
349+
DockArea->resize(DockAreaSize);*/
350+
dockWidget()->setFloating();
327351
}
328352

329353

330-
//============================================================================
331-
void CAutoHideTab::setDockWidgetFloating()
354+
//===========================================================================
355+
void CAutoHideTab::onAutoHideToActionClicked()
332356
{
333-
dockWidget()->setFloating();
357+
int Location = sender()->property(LocationProperty).toInt();
358+
std::cout << "CAutoHideTab::onAutoHideToActionClicked " << Location << std::endl;
359+
d->DockWidget->setAutoHide(true, (SideBarLocation)Location);
334360
}
335361

336362

src/AutoHideTab.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,14 @@ class ADS_EXPORT CAutoHideTab : public CPushButton
6565
friend class CDockContainerWidget;
6666
friend DockContainerWidgetPrivate;
6767

68+
private Q_SLOTS:
69+
void onAutoHideToActionClicked();
70+
6871
protected:
6972
void setSideBar(CAutoHideSideBar *SideTabBar);
7073
void removeFromSideBar();
7174
virtual bool event(QEvent* event) override;
7275
virtual void contextMenuEvent(QContextMenuEvent* ev) override;
73-
virtual void mouseDoubleClickEvent(QMouseEvent *event) override;
7476

7577
public:
7678
using Super = CPushButton;

src/DockContainerWidget.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1156,12 +1156,12 @@ bool DockContainerWidgetPrivate::restoreSideBar(CDockingStateReader& s,
11561156
continue;
11571157
}
11581158

1159-
auto SideBar = _this->sideTabBar(Area);
1159+
auto SideBar = _this->autoHideSideBar(Area);
11601160
CAutoHideDockContainer* AutoHideContainer;
11611161
if (DockWidget->isAutoHide())
11621162
{
11631163
AutoHideContainer = DockWidget->autoHideDockContainer();
1164-
if (AutoHideContainer->sideBar() != SideBar)
1164+
if (AutoHideContainer->autoHideSideBar() != SideBar)
11651165
{
11661166
SideBar->addAutoHideWidget(AutoHideContainer);
11671167
}
@@ -1472,7 +1472,7 @@ CAutoHideDockContainer* CDockContainerWidget::createAndSetupAutoHideContainer(
14721472
DockWidget->setDockManager(d->DockManager); // Auto hide Dock Container needs a valid dock manager
14731473
}
14741474

1475-
return sideTabBar(area)->insertDockWidget(-1, DockWidget);
1475+
return autoHideSideBar(area)->insertDockWidget(-1, DockWidget);
14761476
}
14771477

14781478

@@ -1731,7 +1731,7 @@ void CDockContainerWidget::dropFloatingWidget(CFloatingDockContainer* FloatingWi
17311731
// them into this widget
17321732
for (auto AutohideWidget : FloatingWidget->dockContainer()->autoHideWidgets())
17331733
{
1734-
auto SideBar = sideTabBar(AutohideWidget->sideBarLocation());
1734+
auto SideBar = autoHideSideBar(AutohideWidget->sideBarLocation());
17351735
SideBar->addAutoHideWidget(AutohideWidget);
17361736
}
17371737

@@ -2118,7 +2118,7 @@ void CDockContainerWidget::closeOtherAreas(CDockAreaWidget* KeepOpenArea)
21182118
}
21192119

21202120
//============================================================================
2121-
CAutoHideSideBar* CDockContainerWidget::sideTabBar(SideBarLocation area) const
2121+
CAutoHideSideBar* CDockContainerWidget::autoHideSideBar(SideBarLocation area) const
21222122
{
21232123
return d->SideTabBarWidgets[area];
21242124
}
@@ -2140,10 +2140,10 @@ QRect CDockContainerWidget::contentRect() const
21402140
{
21412141
auto ContentRect = this->rect();
21422142
ContentRect.adjust(
2143-
sideTabBar(SideBarLeft)->sizeHint().width(),
2144-
sideTabBar(SideBarTop)->sizeHint().height(),
2145-
-sideTabBar(SideBarRight)->sizeHint().width(),
2146-
-sideTabBar(SideBarBottom)->sizeHint().height());
2143+
autoHideSideBar(SideBarLeft)->sizeHint().width(),
2144+
autoHideSideBar(SideBarTop)->sizeHint().height(),
2145+
-autoHideSideBar(SideBarRight)->sizeHint().width(),
2146+
-autoHideSideBar(SideBarBottom)->sizeHint().height());
21472147

21482148
return ContentRect;
21492149
}

src/DockContainerWidget.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ class ADS_EXPORT CDockContainerWidget : public QFrame
329329
/**
330330
* Returns the side tab widget for the given area
331331
*/
332-
CAutoHideSideBar* sideTabBar(SideBarLocation area) const;
332+
CAutoHideSideBar* autoHideSideBar(SideBarLocation area) const;
333333

334334

335335
/**

src/DockOverlay.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ struct DockOverlayCrossPrivate
370370
int DockOverlayPrivate::sideBarOverlaySize(SideBarLocation sideBarLocation)
371371
{
372372
auto Container = qobject_cast<CDockContainerWidget*>(TargetWidget.data());
373-
auto SideBar = Container->sideTabBar(sideBarLocation);
373+
auto SideBar = Container->autoHideSideBar(sideBarLocation);
374374
if (!SideBar || !SideBar->isVisibleTo(Container))
375375
{
376376
return AutoHideAreaWidth;
@@ -386,7 +386,7 @@ int DockOverlayPrivate::sideBarOverlaySize(SideBarLocation sideBarLocation)
386386
int DockOverlayPrivate::sideBarMouseZone(SideBarLocation sideBarLocation)
387387
{
388388
auto Container = qobject_cast<CDockContainerWidget*>(TargetWidget.data());
389-
auto SideBar = Container->sideTabBar(sideBarLocation);
389+
auto SideBar = Container->autoHideSideBar(sideBarLocation);
390390
if (!SideBar || !SideBar->isVisibleTo(Container))
391391
{
392392
return AutoHideAreaMouseZone;

src/DockWidget.cpp

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,13 @@ bool CDockWidget::isAutoHide() const
555555
}
556556

557557

558+
//============================================================================
559+
SideBarLocation CDockWidget::autoHideLocation() const
560+
{
561+
return isAutoHide() ? autoHideDockContainer()->sideBarLocation() : SideBarNone;
562+
}
563+
564+
558565
//============================================================================
559566
bool CDockWidget::isFloating() const
560567
{
@@ -1206,7 +1213,7 @@ void CDockWidget::setAutoHide(bool Enable, SideBarLocation Location)
12061213
}
12071214

12081215
// Do nothing if nothing changes
1209-
if (Enable == isAutoHide())
1216+
if (Enable == isAutoHide() && Location == autoHideLocation())
12101217
{
12111218
return;
12121219
}
@@ -1216,6 +1223,25 @@ void CDockWidget::setAutoHide(bool Enable, SideBarLocation Location)
12161223
{
12171224
DockArea->setAutoHide(false);
12181225
}
1226+
else if (isAutoHide())
1227+
{
1228+
auto AutoHideContainer = autoHideDockContainer();
1229+
auto OldOrientation = AutoHideContainer->orientation();
1230+
auto SideBar = dockContainer()->autoHideSideBar(Location);
1231+
SideBar->addAutoHideWidget(AutoHideContainer);
1232+
if (SideBar->orientation() != OldOrientation)
1233+
{
1234+
auto OriginalSize = AutoHideContainer->originalDockWidgetSize();
1235+
if (SideBar->orientation() == Qt::Horizontal)
1236+
{
1237+
AutoHideContainer->setSize(OriginalSize.height());
1238+
}
1239+
else
1240+
{
1241+
AutoHideContainer->setSize(OriginalSize.width());
1242+
}
1243+
}
1244+
}
12191245
else
12201246
{
12211247
auto area = (SideBarNone == Location) ? DockArea->calculateSideTabBarArea() : Location;

src/DockWidget.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,12 @@ private Q_SLOTS:
377377
*/
378378
CAutoHideDockContainer* autoHideDockContainer() const;
379379

380+
/**
381+
* Returns the auto hide side bar location or SideBarNone if, this is not
382+
* an autohide dock widget
383+
*/
384+
SideBarLocation autoHideLocation() const;
385+
380386
/**
381387
* This property holds whether the dock widget is floating.
382388
* A dock widget is only floating, if it is the one and only widget inside

0 commit comments

Comments
 (0)