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 connect(this, SIGNAL(dockLocationChanged(Qt::DockWidgetArea)),
63 this, SLOT(updateToolBoxOrientation(Qt::DockWidgetArea)));
64 connect(this, SIGNAL(topLevelChanged(bool)),
65 this, SLOT(updateFloating(bool)));
66}
67
69{
70 Q_UNUSED(canvas);
71}
72
76
78{
79 m_toolBox->setViewManager(viewManager);
80}
81
82void KoToolBoxDocker::resizeEvent(QResizeEvent *event)
83{
84 QDockWidget::resizeEvent(event);
85 if (isFloating()) {
86 if (width() > height()) {
87 setToolBoxOrientation(Qt::Horizontal);
88 } else {
89 setToolBoxOrientation(Qt::Vertical);
90 }
91 }
92}
93
94void KoToolBoxDocker::updateToolBoxOrientation(Qt::DockWidgetArea area)
95{
96 m_dockArea = area;
98 if (area == Qt::TopDockWidgetArea || area == Qt::BottomDockWidgetArea) {
99 setToolBoxOrientation(Qt::Horizontal);
100 } else {
101 setToolBoxOrientation(Qt::Vertical);
102 }
103}
104
106{
107 if (m_layoutDir == Qt::LayoutDirectionAuto) {
108 if (m_dockArea == Qt::RightDockWidgetArea) {
109 m_scrollArea->setLayoutDirection(Qt::RightToLeft);
110 } else if (m_dockArea == Qt::LeftDockWidgetArea) {
111 m_scrollArea->setLayoutDirection(Qt::LeftToRight);
112 } else {
113 m_scrollArea->unsetLayoutDirection();
114 }
115 } else {
116 m_scrollArea->setLayoutDirection(m_layoutDir);
117 }
118}
119
120void KoToolBoxDocker::changeLayoutDir(Qt::LayoutDirection dir)
121{
122 KConfigGroup cfg = KSharedConfig::openConfig()->group("KoToolBox");
123 cfg.writeEntry<int>("layoutDir", dir);
124 m_layoutDir = dir;
126}
127
128void KoToolBoxDocker::setToolBoxOrientation(Qt::Orientation orientation)
129{
130 if (orientation == Qt::Horizontal) {
131 setFeatures(features() | QDockWidget::DockWidgetVerticalTitleBar);
132 m_scrollArea->setOrientation(Qt::Horizontal);
133 } else {
134 setFeatures(features() & ~QDockWidget::DockWidgetVerticalTitleBar);
135 m_scrollArea->setOrientation(Qt::Vertical);
136 }
137}
138
143
144void KoToolBoxDocker::contextMenuEvent(QContextMenuEvent *event)
145{
146 if (!m_contextMenu) {
147 m_contextMenu = new QMenu(this);
148 m_contextMenu->addSection(i18n("Icon Size"));
150
151 m_contextMenu->addSection(i18nc("Toolbox layout", "Layout"));
152 QActionGroup *layoutActionGroup = new QActionGroup(m_contextMenu);
153
154 QAction *layoutAuto = m_contextMenu->addAction(i18nc("@item:inmenu Toolbox layout direction", "&Automatic"));
155 layoutAuto->setActionGroup(layoutActionGroup);
156 layoutAuto->setCheckable(true);
157 connect(layoutAuto, &QAction::triggered, this, [this]() {
158 changeLayoutDir(Qt::LayoutDirectionAuto);
159 });
160
161 QAction *layoutLtr = m_contextMenu->addAction(i18nc("@item:inmenu Toolbox layout direction", "&Left-to-right"));
162 layoutLtr->setActionGroup(layoutActionGroup);
163 layoutLtr->setCheckable(true);
164 connect(layoutLtr, &QAction::triggered, this, [this]() {
165 changeLayoutDir(Qt::LeftToRight);
166 });
167
168 QAction *layoutRtl = m_contextMenu->addAction(i18nc("@item:inmenu Toolbox layout direction", "&Right-to-left"));
169 layoutRtl->setActionGroup(layoutActionGroup);
170 layoutRtl->setCheckable(true);
171 connect(layoutRtl, &QAction::triggered, this, [this]() {
172 changeLayoutDir(Qt::RightToLeft);
173 });
174
175 switch (m_layoutDir) {
176 case Qt::LayoutDirectionAuto:
177 layoutAuto->setChecked(true);
178 break;
179 case Qt::LeftToRight:
180 layoutLtr->setChecked(true);
181 break;
182 case Qt::RightToLeft:
183 layoutRtl->setChecked(true);
184 break;
185 }
186 }
187
188 m_contextMenu->exec(event->globalPos());
189}
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 updateToolBoxOrientation(Qt::DockWidgetArea area)
void contextMenuEvent(QContextMenuEvent *event) override
void setCanvas(KoCanvasBase *canvas) override
reimplemented from KoCanvasObserverBase
void setToolBoxOrientation(Qt::Orientation orientation)
void updateFloating(bool)
KoToolBox * m_toolBox
KoToolBoxDocker(KoToolBox *toolBox)
void changeLayoutDir(Qt::LayoutDirection)
void resizeEvent(QResizeEvent *event) override
void setOrientation(Qt::Orientation orientation)
void setupIconSizeMenu(QMenu *menu)
void setFloating(bool v)
void setViewManager(KisViewManager *viewManager)