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

0001 /*
0002  *  kis_control_frame.cc - part of Krita
0003  *
0004  *  SPDX-FileCopyrightText: 1999 Matthias Elter <elter@kde.org>
0005  *  SPDX-FileCopyrightText: 2003 Patrick Julien <freak@codepimps.org>
0006  *  SPDX-FileCopyrightText: 2004 Sven Langkamp <sven.langkamp@gmail.com>
0007  *  SPDX-FileCopyrightText: 2006 Boudewijn Rempt <boud@valdyas.org>
0008  *
0009  *  SPDX-License-Identifier: GPL-2.0-or-later
0010  */
0011 
0012 #include "kis_control_frame.h"
0013 
0014 #include <stdlib.h>
0015 
0016 #include <QApplication>
0017 #include <QLayout>
0018 #include <QTabWidget>
0019 #include <QFrame>
0020 #include <QWidget>
0021 #include <QEvent>
0022 #include <QHBoxLayout>
0023 #include <QMenu>
0024 #include <QWidgetAction>
0025 #include <QFontDatabase>
0026 
0027 #include <klocalizedstring.h>
0028 #include <QAction>
0029 #include <kactioncollection.h>
0030 #include <KoDualColorButton.h>
0031 #include <resources/KoAbstractGradient.h>
0032 #include <KoResourceServer.h>
0033 #include <KoResourceServerProvider.h>
0034 #include <KoColorSpaceRegistry.h>
0035 #include <kis_image.h>
0036 
0037 #include <resources/KoPattern.h>
0038 #include "KisResourceServerProvider.h"
0039 #include "kis_canvas_resource_provider.h"
0040 
0041 #include "widgets/kis_iconwidget.h"
0042 
0043 #include "widgets/gradient/KisGradientChooser.h"
0044 #include "KisViewManager.h"
0045 #include "kis_config.h"
0046 #include "kis_paintop_box.h"
0047 #include "kis_custom_pattern.h"
0048 #include "widgets/kis_pattern_chooser.h"
0049 #include "kis_favorite_resource_manager.h"
0050 #include "kis_display_color_converter.h"
0051 #include <kis_canvas2.h>
0052 
0053 
0054 KisControlFrame::KisControlFrame(KisViewManager *view, QWidget *parent, const char* name)
0055     : QObject(view)
0056     , m_viewManager(view)
0057     , m_checkersPainter(4)
0058 {
0059     setObjectName(name);
0060 
0061     m_patternWidget = new KisIconWidget(parent, ResourceType::Patterns);
0062     m_patternWidget->setToolTip(i18n("Fill Patterns"));
0063     m_patternWidget->setFixedSize(32, 32);
0064 
0065     m_gradientWidget = new KisIconWidget(parent, ResourceType::Gradients);
0066     m_gradientWidget->setToolTip(i18n("Fill Gradients"));
0067     m_gradientWidget->setFixedSize(32, 32);
0068 }
0069 
0070 void KisControlFrame::setup(QWidget *parent)
0071 {
0072     createPatternsChooser(m_viewManager);
0073     createGradientsChooser(m_viewManager);
0074 
0075     QWidgetAction *action  = new QWidgetAction(this);
0076     action->setText(i18n("&Patterns"));
0077     m_viewManager->actionCollection()->addAction(ResourceType::Patterns, action);
0078     action->setDefaultWidget(m_patternWidget);
0079     connect(action, SIGNAL(triggered()), m_patternWidget, SLOT(showPopupWidget()));
0080     m_patternChooserPopup->addAction(action);
0081 
0082     action = new QWidgetAction(this);
0083     action->setText(i18n("&Gradients"));
0084     m_viewManager->actionCollection()->addAction(ResourceType::Gradients, action);
0085     action->setDefaultWidget(m_gradientWidget);
0086     connect(action, SIGNAL(triggered()), m_gradientWidget, SLOT(showPopupWidget()));
0087     m_gradientChooserPopup->addAction(action);
0088 
0089 
0090     // XXX: KOMVC we don't have a canvas here yet, needs a setImageView
0091     const KoColorDisplayRendererInterface *displayRenderer = \
0092         KisDisplayColorConverter::dumbConverterInstance()->displayRendererInterface();
0093     m_dual = new KoDualColorButton(m_viewManager->canvasResourceProvider()->fgColor(),
0094                                                      m_viewManager->canvasResourceProvider()->bgColor(), displayRenderer,
0095                                                      m_viewManager->mainWindowAsQWidget(), m_viewManager->mainWindowAsQWidget());
0096     m_dual->setPopDialog(true);
0097     action = new QWidgetAction(this);
0098     action->setText(i18n("&Choose foreground and background colors"));
0099     m_viewManager->actionCollection()->addAction("dual", action);
0100     action->setDefaultWidget(m_dual);
0101     connect(m_dual, SIGNAL(foregroundColorChanged(KoColor)), m_viewManager->canvasResourceProvider(), SLOT(slotSetFGColor(KoColor)));
0102     connect(m_dual, SIGNAL(backgroundColorChanged(KoColor)), m_viewManager->canvasResourceProvider(), SLOT(slotSetBGColor(KoColor)));
0103     connect(m_viewManager->canvasResourceProvider(), SIGNAL(sigBGColorChanged(KoColor)), m_dual, SLOT(setBackgroundColor(KoColor)));
0104     connect(m_viewManager->canvasResourceProvider(), SIGNAL(sigFGColorChanged(KoColor)), m_dual, SLOT(setForegroundColor(KoColor)));
0105     connect(m_viewManager->canvasResourceProvider(), SIGNAL(sigFGColorChanged(KoColor)), m_gradientWidget, SLOT(update()));
0106     connect(m_viewManager->canvasResourceProvider(), SIGNAL(sigBGColorChanged(KoColor)), m_gradientWidget, SLOT(update()));
0107     m_dual->setFixedSize(28, 28);
0108     connect(m_viewManager, SIGNAL(viewChanged()), SLOT(slotUpdateDisplayRenderer()));
0109 
0110     m_paintopBox = new KisPaintopBox(m_viewManager, parent, "paintopbox");
0111 
0112     action = new QWidgetAction(this);
0113     action->setText(i18n("&Painter's Tools"));
0114     m_viewManager->actionCollection()->addAction("paintops", action);
0115     action->setDefaultWidget(m_paintopBox);
0116 
0117     action = new QWidgetAction(this);
0118     action->setText(i18n("&Open Foreground color selector"));
0119     m_viewManager->actionCollection()->addAction("chooseForegroundColor", action);
0120     connect(action, SIGNAL(triggered()), m_dual, SLOT(openForegroundDialog()));
0121 
0122     action = new QWidgetAction(this);
0123     action->setText(i18n("&Open Background color selector"));
0124     m_viewManager->actionCollection()->addAction("chooseBackgroundColor", action);
0125     connect(action, SIGNAL(triggered()), m_dual, SLOT(openBackgroundDialog()));
0126 }
0127 
0128 void KisControlFrame::slotUpdateDisplayRenderer()
0129 {
0130     if (m_viewManager->canvasBase()){
0131         m_dual->setDisplayRenderer(m_viewManager->canvasBase()->displayColorConverter()->displayRendererInterface());
0132         m_dual->setColorSpace(m_viewManager->canvasBase()->image()->colorSpace());
0133         m_viewManager->canvasBase()->image()->disconnect(m_dual);
0134         connect(m_viewManager->canvasBase()->image(), SIGNAL(sigColorSpaceChanged(const KoColorSpace*)), m_dual, SLOT(setColorSpace(const KoColorSpace*)), Qt::UniqueConnection);
0135     } else if (m_viewManager->viewCount()==0) {
0136         m_dual->setDisplayRenderer();
0137     }
0138 }
0139 
0140 void KisControlFrame::slotSetPattern(KoPatternSP pattern)
0141 {
0142     KIS_SAFE_ASSERT_RECOVER_RETURN(pattern);
0143     m_patternWidget->setThumbnail(pattern->image());
0144     m_patternChooser->setCurrentPattern(pattern);
0145 }
0146 
0147 void KisControlFrame::slotSetGradient(KoAbstractGradientSP gradient)
0148 {
0149     const QSize iconSize = m_gradientWidget->preferredIconSize();
0150 
0151     QImage icon(iconSize, QImage::Format_ARGB32);
0152 
0153     {
0154         QPainter gc(&icon);
0155         m_checkersPainter.paint(gc, QRect(QPoint(), iconSize));
0156         gc.drawImage(QPoint(),
0157                      gradient->generatePreview(iconSize.width(), iconSize.height(),
0158                                                m_viewManager->canvasResourceProvider()->
0159                                                resourceManager()->canvasResourcesInterface()));
0160     }
0161 
0162 
0163     m_gradientWidget->setThumbnail(icon);
0164 }
0165 
0166 void KisControlFrame::createPatternsChooser(KisViewManager * view)
0167 {
0168     if (m_patternChooserPopup) delete m_patternChooserPopup;
0169     m_patternChooserPopup = new QWidget(m_patternWidget);
0170     m_patternChooserPopup->setMinimumSize(450, 400);
0171     m_patternChooserPopup->setObjectName("pattern_chooser_popup");
0172     QHBoxLayout * l2 = new QHBoxLayout(m_patternChooserPopup);
0173     l2->setObjectName("patternpopuplayout");
0174 
0175     m_patternsTab = new QTabWidget(m_patternChooserPopup);
0176     m_patternsTab->setObjectName("patternstab");
0177     m_patternsTab->setFocusPolicy(Qt::NoFocus);
0178     l2->addWidget(m_patternsTab);
0179 
0180     m_patternChooser = new KisPatternChooser(m_patternChooserPopup);
0181     m_patternChooser->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
0182     QWidget *patternChooserPage = new QWidget(m_patternChooserPopup);
0183     QHBoxLayout *patternChooserPageLayout  = new QHBoxLayout(patternChooserPage);
0184     patternChooserPageLayout->addWidget(m_patternChooser);
0185     m_patternsTab->addTab(patternChooserPage, i18n("Patterns"));
0186 
0187     KisCustomPattern *customPatterns = new KisCustomPattern(0, "custompatterns",
0188                                                             i18n("Custom Pattern"), m_viewManager);
0189     m_patternsTab->addTab(customPatterns, i18n("Custom Pattern"));
0190 
0191     connect(m_patternChooser, SIGNAL(resourceSelected(KoResourceSP )),
0192             view->canvasResourceProvider(), SLOT(slotPatternActivated(KoResourceSP )));
0193 
0194     connect(customPatterns, SIGNAL(activatedResource(KoResourceSP )),
0195             view->canvasResourceProvider(), SLOT(slotPatternActivated(KoResourceSP )));
0196 
0197     connect(customPatterns, SIGNAL(patternAdded(KoResourceSP)), m_patternChooser, SLOT(setCurrentPattern(KoResourceSP)));
0198     connect(customPatterns, SIGNAL(patternUpdated(KoResourceSP)), m_patternChooser, SLOT(setCurrentPattern(KoResourceSP)));
0199 
0200     connect(view->canvasResourceProvider(),
0201             &KisCanvasResourceProvider::sigPatternChanged,
0202             this,
0203             &KisControlFrame::slotSetPattern);
0204 
0205     m_patternChooser->setCurrentItem(0);
0206     if (m_patternChooser->currentResource() && view->canvasResourceProvider()) {
0207         view->canvasResourceProvider()->slotPatternActivated(m_patternChooser->currentResource());
0208     }
0209 
0210     m_patternWidget->setPopupWidget(m_patternChooserPopup);
0211 
0212 
0213 }
0214 
0215 void KisControlFrame::createGradientsChooser(KisViewManager * view)
0216 {
0217     if (m_gradientChooserPopup) {
0218         delete m_gradientChooserPopup;
0219         m_gradientChooserPopup = 0;
0220     }
0221 
0222     m_gradientChooserPopup = new QWidget(m_gradientWidget);
0223     m_gradientChooserPopup->setObjectName("gradient_chooser_popup");
0224     QHBoxLayout * l2 = new QHBoxLayout(m_gradientChooserPopup);
0225     l2->setObjectName("gradientpopuplayout");
0226 
0227     m_gradientTab = new QTabWidget(m_gradientChooserPopup);
0228     m_gradientTab->setObjectName("gradientstab");
0229     m_gradientTab->setFocusPolicy(Qt::NoFocus);
0230     l2->addWidget(m_gradientTab);
0231 
0232     m_gradientChooser = new KisGradientChooser(m_gradientChooserPopup);
0233     m_gradientChooser->setCanvasResourcesInterface(view->canvasResourceProvider()->resourceManager()->canvasResourcesInterface());
0234     QWidget *gradientChooserPage = new QWidget(m_gradientChooserPopup);
0235     QHBoxLayout *gradientChooserPageLayout  = new QHBoxLayout(gradientChooserPage);
0236     gradientChooserPageLayout->addWidget(m_gradientChooser);
0237     m_gradientTab->addTab(gradientChooserPage, i18n("Gradients"));
0238 
0239     connect(m_gradientChooser, SIGNAL(resourceSelected(KoResourceSP)),
0240             view->canvasResourceProvider(), SLOT(slotGradientActivated(KoResourceSP)));
0241     connect (view->mainWindowAsQWidget(), SIGNAL(themeChanged()), m_gradientChooser, SLOT(slotUpdateIcons()));
0242     connect(view->canvasResourceProvider(), SIGNAL(sigGradientChanged(KoAbstractGradientSP)),
0243             this, SLOT(slotSetGradient(KoAbstractGradientSP)));
0244     connect(m_gradientChooser, SIGNAL(gradientEdited(KoAbstractGradientSP)),
0245             this, SLOT(slotSetGradient(KoAbstractGradientSP)));
0246 
0247 
0248     // set the Foreground to Transparent gradient as default on startup
0249     KisResourceModel resModel(ResourceType::Gradients);
0250     QVector<KoResourceSP> resources = resModel.resourcesForFilename("Foreground to Transparent.svg");
0251     if (resources.size() > 0) {
0252         m_gradientChooser->setCurrentResource(resources[0]);
0253     }
0254 
0255     if (m_gradientChooser->currentResource() && view->canvasResourceProvider()) {
0256         view->canvasResourceProvider()->slotGradientActivated(m_gradientChooser->currentResource());
0257     }
0258     m_gradientWidget->setPopupWidget(m_gradientChooserPopup);
0259 
0260 }
0261 
0262