Skip to content

Commit 1b6e449

Browse files
Merge branch 'dev'
2 parents 542618f + 0e88467 commit 1b6e449

File tree

6 files changed

+99
-3
lines changed

6 files changed

+99
-3
lines changed

demo/MainWindow.cpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,11 +224,27 @@ static ads::CDockWidget* createEditorWidget(QMenu* ViewMenu)
224224
}
225225

226226

227+
//===========================================================================
228+
/**
229+
* Custom QTableWidget with a minimum size hint to test CDockWidget
230+
* setMinimumSizeHintMode() function of CDockWidget
231+
*/
232+
class CMinSizeTableWidget : public QTableWidget
233+
{
234+
public:
235+
using QTableWidget::QTableWidget;
236+
virtual QSize minimumSizeHint() const override
237+
{
238+
return QSize(300, 100);
239+
}
240+
};
241+
242+
227243
//============================================================================
228244
static ads::CDockWidget* createTableWidget(QMenu* ViewMenu)
229245
{
230246
static int TableCount = 0;
231-
QTableWidget* w = new QTableWidget();
247+
auto w = new CMinSizeTableWidget();
232248
ads::CDockWidget* DockWidget = new ads::CDockWidget(QString("Table %1").arg(TableCount++));
233249
static int colCount = 5;
234250
static int rowCount = 30;
@@ -244,6 +260,7 @@ static ads::CDockWidget* createTableWidget(QMenu* ViewMenu)
244260
}
245261
DockWidget->setWidget(w);
246262
DockWidget->setIcon(svgIcon(":/adsdemo/images/grid_on.svg"));
263+
DockWidget->setMinimumSizeHintMode(ads::CDockWidget::MinimumSizeHintFromContent);
247264
ViewMenu->addAction(DockWidget->toggleViewAction());
248265
return DockWidget;
249266
}

sip/DockWidget.sip

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@ public:
5050
ForceScrollArea,
5151
ForceNoScrollArea
5252
};
53+
54+
enum eMinimumSizeHintMode
55+
{
56+
MinimumSizeHintFromDockWidget,
57+
MinimumSizeHintFromContent
58+
};
5359

5460
enum eToggleViewActionMode
5561
{
@@ -76,6 +82,7 @@ public:
7682
bool isClosed() const;
7783
QAction* toggleViewAction() const;
7884
void setToggleViewActionMode(ads::CDockWidget::eToggleViewActionMode Mode);
85+
void setMinimumSizeHintMode(ads::CDockWidget::eMinimumSizeHintMode Mode);
7986
void setIcon(const QIcon& Icon);
8087
QIcon icon() const;
8188
QToolBar* toolBar() const;

src/DockAreaWidget.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ struct DockAreaWidgetPrivate
247247
CDockManager* DockManager = nullptr;
248248
bool UpdateTitleBarButtons = false;
249249
DockWidgetAreas AllowedAreas = AllDockAreas;
250+
QSize MinSizeHint;
250251

251252
/**
252253
* Private data constructor
@@ -303,6 +304,20 @@ struct DockAreaWidgetPrivate
303304
* Udpates the enable state of the close and detach button
304305
*/
305306
void updateTitleBarButtonStates();
307+
308+
/**
309+
* Scans all contained dock widgets for the max. minimum size hint
310+
*/
311+
void updateMinimumSizeHint()
312+
{
313+
MinSizeHint = QSize();
314+
for (int i = 0; i < ContentsLayout->count(); ++i)
315+
{
316+
auto Widget = ContentsLayout->widget(i);
317+
MinSizeHint.setHeight(qMax(MinSizeHint.height(), Widget->minimumSizeHint().height()));
318+
MinSizeHint.setWidth(qMax(MinSizeHint.width(), Widget->minimumSizeHint().width()));
319+
}
320+
}
306321
};
307322
// struct DockAreaWidgetPrivate
308323

