File indexing completed on 2025-02-23 04:08:59

0001 /*
0002  * This file is part of Krita
0003  *
0004  *  SPDX-FileCopyrightText: 2006 Cyrille Berger <cberger@cberger.net>
0005  *
0006  *  SPDX-License-Identifier: GPL-2.0-or-later
0007  */
0008 
0009 #include "kis_grid_manager.h"
0010 
0011 #include <QAction>
0012 #include <ktoggleaction.h>
0013 #include <kactioncollection.h>
0014 #include <klocalizedstring.h>
0015 
0016 #include <kis_icon.h>
0017 
0018 #include "kis_canvas2.h"
0019 #include "kis_coordinates_converter.h"
0020 #include "kis_config.h"
0021 #include "kis_grid_decoration.h"
0022 #include "kis_image.h"
0023 #include "KisViewManager.h"
0024 #include "KisDocument.h"
0025 #include "KisView.h"
0026 #include "kis_grid_config.h"
0027 #include "kis_signals_blocker.h"
0028 #include <kis_signal_auto_connection.h>
0029 
0030 struct KisGridManager::Private
0031 {
0032     KisAction *toggleGrid;
0033     KisAction* toggleSnapToGrid;
0034 
0035     QPointer<KisView> imageView;
0036     KisGridDecoration* gridDecoration;
0037 
0038     bool blockModifiedSignal;
0039     KisSignalAutoConnectionsStore connections;
0040 };
0041 
0042 KisGridManager::KisGridManager(KisViewManager * parent)
0043     : QObject(parent)
0044     , m_d(new Private)
0045 {
0046 
0047 }
0048 
0049 KisGridManager::~KisGridManager()
0050 {
0051 
0052 }
0053 
0054 void KisGridManager::setGridConfig(const KisGridConfig &config)
0055 {
0056     setGridConfigImpl(config, true);
0057 }
0058 
0059 void KisGridManager::setGridConfigImpl(const KisGridConfig &config, bool /*emitModified*/)
0060 {
0061     if (!m_d->imageView) return;
0062 
0063     config.saveStaticData();
0064     m_d->imageView->document()->setGridConfig(config);
0065 
0066     m_d->gridDecoration->setGridConfig(config);
0067     m_d->gridDecoration->setVisible(config.showGrid());
0068 
0069     m_d->toggleGrid->setChecked(config.showGrid());
0070     m_d->toggleSnapToGrid->setChecked(config.snapToGrid());
0071 }
0072 
0073 void KisGridManager::setup(KisActionManager* actionManager)
0074 {
0075     m_d->toggleGrid = actionManager->createAction("view_grid");
0076     connect(m_d->toggleGrid, SIGNAL(toggled(bool)), this, SLOT(slotChangeGridVisibilityTriggered(bool)));
0077 
0078     m_d->toggleSnapToGrid  = actionManager->createAction("view_snap_to_grid");
0079     connect(m_d->toggleSnapToGrid, SIGNAL(toggled(bool)), this, SLOT(slotSnapToGridTriggered(bool)));
0080 }
0081 
0082 void KisGridManager::updateGUI()
0083 {
0084 
0085 }
0086 
0087 void KisGridManager::setView(QPointer<KisView> imageView)
0088 {
0089     if (m_d->imageView) {
0090         m_d->connections.clear();
0091         m_d->gridDecoration = 0;
0092     }
0093 
0094     m_d->imageView = imageView;
0095 
0096     if (imageView) {
0097         if (!imageView->document()) {
0098             return;
0099         }
0100 
0101         m_d->gridDecoration = qobject_cast<KisGridDecoration*>(imageView->canvasBase()->decoration("grid").data());
0102         if (!m_d->gridDecoration) {
0103             m_d->gridDecoration = new KisGridDecoration(imageView);
0104             imageView->canvasBase()->addDecoration(m_d->gridDecoration);
0105         }
0106         m_d->connections.addConnection(imageView->document(), SIGNAL(sigGridConfigChanged(KisGridConfig)),
0107                                        this, SIGNAL(sigRequestUpdateGridConfig(KisGridConfig)));
0108 
0109         KisGridConfig config = imageView->document()->gridConfig();
0110         setGridConfigImpl(config, false);
0111 
0112         KisSignalsBlocker blocker(m_d->toggleGrid, m_d->toggleSnapToGrid);
0113         Q_UNUSED(blocker);
0114         m_d->toggleGrid->setChecked(config.showGrid());
0115         m_d->toggleSnapToGrid->setChecked(config.snapToGrid());
0116     }
0117 }
0118 
0119 void KisGridManager::slotChangeGridVisibilityTriggered(bool value)
0120 {
0121     if (!m_d->imageView) return;
0122 
0123     KisGridConfig config = m_d->imageView->document()->gridConfig();
0124     config.setShowGrid(value);
0125 
0126     setGridConfig(config);
0127     emit sigRequestUpdateGridConfig(config);
0128 }
0129 
0130 void KisGridManager::slotSnapToGridTriggered(bool value)
0131 {
0132     if (!m_d->imageView) return;
0133 
0134     KisGridConfig config = m_d->imageView->document()->gridConfig();
0135     config.setSnapToGrid(value);
0136 
0137     setGridConfig(config);
0138     emit sigRequestUpdateGridConfig(config);
0139 }
0140