KDDockWidgets API Documentation  1.4
MainWindowBase.cpp
Go to the documentation of this file.
1 /*
2  This file is part of KDDockWidgets.
3 
4  SPDX-FileCopyrightText: 2019-2021 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
5  Author: SĂ©rgio Martins <sergio.martins@kdab.com>
6 
7  SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only
8 
9  Contact KDAB at <info@kdab.com> for commercial licensing options.
10 */
11 
12 
20 #include "MainWindowBase.h"
21 #include "private/DockRegistry_p.h"
22 #include "private/MDILayoutWidget_p.h"
23 #include "private/DropArea_p.h"
24 #include "private/Frame_p.h"
25 #include "private/Utils_p.h"
26 #include "private/SideBar_p.h"
27 #include "private/Logging_p.h"
28 #include "private/WidgetResizeHandler_p.h"
29 #include "FrameworkWidgetFactory.h"
30 #include "private/DropAreaWithCentralFrame_p.h"
31 #include "private/LayoutSaver_p.h"
32 #include "private/DockWidgetBase_p.h"
33 
34 using namespace KDDockWidgets;
35 
36 static LayoutWidget *createLayoutWidget(MainWindowBase *mainWindow, MainWindowOptions options)
37 {
38  if (options & MainWindowOption_MDI)
39  return new MDILayoutWidget(mainWindow);
40 
41  return new DropAreaWithCentralFrame(mainWindow, options);
42 }
43 
44 class MainWindowBase::Private
45 {
46 public:
47  explicit Private(MainWindowBase *mainWindow, MainWindowOptions options)
48  : m_options(options)
49  , q(mainWindow)
50  , m_layoutWidget(createLayoutWidget(mainWindow, options))
51  {
52  }
53 
54  bool supportsCentralFrame() const
55  {
56  return m_options & MainWindowOption_HasCentralFrame;
57  }
58 
59 
60  void updateOverlayedDockWidgetGeometries()
61  {
62  if (m_overlayedDockWidget)
63  updateOverlayGeometry(m_overlayedDockWidget->d->frame()->QWidgetAdapter::size());
64  }
65 
66  CursorPositions allowedResizeSides(SideBarLocation loc) const;
67 
68  QRect rectForOverlay(Frame *, SideBarLocation) const;
69  SideBarLocation preferredSideBar(DockWidgetBase *) const;
70  void updateOverlayGeometry(QSize suggestedSize);
71  void clearSideBars();
72 
73  QString name;
75  const MainWindowOptions m_options;
76  MainWindowBase *const q;
77  QPointer<DockWidgetBase> m_overlayedDockWidget;
78  LayoutWidget *const m_layoutWidget;
79 };
80 
81 MainWindowBase::MainWindowBase(const QString &uniqueName, KDDockWidgets::MainWindowOptions options,
82  WidgetType *parent, Qt::WindowFlags flags)
83  : QMainWindowOrQuick(parent, flags)
84  , d(new Private(this, options))
85 {
87 
88  connect(d->m_layoutWidget, &LayoutWidget::visibleWidgetCountChanged, this,
90 
91  connect(this, &MainWindowBase::centralWidgetResized, this, [this] {
92  d->updateOverlayedDockWidgetGeometries();
93  });
94 }
95 
97 {
98  DockRegistry::self()->unregisterMainWindow(this);
99  delete d;
100 }
101 
103 {
104  Q_ASSERT(widget);
105  qCDebug(addwidget) << Q_FUNC_INFO << widget;
106 
107  if (!DockRegistry::self()->affinitiesMatch(d->affinities, widget->affinities())) {
108  qWarning() << Q_FUNC_INFO << "Refusing to dock widget with incompatible affinity."
109  << widget->affinities() << affinities();
110  return;
111  }
112 
113  if (widget->options() & DockWidgetBase::Option_NotDockable) {
114  qWarning() << Q_FUNC_INFO << "Refusing to dock non-dockable widget" << widget;
115  return;
116  }
117 
118  if (isMDI()) {
119  // Not applicable to MDI
120  return;
121  }
122 
123  if (d->supportsCentralFrame()) {
124  dropArea()->m_centralFrame->addWidget(widget);
125  } else {
126  qWarning() << Q_FUNC_INFO << "Not supported without MainWindowOption_HasCentralFrame";
127  }
128 }
129 
131  DockWidgetBase *relativeTo, InitialOption option)
132 {
134  qWarning() << Q_FUNC_INFO << "Refusing to dock non-dockable widget" << dw;
135  return;
136  }
137 
138  if (isMDI()) {
139  // Not applicable to MDI
140  return;
141  }
142 
143  dropArea()->addDockWidget(dw, location, relativeTo, option);
144 }
145 
147 {
148  return d->name;
149 }
150 
151 MainWindowOptions MainWindowBase::options() const
152 {
153  return d->m_options;
154 }
155 
156 DropAreaWithCentralFrame *MainWindowBase::dropArea() const
157 {
158  return qobject_cast<DropAreaWithCentralFrame *>(d->m_layoutWidget);
159 }
160 
161 MultiSplitter *MainWindowBase::multiSplitter() const
162 {
163  return dropArea();
164 }
165 
166 LayoutWidget *MainWindowBase::layoutWidget() const
167 {
168  return d->m_layoutWidget;
169 }
170 
171 MDILayoutWidget *MainWindowBase::mdiLayoutWidget() const
172 {
173  return qobject_cast<MDILayoutWidget *>(layoutWidget());
174 }
175 
176 void MainWindowBase::setAffinities(const QStringList &affinityNames)
177 {
178  QStringList affinities = affinityNames;
180 
181  if (d->affinities == affinities)
182  return;
183 
184  if (!d->affinities.isEmpty()) {
185  qWarning() << Q_FUNC_INFO
186  << "Affinity is already set, refusing to change."
187  << "Submit a feature request with a good justification.";
188  return;
189  }
190 
191  d->affinities = affinities;
192 }
193 
195 {
196  return d->affinities;
197 }
198 
200 {
201  dropArea()->layoutEqually();
202 }
203 
205 {
206  dropArea()->layoutParentContainerEqually(dockWidget);
207 }
208 
209 CursorPositions MainWindowBase::Private::allowedResizeSides(SideBarLocation loc) const
210 {
211  // When a sidebar is on top, you can only resize its bottom.
212  // and so forth...
213 
214  switch (loc) {
216  return CursorPosition_Bottom;
218  return CursorPosition_Left;
220  return CursorPosition_Right;
222  return CursorPosition_Top;
225  }
226 
228 }
229 
230 QRect MainWindowBase::Private::rectForOverlay(Frame *frame, SideBarLocation location) const
231 {
232  SideBar *sb = q->sideBar(location);
233  if (!sb)
234  return {};
235 
236  const QRect centralAreaGeo = q->centralAreaGeometry();
237  const QMargins centerWidgetMargins = q->centerWidgetMargins();
238 
239  QRect rect;
240  const int margin = 1;
241  switch (location) {
243  case SideBarLocation::South: {
244 
245  SideBar *leftSideBar = q->sideBar(SideBarLocation::West);
246  SideBar *rightSideBar = q->sideBar(SideBarLocation::East);
247  const int leftSideBarWidth = (leftSideBar && leftSideBar->isVisible()) ? leftSideBar->width()
248  : 0;
249  const int rightSideBarWidth = (rightSideBar && rightSideBar->isVisible()) ? rightSideBar->width()
250  : 0;
251  rect.setHeight(qMax(300, frame->minSize().height()));
252  rect.setWidth(centralAreaGeo.width() - margin * 2 - leftSideBarWidth - rightSideBarWidth);
253  rect.moveLeft(margin + leftSideBarWidth);
254  if (location == SideBarLocation::South) {
255  rect.moveTop(centralAreaGeo.bottom() - centerWidgetMargins.bottom() - rect.height() - sb->height());
256  } else {
257  rect.moveTop(centralAreaGeo.y() + sb->height() + centerWidgetMargins.top());
258  }
259  break;
260  }
262  case SideBarLocation::East: {
263  SideBar *topSideBar = q->sideBar(SideBarLocation::North);
264  SideBar *bottomSideBar = q->sideBar(SideBarLocation::South);
265  const int topSideBarHeight = (topSideBar && topSideBar->isVisible()) ? topSideBar->height()
266  : 0;
267  const int bottomSideBarHeight = (bottomSideBar && bottomSideBar->isVisible()) ? bottomSideBar->height()
268  : 0;
269  rect.setWidth(qMax(300, frame->minSize().width()));
270  rect.setHeight(centralAreaGeo.height() - topSideBarHeight - bottomSideBarHeight - centerWidgetMargins.top() - centerWidgetMargins.bottom());
271  rect.moveTop(sb->mapTo(q, QPoint(0, 0)).y() + topSideBarHeight - 1);
272  if (location == SideBarLocation::East) {
273  rect.moveLeft(centralAreaGeo.width() - rect.width() - sb->width() - centerWidgetMargins.right() - margin);
274  } else {
275  rect.moveLeft(margin + centralAreaGeo.x() + centerWidgetMargins.left() + sb->width());
276  }
277 
278  break;
279  }
281  break;
282  }
283 
284  return rect;
285 }
286 
287 static SideBarLocation opposedSideBarLocationForBorder(Layouting::LayoutBorderLocation loc)
288 {
289  switch (loc) {
290  case Layouting::LayoutBorderLocation_North:
291  return SideBarLocation::South;
292  case Layouting::LayoutBorderLocation_East:
293  return SideBarLocation::West;
294  case Layouting::LayoutBorderLocation_West:
295  return SideBarLocation::East;
296  case Layouting::LayoutBorderLocation_South:
297  return SideBarLocation::North;
298  case Layouting::LayoutBorderLocation_All:
299  case Layouting::LayoutBorderLocation_Verticals:
300  case Layouting::LayoutBorderLocation_Horizontals:
301  case Layouting::LayoutBorderLocation_None:
302  break;
303  }
304 
305  qWarning() << Q_FUNC_INFO << "Unknown loc" << loc;
306  return SideBarLocation::None;
307 }
308 
309 static SideBarLocation sideBarLocationForBorder(Layouting::LayoutBorderLocations loc)
310 {
311  switch (loc) {
312  case Layouting::LayoutBorderLocation_North:
313  return SideBarLocation::North;
314  case Layouting::LayoutBorderLocation_East:
315  return SideBarLocation::East;
316  case Layouting::LayoutBorderLocation_West:
317  return SideBarLocation::West;
318  case Layouting::LayoutBorderLocation_South:
319  return SideBarLocation::South;
320  case Layouting::LayoutBorderLocation_All:
321  case Layouting::LayoutBorderLocation_Verticals:
322  case Layouting::LayoutBorderLocation_Horizontals:
323  case Layouting::LayoutBorderLocation_None:
324  break;
325  }
326 
327  return SideBarLocation::None;
328 }
329 
330 SideBarLocation MainWindowBase::Private::preferredSideBar(DockWidgetBase *dw) const
331 {
332  // TODO: Algorithm can still be made smarter
333 
334  Layouting::Item *item = q->layoutWidget()->itemForFrame(dw->d->frame());
335  if (!item) {
336  qWarning() << Q_FUNC_INFO << "No item for dock widget";
337  return SideBarLocation::None;
338  }
339 
340  const Layouting::LayoutBorderLocations borders = item->adjacentLayoutBorders();
341  const qreal aspectRatio = dw->width() / (dw->height() * 1.0);
342 
344  if (borders == Layouting::LayoutBorderLocation_All) {
345  return aspectRatio > 1.0 ? SideBarLocation::South
347  }
348 
350  for (auto borderLoc : { Layouting::LayoutBorderLocation_North, Layouting::LayoutBorderLocation_East,
351  Layouting::LayoutBorderLocation_West, Layouting::LayoutBorderLocation_South }) {
352  if (borders == (Layouting::LayoutBorderLocation_All & ~borderLoc))
353  return opposedSideBarLocationForBorder(borderLoc);
354  }
355 
357  if ((borders & Layouting::LayoutBorderLocation_Verticals) == Layouting::LayoutBorderLocation_Verticals) {
358  // We could measure the distance to the top though.
359  return SideBarLocation::South;
360  }
361 
363  if ((borders & Layouting::LayoutBorderLocation_Horizontals) == Layouting::LayoutBorderLocation_Horizontals) {
364  // We could measure the distance to the left though.
365  return SideBarLocation::East;
366  }
367 
368  // 5. It's in a corner
369  if (borders == (Layouting::LayoutBorderLocation_West | Layouting::LayoutBorderLocation_South)) {
370  return aspectRatio > 1.0 ? SideBarLocation::South
372  } else if (borders == (Layouting::LayoutBorderLocation_East | Layouting::LayoutBorderLocation_South)) {
373  return aspectRatio > 1.0 ? SideBarLocation::South
375  } else if (borders == (Layouting::LayoutBorderLocation_West | Layouting::LayoutBorderLocation_North)) {
376  return aspectRatio > 1.0 ? SideBarLocation::North
378  } else if (borders == (Layouting::LayoutBorderLocation_East | Layouting::LayoutBorderLocation_North)) {
379  return aspectRatio > 1.0 ? SideBarLocation::North
381  }
382 
383 
384  {
385  // 6. It's only touching 1 border
387  if (loc != SideBarLocation::None)
388  return loc;
389  }
390 
391  // It's not touching any border, use aspect ratio.
392  return aspectRatio > 1.0 ? SideBarLocation::South
394 }
395 
396 void MainWindowBase::Private::updateOverlayGeometry(QSize suggestedSize)
397 {
398  if (!m_overlayedDockWidget)
399  return;
400 
401  SideBar *sb = q->sideBarForDockWidget(m_overlayedDockWidget);
402  if (!sb) {
403  qWarning() << Q_FUNC_INFO << "Expected a sidebar";
404  return;
405  }
406 
407  const QRect defaultGeometry = rectForOverlay(m_overlayedDockWidget->d->frame(), sb->location());
408  QRect newGeometry = defaultGeometry;
409 
410  Frame *frame = m_overlayedDockWidget->d->frame();
411 
412  if (suggestedSize.isValid() && !suggestedSize.isEmpty()) {
413  // Let's try to honour the suggested overlay size
414  switch (sb->location()) {
415  case SideBarLocation::North: {
416  const int maxHeight = q->height() - frame->pos().y() - 10; // gap
417  newGeometry.setHeight(qMin(suggestedSize.height(), maxHeight));
418  break;
419  }
420  case SideBarLocation::South: {
421  const int maxHeight = sb->pos().y() - m_layoutWidget->pos().y() - 10; // gap
422  const int bottom = newGeometry.bottom();
423  newGeometry.setHeight(qMin(suggestedSize.height(), maxHeight));
424  newGeometry.moveBottom(bottom);
425  break;
426  }
427  case SideBarLocation::East: {
428  const int maxWidth = sb->pos().x() - m_layoutWidget->pos().x() - 10; // gap
429  const int right = newGeometry.right();
430  newGeometry.setWidth(qMin(suggestedSize.width(), maxWidth));
431  newGeometry.moveRight(right);
432  break;
433  }
434  case SideBarLocation::West: {
435  const int maxWidth = q->width() - frame->pos().x() - 10; // gap
436  newGeometry.setWidth(qMin(suggestedSize.width(), maxWidth));
437  break;
438  }
440  qWarning() << Q_FUNC_INFO << "Unexpected sidebar value";
441  break;
442  }
443  }
444 
445  m_overlayedDockWidget->d->frame()->QWidgetAdapter::setGeometry(newGeometry);
446 }
447 
448 void MainWindowBase::Private::clearSideBars()
449 {
452  if (SideBar *sb = q->sideBar(loc))
453  sb->clear();
454  }
455 }
456 
458 {
459  moveToSideBar(dw, d->preferredSideBar(dw));
460 }
461 
463 {
464  if (SideBar *sb = sideBar(location)) {
465  QScopedValueRollback<bool> rollback(dw->d->m_isMovingToSideBar, true);
466  dw->forceClose();
467  sb->addDockWidget(dw);
468  } else {
469  // Shouldn't happen
470  qWarning() << Q_FUNC_INFO << "Minimization supported, probably disabled in Config::self().flags()";
471  }
472 }
473 
475 {
476  // First un-overlay it, if it's overlayed
477  if (dw == d->m_overlayedDockWidget)
479 
480  SideBar *sb = sideBarForDockWidget(dw);
481  if (!sb) {
482  // Doesn't happen
483  qWarning() << Q_FUNC_INFO << "Dock widget isn't in any sidebar";
484  return;
485  }
486 
487  sb->removeDockWidget(dw);
488  dw->setFloating(false); // dock it
489 }
490 
492 {
493  if (!dw)
494  return;
495 
496  const SideBar *sb = sideBarForDockWidget(dw);
497  if (!sb) {
498  qWarning() << Q_FUNC_INFO << "You need to add the dock widget to the sidebar before you can overlay it";
499  return;
500  }
501 
502  if (d->m_overlayedDockWidget == dw) {
503  // Already overlayed
504  return;
505  }
506 
507  // We only support one overlay at a time, remove any existing overlay
509 
511  d->m_overlayedDockWidget = dw;
512  frame->addWidget(dw);
513  d->updateOverlayGeometry(dw->d->lastPositions().lastOverlayedGeometry(sb->location()).size());
514 
515  frame->setAllowedResizeSides(d->allowedResizeSides(sb->location()));
516  frame->QWidgetAdapter::show();
517 
518  Q_EMIT dw->isOverlayedChanged(true);
519 }
520 
522 {
523  const bool wasOverlayed = d->m_overlayedDockWidget == dw;
524  clearSideBarOverlay(); // Because only 1 dock widget can be overlayed each time
525  if (!wasOverlayed) {
526  overlayOnSideBar(dw);
527  }
528 }
529 
531 {
532  if (!d->m_overlayedDockWidget)
533  return;
534 
535  Frame *frame = d->m_overlayedDockWidget->d->frame();
536  if (!frame) { // prophylactic check
537  d->m_overlayedDockWidget = nullptr;
538  return;
539  }
540 
541  const SideBarLocation loc = d->m_overlayedDockWidget->sideBarLocation();
542  d->m_overlayedDockWidget->d->lastPositions().setLastOverlayedGeometry(
543  loc, frame->QWidgetAdapter::geometry());
544 
545  frame->unoverlay();
546 
547  if (deleteFrame) {
548  d->m_overlayedDockWidget->setParent(nullptr);
549  Q_EMIT d->m_overlayedDockWidget->isOverlayedChanged(false);
550  d->m_overlayedDockWidget = nullptr;
551  delete frame;
552  } else {
553  // No cleanup, just unset. When we drag the overlay it becomes a normal floating window
554  // meaning we reuse Frame. Don't delete it.
555  Q_EMIT d->m_overlayedDockWidget->isOverlayedChanged(false);
556  d->m_overlayedDockWidget = nullptr;
557  }
558 }
559 
561 {
564 
565  if (SideBar *sb = sideBar(loc)) {
566  if (sb->containsDockWidget(const_cast<DockWidgetBase *>(dw)))
567  return sb;
568  }
569  }
570 
571  return nullptr;
572 }
573 
575 {
576  return d->m_overlayedDockWidget;
577 }
578 
580 {
581  if (SideBar *sb = sideBar(loc)) {
582  return !sb->isEmpty(); // isVisible() is always true, but its height is 0 when empty.
583  }
584 
585  return false;
586 }
587 
589 {
592  if (sideBarIsVisible(loc))
593  return true;
594  }
595 
596  return false;
597 }
598 
600 {
601  return d->m_options & MainWindowOption_MDI;
602 }
603 
605 {
606  bool allClosed = true;
607 
608  const auto dockWidgets = d->m_layoutWidget->dockWidgets();
609  for (DockWidgetBase *dw : dockWidgets) {
610  Frame *frame = dw->d->frame();
611 
612  if (force) {
613  dw->forceClose();
614  } else {
615  const bool closed = dw->close();
616  allClosed = allClosed && closed;
617  }
618 
619  if (frame->beingDeletedLater()) {
620  // The dock widget was closed and this frame is empty, delete immediately instead of
621  // waiting. I'm not a big fan of deleting stuff later, as state becomes inconsistent
622 
623  // Empty frames are historically deleted later since they are triggered by mouse click
624  // on the title bar, and the title bar is inside the frame.
625  // When doing it programmatically we can delete immediately.
626 
627  delete frame;
628  }
629  }
630 
631  return allClosed;
632 }
633 
634 void MainWindowBase::setUniqueName(const QString &uniqueName)
635 {
636  if (uniqueName.isEmpty())
637  return;
638 
639  if (d->name.isEmpty()) {
640  d->name = uniqueName;
642  DockRegistry::self()->registerMainWindow(this);
643  } else {
644  qWarning() << Q_FUNC_INFO << "Already has a name." << this->uniqueName() << uniqueName;
645  }
646 }
647 
649 {
650  d->updateOverlayedDockWidgetGeometries();
651 }
652 
653 bool MainWindowBase::deserialize(const LayoutSaver::MainWindow &mw)
654 {
655  if (mw.options != options()) {
656  qWarning() << Q_FUNC_INFO << "Refusing to restore MainWindow with different options"
657  << "; expected=" << mw.options << "; has=" << options();
658  return false;
659  }
660 
661  if (d->affinities != mw.affinities) {
662  qWarning() << Q_FUNC_INFO << "Affinty name changed from" << d->affinities
663  << "; to" << mw.affinities;
664 
665  d->affinities = mw.affinities;
666  }
667 
668  const bool success = layoutWidget()->deserialize(mw.multiSplitterLayout);
669 
670  // Restore the SideBars
671  d->clearSideBars();
673  SideBar *sb = sideBar(loc);
674  if (!sb)
675  continue;
676 
677  const QStringList dockWidgets = mw.dockWidgetsPerSideBar.value(loc);
678  for (const QString &uniqueName : dockWidgets) {
679 
680  DockWidgetBase *dw = DockRegistry::self()->dockByName(uniqueName, DockRegistry::DockByNameFlag::CreateIfNotFound);
681  if (!dw) {
682  qWarning() << Q_FUNC_INFO << "Could not find dock widget" << uniqueName
683  << ". Won't restore it to sidebar";
684  continue;
685  }
686 
687  sb->addDockWidget(dw);
688  }
689  }
690 
691  // Commented-out for now, we don't want to restore the popup/overlay. popups are perishable
692  //if (!mw.overlayedDockWidget.isEmpty())
693  // overlayOnSideBar(DockRegistry::self()->dockByName(mw.overlayedDockWidget));
694 
695  return success;
696 }
697 
698 LayoutSaver::MainWindow MainWindowBase::serialize() const
699 {
700  LayoutSaver::MainWindow m;
701 
702  m.options = options();
703  m.geometry = windowGeometry();
704  m.isVisible = isVisible();
705  m.uniqueName = uniqueName();
706  m.screenIndex = screenNumberForWidget(this);
707  m.screenSize = screenSizeForWidget(this);
708  m.multiSplitterLayout = layoutWidget()->serialize();
709  m.affinities = d->affinities;
710  m.windowState = windowHandle() ? windowHandle()->windowState()
712 
714  if (SideBar *sb = sideBar(loc)) {
715  const QStringList dockwidgets = sb->serialize();
716  if (!dockwidgets.isEmpty())
717  m.dockWidgetsPerSideBar.insert(loc, dockwidgets);
718  }
719  }
720 
721  return m;
722 }
723 
725 {
726  if (QWindow *window = windowHandle())
727  return window->geometry();
728 
729  return window()->geometry();
730 }
QPointer
KDDockWidgets::MainWindowBase::clearSideBarOverlay
Q_INVOKABLE void clearSideBarOverlay(bool deleteFrame=true)
closes any overlayed dock widget. The sidebar still displays them as button.
Definition: MainWindowBase.cpp:530
KDDockWidgets::MainWindowBase::setUniqueName
void setUniqueName(const QString &uniqueName)
Definition: MainWindowBase.cpp:634
Qt::right
QTextStream & right(QTextStream &stream)
QWidget::window
QWidget * window() const const
QRect::setWidth
void setWidth(int width)
QMainWindow
KDDockWidgets::MainWindowBase::addDockWidget
Q_INVOKABLE void addDockWidget(KDDockWidgets::DockWidgetBase *dockWidget, KDDockWidgets::Location location, KDDockWidgets::DockWidgetBase *relativeTo=nullptr, KDDockWidgets::InitialOption initialOption={})
Docks a DockWidget into this main window.
Definition: MainWindowBase.cpp:130
QMargins::bottom
int bottom() const const
QSize::isValid
bool isValid() const const
KDDockWidgets::MainWindowBase::frameCountChanged
void frameCountChanged(int)
emitted when the number of docked frames changes Note that we're using the "Frame" nomenculature inst...
KDDockWidgets::DockWidgetBase::affinities
QStringList affinities() const
Returns the affinity name. Empty by default.
Definition: DockWidgetBase.cpp:356
QRect::moveBottom
void moveBottom(int y)
KDDockWidgets::MainWindowBase::isMDI
bool isMDI
Definition: MainWindowBase.h:61
QRect
QRect::right
int right() const const
KDDockWidgets::DockWidgetBase::setFloating
bool setFloating(bool floats)
setter to make the dock widget float or dock.
Definition: DockWidgetBase.cpp:172
QObject::Q_EMIT
Q_EMITQ_EMIT
QList::removeAll
int removeAll(const T &value)
KDDockWidgets::InitialOption
Struct describing the preferred dock widget size and visibility when adding it to a layout.
Definition: KDDockWidgets.h:103
KDDockWidgets::MainWindowBase::layoutWidget
LayoutWidget * layoutWidget() const
Definition: MainWindowBase.cpp:166
KDDockWidgets::DockWidgetBase::forceClose
Q_INVOKABLE void forceClose()
Like QWidget::close() but the hosted widget won't be asked if we should close.
Definition: DockWidgetBase.cpp:338
QSize::isEmpty
bool isEmpty() const const
QWindow
QWidget
KDDockWidgets::MainWindowBase::closeDockWidgets
Q_INVOKABLE bool closeDockWidgets(bool force=false)
Closes all dock widgets which are docked into this main window This is convenience to calling DockWid...
Definition: MainWindowBase.cpp:604
KDDockWidgets::MainWindowBase::affinities
QStringList affinities
Definition: MainWindowBase.h:58
QRect::width
int width() const const
KDDockWidgets::Location
Location
Definition: KDDockWidgets.h:45
KDDockWidgets::SideBarLocation::West
@ West
QSize
QRect::x
int x() const const
QRect::y
int y() const const
KDDockWidgets::MainWindowBase::layoutEqually
Q_INVOKABLE void layoutEqually()
layouts all the widgets so they have an equal size within their parent container
Definition: MainWindowBase.cpp:199
KDDockWidgets::MainWindowBase::addDockWidgetAsTab
Q_INVOKABLE void addDockWidgetAsTab(KDDockWidgets::DockWidgetBase *dockwidget)
Docks a DockWidget into the central frame, tabbed.
Definition: MainWindowBase.cpp:102
KDDockWidgets::DockWidgetBase::Option_NotDockable
@ Option_NotDockable
The DockWidget can't be docked, it's always floating.
Definition: DockWidgetBase.h:78
QSize::width
int width() const const
KDDockWidgets::MainWindowBase::anySideBarIsVisible
bool anySideBarIsVisible() const
Returns whether any side bar is visible.
Definition: MainWindowBase.cpp:588
KDDockWidgets::CursorPosition_Left
@ CursorPosition_Left
Definition: KDDockWidgets.h:240
KDDockWidgets::CursorPosition_Bottom
@ CursorPosition_Bottom
Definition: KDDockWidgets.h:243
KDDockWidgets::CursorPosition_Undefined
@ CursorPosition_Undefined
Definition: KDDockWidgets.h:239
QObject::connect
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
KDDockWidgets::MainWindowBase::overlayOnSideBar
Q_INVOKABLE void overlayOnSideBar(KDDockWidgets::DockWidgetBase *)
Shows the dock widget overlayed on top of the main window, placed next to the sidebar.
Definition: MainWindowBase.cpp:491
MainWindowBase.h
The MainWindow base-class that's shared between QtWidgets and QtQuick stack.
KDDockWidgets::MainWindowBase::options
KDDockWidgets::MainWindowOptions options
Definition: MainWindowBase.h:60
KDDockWidgets::FrameOption_IsOverlayed
@ FrameOption_IsOverlayed
Definition: KDDockWidgets.h:261
KDDockWidgets::MainWindowBase::sideBar
virtual SideBar * sideBar(SideBarLocation) const =0
QWidget::isVisible
bool isVisible() const const
QMargins::right
int right() const const
Qt::WindowFlags
typedef WindowFlags
KDDockWidgets::MainWindowOption_MDI
@ MainWindowOption_MDI
Makes the MainWindow always have a central frame, for tabbing documents
Definition: KDDockWidgets.h:58
QRect::bottom
int bottom() const const
QSize::height
int height() const const
QRect::setHeight
void setHeight(int height)
KDDockWidgets::SideBarLocation::None
@ None
QString
createLayoutWidget
static LayoutWidget * createLayoutWidget(MainWindowBase *mainWindow, MainWindowOptions options)
Definition: MainWindowBase.cpp:36
KDDockWidgets::MainWindowBase::~MainWindowBase
~MainWindowBase() override
Definition: MainWindowBase.cpp:96
QString::isEmpty
bool isEmpty() const const
KDDockWidgets::MainWindowBase::multiSplitter
MultiSplitter * multiSplitter() const
Definition: MainWindowBase.cpp:161
QRect::moveTop
void moveTop(int y)
KDDockWidgets::MainWindowBase::mdiLayoutWidget
MDILayoutWidget * mdiLayoutWidget() const
Definition: MainWindowBase.cpp:171
KDDockWidgets::MainWindowBase::dropArea
DropAreaWithCentralFrame * dropArea() const
Definition: MainWindowBase.cpp:156
KDDockWidgets::MainWindowBase::uniqueNameChanged
void uniqueNameChanged()
KDDockWidgets::MainWindowBase::uniqueName
QString uniqueName
Definition: MainWindowBase.h:59
QList::isEmpty
bool isEmpty() const const
Qt::WindowNoState
WindowNoState
KDDockWidgets::Config::frameworkWidgetFactory
FrameworkWidgetFactory * frameworkWidgetFactory() const
getter for the framework widget factory
Definition: Config.cpp:143
KDDockWidgets::MainWindowBase::toggleOverlayOnSideBar
Q_INVOKABLE void toggleOverlayOnSideBar(KDDockWidgets::DockWidgetBase *)
Shows or hides an overlay. It's assumed the dock widget is already in a side-bar.
Definition: MainWindowBase.cpp:521
opposedSideBarLocationForBorder
static SideBarLocation opposedSideBarLocationForBorder(Layouting::LayoutBorderLocation loc)
Definition: MainWindowBase.cpp:287
KDDockWidgets::MainWindowBase::sideBarIsVisible
Q_INVOKABLE bool sideBarIsVisible(KDDockWidgets::SideBarLocation) const
Returns whether the specified sidebar is visible.
Definition: MainWindowBase.cpp:579
QMargins
KDDockWidgets::FrameworkWidgetFactory::createFrame
virtual Frame * createFrame(QWidgetOrQuick *parent=nullptr, FrameOptions options=FrameOption_None) const =0
Called internally by the framework to create a Frame class Override to provide your own Frame sub-cla...
KDDockWidgets::SideBarLocation
SideBarLocation
Each main window supports 4 sidebars.
Definition: KDDockWidgets.h:209
QList::insert
void insert(int i, const T &value)
KDDockWidgets::MainWindowBase::centralWidgetResized
void centralWidgetResized(QSize oldSize, QSize newSize)
emitted when the MainWindow::centralWidget() changes size
KDDockWidgets::SideBarLocation::East
@ East
KDDockWidgets::SideBarLocation::South
@ South
QWidget::windowHandle
QWindow * windowHandle() const const
KDDockWidgets::MainWindowBase::setAffinities
void setAffinities(const QStringList &names)
Sets the affinities names. Dock widgets can only dock into main windows of the same affinity.
Definition: MainWindowBase.cpp:176
KDDockWidgets::MainWindowBase::moveToSideBar
Q_INVOKABLE void moveToSideBar(KDDockWidgets::DockWidgetBase *)
Moves the dock widget into one of the MainWindow's sidebar. Means the dock widget is removed from the...
Definition: MainWindowBase.cpp:457
QRect::height
int height() const const
KDDockWidgets::MainWindowBase::sideBarForDockWidget
Q_INVOKABLE KDDockWidgets::SideBar * sideBarForDockWidget(const KDDockWidgets::DockWidgetBase *) const
Returns the sidebar this dockwidget is in. nullptr if not in any.
Definition: MainWindowBase.cpp:560
KDDockWidgets::SideBarLocation::North
@ North
QMargins::left
int left() const const
QResizeEvent
KDDockWidgets::DockWidgetBase
The DockWidget base-class. DockWidget and DockWidgetBase are only split in two so we can share some c...
Definition: DockWidgetBase.h:61
KDDockWidgets::CursorPosition_Right
@ CursorPosition_Right
Definition: KDDockWidgets.h:241
KDDockWidgets
Definition: Config.cpp:36
QScopedValueRollback
QWidget::geometry
geometry
KDDockWidgets::MainWindowBase::windowGeometry
QRect windowGeometry() const
Returns the window geometry This is usually the same as MainWindowBase::geometry() But fixes the foll...
Definition: MainWindowBase.cpp:724
KDDockWidgets::MainWindowBase::layoutParentContainerEqually
Q_INVOKABLE void layoutParentContainerEqually(KDDockWidgets::DockWidgetBase *dockWidget)
like layoutEqually() but starts with the container that has dockWidget. While layoutEqually() starts ...
Definition: MainWindowBase.cpp:204
KDDockWidgets::MainWindowBase
The MainWindow base-class. MainWindow and MainWindowBase are only split in two so we can share some c...
Definition: MainWindowBase.h:56
QWindow::windowState
Qt::WindowState windowState() const const
QRect::moveLeft
void moveLeft(int x)
sideBarLocationForBorder
static SideBarLocation sideBarLocationForBorder(Layouting::LayoutBorderLocations loc)
Definition: MainWindowBase.cpp:309
KDDockWidgets::MainWindowBase::onResized
void onResized(QResizeEvent *)
Definition: MainWindowBase.cpp:648
KDDockWidgets::DockWidgetBase::options
KDDockWidgets::DockWidgetBase::Options options
Definition: DockWidgetBase.h:69
KDDockWidgets::MainWindowBase::restoreFromSideBar
Q_INVOKABLE void restoreFromSideBar(KDDockWidgets::DockWidgetBase *)
Removes the dock widget from the sidebar and docks it into the main window again.
Definition: MainWindowBase.cpp:474
QMargins::top
int top() const const
QList::value
T value(int i) const const
QPoint
KDDockWidgets::MainWindowBase::MainWindowBase
MainWindowBase(const QString &uniqueName, MainWindowOptions options=MainWindowOption_HasCentralFrame, WidgetType *parent=nullptr, Qt::WindowFlags flags=Qt::WindowFlags())
Definition: MainWindowBase.cpp:81
KDDockWidgets::Config::self
static Config & self()
returns the singleton Config instance
Definition: Config.cpp:82
FrameworkWidgetFactory.h
A factory class for allowing the user to customize some internal widgets.
QStringList
KDDockWidgets::MainWindowOption_HasCentralFrame
@ MainWindowOption_HasCentralFrame
No option set
Definition: KDDockWidgets.h:57
KDDockWidgets::CursorPosition_Top
@ CursorPosition_Top
Definition: KDDockWidgets.h:242
QRect::moveRight
void moveRight(int x)
KDDockWidgets::MainWindowBase::overlayedDockWidget
DockWidgetBase * overlayedDockWidget() const
returns the dock widget which is currently overlayed. nullptr if none. This is only relevant when usi...
Definition: MainWindowBase.cpp:574
KDDockWidgets::DockWidgetBase::isOverlayedChanged
void isOverlayedChanged(bool)
emitted when isOverlayed changes

© 2019-2021 Klarälvdalens Datakonsult AB (KDAB)
"The Qt, C++ and OpenGL Experts"
https://www.kdab.com/
KDDockWidgets
Advanced Dock Widget Framework for Qt
https://www.kdab.com/development-resources/qt-tools/kddockwidgets/
Generated on Mon Nov 15 2021 00:17:27 for KDDockWidgets API Documentation by doxygen 1.8.20