File indexing completed on 2024-05-12 15:59:08

0001 /*
0002  *  SPDX-FileCopyrightText: 2016 Boudewijn Rempt <boud@valdyas.org>
0003  *
0004  *  SPDX-License-Identifier: LGPL-2.0-or-later
0005  */
0006 #include "View.h"
0007 #include <QPointer>
0008 #include <QScopedPointer>
0009 
0010 #include <KoPattern.h>
0011 #include <KoAbstractGradient.h>
0012 #include <kis_paintop_preset.h>
0013 #include <KisView.h>
0014 #include <KisViewManager.h>
0015 #include <kis_node_manager.h>
0016 #include <kis_selection_manager.h>
0017 #include <kis_canvas_resource_provider.h>
0018 #include <kis_exposure_gamma_correction_interface.h>
0019 #include <kis_paintop_box.h>
0020 #include <KisMainWindow.h>
0021 #include <KoCanvasBase.h>
0022 #include <kis_canvas2.h>
0023 #include <KisResourceTypes.h>
0024 #include <KisDocument.h>
0025 #include "Document.h"
0026 #include "Canvas.h"
0027 #include "Window.h"
0028 #include "Resource.h"
0029 #include "ManagedColor.h"
0030 
0031 #include "LibKisUtils.h"
0032 
0033 
0034 struct View::Private {
0035     Private() {}
0036     QPointer<KisView> view;
0037 };
0038 
0039 View::View(KisView* view, QObject *parent)
0040     : QObject(parent)
0041     , d(new Private)
0042 {
0043     d->view = view;
0044 }
0045 
0046 View::~View()
0047 {
0048     delete d;
0049 }
0050 
0051 bool View::operator==(const View &other) const
0052 {
0053     return (d->view == other.d->view);
0054 }
0055 
0056 bool View::operator!=(const View &other) const
0057 {
0058     return !(operator==(other));
0059 }
0060 
0061 Window* View::window() const
0062 {
0063     if (!d->view) return 0;
0064     KisMainWindow *mainwin = d->view->mainWindow();
0065     Window *win = new Window(mainwin);
0066     return win;
0067 }
0068 
0069 
0070 Document* View::document() const
0071 {
0072     if (!d->view) return 0;
0073     Document *doc = new Document(d->view->document(), false);
0074     return doc;
0075 }
0076 
0077 void View::setDocument(Document *document)
0078 {
0079     if (!d->view || !document || !document->document()) return;
0080     d->view = d->view->replaceBy(document->document());
0081 }
0082 
0083 bool View::visible() const
0084 {
0085     if (!d->view) return false;
0086     return d->view->isVisible();
0087 }
0088 
0089 void View::setVisible()
0090 {
0091     if (!d->view) return;
0092     KisMainWindow *mainwin = d->view->mainWindow();
0093     mainwin->setActiveView(d->view);
0094     mainwin->subWindowActivated();
0095 }
0096 
0097 Canvas* View::canvas() const
0098 {
0099     if (!d->view) return 0;
0100     Canvas *c = new Canvas(d->view->canvasBase());
0101     return c;
0102 }
0103 
0104 KisView *View::view()
0105 {
0106     return d->view;
0107 }
0108 
0109 void View::activateResource(Resource *resource)
0110 {
0111     if (!d->view) return;
0112     if (!resource) return;
0113 
0114     KoResourceSP r = resource->resource();
0115     if (!r) return;
0116 
0117     if (KoPatternSP pattern = r.dynamicCast<KoPattern>()) {
0118         QVariant value = QVariant::fromValue(pattern);
0119         d->view->canvasBase()->resourceManager()->setResource(KoCanvasResource::CurrentPattern, value);
0120     } else if (KoAbstractGradientSP gradient = r.dynamicCast<KoAbstractGradient>()) {
0121         QVariant value = QVariant::fromValue(gradient);
0122         d->view->canvasBase()->resourceManager()->setResource(KoCanvasResource::CurrentGradient, value);
0123     } else if (KoResourceSP preset = r.dynamicCast<KisPaintOpPreset>()) {
0124         d->view->viewManager()->paintOpBox()->resourceSelected(preset);
0125     }
0126 }
0127 
0128 
0129 ManagedColor *View::foregroundColor() const
0130 {
0131     if (!d->view) return 0;
0132     return new ManagedColor(d->view->resourceProvider()->fgColor());
0133 }
0134 
0135 void View::setForeGroundColor(ManagedColor *color)
0136 {
0137     if (!d->view) return;
0138     d->view->resourceProvider()->setFGColor(color->color());
0139 }
0140 
0141 ManagedColor *View::backgroundColor() const
0142 {
0143     if (!d->view) return 0;
0144     return new ManagedColor(d->view->resourceProvider()->bgColor());
0145 }
0146 
0147 void View::setBackGroundColor(ManagedColor *color)
0148 {
0149     if (!d->view) return;
0150     d->view->resourceProvider()->setBGColor(color->color());
0151 }
0152 
0153 Resource *View::currentBrushPreset() const
0154 {
0155     if (!d->view) return 0;
0156     return new Resource(d->view->resourceProvider()->currentPreset(), ResourceType::PaintOpPresets);
0157 }
0158 
0159 void View::setCurrentBrushPreset(Resource *resource)
0160 {
0161     activateResource(resource);
0162 }
0163 
0164 Resource *View::currentPattern() const
0165 {
0166     if (!d->view) return 0;
0167     return new Resource(d->view->resourceProvider()->currentPattern(), ResourceType::Patterns);
0168 }
0169 
0170 void View::setCurrentPattern(Resource *resource)
0171 {
0172     activateResource(resource);
0173 }
0174 
0175 Resource *View::currentGradient() const
0176 {
0177     if (!d->view) return 0;
0178     return new Resource(d->view->resourceProvider()->currentGradient(), ResourceType::Gradients);
0179 }
0180 
0181 void View::setCurrentGradient(Resource *resource)
0182 {
0183     activateResource(resource);
0184 }
0185 
0186 QString View::currentBlendingMode() const
0187 {
0188     if (!d->view) return "";
0189     return d->view->resourceProvider()->currentCompositeOp();
0190 }
0191 
0192 void View::setCurrentBlendingMode(const QString &blendingMode)
0193 {
0194     if (!d->view) return;
0195     d->view->resourceProvider()->setCurrentCompositeOp(blendingMode);
0196 }
0197 
0198 float View::HDRExposure() const
0199 {
0200     if (!d->view) return 0.0;
0201     KisExposureGammaCorrectionInterface *iface = d->view->canvasBase()->exposureGammaCorrectionInterface();
0202     return iface->currentExposure();
0203 }
0204 
0205 void View::setHDRExposure(float exposure)
0206 {
0207     if (!d->view) return;
0208     KisExposureGammaCorrectionInterface *iface = d->view->canvasBase()->exposureGammaCorrectionInterface();
0209     iface->setCurrentExposure(exposure);
0210 }
0211 
0212 float View::HDRGamma() const
0213 {
0214     if (!d->view) return 0.0;
0215     KisExposureGammaCorrectionInterface *iface = d->view->canvasBase()->exposureGammaCorrectionInterface();
0216     return iface->currentGamma();
0217 }
0218 
0219 void View::setHDRGamma(float gamma)
0220 {
0221     if (!d->view) return;
0222     KisExposureGammaCorrectionInterface *iface = d->view->canvasBase()->exposureGammaCorrectionInterface();
0223     return iface->setCurrentGamma(gamma);
0224 }
0225 
0226 qreal View::paintingOpacity() const
0227 {
0228     if (!d->view) return 0.0;
0229     return d->view->resourceProvider()->opacity();
0230 }
0231 
0232 void View::setPaintingOpacity(qreal opacity)
0233 {
0234     if (!d->view) return;
0235     d->view->resourceProvider()->setOpacity(opacity);
0236 }
0237 
0238 qreal View::brushSize() const
0239 {
0240     if (!d->view) return 0.0;
0241     return d->view->resourceProvider()->size();
0242 }
0243 
0244 void View::setBrushSize(qreal brushSize)
0245 {
0246     if (!d->view) return;
0247     d->view->resourceProvider()->setSize(brushSize);
0248 }
0249 
0250 qreal View::paintingFlow() const
0251 {
0252     if (!d->view) return 0.0;
0253     return d->view->resourceProvider()->flow();
0254 }
0255 
0256 void View::setPaintingFlow(qreal flow)
0257 {
0258     if (!d->view) return;
0259     d->view->resourceProvider()->setFlow(flow);
0260 }
0261 
0262 QList<Node *> View::selectedNodes() const
0263 {
0264     if (!d->view) return QList<Node *>();
0265     if (!d->view->viewManager()) return QList<Node *>();
0266     if (!d->view->viewManager()->nodeManager()) return QList<Node *>();
0267 
0268     KisNodeList selectedNodes = d->view->viewManager()->nodeManager()->selectedNodes();
0269     return LibKisUtils::createNodeList(selectedNodes, d->view->image());
0270 }
0271 
0272 void View::showFloatingMessage(const QString &message, const QIcon& icon, int timeout, int priority)
0273 {
0274     if (!d->view) return;
0275 
0276     KisFloatingMessage::Priority p;
0277     p = static_cast<KisFloatingMessage::Priority>(priority);
0278 
0279     d->view->showFloatingMessage(message, icon, timeout, p);
0280 }