swift
dockwidget.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2014 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
4 #include "gui/dockwidget.h"
5 
6 #include <QApplication>
7 #include <QCloseEvent>
8 #include <QFrame>
9 #include <QLayout>
10 #include <QLayoutItem>
11 #include <QMenu>
12 #include <QPointer>
13 #include <QScopedPointer>
14 #include <QScreen>
15 #include <QSizePolicy>
16 #include <QStatusBar>
17 #include <QStyle>
18 #include <QTimer>
19 #include <QVBoxLayout>
20 #include <QVariant>
21 #include <QWidget>
22 #include <QWidgetAction>
23 #include <Qt>
24 #include <QtGlobal>
25 
27 #include "gui/guiapplication.h"
28 #include "gui/guiutility.h"
29 #include "gui/menus/fontmenus.h"
30 #include "gui/stylesheetutility.h"
31 #include "misc/icons.h"
32 #include "misc/logmessage.h"
33 #include "misc/verify.h"
34 
35 using namespace swift::misc;
36 using namespace swift::gui::components;
37 using namespace swift::gui::settings;
38 using namespace swift::gui::menus;
39 
40 namespace swift::gui
41 {
42  CDockWidget::CDockWidget(bool allowStatusBar, QWidget *parent)
44  CEnableForFramelessWindow(CEnableForFramelessWindow::WindowTool, false, "framelessDockWidget", this),
45  m_allowStatusBar(allowStatusBar)
46  {
47  // init settings
48  this->onStyleSheetsChanged();
49  this->initTitleBarWidgets();
50  m_originalAreas = this->allowedAreas();
51 
52  // context menu
53  m_input = new CMarginsInput(this);
54  m_input->setMaximumWidth(150);
55  m_marginMenuAction = new QWidgetAction(this);
56  m_marginMenuAction->setDefaultWidget(m_input);
57  m_fontMenu = new CFontMenu(this, Qt::WidgetWithChildrenShortcut);
58 
59  this->setContextMenuPolicy(Qt::CustomContextMenu);
60  connect(this, &CDockWidget::customContextMenuRequested, this, &CDockWidget::showContextMenu,
61  Qt::QueuedConnection);
62  connect(m_input, &CMarginsInput::changedMargins, this,
63  &CDockWidget::menuChangeMargins); // only works direct, as QMargins is not registered: 'QMargins' is
64  // registered using qRegisterMetaTyp
65 
66  // connect
68  Qt::QueuedConnection);
69  connect(this, &QDockWidget::topLevelChanged, this, &CDockWidget::onTopLevelChanged, Qt::QueuedConnection);
70  connect(this, &QDockWidget::visibilityChanged, this, &CDockWidget::onVisibilityChanged, Qt::QueuedConnection);
71  connect(m_fontMenu, &CFontMenu::fontSizeMinus, this, &CDockWidget::fontSizeMinus, Qt::QueuedConnection);
72  connect(m_fontMenu, &CFontMenu::fontSizePlus, this, &CDockWidget::fontSizePlus, Qt::QueuedConnection);
73  }
74 
76  {
77  if (this->isFloating())
78  {
79  this->setContentsMargins(this->isFrameless() ? this->getMarginsWhenFramelessFloating() :
80  this->getMarginsWhenFloating());
81  }
82  else { this->setContentsMargins(this->getMarginsWhenDocked()); }
83  }
84 
85  CDockWidget::CDockWidget(QWidget *parent) : CDockWidget(true, parent) {}
86 
88  {
89  if (!m_titleBarWidgetOriginal) { this->initTitleBarWidgets(); }
90  if (this->titleBarWidget() == m_titleBarWidgetOriginal)
91  {
92  return;
93  } // on purpose, as I do not know what happens when I call setTitleBar
94  this->setTitleBarWidget(m_titleBarWidgetOriginal);
95  }
96 
98  {
99  if (!m_titleBarWidgetOriginal) { this->initTitleBarWidgets(); }
100  if (this->titleBarWidget() == m_titleBarWidgetEmpty)
101  {
102  return;
103  } // on purpose, as I do not know what happens when I call setTitleBar
104  this->setTitleBarWidget(m_titleBarWidgetEmpty);
105  }
106 
107  void CDockWidget::setNullTitleBarWidget() { this->setTitleBarWidget(nullptr); }
108 
109  void CDockWidget::setMarginsWhenFloating(const QMargins &margins)
110  {
111  CDockWidgetSettings s = this->getSettings();
112  s.setMarginsWhenFloating(margins);
113  this->saveSettings(s);
114  }
115 
116  void CDockWidget::setMarginsWhenFloating(int left, int top, int right, int bottom)
117  {
118  this->setMarginsWhenFloating(QMargins(left, top, right, bottom));
119  }
120 
121  QMargins CDockWidget::getMarginsWhenFloating() const { return this->getSettings().getMarginsWhenFloating(); }
122 
123  void CDockWidget::setMarginsWhenFramelessFloating(const QMargins &margins)
124  {
125  CDockWidgetSettings s = this->getSettings();
127  this->saveSettings(s);
128  }
129 
130  void CDockWidget::setMarginsWhenFramelessFloating(int left, int top, int right, int bottom)
131  {
132  this->setMarginsWhenFramelessFloating(QMargins(left, top, right, bottom));
133  }
134 
136  {
137  return this->getSettings().getMarginsWhenFramelessFloating();
138  }
139 
140  void CDockWidget::setMarginsWhenDocked(const QMargins &margins)
141  {
142  CDockWidgetSettings s = this->getSettings();
143  s.setMarginsWhenDocked(margins);
144  this->saveSettings(s);
145  }
146 
147  void CDockWidget::setMarginsWhenDocked(int left, int top, int right, int bottom)
148  {
149  this->setMarginsWhenDocked(QMargins(left, top, right, bottom));
150  }
151 
152  QMargins CDockWidget::getMarginsWhenDocked() const { return this->getSettings().getMarginsWhenDocked(); }
153 
154  bool CDockWidget::isWidgetVisible() const { return m_dockWidgetVisible && this->isVisible(); }
155 
156  void CDockWidget::setWindowTitle(const QString &title)
157  {
158  m_windowTitleBackup = title;
159  QDockWidget::setWindowTitle(title);
160  }
161 
163  {
164  if (!m_allowStatusBar || !this->isFloating()) { return; }
165  m_statusBar.displayStatusMessage(statusMessage);
166  }
167 
169  {
170  if (!m_allowStatusBar || !this->isFloating()) { return; }
171  m_statusBar.displayStatusMessages(statusMessages);
172  }
173 
175  {
176  m_windowTitleWhenDocked = show;
177  if (show) { QDockWidget::setWindowTitle(m_windowTitleBackup); }
178  else { QDockWidget::setWindowTitle(""); }
179  }
180 
181  void CDockWidget::resetWasAlreadyFloating() { m_wasAlreadyFloating = false; }
182 
183  void CDockWidget::setPreferredSizeWhenFloating(const QSize &size) { m_preferredSizeWhenFloating = size; }
184 
185  void CDockWidget::setOffsetWhenFloating(const QPoint &point, bool frameless)
186  {
187  Q_UNUSED(frameless)
188  m_offsetWhenFloating = point;
189  }
190 
191  void CDockWidget::setFrameless(bool frameless)
192  {
194 
195  // grip
196  bool hasStatusBar = m_statusBar.getStatusBar();
197  if (frameless)
198  {
199  if (hasStatusBar) { this->addFramelessSizeGripToStatusBar(m_statusBar.getStatusBar()); }
200  }
201  else
202  {
203  if (hasStatusBar) { this->hideFramelessSizeGripInStatusBar(); }
204  }
205 
206  // resize
207  if (frameless)
208  {
209  QWidget *innerWidget = this->widget(); // the inner widget containing the layout
210  Q_ASSERT(innerWidget);
211  this->resize(innerWidget->size());
212  }
213 
214  this->setMargins();
215  this->forceStyleSheetUpdate(); // force style sheet reload
216  }
217 
219  {
220  static const QString s("outerwidget");
221  return s;
222  }
223 
225  {
226  static const QString s("innerwidget");
227  return s;
228  }
229 
231  {
232  const bool changeToFloating = !this->isFloating();
233  if (!changeToFloating) { this->setFrameless(false); } // remove frameless if not floating
234 
235  // disable the interactive docking
236  if (changeToFloating)
237  {
238  m_originalAreas = this->allowedAreas();
239  this->setAllowedAreas(Qt::NoDockWidgetArea);
240  }
241  else { this->setAllowedAreas(m_originalAreas); }
242 
243  this->setAlwaysOnTop(m_alwaysOnTop && changeToFloating);
244  this->setFloating(changeToFloating);
245 
246  const Qt::KeyboardModifiers km = QGuiApplication::queryKeyboardModifiers();
247  const bool shift = km.testFlag(Qt::ShiftModifier);
248 
249  // with shift ALWAYS reset
250  if (shift && changeToFloating) { this->resetPosition(); }
251  if (changeToFloating)
252  {
253  // check where we are, otherwise reset if NOT appropriate
254  const QPoint p = this->rect().topLeft();
255  if (p.x() < 1 || p.y() < 1) { this->resetPosition(); }
256  }
257  }
258 
259  void CDockWidget::toggleVisibility() { this->setVisible(!this->isVisible()); }
260 
262  {
263  const bool frameless = this->isFrameless();
264  this->setFrameless(!frameless);
265  }
266 
279  {
280  if (this->isFloating())
281  {
282  this->setAlwaysOnTopFlag(true);
283  m_alwaysOnTop = true;
284  }
285  }
286 
288  {
289  if (this->isFloating())
290  {
291  this->setAlwaysOnTopFlag(false);
292  m_alwaysOnTop = false;
293  }
294  }
295 
297  {
298  if (onTop) { this->setWindowFlags(this->windowFlags() | Qt::WindowStaysOnTopHint); }
299  else { this->setWindowFlags(this->windowFlags() & ~Qt::WindowStaysOnTopHint); }
300  }
301 
303  {
304  const CDockWidgetSettings s = this->getSettings();
305  if (s.isFloating() != this->isFloating())
306  {
307  this->toggleFloating();
308  QPointer<CDockWidget> myself(this);
309  QTimer::singleShot(500, this, [=] {
310  if (myself) { myself->restoreFromSettings(); }
311  });
312  return true;
313  }
314 
315  if (s.isFramless() != this->isFrameless())
316  {
317  this->toggleFrameless();
318  QPointer<CDockWidget> myself(this);
319  QTimer::singleShot(500, this, [=] {
320  if (myself) { myself->restoreFromSettings(); }
321  });
322  return true;
323  }
324 
325  // now frameless and floating is correct
326  const QByteArray geo(s.getGeometry());
327  if (!geo.isEmpty())
328  {
329  const bool ok = this->restoreGeometry(geo);
330  if (ok) { this->rememberFloatingSizeAndPosition(); }
331  }
332 
333  this->setMargins();
334  return true;
335  }
336 
337  void CDockWidget::closeEvent(QCloseEvent *event)
338  {
339  if (this->isFloating())
340  {
341  this->toggleFloating();
342 
355  event->setAccepted(false); // refuse -> do not close (otherwise crash)
356  }
357  else { QDockWidget::closeEvent(event); }
358  }
359 
360  void CDockWidget::paintEvent(QPaintEvent *event)
361  {
362  CStyleSheetUtility::useStyleSheetInDerivedWidget(this, QStyle::PE_FrameDockWidget);
363  QDockWidget::paintEvent(event);
364  this->rememberFloatingSizeAndPosition();
365  }
366 
367  void CDockWidget::mouseMoveEvent(QMouseEvent *event)
368  {
369  if (!handleMouseMoveEvent(event)) { QDockWidget::mouseMoveEvent(event); }
370  }
371 
372  void CDockWidget::keyPressEvent(QKeyEvent *event)
373  {
374  if (event->key() == Qt::Key_Escape && this->isFloating()) { this->toggleFloating(); }
375  QDockWidget::keyPressEvent(event);
376  }
377 
378  void CDockWidget::mousePressEvent(QMouseEvent *event)
379  {
380  if (!handleMousePressEvent(event)) { QDockWidget::mousePressEvent(event); }
381  }
382 
383  void CDockWidget::addToContextMenu(QMenu *contextMenu) const
384  {
385  if (this->isFloating())
386  {
387  const bool frameless = this->isFrameless();
388 
389  contextMenu->addAction(CIcons::dockTop16(), "Dock", this, &CDockWidget::toggleFloating);
390  contextMenu->addAction(CIcons::tableSheet16(), frameless ? "Normal window" : "Frameless", this,
392  contextMenu->addAction(CIcons::dockTop16(), "Always on top", this, &CDockWidget::windowAlwaysOnTop);
393  contextMenu->addAction(CIcons::dockTop16(), "Not on top", this, &CDockWidget::windowNotAlwaysOnTop);
394  contextMenu->addAction(CIcons::refresh16(), "Redraw", this, qOverload<>(&CDockWidget::update));
395  }
396  else { contextMenu->addAction(CIcons::floatOne16(), "Float", this, &CDockWidget::toggleFloating); }
397 
398  // Font actions
399  Q_ASSERT_X(m_fontMenu, Q_FUNC_INFO, "Missing menu object");
400  if (m_fontMenu) { contextMenu->addActions(m_fontMenu->getActions()); }
401 
402  // State actions (windows state)
403  contextMenu->addAction(CIcons::load16(), "Restore from settings", this, &CDockWidget::restoreFromSettings);
404  contextMenu->addAction(CIcons::save16(), "Save state", this, &CDockWidget::saveCurrentStateToSettings);
405  contextMenu->addAction(CIcons::refresh16(), "Reset to defaults", this, &CDockWidget::resetSettings);
406  contextMenu->addAction(CIcons::refresh16(), "Reset position", this, &CDockWidget::resetPosition);
407 
408  m_input->setMargins(this->contentsMargins());
409  contextMenu->addAction(CIcons::tableSheet16(), "Margins", this, &CDockWidget::dummy);
410  contextMenu->addAction(m_marginMenuAction);
411  }
412 
414  {
415  // init status bar, as we have now all structures set and name is known
416  this->initStatusBarAndProperties();
417 
418  // for the first time resize
419  SWIFT_VERIFY(!m_preferredSizeWhenFloating.isNull());
420  if (!m_preferredSizeWhenFloating.isNull())
421  {
422  m_initialDockedMinimumSize = this->minimumSize();
423  this->resize(m_preferredSizeWhenFloating);
424  }
425 
426  // and move
427  this->resetPosition();
428 
429  // deferred int from settings
430  this->restoreFloatingSizeAndPositionDeferred();
431  }
432 
434  {
435  const QString t(windowTitle());
436  if (t.isEmpty()) { return this->windowTitleBackup(); }
437  return t;
438  }
439 
440  void CDockWidget::onTopLevelChanged(bool topLevel)
441  {
442 #ifdef Q_OS_LINUX
443  // Give XCB platforms enough time to handle window events before adjusting it.
444  // close T593 if this is no longer needed
445  QThread::msleep(100);
446 #endif
447 
448  this->setMargins(); // from settings or default
449  if (topLevel)
450  {
451  if (m_windowTitleBackup != QDockWidget::windowTitle()) { QDockWidget::setWindowTitle(m_windowTitleBackup); }
452  this->setNullTitleBarWidget();
453  if (m_wasFrameless) { this->setFrameless(true); }
454 
467  m_statusBar.show();
468  m_wasAlreadyFloating = true;
469  }
470  else
471  {
472  // frameless
473  this->setFrameless(false);
474 
475  if (!m_windowTitleWhenDocked) { QDockWidget::setWindowTitle(""); }
476  m_statusBar.hide();
477  this->setEmptyTitleBar();
478 
479  // sometimes floating sets a new minimum size, here we reset it
480  if (this->minimumHeight() > m_initialDockedMinimumSize.height())
481  {
482  this->setMinimumSize(m_initialDockedMinimumSize);
483  }
484  }
485 
486  // relay
487  emit this->widgetTopLevelChanged(this, topLevel);
488  }
489 
490  void CDockWidget::initTitleBarWidgets()
491  {
492  m_titleBarWidgetOriginal = this->titleBarWidget();
493  m_titleBarWidgetEmpty = new QWidget(this);
494  this->setTitleBarWidget(m_titleBarWidgetEmpty);
495  }
496 
497  void CDockWidget::initStatusBarAndProperties()
498  {
499  if (m_statusBar.getStatusBar()) { return; }
500 
501  // Typical reasons for asserts here
502  // 1) Check the structure, we expect the following hierarchy:
503  // QDockWidget (CDockWidget/CDockWidgetInfoArea) -> QWidget (outer widget) -> QFrame (inner widget)
504  // Structure used for frameless floating windows
505  // 2) Check if the "floating" flag is accidentally set for the dock widget in the GUI builder
506  // 3) Is the dock widget promoted swift::gui::CDockWidgetInfoArea?
507  QWidget *outerWidget = this->widget(); // the outer widget containing the layout
508  Q_ASSERT_X(outerWidget, "CDockWidget::initStatusBar", "No outer widget");
509  if (!outerWidget) { return; }
510  outerWidget->setProperty("dockwidget", propertyOuterWidget());
511 
512  Q_ASSERT_X(outerWidget->layout(), "CDockWidget::initStatusBar", "No outer widget layout");
513  if (!outerWidget->layout()) { return; }
514  Q_ASSERT_X(outerWidget->layout()->itemAt(0) && outerWidget->layout()->itemAt(0)->widget(),
515  "CDockWidget::initStatusBar", "No outer widget layout item");
516  if (!outerWidget->layout()->itemAt(0) || !outerWidget->layout()->itemAt(0)->widget())
517  {
518  m_allowStatusBar = false;
519  return;
520  }
521 
522  // Inner widget is supposed to be a QFrame / promoted QFrame
523  QFrame *innerWidget = qobject_cast<QFrame *>(
524  outerWidget->layout()->itemAt(0)->widget()); // the inner widget containing the layout
525  Q_ASSERT_X(innerWidget, "CDockWidget::initStatusBar", "No inner widget");
526  if (!innerWidget)
527  {
528  m_allowStatusBar = false;
529  return;
530  }
531  innerWidget->setProperty("dockwidget", propertyInnerWidget());
532 
533  // status bar
534  if (!m_allowStatusBar) { return; }
535  m_statusBar.initStatusBar();
536 
537  // layout
538  QVBoxLayout *vLayout = qobject_cast<QVBoxLayout *>(innerWidget->layout());
539  Q_ASSERT_X(vLayout, "CDockWidget::initStatusBar", "No outer widget layout");
540  if (!vLayout)
541  {
542  m_allowStatusBar = false;
543  return;
544  }
545  vLayout->addWidget(m_statusBar.getStatusBar(), 0, Qt::AlignBottom); // 0->vertical stretch minimum
546 
547  // adjust stretching of the original widget. It was the only widget so far
548  // and should occupy maximum space
549  QWidget *compWidget = innerWidget->findChild<QWidget *>(QString(), Qt::FindDirectChildrenOnly);
550  Q_ASSERT(compWidget);
551  if (!compWidget) { return; }
552  QSizePolicy sizePolicy = compWidget->sizePolicy();
553  sizePolicy.setVerticalStretch(1); // make the original widget occupying maximum space
554  compWidget->setSizePolicy(sizePolicy);
555 
556  // hide status bar if not floating T592 no longer init floating
557  if (!this->isFloating()) { m_statusBar.hide(); }
558  }
559 
560  void CDockWidget::showContextMenu(const QPoint &pos)
561  {
562  const QPoint globalPos = this->mapToGlobal(pos);
563  QScopedPointer<QMenu> contextMenu(new QMenu(this));
564  this->addToContextMenu(contextMenu.data());
565  QAction *selectedItem = contextMenu.data()->exec(globalPos);
566  Q_UNUSED(selectedItem)
567  }
568 
569  void CDockWidget::onVisibilityChanged(bool visible) { m_dockWidgetVisible = visible; }
570 
571  void CDockWidget::menuChangeMargins(const QMargins &margins)
572  {
573  const bool frameless = this->isFrameless();
574  const bool floating = this->isFloating();
575  if (floating)
576  {
577  if (frameless) { this->setMarginsWhenFramelessFloating(margins); }
578  else { this->setMarginsWhenFloating(margins); }
579  }
580  else { this->setMarginsWhenDocked(margins); }
581  this->setContentsMargins(margins);
582  this->repaint();
583  }
584 
585  void CDockWidget::settingsChanged()
586  {
587  // void, normally not used
588  }
589 
590  void CDockWidget::dummy()
591  {
592  // void
593  }
594 
596  {
597  // style sheet changes go here
598  }
599 
600  void CDockWidget::forceStyleSheetUpdate()
601  {
602  const QString qss = this->styleSheet();
603  this->setStyleSheet(qss.isEmpty() ? QStringLiteral(" ") : QString());
604  this->setStyleSheet(qss);
605  }
606 
607  void CDockWidget::rememberFloatingSizeAndPosition()
608  {
609  if (!this->isFloating()) { return; }
610  m_lastFloatingSize = this->size();
611  m_lastFloatingPosition = this->pos();
612  }
613 
614  void CDockWidget::restoreFloatingSizeAndPosition()
615  {
616  if (!m_lastFloatingSize.isValid() || m_lastFloatingPosition.isNull()) { return; }
617  this->resize(m_lastFloatingSize);
618  this->move(m_lastFloatingPosition);
619  }
620 
621  void CDockWidget::restoreFloatingSizeAndPositionDeferred()
622  {
623  // if (!m_lastFloatingSize.isValid() || m_lastFloatingPosition.isNull()) { return; }
624  QPointer<CDockWidget> myself(this);
625  QTimer::singleShot(2500, this, [=] {
626  if (!myself) { return; }
627  const Qt::KeyboardModifiers km = QGuiApplication::queryKeyboardModifiers();
628  const bool shift = km.testFlag(Qt::ShiftModifier);
629  if (shift) { return; }
630 
631  if (!sGui || sGui->isCmdWindowSizeResetSet()) { return; }
632  myself->restoreFromSettings();
633  });
634  }
635 
636  CDockWidgetSettings CDockWidget::getSettings() const
637  {
638  if (this->objectName().isEmpty()) { return CDockWidgetSettings(); }
639 
640  // we need object name for settings %OwnerName%"
641  const CDockWidgetSettings s = m_settings.get();
642  return s;
643  }
644 
645  void CDockWidget::saveSettings(const CDockWidgetSettings &settings)
646  {
647  SWIFT_VERIFY_X(!this->objectName().isEmpty(), Q_FUNC_INFO, "Need object name for settings %OwnerName%");
648  if (this->objectName().isEmpty())
649  {
650  CStatusMessage(this).error(u"Settings cannot be saved!");
651  return;
652  }
653 
654  const CStatusMessage m = m_settings.setAndSave(settings);
655  if (m.isFailure()) { CLogMessage::preformatted(m); }
656  }
657 
659  {
660  CDockWidgetSettings s = this->getSettings();
661  const bool floating = this->isFloating();
662  const bool frameless = this->isFrameless();
663  const QByteArray geo = this->saveGeometry();
664  s.setFloating(floating);
665  s.setFrameless(frameless);
666  s.setGeometry(geo);
667  this->saveSettings(s);
668  }
669 
671  {
672  CDockWidgetSettings s = this->getSettings();
673  s.reset();
674  this->saveSettings(s);
675  this->restoreFromSettings();
676  }
677 
679  {
680  // center on screen when floating
681  if (!this->isFloating()) { return; }
682  if (!sGui) { return; }
683 
684  // pos can be null during init
685  const QWidget *mw = CGuiUtility::mainApplicationWidget();
686  QPoint pos = mw && mw->isVisible() ? CGuiUtility::mainWidgetGlobalPosition() : QPoint();
687  if (pos.isNull()) { pos = CGuiApplication::currentScreen()->geometry().center() - this->rect().center(); }
688 
689  const int osFloatingX = m_offsetWhenFloating.x();
690  const int osFloatingY = m_offsetWhenFloating.y();
691  const int x = pos.x() + osFloatingX;
692  const int y = pos.y() + osFloatingY;
693  this->move(x, y);
694  }
695 } // namespace swift::gui
Our base class for dockable widgets containing some specialized functionality on top of QDockWidget.
Definition: dockwidget.h:52
void toggleVisibility()
Toggle visibility.
Definition: dockwidget.cpp:259
virtual void closeEvent(QCloseEvent *event)
Definition: dockwidget.cpp:337
QString windowTitleOrBackup() const
If current window title is empty, use backup.
Definition: dockwidget.cpp:433
CDockWidget(QWidget *parent=nullptr)
Constructor.
Definition: dockwidget.cpp:85
void setAlwaysOnTop(bool onTop)
Set always on top.
Definition: dockwidget.h:121
void setWindowTitle(const QString &title)
Set title and internally keep a backup.
Definition: dockwidget.cpp:156
virtual void addToContextMenu(QMenu *contextMenu) const
Contribute to menu.
Definition: dockwidget.cpp:383
void windowNotAlwaysOnTop()
Window not on top.
Definition: dockwidget.cpp:287
void widgetTopLevelChanged(CDockWidget *, bool topLevel)
Top level has changed for given widget.
virtual void mousePressEvent(QMouseEvent *event)
Definition: dockwidget.cpp:378
void setMarginsWhenFramelessFloating(const QMargins &margins)
Margins when window is floating (frameless)
Definition: dockwidget.cpp:123
void setPreferredSizeWhenFloating(const QSize &size)
Size when floating first time.
Definition: dockwidget.cpp:183
void setAlwaysOnTopFlag(bool onTop)
Set the on top flag.
Definition: dockwidget.cpp:296
void windowAlwaysOnTop()
Toggle frameless deferred.
Definition: dockwidget.cpp:278
void resetSettings()
Reset margin settings.
Definition: dockwidget.cpp:670
virtual void onStyleSheetsChanged()
Style sheet has changed.
Definition: dockwidget.cpp:595
bool restoreFromSettings()
Restore from settings.
Definition: dockwidget.cpp:302
virtual void paintEvent(QPaintEvent *event)
Definition: dockwidget.cpp:360
void setNullTitleBarWidget()
Set null (nullptr) title bar.
Definition: dockwidget.cpp:107
QMargins getMarginsWhenDocked() const
Margins when docked.
Definition: dockwidget.cpp:152
virtual void setFrameless(bool frameless)
Framless.
Definition: dockwidget.cpp:191
void setOriginalTitleBar()
Set original title bar.
Definition: dockwidget.cpp:87
QMargins getMarginsWhenFramelessFloating() const
Margins when floating and frameless.
Definition: dockwidget.cpp:135
void fontSizeMinus()
Font size signals.
static const QString & propertyOuterWidget()
Value for dynamic property "dockwidget".
Definition: dockwidget.cpp:218
bool isWidgetVisible() const
Is widget visible? Not to be confused with.
Definition: dockwidget.cpp:154
void saveCurrentStateToSettings()
Remember widget state.
Definition: dockwidget.cpp:658
void setMargins()
Set margins from settings.
Definition: dockwidget.cpp:75
virtual void mouseMoveEvent(QMouseEvent *event)
Definition: dockwidget.cpp:367
void toggleFloating()
Toggle floating.
Definition: dockwidget.cpp:230
void setEmptyTitleBar()
Set empty title bar (empty widget as title bar)
Definition: dockwidget.cpp:97
void resetPosition()
Reset window position.
Definition: dockwidget.cpp:678
void displayStatusMessages(const swift::misc::CStatusMessageList &statusMessages)
Display status messages.
Definition: dockwidget.cpp:168
void toggleFrameless()
Toggle frameless mode.
Definition: dockwidget.cpp:261
void resetWasAlreadyFloating()
Reset first time floating, marked as never floated before.
Definition: dockwidget.cpp:181
void fontSizePlus()
Font size signals.
const QString & windowTitleBackup() const
Window title backup.
Definition: dockwidget.h:66
void displayStatusMessage(const swift::misc::CStatusMessage &statusMessage)
Display status message.
Definition: dockwidget.cpp:162
void setMarginsWhenDocked(const QMargins &margins)
Margins when widget is floating.
Definition: dockwidget.cpp:140
void setOffsetWhenFloating(const QPoint &point, bool frameless)
Position offset when floating first time.
Definition: dockwidget.cpp:185
static const QString & propertyInnerWidget()
Value for dynamic property "dockwidget".
Definition: dockwidget.cpp:224
QMargins getMarginsWhenFloating() const
Margins when floating.
Definition: dockwidget.cpp:121
virtual void keyPressEvent(QKeyEvent *event)
Definition: dockwidget.cpp:372
void setMarginsWhenFloating(const QMargins &margins)
Margins when window is floating.
Definition: dockwidget.cpp:109
bool showTitleWhenDocked() const
Window title when window is docked.
Definition: dockwidget.h:72
virtual void initialFloating()
Widget is initialized by being a floating window for a shot period.
Definition: dockwidget.cpp:413
Main window which can be frameless.
bool handleMousePressEvent(QMouseEvent *event)
Mouse press, required for frameless window.
void addFramelessSizeGripToStatusBar(QStatusBar *statusBar)
Resize grip handle.
void hideFramelessSizeGripInStatusBar()
Resize grip handle.
virtual void setFrameless(bool frameless)
Framless.
bool handleMouseMoveEvent(QMouseEvent *event)
Mouse moving, required for frameless window.
bool isCmdWindowSizeResetSet() const
Window size reset mode set.
static QScreen * currentScreen()
Current screen.
void styleSheetsChanged()
Style sheet changed.
static QPoint mainWidgetGlobalPosition()
Position of main widget.
Definition: guiutility.cpp:511
static QWidget * mainApplicationWidget()
Main application window widget.
Definition: guiutility.cpp:92
void displayStatusMessages(const swift::misc::CStatusMessageList &statusMessages)
Display status messages.
void displayStatusMessage(const swift::misc::CStatusMessage &statusMessage)
Display status message.
void initStatusBar(QStatusBar *statusBar=nullptr)
Init.
QStatusBar * getStatusBar() const
Get the status bar.
Using this class provides a QDockWidget with the overlay functionality already integrated.
static bool useStyleSheetInDerivedWidget(QWidget *derivedWidget, QStyle::PrimitiveElement element=QStyle::PE_Widget)
Use style sheets in derived widgets.
Widget alows to enter margins.
Definition: marginsinput.h:24
void setMargins(const QMargins &margins)
Set margins.
Standard font (size, style) menus. Can be used as nested menu or via getActions added manually.
Definition: fontmenus.h:21
QList< QAction * > getActions() const
Allow to use the actions directly.
Definition: fontmenus.cpp:46
void setFrameless(bool frameless)
Frameless.
void setMarginsWhenFloating(const QMargins &margins)
Set margins for given dock widget.
QMargins getMarginsWhenDocked() const
Margins for given dock widget.
QMargins getMarginsWhenFloating() const
Margins for given dock widget.
void setMarginsWhenFramelessFloating(const QMargins &margins)
Set margins for given dock widget.
void setGeometry(const QByteArray &ba)
Set geometry.
QMargins getMarginsWhenFramelessFloating() const
Margins for given dock widget.
void setMarginsWhenDocked(const QMargins &margins)
Set margins for given dock widget.
void setFloating(bool floating)
Floating.
CStatusMessage setAndSave(const T &value, qint64 timestamp=0)
Write and save in the same step. Must be called from the thread in which the owner lives.
Definition: valuecache.h:417
T get() const
Get a copy of the current value.
Definition: valuecache.h:408
Derived & error(const char16_t(&format)[N])
Set the severity to error, providing a format string.
Streamable status message, e.g.
bool isFailure() const
Operation considered unsuccessful.
Status messages, e.g. from Core -> GUI.
SWIFT_GUI_EXPORT swift::gui::CGuiApplication * sGui
Single instance of GUI application object.
High level reusable GUI components.
Definition: aboutdialog.cpp:13
GUI related classes.
Free functions in swift::misc.
auto singleShot(int msec, QObject *target, F &&task)
Starts a single-shot timer which will call a task in the thread of the given object when it times out...
Definition: threadutils.h:30
#define SWIFT_VERIFY_X(COND, WHERE, WHAT)
A weaker kind of assert.
Definition: verify.h:26
#define SWIFT_VERIFY(COND)
A weaker kind of assert.
Definition: verify.h:29