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 }