• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • krita API Reference
  • KDE Home
  • Contact Us
 

KritaWidgets

  • sources
  • kfour-appscomplete
  • krita
  • libs
  • widgets
KoDockWidgetTitleBar.cpp
Go to the documentation of this file.
1 /* This file is part of the KDE project
2  SPDX-FileCopyrightText: 2007 Marijn Kruisselbrink <[email protected]>
3  SPDX-FileCopyrightText: 2007 Thomas Zander <[email protected]>
4 
5  SPDX-License-Identifier: LGPL-2.0-or-later
6 */
7 
8 #include "KoDockWidgetTitleBar.h"
9 #include "KoDockWidgetTitleBar_p.h"
10 #include "KoDockWidgetTitleBarButton.h"
11 
12 #include <KoIcon.h>
13 #include <kis_icon_utils.h>
14 
15 #include <WidgetsDebug.h>
16 #include <klocalizedstring.h>
17 
18 #include <QAbstractButton>
19 #include <QAction>
20 #include <QLabel>
21 #include <QLayout>
22 #include <QStyle>
23 #include <QStylePainter>
24 #include <QStyleOptionFrame>
25 
26 static inline bool hasFeature(const QDockWidget *dockwidget, QDockWidget::DockWidgetFeature feature)
27 {
28  return (dockwidget->features() & feature) == feature;
29 }
30 
31 KoDockWidgetTitleBar::KoDockWidgetTitleBar(QDockWidget* dockWidget)
32  : QWidget(dockWidget), d(new Private(this))
33 {
34  d->floatIcon = kisIcon("docker_float");
35  d->floatButton = new KoDockWidgetTitleBarButton(this);
36  d->floatButton->setIcon(d->floatIcon);
37  connect(d->floatButton, SIGNAL(clicked()), SLOT(toggleFloating()));
38  d->floatButton->setVisible(true);
39  d->floatButton->setToolTip(i18nc("@info:tooltip", "Float Docker"));
40  d->floatButton->setStyleSheet("border: 0");
41 
42  d->removeIcon = kisIcon("docker_close");
43  d->closeButton = new KoDockWidgetTitleBarButton(this);
44  d->closeButton->setIcon(d->removeIcon);
45  connect(d->closeButton, SIGNAL(clicked()), dockWidget, SLOT(close()));
46  d->closeButton->setVisible(true);
47  d->closeButton->setToolTip(i18nc("@info:tooltip", "Close Docker"));
48  d->closeButton->setStyleSheet("border: 0"); // border makes the header busy looking (appears on some OSs)
49 
50  d->lockIcon = kisIcon("docker_lock_a");
51  d->lockButton = new KoDockWidgetTitleBarButton(this);
52  d->lockButton->setCheckable(true);
53  d->lockButton->setIcon(d->lockIcon);
54  connect(d->lockButton, SIGNAL(toggled(bool)), SLOT(setLocked(bool)));
55  d->lockButton->setVisible(true);
56  d->lockable = true;
57  d->lockButton->setToolTip(i18nc("@info:tooltip", "Lock Docker"));
58  d->lockButton->setStyleSheet("border: 0");
59 
60  connect(dockWidget, SIGNAL(featuresChanged(QDockWidget::DockWidgetFeatures)), SLOT(featuresChanged(QDockWidget::DockWidgetFeatures)));
61  connect(dockWidget, SIGNAL(topLevelChanged(bool)), SLOT(topLevelChanged(bool)));
62 
63  d->featuresChanged(QDockWidget::NoDockWidgetFeatures);
64 }
65 
66 KoDockWidgetTitleBar::~KoDockWidgetTitleBar()
67 {
68  delete d;
69 }
70 
71 QSize KoDockWidgetTitleBar::minimumSizeHint() const
72 {
73  return sizeHint();
74 }
75 
76 QSize KoDockWidgetTitleBar::sizeHint() const
77 {
78  if (isHidden()) {
79  return QSize(0, 0);
80  }
81 
82  QDockWidget *q = qobject_cast<QDockWidget*>(parentWidget());
83 
84  int mw = q->style()->pixelMetric(QStyle::PM_DockWidgetTitleMargin, 0, q);
85  int fw = q->style()->pixelMetric(QStyle::PM_DockWidgetFrameWidth, 0, q);
86 
87  // get size of buttons...
88  QSize closeSize(0, 0);
89  if (d->closeButton && hasFeature(q, QDockWidget::DockWidgetClosable)) {
90  closeSize = d->closeButton->sizeHint();
91  }
92 
93  QSize floatSize(0, 0);
94  if (d->floatButton && hasFeature(q, QDockWidget::DockWidgetFloatable)) {
95  floatSize = d->floatButton->sizeHint();
96  }
97 
98  QSize lockSize(0, 0);
99  if (d->lockButton && d->lockable) {
100  lockSize = d->lockButton->sizeHint();
101  }
102 
103  int buttonHeight = qMax(qMax(closeSize.height(), floatSize.height()), lockSize.height()) + 2;
104  int buttonWidth = closeSize.width() + lockSize.width() + floatSize.width();
105 
106  int height = buttonHeight;
107  if (d->textVisibilityMode == FullTextAlwaysVisible) {
108  // get font size
109  QFontMetrics titleFontMetrics = q->fontMetrics();
110  int fontHeight = titleFontMetrics.lineSpacing() + 2 * mw;
111 
112  height = qMax(height, fontHeight);
113  }
114 
115  if (d->textVisibilityMode == FullTextAlwaysVisible) {
116  const int titleWidth = q->fontMetrics().width(q->windowTitle()) + 2*mw;
117  return QSize(buttonWidth /*+ height*/ + 2*mw + 2*fw + titleWidth, height);
118  } else if (q->widget()) {
119  return QSize(qMin(q->widget()->minimumSizeHint().width(), buttonWidth), height);
120  } else {
121  return QSize(buttonWidth, height);
122  }
123 }
124 
125 void KoDockWidgetTitleBar::paintEvent(QPaintEvent*)
126 {
127  QStylePainter p(this);
128 
129  QDockWidget *q = qobject_cast<QDockWidget*>(parentWidget());
130 
131  int fw = q->isFloating() ? q->style()->pixelMetric(QStyle::PM_DockWidgetFrameWidth, 0, q) : 0;
132  int mw = q->style()->pixelMetric(QStyle::PM_DockWidgetTitleMargin, 0, q);
133 
134  QStyleOptionDockWidget titleOpt;
135  titleOpt.initFrom(q);
136 
137  QSize lockButtonSize(0,0);
138  if (d->lockable && d->lockButton->isVisible()) {
139  lockButtonSize = d->lockButton->size();
140  }
141 
142  titleOpt.rect = QRect(QPoint(fw + mw + lockButtonSize.width(), 0),
143  QSize(geometry().width() - (fw * 2) - mw - lockButtonSize.width(), geometry().height()));
144  titleOpt.title = q->windowTitle();
145  titleOpt.closable = hasFeature(q, QDockWidget::DockWidgetClosable);
146  titleOpt.floatable = hasFeature(q, QDockWidget::DockWidgetFloatable);
147  p.drawControl(QStyle::CE_DockWidgetTitle, titleOpt);
148 }
149 
150 void KoDockWidgetTitleBar::resizeEvent(QResizeEvent*)
151 {
152  QDockWidget *q = qobject_cast<QDockWidget*>(parentWidget());
153 
154  int fw = q->isFloating() ? q->style()->pixelMetric(QStyle::PM_DockWidgetFrameWidth, 0, q) : 0;
155 
156  QStyleOptionDockWidget opt;
157  opt.initFrom(q);
158  opt.rect = QRect(QPoint(fw, fw), QSize(geometry().width() - (fw * 2), geometry().height() - (fw * 2)));
159  opt.title = q->windowTitle();
160  opt.closable = hasFeature(q, QDockWidget::DockWidgetClosable);
161  opt.floatable = hasFeature(q, QDockWidget::DockWidgetFloatable);
162 
163  QRect floatRect = q->style()->subElementRect(QStyle::SE_DockWidgetFloatButton, &opt, q);
164  if (!floatRect.isNull())
165  d->floatButton->setGeometry(floatRect);
166 
167  QRect closeRect = q->style()->subElementRect(QStyle::SE_DockWidgetCloseButton, &opt, q);
168  if (!closeRect.isNull())
169  d->closeButton->setGeometry(closeRect);
170 
171  int top = fw;
172  if (!floatRect.isNull())
173  top = floatRect.y();
174  else if (!closeRect.isNull())
175  top = closeRect.y();
176 
177  QSize lockRectSize = d->lockButton->size();
178  if (!closeRect.isNull()) {
179  lockRectSize = d->closeButton->size();
180  } else if (!floatRect.isNull()) {
181  lockRectSize = d->floatButton->size();
182  }
183 
184  if (q->isFloating() || (width() < (closeRect.width() + lockRectSize.width()) + 50)) {
185  d->lockButton->setVisible(false);
186  d->lockable = false;
187  } else {
188  d->lockButton->setVisible(true);
189  d->lockable = true;
190  }
191 
192  int offset = 0;
193 
194  QRect lockRect = QRect(QPoint(fw + 2 + offset, top), lockRectSize);
195  d->lockButton->setGeometry(lockRect);
196 }
197 
198 void KoDockWidgetTitleBar::setLocked(bool locked)
199 {
200  QDockWidget *q = qobject_cast<QDockWidget*>(parentWidget());
201 
202  d->locked = locked;
203  d->lockButton->blockSignals(true);
204  d->lockButton->setChecked(locked);
205  d->lockButton->blockSignals(false);
206 
207  if (locked) {
208  d->features = q->features();
209  q->setFeatures(QDockWidget::NoDockWidgetFeatures);
210  }
211  else {
212  q->setFeatures(d->features);
213  }
214 
215  q->toggleViewAction()->setEnabled(!locked);
216  d->closeButton->setEnabled(!locked);
217  d->floatButton->setEnabled(!locked);
218  d->floatButton->setVisible(!locked);
219 
220  d->updateIcons();
221  q->setProperty("Locked", locked);
222 }
223 
224 
225 void KoDockWidgetTitleBar::setTextVisibilityMode(TextVisibilityMode textVisibilityMode)
226 {
227  d->textVisibilityMode = textVisibilityMode;
228 }
229 
230 void KoDockWidgetTitleBar::updateIcons()
231 {
232  d->updateIcons();
233 }
234 
235 void KoDockWidgetTitleBar::Private::toggleFloating()
236 {
237  QDockWidget *q = qobject_cast<QDockWidget*>(thePublic->parentWidget());
238 
239  q->setFloating(!q->isFloating());
240  updateIcons();
241 }
242 
243 void KoDockWidgetTitleBar::Private::topLevelChanged(bool topLevel)
244 {
245  lockButton->setEnabled(!topLevel);
246  updateIcons();
247 }
248 
249 void KoDockWidgetTitleBar::Private::featuresChanged(QDockWidget::DockWidgetFeatures)
250 {
251  QDockWidget *q = qobject_cast<QDockWidget*>(thePublic->parentWidget());
252 
253  closeButton->setVisible(hasFeature(q, QDockWidget::DockWidgetClosable));
254  floatButton->setVisible(hasFeature(q, QDockWidget::DockWidgetFloatable));
255 
256  thePublic->resizeEvent(0);
257 }
258 
259 
260 void KoDockWidgetTitleBar::Private::updateIcons()
261 {
262  lockIcon = (!locked) ? kisIcon("docker_lock_a") : kisIcon("docker_lock_b");
263  lockButton->setIcon(lockIcon);
264 
265  // this method gets called when switching themes, so update all of the themed icons now
266  floatButton->setIcon(kisIcon("docker_float"));
267  closeButton->setIcon(kisIcon("docker_close"));
268 
269  thePublic->resizeEvent(0);
270 }
271 
272 //have to include this because of Q_PRIVATE_SLOT
273 #include "moc_KoDockWidgetTitleBar.cpp"
KoDockWidgetTitleBar::topLevelChanged
void topLevelChanged(bool topLevel)
QWidget::fontMetrics
QFontMetrics fontMetrics() const
KoDockWidgetTitleBar::textVisibilityMode
KoDockWidgetTitleBar::TextVisibilityMode textVisibilityMode
Definition: KoDockWidgetTitleBar_p.h:42
QDockWidget::DockWidgetFeatures
typedef DockWidgetFeatures
QRect
QDockWidget::isFloating
bool isFloating() const
KoDockWidgetTitleBar::minimumSizeHint
QSize minimumSizeHint() const override
reimplemented from QWidget
Definition: KoDockWidgetTitleBar.cpp:71
KoDockWidgetTitleBar::featuresChanged
void featuresChanged(QDockWidget::DockWidgetFeatures features)
QDockWidget::features
features
QWidget
QRect::width
int width() const
QSize
QRect::y
int y() const
QStyleOption::initFrom
void initFrom(const QWidget *widget)
QSize::width
int width() const
QStylePainter::drawControl
void drawControl(QStyle::ControlElement ce, const QStyleOption &option)
QWidget::close
bool close()
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
KoDockWidgetTitleBar::setLocked
void setLocked(bool locked)
Definition: KoDockWidgetTitleBar.cpp:198
QStyle::pixelMetric
virtual int pixelMetric(PixelMetric metric, const QStyleOption *option, const QWidget *widget) const=0
KoDockWidgetTitleBar::FullTextAlwaysVisible
Definition: KoDockWidgetTitleBar.h:29
KoDockWidgetTitleBar::setTextVisibilityMode
void setTextVisibilityMode(TextVisibilityMode textVisibilityMode)
Define whether the minimal width should ensure that the full text is visible.
Definition: KoDockWidgetTitleBar.cpp:225
QWidget::setVisible
virtual void setVisible(bool visible)
QFontMetrics::lineSpacing
int lineSpacing() const
QWidget::style
QStyle * style() const
KoDockWidgetTitleBar::resizeEvent
void resizeEvent(QResizeEvent *event) override
reimplemented from QWidget
Definition: KoDockWidgetTitleBar.cpp:150
QSize::height
int height() const
KoDockWidgetTitleBar::sizeHint
QSize sizeHint() const override
reimplemented from QWidget
Definition: KoDockWidgetTitleBar.cpp:76
QDockWidget
QDockWidget::widget
QWidget * widget() const
KoDockWidgetTitleBarButton.h
KoDockWidgetTitleBar_p.h
QFontMetrics
KoDockWidgetTitleBar::~KoDockWidgetTitleBar
~KoDockWidgetTitleBar() override
Definition: KoDockWidgetTitleBar.cpp:66
QStylePainter
KoDockWidgetTitleBar::locked
bool locked
Definition: KoDockWidgetTitleBar_p.h:43
QRect::isNull
bool isNull() const
KoDockWidgetTitleBar.h
KoDockWidgetTitleBar::TextVisibilityMode
TextVisibilityMode
Definition: KoDockWidgetTitleBar.h:29
KoDockWidgetTitleBar::KoDockWidgetTitleBar
KoDockWidgetTitleBar(QDockWidget *dockWidget)
Definition: KoDockWidgetTitleBar.cpp:31
QWidget::minimumSizeHint
minimumSizeHint
KoDockWidgetTitleBar::toggleFloating
void toggleFloating()
QObject::setProperty
bool setProperty(const char *name, const QVariant &value)
QWidget::height
int height() const
QRect::height
int height() const
QStyleOptionDockWidget
QAction::setEnabled
void setEnabled(bool)
QResizeEvent
QPaintEvent
WidgetsDebug.h
QStyle::subElementRect
virtual QRect subElementRect(SubElement element, const QStyleOption *option, const QWidget *widget) const=0
KoDockWidgetTitleBar::updateIcons
void updateIcons()
Definition: KoDockWidgetTitleBar.cpp:230
QDockWidget::windowTitle
windowTitle
QWidget::geometry
const QRect & geometry() const
hasFeature
static bool hasFeature(const QDockWidget *dockwidget, QDockWidget::DockWidgetFeature feature)
Definition: KoDockWidgetTitleBar.cpp:26
Private
QWidget::isHidden
bool isHidden() const
QFontMetrics::width
int width(const QString &text, int len) const
QWidget::width
int width() const
QWidget::parentWidget
QWidget * parentWidget() const
QDockWidget::toggleViewAction
QAction * toggleViewAction() const
QPoint
KoDockWidgetTitleBar::paintEvent
void paintEvent(QPaintEvent *event) override
reimplemented from QWidget
Definition: KoDockWidgetTitleBar.cpp:125
This file is part of the KDE documentation.
Documentation copyright © 1996-2021 The KDE developers.
Generated on Sat Jan 23 2021 11:48:22 by doxygen 1.8.16 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KritaWidgets

Skip menu "KritaWidgets"
  • Main Page
  • Namespace List
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

krita API Reference

Skip menu "krita API Reference"
  • libs
  •   KritaBasicFlakes
  •   brush
  •   KritaUndo2
  •   KritaFlake
  •   image
  •   KritaPlugin
  •   Krita
  •   KritaPigment
  •   KritaResources
  •   KritaStore
  •   ui
  •   KritaWidgets
  •   KritaWidgetUtils
  • plugins
  •   Assitants
  •   Extensions
  •   Filters
  •   Generators
  •   Formats
  •           src
  •   PaintOps
  •     libpaintop

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal