Krita Source Code Documentation
Loading...
Searching...
No Matches
KoToolBoxDocker.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2005-2009 Thomas Zander <zander@kde.org>
3 * SPDX-FileCopyrightText: 2009 Peter Simonsson <peter.simonsson@gmail.com>
4 * SPDX-FileCopyrightText: 2010 Cyrille Berger <cberger@cberger.net>
5 * SPDX-FileCopyrightText: 2022 Alvin Wong <alvin@alvinhc.com>
6 *
7 * SPDX-License-Identifier: LGPL-2.0-or-later
8 */
9
10#include "KoToolBoxDocker_p.h"
11#include "KoToolBox_p.h"
13
14#include <QLabel>
15#include <QFontMetrics>
16#include <QFrame>
17#include <QAction>
18#include <QMenu>
19#include <QActionGroup>
20
21#include <klocalizedstring.h>
22#include <kconfiggroup.h>
23#include <ksharedconfig.h>
24
26 : QDockWidget(i18n("Toolbox"))
27 , m_toolBox(toolBox)
28 , m_scrollArea(new KoToolBoxScrollArea(toolBox, this))
29{
30 setWidget(m_scrollArea);
31
32 QLabel *w = new QLabel(" ", this);
33 w->setFrameShape(QFrame::StyledPanel);
34 w->setFrameShadow(QFrame::Raised);
35 w->setFrameStyle(QFrame::Panel | QFrame::Raised);
36 QFont font = qApp->font();
37 // Font size may be in pixels (on Android) or points (everywhere else.)
38 qreal ratio = 0.9;
39 if (font.pixelSize() == -1) {
40 font.setPointSizeF(font.pointSizeF() * ratio);
41 } else {
42 font.setPixelSize(qRound(font.pixelSize() * ratio));
43 }
44 int titleSize = QFontMetrics(font).height();
45 w->setMinimumSize(titleSize, titleSize);
46 setTitleBarWidget(w);
47
48 KConfigGroup cfg = KSharedConfig::openConfig()->group("KoToolBox");
49 const int layoutDirUnchecked = cfg.readEntry<int>("layoutDir", Qt::LayoutDirectionAuto);
50 switch (layoutDirUnchecked) {
51 case Qt::LayoutDirectionAuto:
52 case Qt::LeftToRight:
53 case Qt::RightToLeft:
54 m_layoutDir = static_cast<Qt::LayoutDirection>(layoutDirUnchecked);
55 break;
56 default:
57 m_layoutDir = Qt::LayoutDirectionAuto;
58 break;
59 }
61
62 const int orientUnchecked = cfg.readEntry<int>("orientation", Auto);
63 switch (orientUnchecked) {
64 case Horizontal:
65 case Vertical:
66 case Auto:
67 m_orientation = static_cast<Orientation>(orientUnchecked);
68 break;
69 default:
71 break;
72 }
73 if (m_orientation != Auto) {
74 setToolBoxOrientation(static_cast<Qt::Orientation>(m_orientation));
75 }
76
77 connect(this, SIGNAL(dockLocationChanged(Qt::DockWidgetArea)),
78 this, SLOT(updateToolBoxOrientation(Qt::DockWidgetArea)));
79 connect(this, SIGNAL(topLevelChanged(bool)),
80 this, SLOT(updateFloating(bool)));
81}
82
84{
85 Q_UNUSED(canvas);
86}
87
91
93{
94 m_toolBox->setViewManager(viewManager);
95}
96
97void KoToolBoxDocker::resizeEvent(QResizeEvent *event)
98{
99 QDockWidget::resizeEvent(event);
100 if (m_orientation == Auto) {
101 setToolBoxOrientation(width() > height() ? Qt::Horizontal : Qt::Vertical);
102 }
103}
104
105void KoToolBoxDocker::updateToolBoxOrientation(Qt::DockWidgetArea area)
106{
107 m_dockArea = area;
109 if (m_orientation == Auto) {
110 setToolBoxOrientation(width() > height() ? Qt::Horizontal : Qt::Vertical);
111 }
112}
113
115{
116 if (m_layoutDir == Qt::LayoutDirectionAuto) {
117 if (m_dockArea == Qt::RightDockWidgetArea) {
118 m_scrollArea->setLayoutDirection(Qt::RightToLeft);
119 } else if (m_dockArea == Qt::LeftDockWidgetArea) {
120 m_scrollArea->setLayoutDirection(Qt::LeftToRight);
121 } else {
122 m_scrollArea->unsetLayoutDirection();
123 }
124 } else {
125 m_scrollArea->setLayoutDirection(m_layoutDir);
126 }
127}
128
129void KoToolBoxDocker::changeLayoutDir(Qt::LayoutDirection dir)
130{
131 KConfigGroup cfg = KSharedConfig::openConfig()->group("KoToolBox");
132 cfg.writeEntry<int>("layoutDir", dir);
133 m_layoutDir = dir;
135}
136
138{
139 if (m_orientation == orientation) {
140 return;
141 }
142 KConfigGroup cfg = KSharedConfig::openConfig()->group("KoToolBox");
143 cfg.writeEntry<int>("orientation", orientation);
144 m_orientation = orientation;
145 if (m_orientation == Auto) {
146 setToolBoxOrientation(width() > height() ? Qt::Horizontal : Qt::Vertical);
147 } else {
148 setToolBoxOrientation(static_cast<Qt::Orientation>(m_orientation));
149 }
150}
151
152void KoToolBoxDocker::changeCompact(const bool state)
153{
154 KConfigGroup cfg = KSharedConfig::openConfig()->group("KoToolBox");
155 cfg.writeEntry<bool>("compact", state);
156 m_scrollArea->setCompact(state);
157}
158
159void KoToolBoxDocker::setToolBoxOrientation(Qt::Orientation orientation)
160{
161 if (m_scrollArea->orientation() == orientation) {
162 return;
163 }
164 if (orientation == Qt::Horizontal) {
165 setFeatures(features() | QDockWidget::DockWidgetVerticalTitleBar);
166 m_scrollArea->setOrientation(Qt::Horizontal);
167 } else {
168 setFeatures(features() & ~QDockWidget::DockWidgetVerticalTitleBar);
169 m_scrollArea->setOrientation(Qt::Vertical);
170 }
171}
172
177
178void KoToolBoxDocker::contextMenuEvent(QContextMenuEvent *event)
179{
180 if (!m_contextMenu) {
181 m_contextMenu = new QMenu(this);
182
183 QAction *compact = m_contextMenu->addAction(i18n("Compact"));
184 compact->setCheckable(true);
185 compact->setChecked(m_toolBox->isCompact());
186 connect(compact, &QAction::triggered, this, &KoToolBoxDocker::changeCompact);
187
188 m_contextMenu->addSection(i18n("Icon Size"));
190
191 m_contextMenu->addSection(i18nc("Toolbox layout", "Layout"));
192 QActionGroup *layoutActionGroup = new QActionGroup(m_contextMenu);
193
194 QAction *layoutAuto = m_contextMenu->addAction(i18nc("@item:inmenu Toolbox layout direction", "&Automatic"));
195 layoutAuto->setActionGroup(layoutActionGroup);
196 layoutAuto->setCheckable(true);
197 connect(layoutAuto, &QAction::triggered, this, [this]() {
198 changeLayoutDir(Qt::LayoutDirectionAuto);
199 });
200
201 QAction *layoutLtr = m_contextMenu->addAction(i18nc("@item:inmenu Toolbox layout direction", "&Left-to-right"));
202 layoutLtr->setActionGroup(layoutActionGroup);
203 layoutLtr->setCheckable(true);
204 connect(layoutLtr, &QAction::triggered, this, [this]() {
205 changeLayoutDir(Qt::LeftToRight);
206 });
207
208 QAction *layoutRtl = m_contextMenu->addAction(i18nc("@item:inmenu Toolbox layout direction", "&Right-to-left"));
209 layoutRtl->setActionGroup(layoutActionGroup);
210 layoutRtl->setCheckable(true);
211 connect(layoutRtl, &QAction::triggered, this, [this]() {
212 changeLayoutDir(Qt::RightToLeft);
213 });
214
215 switch (m_layoutDir) {
216 case Qt::LayoutDirectionAuto:
217 layoutAuto->setChecked(true);
218 break;
219 case Qt::LeftToRight:
220 layoutLtr->setChecked(true);
221 break;
222 case Qt::RightToLeft:
223 layoutRtl->setChecked(true);
224 break;
225 }
226
227 m_contextMenu->addSection(i18nc("Toolbox orientation", "Orientation"));
228 QActionGroup *orientActionGroup = new QActionGroup(m_contextMenu);
229
230 QAction *orientAuto = m_contextMenu->addAction(i18nc("@item:inmenu Toolbox orientation", "&Automatic"));
231 orientAuto->setActionGroup(orientActionGroup);
232 orientAuto->setCheckable(true);
233 connect(orientAuto, &QAction::triggered, this, [this]() {
235 });
236
237 QAction *orientHorizontal = m_contextMenu->addAction(i18nc("@item:inmenu Toolbox orientation", "&Horizontal"));
238 orientHorizontal->setActionGroup(orientActionGroup);
239 orientHorizontal->setCheckable(true);
240 connect(orientHorizontal, &QAction::triggered, this, [this]() {
242 });
243
244 QAction *orientVertical = m_contextMenu->addAction(i18nc("@item:inmenu Toolbox orientation", "&Vertical"));
245 orientVertical->setActionGroup(orientActionGroup);
246 orientVertical->setCheckable(true);
247 connect(orientVertical, &QAction::triggered, this, [this]() {
249 });
250
251 switch (m_orientation) {
252 case Horizontal:
253 orientHorizontal->setChecked(true);
254 break;
255 case Vertical:
256 orientVertical->setChecked(true);
257 break;
258 case Auto:
259 orientAuto->setChecked(true);
260 break;
261 }
262 }
263
264 m_contextMenu->exec(event->globalPos());
265}
qreal v
Qt::DockWidgetArea m_dockArea
void setViewManager(KisViewManager *viewManager) override
reimplemented from KisMainwindowObserver
KoToolBoxScrollArea * m_scrollArea
Qt::LayoutDirection m_layoutDir
void unsetCanvas() override
void contextMenuEvent(QContextMenuEvent *event) override
Orientation m_orientation
void setCanvas(KoCanvasBase *canvas) override
reimplemented from KoCanvasObserverBase
void updateFloating(bool)
void changeOrientation(Orientation)
void updateToolBoxOrientation(Qt::DockWidgetArea)
KoToolBox * m_toolBox
KoToolBoxDocker(KoToolBox *toolBox)
void setToolBoxOrientation(Qt::Orientation)
void changeLayoutDir(Qt::LayoutDirection)
void resizeEvent(QResizeEvent *event) override
void setCompact(bool state)
Qt::Orientation orientation() const
void setOrientation(Qt::Orientation orientation)
void setupIconSizeMenu(QMenu *menu)
void setFloating(bool v)
void setViewManager(KisViewManager *viewManager)
bool isCompact()