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 }