Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_mirror_manager.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2009 Cyrille Berger <cberger@cberger.net>
3 * SPDX-FileCopyrightText: 2014 Sven Langkamp <sven.langkamp@gmail.com>
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
9#include "KisViewManager.h"
11#include <kis_icon.h>
12
13#include <klocalizedstring.h>
14#include <kguiitem.h>
15#include <ktoggleaction.h>
16#include <kactioncollection.h>
17#include <QAction>
18
19#include "kis_canvas2.h"
20#include "kis_mirror_axis.h"
21#include <KisMirrorAxisConfig.h>
22#include <KisDocument.h>
23#include <kis_signals_blocker.h>
24#include <kis_types.h>
25
27 , m_imageView(0)
28{
29}
30
34
36{
37 m_mirrorCanvas = new KToggleAction(i18n("Mirror View"), this);
38 m_mirrorCanvas->setChecked(false);
39 m_mirrorCanvas->setIcon(KisIconUtils::loadIcon("mirror-view"));
40 collection->addAction("mirror_canvas", m_mirrorCanvas);
41 collection->setDefaultShortcut(m_mirrorCanvas, QKeySequence(Qt::Key_M));
42
43 m_mirrorCanvasAroundCursor = new KToggleAction(i18n("Mirror View Around Cursor"), this);
44 m_mirrorCanvasAroundCursor->setChecked(false);
45 m_mirrorCanvasAroundCursor->setIcon(KisIconUtils::loadIcon("mirror-view-around-cursor"));
46 collection->addAction("mirror_canvas_around_cursor", m_mirrorCanvasAroundCursor);
47
48 m_mirrorCanvasAroundCanvas = new KToggleAction(i18n("Mirror View Around Canvas"), this);
49 m_mirrorCanvasAroundCanvas->setChecked(false);
51 collection->addAction("mirror_canvas_around_canvas", m_mirrorCanvasAroundCanvas);
52
54}
55
57{
58 if (m_imageView) {
59 m_mirrorCanvas->disconnect();
60 m_mirrorCanvasAroundCursor->disconnect();
61 m_mirrorCanvasAroundCanvas->disconnect();
62
63 m_imageView->document()->disconnect(this);
64
65 KisMirrorAxisSP canvasDecoration = this->decoration();
66 if (canvasDecoration) {
67 canvasDecoration->disconnect();
68 }
69 }
70
71 m_imageView = imageView;
72
73 if (m_imageView) {
74 connect(m_mirrorCanvas, SIGNAL(toggled(bool)), dynamic_cast<KisCanvasController*>(m_imageView->canvasController()), SLOT(mirrorCanvas(bool)));
75 connect(m_mirrorCanvasAroundCursor, SIGNAL(toggled(bool)), dynamic_cast<KisCanvasController*>(m_imageView->canvasController()), SLOT(mirrorCanvasAroundCursor(bool)));
76 connect(m_mirrorCanvasAroundCanvas, SIGNAL(toggled(bool)), dynamic_cast<KisCanvasController*>(m_imageView->canvasController()), SLOT(mirrorCanvasAroundCanvas(bool)));
77
78 connect(m_imageView->canvasController()->proxyObject,
80 this,
81 [this](bool mirrorX, bool mirrorY) {
82 Q_UNUSED(mirrorY);
83 this->slotSyncActionStates(mirrorX);
84 });
85
86 connect(m_imageView->document(), SIGNAL(sigMirrorAxisConfigChanged()), this, SLOT(slotDocumentConfigChanged()), Qt::UniqueConnection);
87
88 KisMirrorAxisSP canvasDecoration = this->decoration();
89 if (!canvasDecoration) {
90 KisMirrorAxis* decoration = new KisMirrorAxis(m_imageView->viewManager()->canvasResourceProvider(), m_imageView);
91 connect(decoration, SIGNAL(sigConfigChanged()), this, SLOT(slotMirrorAxisConfigChanged()), Qt::UniqueConnection);
92 m_imageView->canvasBase()->addDecoration(decoration);
93 } else {
94 connect(canvasDecoration.data(), SIGNAL(sigConfigChanged()), this, SLOT(slotMirrorAxisConfigChanged()), Qt::UniqueConnection);
95 }
96
98 }
99
100 updateAction();
101}
102
112
114{
115 if (m_imageView) {
116 m_mirrorCanvas->setEnabled(true);
117 m_mirrorCanvas->setChecked(m_imageView->canvasIsMirrored());
118 m_mirrorCanvasAroundCursor->setEnabled(true);
119 m_mirrorCanvasAroundCursor->setChecked(m_imageView->canvasIsMirrored());
120 m_mirrorCanvasAroundCanvas->setEnabled(true);
121 m_mirrorCanvasAroundCanvas->setChecked(m_imageView->canvasIsMirrored());
122 }
123 else {
124 m_mirrorCanvas->setEnabled(false);
125 m_mirrorCanvas->setChecked(false);
126 m_mirrorCanvasAroundCursor->setEnabled(false);
127 m_mirrorCanvasAroundCursor->setChecked(false);
128 m_mirrorCanvasAroundCanvas->setEnabled(false);
129 m_mirrorCanvasAroundCanvas->setChecked(false);
130 }
131}
132
137
139{
140 if (m_imageView && m_imageView->document()) {
141 KisSignalsBlocker blocker(m_imageView->document());
142
143 KisMirrorAxisSP canvasDecoration = this->decoration();
144 if (canvasDecoration) {
145 m_imageView->document()->setMirrorAxisConfig(canvasDecoration->mirrorAxisConfig());
146 }
147 }
148}
149
151{
152 if (m_imageView) {
153 return qobject_cast<KisMirrorAxis*>(m_imageView->canvasBase()->decoration("mirror_axis").data());
154 } else {
155 return 0;
156 }
157}
158
160{
161 if (m_imageView && m_imageView->document()) {
162 KisMirrorAxisConfig config = m_imageView->document()->mirrorAxisConfig();
163
164 KisMirrorAxisSP canvasDecoration = this->decoration();
165 if (canvasDecoration) {
166 canvasDecoration->setMirrorAxisConfig(config);
167 }
168 }
169}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
A container for a set of QAction objects.
void setDefaultShortcut(QAction *action, const QKeySequence &shortcut)
Q_INVOKABLE QAction * addAction(const QString &name, QAction *action)
The KisMirrorAxisConfig class stores configuration for the KisMirrorAxis canvas decoration....
void setView(QPointer< KisView > imageView)
KisMirrorAxisSP decoration() const
QPointer< KisView > m_imageView
QAction * m_mirrorCanvasAroundCursor
QAction * m_mirrorCanvasAroundCanvas
void setup(KisKActionCollection *collection)
KisMirrorManager(KisViewManager *view)
void slotSyncActionStates(bool val)
void documentMirrorStatusChanged(bool mirrorX, bool mirrorY)
QIcon loadIcon(const QString &name)