File indexing completed on 2024-05-12 16:01:45

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