@@ -407,6 +422,8 @@ void CDockAreaWidget::insertDockWidget(int index, CDockWidget* DockWidget,
407422
d->tabBar()->blockSignals(false);
408423
TabWidget->setVisible(!DockWidget->isClosed());
409424
DockWidget->setProperty(INDEX_PROPERTY, index);
425+
d->MinSizeHint.setHeight(qMax(d->MinSizeHint.height(), DockWidget->minimumSizeHint().height()));
426+
d->MinSizeHint.setWidth(qMax(d->MinSizeHint.width(), DockWidget->minimumSizeHint().width()));
410427
if (Activate)
411428
{
412429
setCurrentIndex(index);
@@ -447,6 +464,7 @@ void CDockAreaWidget::removeDockWidget(CDockWidget* DockWidget)
447464

448465
d->updateTitleBarButtonStates();
449466
updateTitleBarVisibility();
467+
d->updateMinimumSizeHint();
450468
auto TopLevelDockWidget = DockContainer->topLevelDockWidget();
451469
if (TopLevelDockWidget)
452470
{
@@ -863,6 +881,13 @@ CDockAreaTitleBar* CDockAreaWidget::titleBar() const
863881
{
864882
return d->TitleBar;
865883
}
884+
885+
886+
//============================================================================
887+
QSize CDockAreaWidget::minimumSizeHint() const
888+
{
889+
return d->MinSizeHint.isValid() ? d->MinSizeHint : Super::minimumSizeHint();
890+
}
866891
} // namespace ads
867892

868893
//---------------------------------------------------------------------------

src/DockAreaWidget.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,13 @@ protected slots:
164164
*/
165165
CDockContainerWidget* dockContainer() const;
166166

167+
/**
168+
* Returns the largest minimumSizeHint() of the dock widgets in this
169+
* area.
170+
* The minimum size hint is updated if a dock widget is removed or added.
171+
*/
172+
virtual QSize minimumSizeHint() const override;
173+
167174
/**
168175
* Returns the rectangle of the title area
169176
*/

src/DockWidget.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ struct DockWidgetPrivate
8282
QSize ToolBarIconSizeFloating = QSize(24, 24);
8383
bool IsFloatingTopLevel = false;
8484
QList<QAction*> TitleBarActions;
85+
CDockWidget::eMinimumSizeHintMode MinimumSizeHintMode = CDockWidget::MinimumSizeHintFromDockWidget;
8586

8687
/**
8788
* Private data constructor
@@ -424,6 +425,13 @@ void CDockWidget::setToggleViewActionMode(eToggleViewActionMode Mode)
424425
}
425426

426427

428+
//============================================================================
429+
void CDockWidget::setMinimumSizeHintMode(eMinimumSizeHintMode Mode)
430+
{
431+
d->MinimumSizeHintMode = Mode;
432+
}
433+
434+
427435
//============================================================================
428436
void CDockWidget::toggleView(bool Open)
429437
{
@@ -753,7 +761,14 @@ void CDockWidget::setClosedState(bool Closed)
753761
//============================================================================
754762
QSize CDockWidget::minimumSizeHint() const
755763
{
756-
return QSize(60, 40);
764+
if (d->MinimumSizeHintMode == CDockWidget::MinimumSizeHintFromDockWidget || !d->Widget)
765+
{
766+
return QSize(60, 40);
767+
}
768+
else
769+
{
770+
return d->Widget->minimumSizeHint();
771+
}
757772
}
758773

759774

src/DockWidget.h

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,23 @@ private slots:
189189
ForceNoScrollArea
190190
};
191191

192+
193+
/**
194+
* The mode of the minimumSizeHint() that is returned by the DockWidget
195+
* minimumSizeHint() function.
196+
* To ensure, that a dock widget does not block resizing, the dock widget
197+
* reimplements minimumSizeHint() function to return a very small minimum
198+
* size hint. If you would like to adhere the minimumSizeHint() from the
199+
* content widget, the set the minimumSizeHintMode() to
200+
* MinimumSizeHintFromContent.
201+
*/
202+
enum eMinimumSizeHintMode
203+
{
204+
MinimumSizeHintFromDockWidget,
205+
MinimumSizeHintFromContent
206+
};
207+
208+
192209
/**
193210
* This mode configures the behavior of the toggle view action.
194211
* If the mode if ActionModeToggle, then the toggle view action is
@@ -225,7 +242,8 @@ private slots:
225242
virtual ~CDockWidget();
226243

227244
/**
228-
* We return a fixed minimum size hint for all dock widgets
245+
* We return a fixed minimum size hint or the size hint of the content
246+
* widget if minimum size hint mode is MinimumSizeHintFromContent
229247
*/
230248
virtual QSize minimumSizeHint() const override;
231249

@@ -334,6 +352,13 @@ private slots:
334352
*/
335353
void setToggleViewActionMode(eToggleViewActionMode Mode);
336354

355+
/**
356+
* Configures the minimum size hint that is returned by the
357+
* minimumSizeHint() function.
358+
* \see eMinimumSizeHintMode for a detailed description
359+
*/
360+
void setMinimumSizeHintMode(eMinimumSizeHintMode Mode);
361+
337362
/**
338363
* Sets the dock widget icon that is shown in tabs and in toggle view
339364
* actions

0 commit comments

Comments
 (0)