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