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