17#include <klocalizedstring.h>
19#include <QAbstractButton>
24#include <QStylePainter>
25#include <QStyleOptionFrame>
27#include <KSqueezedTextLabel>
29static inline bool hasFeature(
const QDockWidget *dockwidget, QDockWidget::DockWidgetFeature feature)
31 return (dockwidget->features() & feature) == feature;
37 : QWidget(dockWidget), d(new
Private(this))
39 d->floatIcon =
kisIcon(
"docker_float");
41 d->floatButton->setIcon(
d->floatIcon);
43 d->floatButton->setVisible(
true);
44 d->floatButton->setToolTip(i18nc(
"@info:tooltip",
"Float Docker"));
45 d->floatButton->setStyleSheet(
"border: 0");
47 d->removeIcon =
kisIcon(
"docker_close");
49 d->closeButton->setIcon(
d->removeIcon);
50 connect(
d->closeButton, SIGNAL(clicked()), dockWidget, SLOT(close()));
51 d->closeButton->setVisible(
true);
52 d->closeButton->setToolTip(i18nc(
"@info:tooltip",
"Close Docker"));
53 d->closeButton->setStyleSheet(
"border: 0");
55 d->lockIcon =
kisIcon(
"docker_lock_a");
57 d->lockButton->setCheckable(
true);
58 d->lockButton->setIcon(
d->lockIcon);
60 d->lockButton->setVisible(
true);
61 d->lockButton->setToolTip(i18nc(
"@info:tooltip",
"Lock Docker"));
62 d->lockButton->setStyleSheet(
"border: 0");
64 d->updateButtonSizes();
66 d->titleLabel =
new KSqueezedTextLabel(
this);
67 d->titleLabel->setTextElideMode(Qt::ElideRight);
68 d->titleLabel->setText(dockWidget->windowTitle());
70 QHBoxLayout *layout =
new QHBoxLayout(
this);
71 layout->setContentsMargins(2, 0, 2, 0);
73 layout->addWidget(
d->lockButton);
74 layout->addWidget(
d->titleLabel, 1);
75 layout->addWidget(
d->floatButton);
76 layout->addWidget(
d->closeButton);
82 d->featuresChanged(QDockWidget::NoDockWidgetFeatures);
92 QStylePainter
p(
this);
94 QDockWidget *q = qobject_cast<QDockWidget*>(parentWidget());
96 int fw = q->isFloating() ? q->style()->pixelMetric(QStyle::PM_DockWidgetFrameWidth, 0, q) : 0;
97 int mw = q->style()->pixelMetric(QStyle::PM_DockWidgetTitleMargin, 0, q);
99 QStyleOptionDockWidget titleOpt;
100 titleOpt.initFrom(q);
102 QSize lockButtonSize(0,0);
103 if (
d->lockButton->isVisible()) {
104 lockButtonSize =
d->lockButton->size();
108 int fusionTextOffset = 0;
109 QRect styleTestRect = q->style()->subElementRect(QStyle::SE_DockWidgetFloatButton, &titleOpt, q);
110 if (styleTestRect.width() < 16) {
111 fusionTextOffset =
d->lockButton->x();
114 titleOpt.rect = QRect(QPoint(fw + mw + lockButtonSize.width() + fusionTextOffset, 0),
115 QSize(geometry().width() - (fw * 2) - mw - lockButtonSize.width(), geometry().height()));
119 titleOpt.title = QString();
120 titleOpt.closable =
hasFeature(q, QDockWidget::DockWidgetClosable);
121 titleOpt.floatable =
hasFeature(q, QDockWidget::DockWidgetFloatable);
122 p.drawControl(QStyle::CE_DockWidgetTitle, titleOpt);
127 QDockWidget *q = qobject_cast<QDockWidget*>(parentWidget());
129 if (q->isFloating() || (width() < (
d->closeButton->width() +
d->floatButton->width() +
d->lockButton->width()) + 32)) {
130 d->lockButton->setVisible(
false);
132 d->lockButton->setVisible(
true);
138 QDockWidget *q = qobject_cast<QDockWidget*>(parentWidget());
141 d->lockButton->blockSignals(
true);
142 d->lockButton->setChecked(
locked);
143 d->lockButton->blockSignals(
false);
146 d->features = q->features();
147 q->setFeatures(QDockWidget::NoDockWidgetFeatures);
150 q->setFeatures(
d->features);
153 q->toggleViewAction()->setEnabled(!
locked);
154 d->closeButton->setEnabled(!
locked);
155 d->floatButton->setEnabled(!
locked);
156 d->floatButton->setVisible(!
locked);
159 q->setProperty(
"Locked",
locked);
167void KoDockWidgetTitleBar::Private::toggleFloating()
169 QDockWidget *q = qobject_cast<QDockWidget*>(thePublic->parentWidget());
171 q->setFloating(!q->isFloating());
175void KoDockWidgetTitleBar::Private::topLevelChanged(
bool topLevel)
177 lockButton->setEnabled(!topLevel);
181void KoDockWidgetTitleBar::Private::featuresChanged(QDockWidget::DockWidgetFeatures)
183 QDockWidget *q = qobject_cast<QDockWidget*>(thePublic->parentWidget());
185 closeButton->setVisible(
hasFeature(q, QDockWidget::DockWidgetClosable));
186 floatButton->setVisible(
hasFeature(q, QDockWidget::DockWidgetFloatable));
189 thePublic->resizeEvent(0);
192void KoDockWidgetTitleBar::Private::dockWidgetTitleChanged(
const QString &title)
194 titleLabel->setText(title);
198void KoDockWidgetTitleBar::Private::updateIcons()
200 lockIcon = (!locked) ?
kisIcon(
"docker_lock_a") :
kisIcon(
"docker_lock_b");
201 lockButton->setIcon(lockIcon);
204 floatButton->setIcon(
kisIcon(
"docker_float"));
205 closeButton->setIcon(
kisIcon(
"docker_close"));
207 thePublic->resizeEvent(0);
210void KoDockWidgetTitleBar::Private::updateButtonSizes()
212 const QDockWidget *q = qobject_cast<QDockWidget*>(thePublic->parentWidget());
214 const int fw = q->isFloating() ? q->style()->pixelMetric(QStyle::PM_DockWidgetFrameWidth, 0, q) : 0;
216 QStyleOptionDockWidget opt;
218 opt.rect = QRect(QPoint(fw, fw), QSize(thePublic->geometry().width() - (fw * 2), thePublic->geometry().height() - (fw * 2)));
219 opt.title = q->windowTitle();
225 opt.floatable =
hasFeature(q, QDockWidget::DockWidgetFloatable);
230 const QRect closeRect = q->style()->subElementRect(QStyle::SE_DockWidgetCloseButton, &opt, q);
246#include "moc_KoDockWidgetTitleBar.cpp"
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))