File indexing completed on 2024-06-23 04:28:10

0001 /*
0002  *  SPDX-FileCopyrightText: 2017 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "DefaultToolTabbedWidget.h"
0008 
0009 #include <QLabel>
0010 #include "kis_icon_utils.h"
0011 #include "DefaultToolGeometryWidget.h"
0012 #include "KoStrokeConfigWidget.h"
0013 #include "KoFillConfigWidget.h"
0014 #include <KoInteractionTool.h>
0015 
0016 #include <kis_document_aware_spin_box_unit_manager.h>
0017 
0018 
0019 DefaultToolTabbedWidget::DefaultToolTabbedWidget(KoInteractionTool *tool, QWidget *parent)
0020     : KoTitledTabWidget(parent)
0021 {    
0022     setObjectName("default-tool-tabbed-widget");
0023 
0024     m_geometryWidget = new DefaultToolGeometryWidget(tool, this);
0025     m_geometryWidget->setWindowTitle(i18n("Geometry"));
0026     addTab(m_geometryWidget, KisIconUtils::loadIcon("geometry"), QString());
0027 
0028     m_strokeWidget = new KoStrokeConfigWidget(tool->canvas(), this);
0029     m_strokeWidget->setWindowTitle(i18nc("Draws a line around an area", "Stroke"));
0030 
0031     KisDocumentAwareSpinBoxUnitManager* managerLineWidth = new KisDocumentAwareSpinBoxUnitManager(m_strokeWidget);
0032     KisDocumentAwareSpinBoxUnitManager* managerMitterLimit = new KisDocumentAwareSpinBoxUnitManager(m_strokeWidget);
0033     managerLineWidth->setApparentUnitFromSymbol("px");
0034     managerMitterLimit->setApparentUnitFromSymbol("px"); //set unit to px by default
0035     m_strokeWidget->setUnitManagers(managerLineWidth, managerMitterLimit);
0036 
0037     addTab(m_strokeWidget, KisIconUtils::loadIcon("krita_tool_line"), QString());
0038 
0039 
0040     m_fillWidget = new KoFillConfigWidget(tool->canvas(), KoFlake::Fill, true, this);
0041     m_fillWidget->setWindowTitle(i18n("Fill"));
0042     addTab(m_fillWidget, KisIconUtils::loadIcon("krita_tool_color_fill"), QString());
0043 
0044     connect(this, SIGNAL(currentChanged(int)), SLOT(slotCurrentIndexChanged(int)));
0045     m_oldTabIndex = currentIndex();
0046 
0047     connect(m_fillWidget, SIGNAL(sigMeshGradientResetted()), SIGNAL(sigMeshGradientResetted()));
0048 }
0049 
0050 DefaultToolTabbedWidget::~DefaultToolTabbedWidget()
0051 {
0052 }
0053 
0054 void DefaultToolTabbedWidget::activate()
0055 {
0056     if (currentIndex() == StrokeTab) {
0057         m_strokeWidget->activate();
0058     } else {
0059         m_fillWidget->activate();
0060     }
0061 }
0062 
0063 void DefaultToolTabbedWidget::deactivate()
0064 {
0065     if (m_oldTabIndex == StrokeTab) {
0066         m_strokeWidget->deactivate();
0067     } else {
0068         m_fillWidget->deactivate();
0069     }
0070 }
0071 
0072 bool DefaultToolTabbedWidget::useUniformScaling() const
0073 {
0074     return m_geometryWidget->useUniformScaling();
0075 }
0076 
0077 void DefaultToolTabbedWidget::slotMeshGradientHandleSelected(KoShapeMeshGradientHandles::Handle h)
0078 {
0079     if (h.type == KoShapeMeshGradientHandles::Handle::Corner) {
0080         m_fillWidget->setSelectedMeshGradientHandle(SvgMeshPosition {h.row, h.col, h.segmentType});
0081     } else {
0082         m_fillWidget->setSelectedMeshGradientHandle(SvgMeshPosition());
0083     }
0084 }
0085 
0086 void DefaultToolTabbedWidget::slotCurrentIndexChanged(int current)
0087 {
0088     // because of nesting we are required to only let one widget be active at at time
0089     deactivate();
0090     activate();
0091 
0092     if (m_oldTabIndex == FillTab) {
0093         emit sigSwitchModeEditFillGradient(false);
0094     } else if (m_oldTabIndex == StrokeTab) {
0095         emit sigSwitchModeEditStrokeGradient(false);
0096     }
0097 
0098     m_oldTabIndex = current;
0099 
0100     if (current == FillTab) {
0101         emit sigSwitchModeEditFillGradient(true);
0102     } else if (m_oldTabIndex == StrokeTab) {
0103         emit sigSwitchModeEditStrokeGradient(true);
0104     }
0105 }