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.setPointSizeF(font.pointSizeF() * 0.9);
38 int titleSize = QFontMetrics(font).height();
39 w->setMinimumSize(titleSize, titleSize);
40 setTitleBarWidget(w);
41
42 KConfigGroup cfg = KSharedConfig::openConfig()->group("KoToolBox");
43 const int layoutDirUnchecked = cfg.readEntry<int>("layoutDir", Qt::LayoutDirectionAuto);
44 switch (layoutDirUnchecked) {
45 case Qt::LayoutDirectionAuto:
46 case Qt::LeftToRight:
47 case Qt::RightToLeft:
48 m_layoutDir = static_cast<Qt::LayoutDirection>(layoutDirUnchecked);
49 break;
50 default:
51 m_layoutDir = Qt::LayoutDirectionAuto;
52 break;
53 }
55
56 connect(this, SIGNAL(dockLocationChanged(Qt::DockWidgetArea)),
57 this, SLOT(updateToolBoxOrientation(Qt::DockWidgetArea)));
58 connect(this, SIGNAL(topLevelChanged(bool)),
59 this, SLOT(updateFloating(bool)));
60}
61
63{
64 Q_UNUSED(canvas);
65}
66
70
72{
73 m_toolBox->setViewManager(viewManager);
74}
75
76void KoToolBoxDocker::resizeEvent(QResizeEvent *event)
77{
78 QDockWidget::resizeEvent(event);
79 if (isFloating()) {
80 if (width() > height()) {
81 setToolBoxOrientation(Qt::Horizontal);
82 } else {
83 setToolBoxOrientation(Qt::Vertical);
84 }
85 }
86}
87
88void KoToolBoxDocker::updateToolBoxOrientation(Qt::DockWidgetArea area)
89{
90 m_dockArea = area;
92 if (area == Qt::TopDockWidgetArea || area == Qt::BottomDockWidgetArea) {
93 setToolBoxOrientation(Qt::Horizontal);
94 } else {
95 setToolBoxOrientation(Qt::Vertical);
96 }
97}
98
100{
101 if (m_layoutDir == Qt::LayoutDirectionAuto) {
102 if (m_dockArea == Qt::RightDockWidgetArea) {
103 m_scrollArea->setLayoutDirection(Qt::RightToLeft);
104 } else if (m_dockArea == Qt::LeftDockWidgetArea) {
105 m_scrollArea->setLayoutDirection(Qt::LeftToRight);
106 } else {
107 m_scrollArea->unsetLayoutDirection();
108 }
109 } else {
110 m_scrollArea->setLayoutDirection(m_layoutDir);
111 }
112}
113
114void KoToolBoxDocker::changeLayoutDir(Qt::LayoutDirection dir)
115{
116 KConfigGroup cfg = KSharedConfig::openConfig()->group("KoToolBox");
117 cfg.writeEntry<int>("layoutDir", dir);
118 m_layoutDir = dir;
120}
121
122void KoToolBoxDocker::setToolBoxOrientation(Qt::Orientation orientation)
123{
124 if (orientation == Qt::Horizontal) {
125 setFeatures(features() | QDockWidget::DockWidgetVerticalTitleBar);
126 m_scrollArea->setOrientation(Qt::Horizontal);
127 } else {
128 setFeatures(features() & ~QDockWidget::DockWidgetVerticalTitleBar);
129 m_scrollArea->setOrientation(Qt::Vertical);
130 }
131}
132
137
138void KoToolBoxDocker::contextMenuEvent(QContextMenuEvent *event)
139{
140 if (!m_contextMenu) {
141 m_contextMenu = new QMenu(this);
142 m_contextMenu->addSection(i18n("Icon Size"));
144
145 m_contextMenu->addSection(i18nc("Toolbox layout", "Layout"));
146 QActionGroup *layoutActionGroup = new QActionGroup(m_contextMenu);
147
148 QAction *layoutAuto = m_contextMenu->addAction(i18nc("@item:inmenu Toolbox layout direction", "&Automatic"));
149 layoutAuto->setActionGroup(layoutActionGroup);
150 layoutAuto->setCheckable(true);
151 connect(layoutAuto, &QAction::triggered, this, [this]() {
152 changeLayoutDir(Qt::LayoutDirectionAuto);
153 });
154
155 QAction *layoutLtr = m_contextMenu->addAction(i18nc("@item:inmenu Toolbox layout direction", "&Left-to-right"));
156 layoutLtr->setActionGroup(layoutActionGroup);
157 layoutLtr->setCheckable(true);
158 connect(layoutLtr, &QAction::triggered, this, [this]() {
159 changeLayoutDir(Qt::LeftToRight);
160 });
161
162 QAction *layoutRtl = m_contextMenu->addAction(i18nc("@item:inmenu Toolbox layout direction", "&Right-to-left"));
163 layoutRtl->setActionGroup(layoutActionGroup);
164 layoutRtl->setCheckable(true);
165 connect(layoutRtl, &QAction::triggered, this, [this]() {
166 changeLayoutDir(Qt::RightToLeft);
167 });
168
169 switch (m_layoutDir) {
170 case Qt::LayoutDirectionAuto:
171 layoutAuto->setChecked(true);
172 break;
173 case Qt::LeftToRight:
174 layoutLtr->setChecked(true);
175 break;
176 case Qt::RightToLeft:
177 layoutRtl->setChecked(true);
178 break;
179 }
180 }
181
182 m_contextMenu->exec(event->globalPos());
183}
qreal v
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
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)