File indexing completed on 2024-06-09 04:24:54

0001 /*
0002  * SPDX-FileCopyrightText: 2005-2009 Thomas Zander <zander@kde.org>
0003  * SPDX-FileCopyrightText: 2009 Peter Simonsson <peter.simonsson@gmail.com>
0004  * SPDX-FileCopyrightText: 2010 Cyrille Berger <cberger@cberger.net>
0005  * SPDX-FileCopyrightText: 2022 Alvin Wong <alvin@alvinhc.com>
0006  *
0007  * SPDX-License-Identifier: LGPL-2.0-or-later
0008  */
0009 
0010 #include "KoToolBoxDocker_p.h"
0011 #include "KoToolBox_p.h"
0012 #include "KoToolBoxScrollArea_p.h"
0013 
0014 #include <QLabel>
0015 #include <QFontMetrics>
0016 #include <QFrame>
0017 #include <QAction>
0018 #include <QMenu>
0019 
0020 #include <klocalizedstring.h>
0021 #include <kconfiggroup.h>
0022 #include <ksharedconfig.h>
0023 
0024 KoToolBoxDocker::KoToolBoxDocker(KoToolBox *toolBox)
0025     : QDockWidget(i18n("Toolbox"))
0026     , m_toolBox(toolBox)
0027     , m_scrollArea(new KoToolBoxScrollArea(toolBox, this))
0028 {
0029     setWidget(m_scrollArea);
0030 
0031     QLabel *w = new QLabel(" ", this);
0032     w->setFrameShape(QFrame::StyledPanel);
0033     w->setFrameShadow(QFrame::Raised);
0034     w->setFrameStyle(QFrame::Panel | QFrame::Raised);
0035     QFont font = qApp->font();
0036     font.setPointSizeF(font.pointSizeF() * 0.9);
0037     int titleSize = QFontMetrics(font).height();
0038     w->setMinimumSize(titleSize, titleSize);
0039     setTitleBarWidget(w);
0040 
0041     KConfigGroup cfg =  KSharedConfig::openConfig()->group("KoToolBox");
0042     const int layoutDirUnchecked = cfg.readEntry<int>("layoutDir", Qt::LayoutDirectionAuto);
0043     switch (layoutDirUnchecked) {
0044     case Qt::LayoutDirectionAuto:
0045     case Qt::LeftToRight:
0046     case Qt::RightToLeft:
0047         m_layoutDir = static_cast<Qt::LayoutDirection>(layoutDirUnchecked);
0048         break;
0049     default:
0050         m_layoutDir = Qt::LayoutDirectionAuto;
0051         break;
0052     }
0053     updateLayoutDir();
0054 
0055     connect(this, SIGNAL(dockLocationChanged(Qt::DockWidgetArea)),
0056             this, SLOT(updateToolBoxOrientation(Qt::DockWidgetArea)));
0057     connect(this, SIGNAL(topLevelChanged(bool)),
0058             this, SLOT(updateFloating(bool)));
0059 }
0060 
0061 void KoToolBoxDocker::setCanvas(KoCanvasBase *canvas)
0062 {
0063     Q_UNUSED(canvas);
0064 }
0065 
0066 void KoToolBoxDocker::unsetCanvas()
0067 {
0068 }
0069 
0070 void KoToolBoxDocker::setViewManager(KisViewManager *viewManager)
0071 {
0072     m_toolBox->setViewManager(viewManager);
0073 }
0074 
0075 void KoToolBoxDocker::resizeEvent(QResizeEvent *event)
0076 {
0077     QDockWidget::resizeEvent(event);
0078     if (isFloating()) {
0079         if (width() > height()) {
0080             setToolBoxOrientation(Qt::Horizontal);
0081         } else {
0082             setToolBoxOrientation(Qt::Vertical);
0083         }
0084     }
0085 }
0086 
0087 void KoToolBoxDocker::updateToolBoxOrientation(Qt::DockWidgetArea area)
0088 {
0089     m_dockArea = area;
0090     updateLayoutDir();
0091     if (area == Qt::TopDockWidgetArea || area == Qt::BottomDockWidgetArea) {
0092         setToolBoxOrientation(Qt::Horizontal);
0093     } else {
0094         setToolBoxOrientation(Qt::Vertical);
0095     }
0096 }
0097 
0098 void KoToolBoxDocker::updateLayoutDir()
0099 {
0100     if (m_layoutDir == Qt::LayoutDirectionAuto) {
0101         if (m_dockArea == Qt::RightDockWidgetArea) {
0102             m_scrollArea->setLayoutDirection(Qt::RightToLeft);
0103         } else if (m_dockArea == Qt::LeftDockWidgetArea) {
0104             m_scrollArea->setLayoutDirection(Qt::LeftToRight);
0105         } else {
0106             m_scrollArea->unsetLayoutDirection();
0107         }
0108     } else {
0109         m_scrollArea->setLayoutDirection(m_layoutDir);
0110     }
0111 }
0112 
0113 void KoToolBoxDocker::changeLayoutDir(Qt::LayoutDirection dir)
0114 {
0115     KConfigGroup cfg = KSharedConfig::openConfig()->group("KoToolBox");
0116     cfg.writeEntry<int>("layoutDir", dir);
0117     m_layoutDir = dir;
0118     updateLayoutDir();
0119 }
0120 
0121 void KoToolBoxDocker::setToolBoxOrientation(Qt::Orientation orientation)
0122 {
0123     if (orientation == Qt::Horizontal) {
0124         setFeatures(features() | QDockWidget::DockWidgetVerticalTitleBar);
0125         m_scrollArea->setOrientation(Qt::Horizontal);
0126     } else {
0127         setFeatures(features() & ~QDockWidget::DockWidgetVerticalTitleBar);
0128         m_scrollArea->setOrientation(Qt::Vertical);
0129     }
0130 }
0131 
0132 void KoToolBoxDocker::updateFloating(bool v)
0133 {
0134     m_toolBox->setFloating(v);
0135 }
0136 
0137 void KoToolBoxDocker::contextMenuEvent(QContextMenuEvent *event)
0138 {
0139     if (!m_contextMenu) {
0140         m_contextMenu = new QMenu(this);
0141         m_contextMenu->addSection(i18n("Icon Size"));
0142         m_toolBox->setupIconSizeMenu(m_contextMenu);
0143 
0144         m_contextMenu->addSection(i18nc("Toolbox layout", "Layout"));
0145         QActionGroup *layoutActionGroup = new QActionGroup(m_contextMenu);
0146 
0147         QAction *layoutAuto = m_contextMenu->addAction(i18nc("@item:inmenu Toolbox layout direction", "&Automatic"));
0148         layoutAuto->setActionGroup(layoutActionGroup);
0149         layoutAuto->setCheckable(true);
0150         connect(layoutAuto, &QAction::triggered, this, [this]() {
0151             changeLayoutDir(Qt::LayoutDirectionAuto);
0152         });
0153 
0154         QAction *layoutLtr = m_contextMenu->addAction(i18nc("@item:inmenu Toolbox layout direction", "&Left-to-right"));
0155         layoutLtr->setActionGroup(layoutActionGroup);
0156         layoutLtr->setCheckable(true);
0157         connect(layoutLtr, &QAction::triggered, this, [this]() {
0158             changeLayoutDir(Qt::LeftToRight);
0159         });
0160 
0161         QAction *layoutRtl = m_contextMenu->addAction(i18nc("@item:inmenu Toolbox layout direction", "&Right-to-left"));
0162         layoutRtl->setActionGroup(layoutActionGroup);
0163         layoutRtl->setCheckable(true);
0164         connect(layoutRtl, &QAction::triggered, this, [this]() {
0165             changeLayoutDir(Qt::RightToLeft);
0166         });
0167 
0168         switch (m_layoutDir) {
0169         case Qt::LayoutDirectionAuto:
0170             layoutAuto->setChecked(true);
0171             break;
0172         case Qt::LeftToRight:
0173             layoutLtr->setChecked(true);
0174             break;
0175         case Qt::RightToLeft:
0176             layoutRtl->setChecked(true);
0177             break;
0178         }
0179     }
0180 
0181     m_contextMenu->exec(event->globalPos());
0182 }