Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_utility_title_bar.cpp
Go to the documentation of this file.
1/*
2 * SPDX-License-Identifier: GPL-3.0-or-later
3 */
4
7#include <QDockWidget>
8#include <QHBoxLayout>
9#include <QLabel>
10#include <QPushButton>
11#include <QStyle>
13#include "qaction.h"
14#include <klocalizedstring.h>
15#include <KoIcon.h>
16#include "kis_assert.h"
17
18
20 : KisUtilityTitleBar(new QLabel(i18n("Title"), parent), parent)
21{
22}
23
24KisUtilityTitleBar::KisUtilityTitleBar(QLabel *title, QWidget *parent)
25 : QWidget(parent), d(new Private(this))
26{
27 // Set up main layout..
28 d->mainLayout = new QHBoxLayout(this);
29 QMargins margins = d->mainLayout->contentsMargins();
30 margins.setTop(0);
31 margins.setBottom(0);
32 margins.setLeft(0);
33 d->mainLayout->setContentsMargins(margins);
34 d->mainLayout->setSpacing(0);
35
36 // Set up lock button
37 d->lockButton = new KoDockWidgetTitleBarButton(this);
38 d->lockButton->setCheckable(true);
39 d->lockButton->setIcon(kisIcon("docker_lock_a"));
40 connect(d->lockButton, SIGNAL(toggled(bool)), SLOT(setLocked(bool) ));
41 d->lockButton->setVisible(true);
42 d->lockButton->setToolTip(i18nc("@info:tooltip", "Lock Docker"));
43 d->lockButton->setStyleSheet("border: 0");
44 d->lockButton->setFixedSize(QSize(22,22));
45
46 d->mainLayout->addWidget(d->lockButton);
47
48 // Set up title..
49 d->mainLayout->addWidget(title);
50
51 //QSpacerItem *spacerItem = new QSpacerItem(SPACING_UNIT * 2, 0);
52 d->mainLayout->addSpacing(SPACING_UNIT * 2);
53 // Set up widget area..
54 QWidget *widgetArea = new QWidget(this);
55 widgetAreaLayout = new QHBoxLayout(widgetArea);
56 widgetAreaLayout->setSpacing(0);
57 widgetAreaLayout->setContentsMargins(0,0,0,0);
58 d->mainLayout->addWidget(widgetArea);
59
60// mainLayout->addSpacing(SPACING_UNIT * 2);
61 d->mainLayout->insertSpacing(4, SPACING_UNIT * 2 );
62
63 { // Controls/Decorations..
64 QWidget *widget = new QWidget(this);
65
66 QHBoxLayout *sublayout = new QHBoxLayout(widget);
67 sublayout->setSpacing(0);
68 sublayout->setContentsMargins(0,0,0,0);
69
70 QDockWidget *dockWidget = qobject_cast<QDockWidget*>(parentWidget());
71
72 { // Float button...
73 QIcon floatIcon = kisIcon("docker_float");
74 d->floatButton = new QPushButton(floatIcon, "", this);
75 d->floatButton->setFlat(true);
76 connect(d->floatButton, &QPushButton::clicked, dockWidget, [dockWidget](){
77 dockWidget->setFloating(!dockWidget->isFloating());
78 } );
79 sublayout->addWidget(d->floatButton);
80 }
81
82 { // Close button...
83 QIcon closeIcon = kisIcon("docker_close");
84 d->closeButton = new QPushButton(closeIcon, "", this);
85 d->closeButton->setFlat(true);
86 connect(d->closeButton, SIGNAL(clicked(bool)), dockWidget, SLOT(close()));
87 sublayout->addWidget(d->closeButton);
88 }
89
90 d->mainLayout->addWidget(widget);
91 }
92}
93
95 return widgetAreaLayout->parentWidget();
96}
97
98void KisUtilityTitleBar::setWidgetArea(QWidget* widgetArea) {
99 QHBoxLayout *layout = dynamic_cast<QHBoxLayout*>(this->layout());
101 // It's the third widget;
102 // title, spacer, widgetArea, spacer, float/close
103 layout->insertWidget(2, widgetArea);
104}
105
107{
108 QDockWidget *q = qobject_cast<QDockWidget*>(parentWidget());
109 d->locked = locked;
110 d->lockButton->blockSignals(true);
111 d->lockButton->setChecked(locked);
112 d->lockButton->blockSignals(false);
113
114 if (locked) {
115 d->features = q->features();
116 q->setFeatures(QDockWidget::NoDockWidgetFeatures);
117 QLayoutItem *spacingItem = d->mainLayout->itemAt(4);
118 d->mainLayout->removeItem(spacingItem);
119 }
120 else {
121 d->mainLayout->insertSpacing(4, SPACING_UNIT * 2 );
122 q->setFeatures(d->features);
123 }
124
125 q->toggleViewAction()->setEnabled(!locked);
126 d->closeButton->setEnabled(!locked);
127 d->closeButton->setVisible(!locked);
128
129 d->floatButton->setEnabled(!locked);
130 d->floatButton->setVisible(!locked);
131
132
133 d->updateIcons();
134 q->setProperty("Locked", locked);
135}
136
137void KisUtilityTitleBar::Private::updateIcons()
138{
139 lockIcon = (!locked) ? kisIcon("docker_lock_a") : kisIcon("docker_lock_b");
140 lockButton->setIcon(lockIcon);
141
142 // this method gets called when switching themes, so update all of the themed icons now
143 floatButton->setIcon(kisIcon("docker_float"));
144 closeButton->setIcon(kisIcon("docker_close"));
145
146 thePublic->resizeEvent(0);
147}
148
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
A special utility titlebar with a title and controls, as well as a central area for adding frequently...
KisUtilityTitleBar(QWidget *parent=nullptr)
void setWidgetArea(QWidget *widgetArea)
A custom title bar button for dock widgets.
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
#define kisIcon(name)
Definition kis_icon.h:26