File indexing completed on 2024-05-19 04:28:59

0001 /*
0002  *  SPDX-FileCopyrightText: 2009 Cyrille Berger <cberger@cberger.net>
0003  *  SPDX-FileCopyrightText: 2014 Sven Langkamp <sven.langkamp@gmail.com>
0004  *
0005  *  SPDX-License-Identifier: GPL-2.0-or-later
0006  */
0007 
0008 #include "kis_mirror_manager.h"
0009 #include "KisViewManager.h"
0010 #include <kis_canvas_controller.h>
0011 #include <kis_icon.h>
0012 
0013 #include <klocalizedstring.h>
0014 #include <kguiitem.h>
0015 #include <ktoggleaction.h>
0016 #include <kactioncollection.h>
0017 #include <QAction>
0018 
0019 #include "kis_canvas2.h"
0020 #include "kis_mirror_axis.h"
0021 #include <KisMirrorAxisConfig.h>
0022 #include <KisDocument.h>
0023 #include <kis_signals_blocker.h>
0024 #include <kis_types.h>
0025 
0026 KisMirrorManager::KisMirrorManager(KisViewManager* view) : QObject(view)
0027     , m_imageView(0)
0028 {
0029 }
0030 
0031 KisMirrorManager::~KisMirrorManager()
0032 {
0033 }
0034 
0035 void KisMirrorManager::setup(KisKActionCollection * collection)
0036 {
0037     m_mirrorCanvas = new KToggleAction(i18n("Mirror View"), this);
0038     m_mirrorCanvas->setChecked(false);
0039     m_mirrorCanvas->setIcon(KisIconUtils::loadIcon("mirror-view"));
0040     collection->addAction("mirror_canvas", m_mirrorCanvas);
0041     collection->setDefaultShortcut(m_mirrorCanvas, QKeySequence(Qt::Key_M));
0042     
0043     m_mirrorCanvasAroundCursor = new KToggleAction(i18n("Mirror View Around Cursor"), this);
0044     m_mirrorCanvasAroundCursor->setChecked(false);
0045     m_mirrorCanvasAroundCursor->setIcon(KisIconUtils::loadIcon("mirror-view-around-cursor"));
0046     collection->addAction("mirror_canvas_around_cursor", m_mirrorCanvasAroundCursor);
0047     
0048     m_mirrorCanvasAroundCanvas = new KToggleAction(i18n("Mirror View Around Canvas"), this);
0049     m_mirrorCanvasAroundCanvas->setChecked(false);
0050     m_mirrorCanvasAroundCanvas->setIcon(KisIconUtils::loadIcon("mirror-view"));
0051     collection->addAction("mirror_canvas_around_canvas", m_mirrorCanvasAroundCanvas);
0052 
0053     updateAction();
0054 }
0055 
0056 void KisMirrorManager::setView(QPointer<KisView> imageView)
0057 {
0058     if (m_imageView) {
0059         m_mirrorCanvas->disconnect();
0060         m_mirrorCanvasAroundCursor->disconnect();
0061         m_mirrorCanvasAroundCanvas->disconnect();
0062 
0063         m_imageView->document()->disconnect(this);
0064 
0065         KisMirrorAxisSP canvasDecoration = this->decoration();
0066         if (canvasDecoration) {
0067             canvasDecoration->disconnect();
0068         }
0069     }
0070 
0071     m_imageView = imageView;
0072 
0073     if (m_imageView)  {
0074         connect(m_mirrorCanvas, SIGNAL(toggled(bool)), dynamic_cast<KisCanvasController*>(m_imageView->canvasController()), SLOT(mirrorCanvas(bool)));
0075         connect(m_mirrorCanvasAroundCursor, SIGNAL(toggled(bool)), dynamic_cast<KisCanvasController*>(m_imageView->canvasController()), SLOT(mirrorCanvasAroundCursor(bool)));
0076         connect(m_mirrorCanvasAroundCanvas, SIGNAL(toggled(bool)), dynamic_cast<KisCanvasController*>(m_imageView->canvasController()), SLOT(mirrorCanvasAroundCanvas(bool)));
0077 
0078         connect(dynamic_cast<KisCanvasController*>(m_imageView->canvasController()), SIGNAL(canvasMirrorModeChanged(bool)), this, SLOT(slotSyncActionStates(bool)));
0079 
0080         connect(m_imageView->document(), SIGNAL(sigMirrorAxisConfigChanged()), this, SLOT(slotDocumentConfigChanged()), Qt::UniqueConnection);
0081 
0082         KisMirrorAxisSP canvasDecoration = this->decoration();
0083         if (!canvasDecoration) {
0084             KisMirrorAxis* decoration = new KisMirrorAxis(m_imageView->viewManager()->canvasResourceProvider(), m_imageView);
0085             connect(decoration, SIGNAL(sigConfigChanged()), this, SLOT(slotMirrorAxisConfigChanged()), Qt::UniqueConnection);
0086             m_imageView->canvasBase()->addDecoration(decoration);
0087         } else {
0088             connect(canvasDecoration.data(), SIGNAL(sigConfigChanged()), this, SLOT(slotMirrorAxisConfigChanged()), Qt::UniqueConnection);
0089         }
0090 
0091         setDecorationConfig();
0092     }
0093 
0094     updateAction();
0095 }
0096 
0097 void KisMirrorManager::slotSyncActionStates(bool val) {
0098     KisSignalsBlocker blocker(m_mirrorCanvas);
0099     KisSignalsBlocker blocker2(m_mirrorCanvasAroundCursor);
0100     KisSignalsBlocker blocker3(m_mirrorCanvasAroundCanvas);
0101 
0102     m_mirrorCanvas->setChecked(val);
0103     m_mirrorCanvasAroundCursor->setChecked(val);
0104     m_mirrorCanvasAroundCanvas->setChecked(val);
0105 }
0106 
0107 void KisMirrorManager::updateAction()
0108 {
0109     if (m_imageView) {
0110         m_mirrorCanvas->setEnabled(true);
0111         m_mirrorCanvas->setChecked(m_imageView->canvasIsMirrored());
0112         m_mirrorCanvasAroundCursor->setEnabled(true);
0113         m_mirrorCanvasAroundCursor->setChecked(m_imageView->canvasIsMirrored());
0114         m_mirrorCanvasAroundCanvas->setEnabled(true);
0115         m_mirrorCanvasAroundCanvas->setChecked(m_imageView->canvasIsMirrored());
0116     }
0117     else {
0118         m_mirrorCanvas->setEnabled(false);
0119         m_mirrorCanvas->setChecked(false);
0120         m_mirrorCanvasAroundCursor->setEnabled(false);
0121         m_mirrorCanvasAroundCursor->setChecked(false);
0122         m_mirrorCanvasAroundCanvas->setEnabled(false);
0123         m_mirrorCanvasAroundCanvas->setChecked(false);
0124     }
0125 }
0126 
0127 void KisMirrorManager::slotDocumentConfigChanged()
0128 {
0129     setDecorationConfig();
0130 }
0131 
0132 void KisMirrorManager::slotMirrorAxisConfigChanged()
0133 {
0134     if (m_imageView && m_imageView->document()) {
0135         KisSignalsBlocker blocker(m_imageView->document());
0136 
0137         KisMirrorAxisSP canvasDecoration = this->decoration();
0138         if (canvasDecoration) {
0139             m_imageView->document()->setMirrorAxisConfig(canvasDecoration->mirrorAxisConfig());
0140         }
0141     }
0142 }
0143 
0144 KisMirrorAxisSP KisMirrorManager::decoration() const
0145 {
0146     if (m_imageView) {
0147         return qobject_cast<KisMirrorAxis*>(m_imageView->canvasBase()->decoration("mirror_axis").data());
0148     } else {
0149         return 0;
0150     }
0151 }
0152 
0153 void KisMirrorManager::setDecorationConfig()
0154 {
0155     if (m_imageView && m_imageView->document()) {
0156         KisMirrorAxisConfig config = m_imageView->document()->mirrorAxisConfig();
0157 
0158         KisMirrorAxisSP canvasDecoration = this->decoration();
0159         if (canvasDecoration) {
0160             canvasDecoration->setMirrorAxisConfig(config);
0161         }
0162     }
0163 }