File indexing completed on 2024-05-19 04:29:10

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 "KisDecorationsManager.h"
0009 
0010 #include "KisViewManager.h"
0011 #include "kis_action_manager.h"
0012 #include "kis_action.h"
0013 #include "kis_config_notifier.h"
0014 
0015 #include "kis_canvas2.h"
0016 #include <klocalizedstring.h>
0017 #include <kguiitem.h>
0018 #include <ktoggleaction.h>
0019 #include <kactioncollection.h>
0020 #include <KisDocument.h>
0021 
0022 
0023 KisDecorationsManager::KisDecorationsManager(KisViewManager* view)
0024     : QObject(view)
0025     , m_imageView(0)
0026 {
0027 }
0028 
0029 KisDecorationsManager::~KisDecorationsManager()
0030 {
0031 }
0032 
0033 void KisDecorationsManager::setup(KisActionManager * actionManager)
0034 {
0035     m_toggleAssistant = actionManager->createAction("view_toggle_painting_assistants");
0036     m_togglePreview   = actionManager->createAction("view_toggle_assistant_previews");
0037     m_toggleReferenceImages = actionManager->createAction("view_toggle_reference_images");
0038 
0039     updateAction();
0040 }
0041 
0042 void KisDecorationsManager::setView(QPointer<KisView> imageView)
0043 {
0044 
0045     // set view is called twice when a document is open, so we need to disconnect the original signals
0046     // if m_imageView has already been created. This prevents double signal events firing
0047     if (m_imageView) {
0048         m_toggleAssistant->disconnect();
0049         m_togglePreview->disconnect();
0050 
0051         if (assistantsDecoration()) {
0052             assistantsDecoration()->disconnect(this);
0053         }
0054         if (referenceImagesDecoration()) {
0055             referenceImagesDecoration()->disconnect(this);
0056         }
0057     }
0058 
0059     m_imageView = imageView;
0060 
0061     if (m_imageView && !referenceImagesDecoration()) {
0062         KisReferenceImagesDecoration *deco = new KisReferenceImagesDecoration(m_imageView, imageView->document());
0063         m_imageView->canvasBase()->addDecoration(deco);
0064     }
0065 
0066     if (m_imageView && !assistantsDecoration()) {
0067         KisPaintingAssistantsDecoration *deco = new KisPaintingAssistantsDecoration(m_imageView);
0068         m_imageView->canvasBase()->addDecoration(deco);
0069     }
0070 
0071     if (m_imageView && assistantsDecoration()) {
0072         connect(m_toggleAssistant, SIGNAL(triggered()), assistantsDecoration(), SLOT(toggleAssistantVisible()));
0073         connect(m_togglePreview, SIGNAL(triggered()), assistantsDecoration(), SLOT(toggleOutlineVisible()));
0074         connect(assistantsDecoration(), SIGNAL(assistantChanged()), SLOT(updateAction()));
0075         connect(m_imageView->document(), &KisDocument::sigAssistantsChanged,
0076                 assistantsDecoration(), &KisPaintingAssistantsDecoration::slotUpdateDecorationVisibility);
0077         connect(m_imageView->document(), &KisDocument::sigAssistantsChanged,
0078                 m_imageView->canvasBase(), QOverload<>::of(&KisCanvas2::updateCanvas));
0079 
0080         connect(KisConfigNotifier::instance(), &KisConfigNotifier::configChanged,
0081                 assistantsDecoration(), &KisPaintingAssistantsDecoration::slotConfigChanged);
0082     }
0083 
0084     if (m_imageView && referenceImagesDecoration()) {
0085         connect(m_toggleReferenceImages, SIGNAL(triggered(bool)), referenceImagesDecoration(), SLOT(setVisible(bool)), Qt::UniqueConnection);
0086     }
0087 
0088 
0089     updateAction();
0090 }
0091 
0092 void KisDecorationsManager::updateAction()
0093 {
0094     if (assistantsDecoration()) {
0095         bool enabled = !assistantsDecoration()->assistants().isEmpty();
0096         m_toggleAssistant->setChecked(assistantsDecoration()->assistantVisibility());
0097         m_toggleAssistant->setEnabled(enabled);
0098         m_togglePreview->setChecked(assistantsDecoration()->outlineVisibility());
0099         m_togglePreview->setEnabled(enabled);
0100     } else {
0101         m_toggleAssistant->setEnabled(false);
0102     }
0103 
0104     if (referenceImagesDecoration()) {
0105        m_toggleReferenceImages->setEnabled(referenceImagesDecoration()->documentHasReferenceImages());
0106        m_toggleReferenceImages->setChecked(referenceImagesDecoration()->visible());
0107     }
0108 }
0109 
0110 KisPaintingAssistantsDecorationSP KisDecorationsManager::assistantsDecoration() const
0111 {
0112     if (m_imageView) {
0113         return m_imageView->canvasBase()->paintingAssistantsDecoration();
0114     }
0115     return 0;
0116 }
0117 
0118 KisReferenceImagesDecorationSP KisDecorationsManager::referenceImagesDecoration() const
0119 {
0120     if (m_imageView) {
0121         return m_imageView->canvasBase()->referenceImagesDecoration();
0122     }
0123     return 0;
0124 }
0125