KDDockWidgets API Documentation  1.4
Frame.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 
19 #include "Frame_p.h"
20 #include "Config.h"
21 #include "DockRegistry_p.h"
22 #include "DockWidgetBase_p.h"
23 #include "FloatingWindow_p.h"
24 #include "FrameworkWidgetFactory.h"
25 #include "LayoutSaver_p.h"
26 #include "LayoutWidget_p.h"
27 #include "Logging_p.h"
28 #include "Position_p.h"
29 #include "TabWidget_p.h"
30 #include "TitleBar_p.h"
31 #include "Utils_p.h"
32 #include "WidgetResizeHandler_p.h"
33 #include "MDILayoutWidget_p.h"
34 
35 #include <QCloseEvent>
36 #include <QTimer>
37 
38 #define MARGIN_THRESHOLD 100
39 
40 static int s_dbg_numFrames = 0;
41 
42 using namespace KDDockWidgets;
43 
44 namespace KDDockWidgets {
45 static FrameOptions actualOptions(FrameOptions options)
46 {
48  options |= FrameOption_AlwaysShowsTabs;
49 
50  return options;
51 }
52 }
53 
54 Frame::Frame(QWidgetOrQuick *parent, FrameOptions options, int userType)
55  : LayoutGuestWidget(parent)
56  , FocusScope(this)
57  , m_tabWidget(Config::self().frameworkWidgetFactory()->createTabWidget(this))
58  , m_titleBar(Config::self().frameworkWidgetFactory()->createTitleBar(this))
59  , m_options(actualOptions(options))
60  , m_userType(userType)
61 {
63  DockRegistry::self()->registerFrame(this);
64 
65  connect(this, &Frame::currentDockWidgetChanged, this, &Frame::updateTitleAndIcon);
66 
67  connect(m_tabWidget->asWidget(), SIGNAL(currentTabChanged(int)), // clazy:exclude=old-style-connect
68  this, SLOT(onCurrentTabChanged(int)));
69 
70  setLayoutWidget(qobject_cast<LayoutWidget *>(QWidgetAdapter::parentWidget()));
71  m_inCtor = false;
72 }
73 
74 Frame::~Frame()
75 {
76  m_inDtor = true;
78  if (m_layoutItem)
79  m_layoutItem->unref();
80 
81  delete m_resizeHandler;
82  m_resizeHandler = nullptr;
83 
84  DockRegistry::self()->unregisterFrame(this);
85 
86  // Run some disconnects() too, so we don't receive signals during destruction:
87  setLayoutWidget(nullptr);
88 }
89 
90 void Frame::updateTitleAndIcon()
91 {
92  if (DockWidgetBase *dw = currentDockWidget()) {
93  m_titleBar->setTitle(dw->title());
94  m_titleBar->setIcon(dw->icon());
95 
96  if (auto fw = floatingWindow()) {
97  if (fw->hasSingleFrame()) {
98  fw->updateTitleAndIcon();
99  }
100  }
101 
102  setObjectName(dw->uniqueName());
103 
104  } else if (currentTabIndex() != -1) {
105  qWarning() << Q_FUNC_INFO << "Invalid dock widget for frame." << currentTabIndex();
106  }
107 }
108 
109 void Frame::onDockWidgetTitleChanged()
110 {
111  updateTitleAndIcon();
112 
113  if (!m_inCtor) { // don't call pure virtual in ctor
114  if (auto dw = qobject_cast<DockWidgetBase *>(sender())) {
115  int index = indexOfDockWidget(dw);
116  renameTab(index, dw->title());
117  changeTabIcon(index, dw->icon(DockWidgetBase::IconPlace::TabBar));
118  }
119  }
120 }
121 
122 void Frame::addWidget(DockWidgetBase *dockWidget, InitialOption addingOption)
123 {
124  insertWidget(dockWidget, dockWidgetCount(), addingOption); // append
125 }
126 
127 void Frame::addWidget(Frame *frame, InitialOption addingOption)
128 {
129  if (frame->isEmpty()) {
130  qWarning() << "Frame::addWidget: frame is empty." << frame;
131  return;
132  }
133 
134  const auto &docks = frame->dockWidgets();
135  for (DockWidgetBase *dockWidget : docks)
136  addWidget(dockWidget, addingOption);
137 }
138 
139 void Frame::addWidget(FloatingWindow *floatingWindow, InitialOption addingOption)
140 {
141  Q_ASSERT(floatingWindow);
142  for (Frame *f : floatingWindow->frames())
143  addWidget(f, addingOption);
144 }
145 
146 void Frame::insertWidget(DockWidgetBase *dockWidget, int index, InitialOption addingOption)
147 {
148  Q_ASSERT(dockWidget);
149  if (containsDockWidget(dockWidget)) {
150  qWarning() << "Frame::addWidget dockWidget already exists. this=" << this << "; dockWidget=" << dockWidget;
151  return;
152  }
153  if (m_layoutItem)
154  dockWidget->d->addPlaceholderItem(m_layoutItem);
155 
156  insertDockWidget(dockWidget, index);
157 
158  if (addingOption.startsHidden()) {
159  dockWidget->close(); // Ensure closed
160  } else {
161  if (hasSingleDockWidget()) {
162  Q_EMIT currentDockWidgetChanged(dockWidget);
163  setObjectName(dockWidget->uniqueName());
164 
165  if (!m_layoutItem) {
166  // When adding the 1st dock widget of a fresh frame, let's give the frame the size
167  // of the dock widget, so that when adding it to the main window, the main window can
168  // use that size as the initial suggested size.
169  resize(dockWidget->size());
170  }
171  }
172  }
173 
174  connect(dockWidget, &DockWidgetBase::titleChanged, this, &Frame::onDockWidgetTitleChanged);
175  connect(dockWidget, &DockWidgetBase::iconChanged, this, &Frame::onDockWidgetTitleChanged);
176 }
177 
178 void Frame::removeWidget(DockWidgetBase *dw)
179 {
180  disconnect(dw, &DockWidgetBase::titleChanged, this, &Frame::onDockWidgetTitleChanged);
181  disconnect(dw, &DockWidgetBase::iconChanged, this, &Frame::onDockWidgetTitleChanged);
182  removeWidget_impl(dw);
183 }
184 
185 FloatingWindow *Frame::detachTab(DockWidgetBase *dockWidget)
186 {
187  if (m_inCtor || m_inDtor)
188  return nullptr;
189 
190  dockWidget->d->saveTabIndex();
191 
192  QRect r = dockWidget->geometry();
193  removeWidget(dockWidget);
194 
195  auto newFrame = Config::self().frameworkWidgetFactory()->createFrame();
196  const QPoint globalPoint = mapToGlobal(QPoint(0, 0));
197  newFrame->addWidget(dockWidget);
198 
199  // We're potentially already dead at this point, as frames with 0 tabs auto-destruct. Don't access members from this point.
200 
201  auto floatingWindow = Config::self().frameworkWidgetFactory()->createFloatingWindow(newFrame);
202  r.moveTopLeft(globalPoint);
203  floatingWindow->setSuggestedGeometry(r, SuggestedGeometryHint_GeometryIsFromDocked);
204  floatingWindow->show();
205 
206  return floatingWindow;
207 }
208 
209 int Frame::indexOfDockWidget(const DockWidgetBase *dw)
210 {
211  if (m_inCtor || m_inDtor)
212  return -1;
213 
214  return indexOfDockWidget_impl(dw);
215 }
216 
217 int Frame::currentIndex() const
218 {
219  if (m_inCtor || m_inDtor)
220  return -1;
221 
222  return currentIndex_impl();
223 }
224 
225 void Frame::setCurrentTabIndex(int index)
226 {
227  if (m_inCtor || m_inDtor)
228  return;
229 
230  setCurrentTabIndex_impl(index);
231 }
232 
233 void Frame::setCurrentDockWidget(DockWidgetBase *dw)
234 {
235  if (m_inCtor || m_inDtor)
236  return;
237 
238  setCurrentDockWidget_impl(dw);
239 }
240 
241 void Frame::insertDockWidget(DockWidgetBase *dw, int index)
242 {
243  if (m_inCtor || m_inDtor)
244  return;
245 
246  insertDockWidget_impl(dw, index);
247 }
248 
249 DockWidgetBase *Frame::dockWidgetAt(int index) const
250 {
251  if (m_inCtor || m_inDtor)
252  return nullptr;
253 
254  return dockWidgetAt_impl(index);
255 }
256 
257 DockWidgetBase *Frame::currentDockWidget() const
258 {
259  if (m_inCtor || m_inDtor)
260  return nullptr;
261 
262  return currentDockWidget_impl();
263 }
264 
265 int Frame::dockWidgetCount() const
266 {
267  if (m_inCtor || m_inDtor)
268  return 0;
269 
270  return m_tabWidget->numDockWidgets();
271 }
272 
273 void Frame::onDockWidgetCountChanged()
274 {
275  qCDebug(docking) << "Frame::onDockWidgetCountChanged:" << this << "; widgetCount=" << dockWidgetCount();
276  if (isEmpty() && !isCentralFrame()) {
277  scheduleDeleteLater();
278  } else {
279  updateTitleBarVisibility();
280 
281  // We don't really keep track of the state, so emit even if the visibility didn't change. No biggie.
282  if (!(m_options & FrameOption_AlwaysShowsTabs))
283  Q_EMIT hasTabsVisibleChanged();
284 
285  const DockWidgetBase::List docks = dockWidgets();
286  for (DockWidgetBase *dock : docks)
287  dock->d->updateFloatAction();
288  }
289 
290  Q_EMIT numDockWidgetsChanged();
291 }
292 
293 void Frame::onCurrentTabChanged(int index)
294 {
295  if (index != -1) {
296  if (auto dock = dockWidgetAt(index)) {
297  Q_EMIT currentDockWidgetChanged(dock);
298  } else {
299  qWarning() << "dockWidgetAt" << index << "returned nullptr" << this;
300  }
301  }
302 }
303 
304 void Frame::isFocusedChangedCallback()
305 {
306  Q_EMIT isFocusedChanged();
307 }
308 
309 void Frame::focusedWidgetChangedCallback()
310 {
311  Q_EMIT focusedWidgetChanged();
312 }
313 
314 void Frame::updateTitleBarVisibility()
315 {
316  if (m_updatingTitleBar || m_beingDeleted) {
317  // To break a cyclic dependency
318  return;
319  }
320 
321  QScopedValueRollback<bool> guard(m_updatingTitleBar, true);
322 
323  bool visible = false;
324  if (isCentralFrame()) {
325  visible = false;
326  } else if ((Config::self().flags() & Config::Flag_HideTitleBarWhenTabsVisible) && hasTabsVisible()) {
327  visible = false;
328  } else if (FloatingWindow *fw = floatingWindow()) {
329  // If there's nested frames then show each Frame's title bar
330  visible = !fw->hasSingleFrame();
331  } else {
332  visible = true;
333  }
334 
335  const bool wasVisible = m_titleBar->isVisible();
336  m_titleBar->setVisible(visible);
337 
338  if (wasVisible != visible) {
339  Q_EMIT actualTitleBarChanged();
340  for (auto dw : dockWidgets())
341  Q_EMIT dw->actualTitleBarChanged();
342  }
343 
344  if (auto fw = floatingWindow()) {
345  // Update the floating window which might be using Flag_HideTitleBarWhenTabsVisible
346  // In that case it might not show title bar depending on the number of tabs that the frame has
347  fw->updateTitleBarVisibility();
348  }
349 }
350 
351 void Frame::updateFloatingActions()
352 {
353  const QVector<DockWidgetBase *> widgets = dockWidgets();
354  for (DockWidgetBase *dw : widgets)
355  dw->d->updateFloatAction();
356 }
357 
358 bool Frame::containsMouse(QPoint globalPos) const
359 {
360  return QWidgetAdapter::rect().contains(KDDockWidgets::QWidgetAdapter::mapFromGlobal(globalPos));
361 }
362 
363 TitleBar *Frame::titleBar() const
364 {
365  return m_titleBar;
366 }
367 
368 TitleBar *Frame::actualTitleBar() const
369 {
370  if (FloatingWindow *fw = floatingWindow()) {
371  // If there's nested frames then show each Frame's title bar
372  if (fw->hasSingleFrame())
373  return fw->titleBar();
374  }
375 
376  return titleBar();
377 }
378 
379 QString Frame::title() const
380 {
381  return m_titleBar->title();
382 }
383 
384 QIcon Frame::icon() const
385 {
386  return m_titleBar->icon();
387 }
388 
389 const DockWidgetBase::List Frame::dockWidgets() const
390 {
391  if (m_inCtor || m_inDtor)
392  return {};
393 
394  DockWidgetBase::List dockWidgets;
395  const int count = dockWidgetCount();
396  dockWidgets.reserve(count);
397  for (int i = 0; i < count; ++i)
398  dockWidgets << dockWidgetAt(i);
399 
400  return dockWidgets;
401 }
402 
403 bool Frame::containsDockWidget(DockWidgetBase *dockWidget) const
404 {
405  const int count = dockWidgetCount();
406  for (int i = 0, e = count; i != e; ++i) {
407  if (dockWidget == dockWidgetAt(i))
408  return true;
409  }
410  return false;
411 }
412 
413 FloatingWindow *Frame::floatingWindow() const
414 {
415  // Returns the first FloatingWindow* parent in the hierarchy.
416  // However, if there's a MainWindow in the hierarchy it stops, which can
417  // happen with nested main windows.
418 
419  auto p = QWidgetAdapter::parentWidget();
420  while (p) {
421  if (qobject_cast<KDDockWidgets::MainWindowBase *>(p))
422  return nullptr;
423 
424  if (auto fw = qobject_cast<FloatingWindow *>(p))
425  return fw;
426 
427  if (p == window()) {
428  // We stop at the window. (top-levels can have parent, but we're not interested)
429  return nullptr;
430  }
431 
432  p = p->parentWidget();
433  }
434 
435  return nullptr;
436 }
437 
438 void Frame::restoreToPreviousPosition()
439 {
440  if (hasSingleDockWidget()) {
441  qWarning() << Q_FUNC_INFO << "Invalid usage, there's no tabs";
442  return;
443  }
444 
445  if (!m_layoutItem) {
446  qCDebug(placeholder) << Q_FUNC_INFO << "There's no previous position known";
447  return;
448  }
449 
450  if (!m_layoutItem->isPlaceholder()) {
451  // Maybe in this case just fold the frame into the placeholder, which probably has other dockwidgets which were added meanwhile. TODO
452  qCDebug(placeholder) << Q_FUNC_INFO << "Previous position isn't a placeholder";
453  return;
454  }
455 
456  m_layoutItem->restore(this);
457 }
458 
459 int Frame::currentTabIndex() const
460 {
461  return currentIndex();
462 }
463 
464 void Frame::onCloseEvent(QCloseEvent *e)
465 {
466  qCDebug(closing) << "Frame::closeEvent";
467  e->accept(); // Accepted by default (will close unless ignored)
468  const DockWidgetBase::List docks = dockWidgets();
469  for (DockWidgetBase *dock : docks) {
470  qApp->sendEvent(dock, e);
471  if (!e->isAccepted())
472  break; // Stop when the first dockwidget prevents closing
473  }
474 }
475 
476 bool Frame::anyNonClosable() const
477 {
478  for (auto dw : dockWidgets()) {
479  if ((dw->options() & DockWidgetBase::Option_NotClosable) && !DockRegistry::self()->isProcessingAppQuitEvent())
480  return true;
481  }
482 
483  return false;
484 }
485 
486 bool Frame::anyNonDockable() const
487 {
488  for (auto dw : dockWidgets()) {
489  if (dw->options() & DockWidgetBase::Option_NotDockable)
490  return true;
491  }
492 
493  return false;
494 }
495 
496 void Frame::onDockWidgetShown(DockWidgetBase *w)
497 {
498  if (hasSingleDockWidget() && containsDockWidget(w)) { // We have to call contains because it might be being in process of being reparented
499  if (!QWidgetAdapter::isVisible()) {
500  qCDebug(hiding) << "Widget" << w << " was shown, we're="
501  << "; visible="
502  << QWidgetAdapter::isVisible();
503  QWidgetAdapter::setVisible(true);
504  }
505  }
506 }
507 
508 void Frame::onDockWidgetHidden(DockWidgetBase *w)
509 {
510  if (!isCentralFrame() && hasSingleDockWidget() && containsDockWidget(w)) { // We have to call contains because it might be being in process of being reparented
511  if (QWidgetAdapter::isVisible()) {
512  qCDebug(hiding) << "Widget" << w << " was hidden, we're="
513  << "; visible=" << QWidgetAdapter::isVisible()
514  << "; dockWidgets=" << dockWidgets();
515  QWidgetAdapter::setVisible(false);
516  }
517  }
518 }
519 
520 void Frame::setLayoutItem(Layouting::Item *item)
521 {
522  if (item == m_layoutItem)
523  return;
524 
525  if (m_layoutItem)
526  m_layoutItem->unref();
527 
528  if (item)
529  item->ref();
530 
531  m_layoutItem = item;
532  if (item) {
533  for (DockWidgetBase *dw : dockWidgets())
534  dw->d->addPlaceholderItem(item);
535  } else {
536  for (DockWidgetBase *dw : dockWidgets())
537  dw->d->lastPositions().removePlaceholders();
538  }
539 }
540 
541 Layouting::Item *Frame::layoutItem() const
542 {
543  return m_layoutItem;
544 }
545 
546 int Frame::dbg_numFrames()
547 {
548  return s_dbg_numFrames;
549 }
550 
551 bool Frame::beingDeletedLater() const
552 {
553  return m_beingDeleted;
554 }
555 
556 bool Frame::hasTabsVisible() const
557 {
558  if (m_beingDeleted)
559  return false;
560 
561  return alwaysShowsTabs() || dockWidgetCount() > 1;
562 }
563 
564 QStringList Frame::affinities() const
565 {
566  if (isEmpty()) {
567  return {};
568  } else {
569  return dockWidgetAt(0)->affinities();
570  }
571 }
572 
573 void Frame::setLayoutWidget(LayoutWidget *dt)
574 {
575  if (dt == m_layoutWidget)
576  return;
577 
578  const bool wasInMainWindow = dt && isInMainWindow();
579  const bool wasMDI = isMDI();
580  if (m_layoutWidget)
581  disconnect(m_visibleWidgetCountChangedConnection);
582 
583  m_layoutWidget = dt;
584  delete m_resizeHandler;
585  m_resizeHandler = nullptr;
586 
587  if (m_layoutWidget) {
588  if (isMDI())
589  m_resizeHandler = new WidgetResizeHandler(/*topLevel=*/false, this);
590 
591  // We keep the connect result so we don't dereference m_layoutWidget at shutdown
592  m_visibleWidgetCountChangedConnection =
593  connect(m_layoutWidget, &LayoutWidget::visibleWidgetCountChanged, this,
594  &Frame::updateTitleBarVisibility);
595  updateTitleBarVisibility();
596  if (wasInMainWindow != isInMainWindow())
597  Q_EMIT isInMainWindowChanged();
598  }
599 
600  if (wasMDI != isMDI())
601  Q_EMIT isMDIChanged();
602 }
603 
604 bool Frame::isTheOnlyFrame() const
605 {
606  return m_layoutWidget && m_layoutWidget->visibleCount() == 1;
607 }
608 
609 bool Frame::isOverlayed() const
610 {
611  return m_options & FrameOption_IsOverlayed;
612 }
613 
614 void Frame::unoverlay()
615 {
616  m_options &= ~FrameOption_IsOverlayed;
617 }
618 
619 bool Frame::isFloating() const
620 {
621  if (isInMainWindow())
622  return false;
623 
624  return isTheOnlyFrame();
625 }
626 
627 bool Frame::isInFloatingWindow() const
628 {
629  return floatingWindow() != nullptr;
630 }
631 
632 bool Frame::isInMainWindow() const
633 {
634  return mainWindow() != nullptr;
635 }
636 
637 bool Frame::event(QEvent *e)
638 {
639  if (e->type() == QEvent::ParentChange) {
640  if (auto layoutWidget = qobject_cast<LayoutWidget *>(QWidgetAdapter::parentWidget())) {
641  setLayoutWidget(layoutWidget);
642  } else {
643  setLayoutWidget(nullptr);
644  }
645  }
646 
647  return QWidgetAdapter::event(e);
648 }
649 
650 Frame *Frame::deserialize(const LayoutSaver::Frame &f)
651 {
652  if (!f.isValid())
653  return nullptr;
654 
655  auto frame = Config::self().frameworkWidgetFactory()->createFrame(/*parent=*/nullptr, FrameOptions(f.options));
656  frame->setObjectName(f.objectName);
657 
658  for (const auto &savedDock : qAsConst(f.dockWidgets)) {
659  if (DockWidgetBase *dw = DockWidgetBase::deserialize(savedDock)) {
660  frame->addWidget(dw);
661  }
662  }
663 
664  frame->setCurrentTabIndex(f.currentTabIndex);
665  frame->QWidgetAdapter::setGeometry(f.geometry);
666 
667  return frame;
668 }
669 
670 LayoutSaver::Frame Frame::serialize() const
671 {
672  LayoutSaver::Frame frame;
673  frame.isNull = false;
674 
675  const DockWidgetBase::List docks = dockWidgets();
676 
677  frame.objectName = objectName();
678  frame.geometry = QWidgetAdapter::geometry();
679  frame.options = options();
680  frame.currentTabIndex = currentTabIndex();
681  frame.id = id(); // for coorelation purposes
682 
683  for (DockWidgetBase *dock : docks)
684  frame.dockWidgets.push_back(dock->d->serialize());
685 
686  return frame;
687 }
688 
689 void Frame::scheduleDeleteLater()
690 {
691  qCDebug(creation) << Q_FUNC_INFO << this;
692  m_beingDeleted = true;
693  QTimer::singleShot(0, this, [this] {
694  // Can't use deleteLater() here due to QTBUG-83030 (deleteLater() never delivered if triggered by a sendEvent() before event loop starts)
695  delete this;
696  });
697 }
698 
699 QSize Frame::dockWidgetsMinSize() const
700 {
701  QSize size = Layouting::Item::hardcodedMinimumSize;
702  for (DockWidgetBase *dw : dockWidgets())
704 
705  return size;
706 }
707 
708 QSize Frame::biggestDockWidgetMaxSize() const
709 {
710  QSize size = Layouting::Item::hardcodedMaximumSize;
711  for (DockWidgetBase *dw : dockWidgets()) {
712  const QSize dwMax = widgetMaxSize(dw);
713  if (size == Layouting::Item::hardcodedMaximumSize) {
714  size = dwMax;
715  continue;
716  }
717 
718  const bool hasMaxSize = dwMax != Layouting::Item::hardcodedMaximumSize;
719  if (hasMaxSize)
720  size = dw->maximumSize().expandedTo(size);
721  }
722 
723  // Interpret 0 max-size as not having one too.
724  if (size.width() == 0)
725  size.setWidth(Layouting::Item::hardcodedMaximumSize.width());
726  if (size.height() == 0)
727  size.setHeight(Layouting::Item::hardcodedMaximumSize.height());
728 
729  return size;
730 }
731 
732 QRect Frame::dragRect() const
733 {
734  QRect rect;
735  if (m_titleBar->isVisible()) {
736  rect = m_titleBar->rect();
737  rect.moveTopLeft(m_titleBar->mapToGlobal(QPoint(0, 0)));
738  }
739 
740  return rect;
741 }
742 
743 MainWindowBase *Frame::mainWindow() const
744 {
745  return m_layoutWidget ? m_layoutWidget->mainWindow() : nullptr;
746 }
747 
748 TabWidget *Frame::tabWidget() const
749 {
750  return m_tabWidget;
751 }
752 
754 bool Frame::allDockWidgetsHave(DockWidgetBase::Option option) const
755 {
756  const DockWidgetBase::List docks = dockWidgets();
757  return std::all_of(docks.cbegin(), docks.cend(), [option](DockWidgetBase *dw) {
758  return dw->options() & option;
759  });
760 }
761 
763 bool Frame::anyDockWidgetsHas(DockWidgetBase::Option option) const
764 {
765  const DockWidgetBase::List docks = dockWidgets();
766  return std::any_of(docks.cbegin(), docks.cend(), [option](DockWidgetBase *dw) {
767  return dw->options() & option;
768  });
769 }
770 
771 bool Frame::allDockWidgetsHave(DockWidgetBase::LayoutSaverOption option) const
772 {
773  const DockWidgetBase::List docks = dockWidgets();
774  return std::all_of(docks.cbegin(), docks.cend(), [option](DockWidgetBase *dw) {
775  return dw->layoutSaverOptions() & option;
776  });
777 }
778 
779 bool Frame::anyDockWidgetsHas(DockWidgetBase::LayoutSaverOption option) const
780 {
781  const DockWidgetBase::List docks = dockWidgets();
782  return std::any_of(docks.cbegin(), docks.cend(), [option](DockWidgetBase *dw) {
783  return dw->layoutSaverOptions() & option;
784  });
785 }
786 
787 void Frame::setAllowedResizeSides(CursorPositions sides)
788 {
789  if (sides) {
790  delete m_resizeHandler;
791  m_resizeHandler = new WidgetResizeHandler(/*topLevel=*/false, this);
792  m_resizeHandler->setAllowedResizeSides(sides);
793  } else {
794  delete m_resizeHandler;
795  m_resizeHandler = nullptr;
796  }
797 }
798 
799 bool Frame::isMDI() const
800 {
801  return mdiLayoutWidget() != nullptr;
802 }
803 
804 MDILayoutWidget *Frame::mdiLayoutWidget() const
805 {
806  return qobject_cast<MDILayoutWidget *>(m_layoutWidget);
807 }
808 
809 int Frame::userType() const
810 {
811  return m_userType;
812 }
813 
814 WidgetResizeHandler *Frame::resizeHandler() const
815 {
816  return m_resizeHandler;
817 }
QRect::moveTopLeft
void moveTopLeft(const QPoint &position)
Layouting::Widget::widgetMinSize
static QSize widgetMinSize(const T *w)
Definition: Widget.h:152
QEvent::ParentChange
ParentChange
QRect
KDDockWidgets::InitialOption
Struct describing the preferred dock widget size and visibility when adding it to a layout.
Definition: KDDockWidgets.h:103
QTimer::singleShot
singleShot
QVector::cend
QVector::const_iterator cend() const const
QWidget
KDDockWidgets::DockWidgetBase::uniqueName
QString uniqueName
Definition: DockWidgetBase.h:65
QSize
QSize::width
int width() const const
QSize::setWidth
void setWidth(int width)
KDDockWidgets::FocusScope
Allows to implement a similar functionality to QtQuick's FocusScope item, in QtWidgets.
Definition: FocusScope.h:28
KDDockWidgets::FrameOption_IsOverlayed
@ FrameOption_IsOverlayed
Definition: KDDockWidgets.h:261
QCloseEvent
QSize::height
int height() const const
QString
QEvent::isAccepted
bool isAccepted() const const
QVector::cbegin
QVector::const_iterator cbegin() const const
KDDockWidgets::FrameOption_AlwaysShowsTabs
@ FrameOption_AlwaysShowsTabs
Definition: KDDockWidgets.h:259
KDDockWidgets::DockWidgetBase::LayoutSaverOption
LayoutSaverOption
Options which will affect LayoutSaver save/restore.
Definition: DockWidgetBase.h:86
KDDockWidgets::Config
Singleton to allow to choose certain behaviours of the framework.
Definition: Config.h:55
KDDockWidgets::LayoutGuestWidget
LayoutGuestWidget is the type that Item will host.
Definition: QWidgetAdapter.h:76
KDDockWidgets::DockWidgetBase::actualTitleBarChanged
void actualTitleBarChanged()
Emitted when the title bar that serves this dock widget changes.
QIcon
QVector::reserve
void reserve(int size)
Config.h
Application-wide config to tune certain behaviours of the framework.
KDDockWidgets::Config::Flag_AlwaysShowTabs
@ Flag_AlwaysShowTabs
Always show tabs, even if there's only one,.
Definition: Config.h:71
QSize::expandedTo
QSize expandedTo(const QSize &otherSize) const const
QEvent::type
QEvent::Type type() const const
QEvent
KDDockWidgets::InitialOption::startsHidden
bool startsHidden() const
Definition: KDDockWidgets.h:131
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
Definition: Config.cpp:36
QScopedValueRollback
KDDockWidgets::MainWindowBase
The MainWindow base-class. MainWindow and MainWindowBase are only split in two so we can share some c...
Definition: MainWindowBase.h:56
QVector
s_dbg_numFrames
static int s_dbg_numFrames
Definition: Frame.cpp:40
KDDockWidgets::DockWidgetBase::Option
Option
DockWidget options to pass at construction time.
Definition: DockWidgetBase.h:75
KDDockWidgets::DockWidgetBase::options
KDDockWidgets::DockWidgetBase::Options options
Definition: DockWidgetBase.h:69
KDDockWidgets::SuggestedGeometryHint_GeometryIsFromDocked
@ SuggestedGeometryHint_GeometryIsFromDocked
Definition: KDDockWidgets.h:202
QSize::setHeight
void setHeight(int height)
KDDockWidgets::actualOptions
static FrameOptions actualOptions(FrameOptions options)
Definition: Frame.cpp:45
QPoint
QEvent::accept
void accept()
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

© 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:21 for KDDockWidgets API Documentation by doxygen 1.8.20