Krita Source Code Documentation
Loading...
Searching...
No Matches
KoToolDocker.cpp
Go to the documentation of this file.
1/* This file is part of the KDE project
2 *
3 * SPDX-FileCopyrightText: 2010-2011 C. Boemann <cbo@boemann.dk>
4 * SPDX-FileCopyrightText: 2005-2006 Boudewijn Rempt <boud@valdyas.org>
5 * SPDX-FileCopyrightText: 2006 Thomas Zander <zander@kde.org>
6 *
7 * SPDX-License-Identifier: LGPL-2.0-or-later
8 */
9#include "KoToolDocker.h"
10
11#include <klocalizedstring.h>
12
13#include <QApplication>
14#include <QBoxLayout>
15#include <QGridLayout>
16#include <QLabel>
17#include <QScrollArea>
18#include <QScroller>
19
20class Q_DECL_HIDDEN KoToolDocker::Private
21{
22public:
24 : q(dock)
25 {
26 }
27
31 delete hiderWidget;
32 }
33
35 QSet<QWidget *> currentAuxWidgets;
36 QScrollArea *scrollArea {nullptr};
37 QWidget *hiderWidget {nullptr}; // non current widgets are hidden by being children of this
38 QWidget *housekeeperWidget {nullptr};
39 QGridLayout *housekeeperLayout {nullptr};
40 QBoxLayout *housekeeperMainLayout{nullptr};
41 KoToolDocker *q {nullptr};
42 Qt::DockWidgetArea dockingArea {Qt::NoDockWidgetArea};
43
45 {
46 currentWidgetList.clear();
47 qDeleteAll(currentAuxWidgets);
48 currentAuxWidgets.clear();
49 }
50
51 void recreateLayout(const QList<QPointer<QWidget> > &optionWidgetList)
52 {
53 Q_FOREACH (QPointer<QWidget> widget, currentWidgetList) {
54 if (!widget.isNull() && widget && hiderWidget) {
55 widget->setParent(hiderWidget);
56 }
57 }
58 qDeleteAll(currentAuxWidgets);
59 currentAuxWidgets.clear();
60
61 currentWidgetList = optionWidgetList;
62
63 // need to unstretch row that have previously been stretched
64 housekeeperLayout->setRowStretch(housekeeperLayout->rowCount()-1, 0);
65
66 int cnt = 0;
67 QFrame *s;
68 QLabel *l;
69 switch (dockingArea) {
70 case Qt::TopDockWidgetArea:
71 case Qt::BottomDockWidgetArea:
72 housekeeperMainLayout->setDirection(QBoxLayout::LeftToRight);
73 housekeeperMainLayout->setStretch(0, 1);
74 housekeeperMainLayout->setStretch(1, 0);
75 housekeeperLayout->setHorizontalSpacing(2);
76 housekeeperLayout->setVerticalSpacing(0);
77 Q_FOREACH (QPointer<QWidget> widget, currentWidgetList) {
78 if (widget.isNull() || widget->objectName().isEmpty()) {
79 continue;
80 }
81 if (!widget->windowTitle().isEmpty()) {
82 housekeeperLayout->addWidget(
83 l = new QLabel(widget->windowTitle()),
84 0,
85 2 * cnt);
86 currentAuxWidgets.insert(l);
87 }
88 housekeeperLayout->addWidget(widget, 1, 2 * cnt);
89 widget->show();
90 if (widget != currentWidgetList.last()) {
91 housekeeperLayout->addWidget(s = new QFrame(),
92 0,
93 2 * cnt + 1,
94 2,
95 1);
96 s->setFrameShape(QFrame::VLine);
97 currentAuxWidgets.insert(s);
98 }
99 cnt++;
100 }
101 break;
102 case Qt::NoDockWidgetArea:
103 case Qt::LeftDockWidgetArea:
104 case Qt::RightDockWidgetArea: {
105 housekeeperMainLayout->setDirection(QBoxLayout::TopToBottom);
106 housekeeperMainLayout->setStretch(0, 0);
107 housekeeperMainLayout->setStretch(1, 1);
108 housekeeperLayout->setHorizontalSpacing(0);
109 housekeeperLayout->setVerticalSpacing(2);
110 Q_FOREACH (QPointer<QWidget> widget, currentWidgetList) {
111 if (widget.isNull() || widget->objectName().isEmpty()) {
112 continue;
113 }
114 if (!widget->windowTitle().isEmpty()) {
115 housekeeperLayout->addWidget(
116 l = new QLabel(widget->windowTitle()),
117 cnt++,
118 0);
119 currentAuxWidgets.insert(l);
120 }
121 housekeeperLayout->addWidget(widget, cnt++, 0);
122 widget->show();
123 if (widget != currentWidgetList.last()) {
124 housekeeperLayout->addWidget(s = new QFrame(), cnt++, 0);
125 s->setFrameStyle(QFrame::HLine | QFrame::Sunken);
126 currentAuxWidgets.insert(s);
127 }
128 }
129 break;
130 }
131 default:
132 break;
133 }
134
135 housekeeperLayout->setSizeConstraint(QLayout::SetMinAndMaxSize);
136 housekeeperLayout->invalidate();
137 }
138
139 void locationChanged(Qt::DockWidgetArea area)
140 {
141 dockingArea = area;
142 recreateLayout(currentWidgetList);
143 }
144
145};
146
148 : QDockWidget(i18n("Tool Options"), parent),
149 d(new Private(this))
150{
151 connect(this, SIGNAL(dockLocationChanged(Qt::DockWidgetArea)), this, SLOT(locationChanged(Qt::DockWidgetArea)));
152
153 d->housekeeperWidget = new QWidget();
154 d->housekeeperLayout = new QGridLayout;
155 d->housekeeperLayout->setContentsMargins(4,4,4,0);
156 d->housekeeperLayout->setSizeConstraint(QLayout::SetMinAndMaxSize);
157 d->housekeeperMainLayout =
158 new QBoxLayout(QBoxLayout::TopToBottom, d->housekeeperWidget);
159 d->housekeeperMainLayout->setContentsMargins(0, 0, 0, 0);
160 d->housekeeperMainLayout->setSpacing(0);
161 d->housekeeperMainLayout->addLayout(d->housekeeperLayout, 0);
162 d->housekeeperMainLayout->addStretch(1);
163
164 d->hiderWidget = new QWidget();
165 d->hiderWidget->setVisible(false);
166
167 d->scrollArea = new QScrollArea();
168 d->scrollArea->setWidget(d->housekeeperWidget);
169 d->scrollArea->setFrameShape(QFrame::NoFrame);
170 d->scrollArea->setWidgetResizable(true);
171 d->scrollArea->setFocusPolicy(Qt::NoFocus);
172
173 QScroller *scroller = KisKineticScroller::createPreconfiguredScroller(d->scrollArea);
174 if( scroller ) {
175 connect(scroller, SIGNAL(stateChanged(QScroller::State)), this, SLOT(slotScrollerStateChange(QScroller::State)));
176 }
177
178 setWidget(d->scrollArea);
179}
180
182{
183 delete d;
184}
185
187{
188 return !d->currentWidgetList.isEmpty();
189}
190
192{
193 d->recreateLayout(optionWidgetList);
194}
195
196void KoToolDocker::slotScrollerStateChange(QScroller::State state)
197{
198 KisKineticScroller::updateCursor(d->scrollArea, state);
199}
200
202{
203 d->resetWidgets();
204}
205
206
208{
209 setEnabled(canvas != 0);
210}
211
213{
214 setEnabled(false);
215}
216
217//have to include this because of Q_PRIVATE_SLOT
218#include <moc_KoToolDocker.cpp>
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
void unsetCanvas() override
QSet< QWidget * > currentAuxWidgets
~KoToolDocker() override
void slotScrollerStateChange(QScroller::State state)
void resetWidgets()
Private(KoToolDocker *dock)
void locationChanged(Qt::DockWidgetArea area)
QList< QPointer< QWidget > > currentWidgetList
void recreateLayout(const QList< QPointer< QWidget > > &optionWidgetList)
bool hasOptionWidget()
void setOptionWidgets(const QList< QPointer< QWidget > > &optionWidgetList)
KoToolDocker(QWidget *parent=0)
void setCanvas(KoCanvasBase *canvas) override
reimplemented
Private *const d
KRITAWIDGETUTILS_EXPORT void updateCursor(QWidget *source, QScroller::State state)
KRITAWIDGETUTILS_EXPORT QScroller * createPreconfiguredScroller(QAbstractScrollArea *target)
KisCanvas2 * canvas