1 /*
2  *  Copyright (c) 2016 Boudewijn Rempt <boud@valdyas.org>
3  *
4  *  This program is free software; you can redistribute it and/or modify
5  *  it under the terms of the GNU Lesser General Public License as published by
6  *  the Free Software Foundation; either version 2 of the License, or
7  *  (at your option) any later version.
8  *
9  *  This program is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU Lesser General Public License
15  *  along with this program; if not, write to the Free Software
16  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  */
18 #include "View.h"
19 #include <QPointer>
20 #include <QScopedPointer>
21 
22 #include <KoPattern.h>
23 #include <KoAbstractGradient.h>
24 #include <kis_paintop_preset.h>
25 #include <KisView.h>
26 #include <KisViewManager.h>
27 #include <kis_node_manager.h>
28 #include <kis_selection_manager.h>
29 #include <kis_canvas_resource_provider.h>
30 #include <kis_paintop_box.h>
31 #include <KisMainWindow.h>
32 #include <KoCanvasBase.h>
33 #include <kis_canvas2.h>
34 #include <KisDocument.h>
35 
36 #include "Document.h"
37 #include "Canvas.h"
38 #include "Window.h"
39 #include "Resource.h"
40 #include "ManagedColor.h"
41 
42 #include "LibKisUtils.h"
43 
44 
45 struct View::Private {
PrivateView::Private46     Private() {}
47     QPointer<KisView> view;
48 };
49 
View(KisView * view,QObject * parent)50 View::View(KisView* view, QObject *parent)
51     : QObject(parent)
52     , d(new Private)
53 {
54     d->view = view;
55 }
56 
~View()57 View::~View()
58 {
59     delete d;
60 }
61 
operator ==(const View & other) const62 bool View::operator==(const View &other) const
63 {
64     return (d->view == other.d->view);
65 }
66 
operator !=(const View & other) const67 bool View::operator!=(const View &other) const
68 {
69     return !(operator==(other));
70 }
71 
window() const72 Window* View::window() const
73 {
74     if (!d->view) return 0;
75     KisMainWindow *mainwin = d->view->mainWindow();
76     Window *win = new Window(mainwin);
77     return win;
78 }
79 
80 
document() const81 Document* View::document() const
82 {
83     if (!d->view) return 0;
84     Document *doc = new Document(d->view->document(), false);
85     return doc;
86 }
87 
setDocument(Document * document)88 void View::setDocument(Document *document)
89 {
90     if (!d->view || !document || !document->document()) return;
91     d->view = d->view->replaceBy(document->document());
92 }
93 
visible() const94 bool View::visible() const
95 {
96     if (!d->view) return false;
97     return d->view->isVisible();
98 }
99 
setVisible()100 void View::setVisible()
101 {
102     if (!d->view) return;
103     KisMainWindow *mainwin = d->view->mainWindow();
104     mainwin->setActiveView(d->view);
105     mainwin->subWindowActivated();
106 }
107 
canvas() const108 Canvas* View::canvas() const
109 {
110     if (!d->view) return 0;
111     Canvas *c = new Canvas(d->view->canvasBase());
112     return c;
113 }
114 
view()115 KisView *View::view()
116 {
117     return d->view;
118 }
119 
activateResource(Resource * resource)120 void View::activateResource(Resource *resource)
121 {
122     if (!d->view) return;
123     if (!resource) return;
124 
125     KoResource *r= resource->resource();
126     if (!r) return;
127 
128     if (dynamic_cast<KoPattern*>(r)) {
129         QVariant v;
130         v.setValue(static_cast<void*>(r));
131         d->view->canvasBase()->resourceManager()->setResource(KisCanvasResourceProvider::CurrentPattern, v);
132     }
133     else if (dynamic_cast<KoAbstractGradient*>(r)) {
134         QVariant v;
135         v.setValue(static_cast<void*>(r));
136         d->view->canvasBase()->resourceManager()->setResource(KisCanvasResourceProvider::CurrentGradient, v);
137     }
138     else if (dynamic_cast<KisPaintOpPreset*>(r)) {
139         d->view->viewManager()->paintOpBox()->resourceSelected(r);
140     }
141 
142 }
143 
144 
foregroundColor() const145 ManagedColor *View::foregroundColor() const
146 {
147     if (!d->view) return 0;
148     return new ManagedColor(d->view->resourceProvider()->fgColor());
149 }
150 
setForeGroundColor(ManagedColor * color)151 void View::setForeGroundColor(ManagedColor *color)
152 {
153     if (!d->view) return;
154     d->view->resourceProvider()->setFGColor(color->color());
155 }
156 
backgroundColor() const157 ManagedColor *View::backgroundColor() const
158 {
159     if (!d->view) return 0;
160     return new ManagedColor(d->view->resourceProvider()->bgColor());
161 }
162 
setBackGroundColor(ManagedColor * color)163 void View::setBackGroundColor(ManagedColor *color)
164 {
165     if (!d->view) return;
166     d->view->resourceProvider()->setBGColor(color->color());
167 }
168 
currentBrushPreset() const169 Resource *View::currentBrushPreset() const
170 {
171     if (!d->view) return 0;
172     return new Resource(d->view->resourceProvider()->currentPreset().data());
173 }
174 
setCurrentBrushPreset(Resource * resource)175 void View::setCurrentBrushPreset(Resource *resource)
176 {
177     activateResource(resource);
178 }
179 
currentPattern() const180 Resource *View::currentPattern() const
181 {
182     if (!d->view) return 0;
183     return new Resource(d->view->resourceProvider()->currentPattern());
184 }
185 
setCurrentPattern(Resource * resource)186 void View::setCurrentPattern(Resource *resource)
187 {
188     activateResource(resource);
189 }
190 
currentGradient() const191 Resource *View::currentGradient() const
192 {
193     if (!d->view) return 0;
194     return new Resource(d->view->resourceProvider()->currentGradient());
195 }
196 
setCurrentGradient(Resource * resource)197 void View::setCurrentGradient(Resource *resource)
198 {
199     activateResource(resource);
200 }
201 
currentBlendingMode() const202 QString View::currentBlendingMode() const
203 {
204     if (!d->view) return "";
205     return d->view->resourceProvider()->currentCompositeOp();
206 }
207 
setCurrentBlendingMode(const QString & blendingMode)208 void View::setCurrentBlendingMode(const QString &blendingMode)
209 {
210     if (!d->view) return;
211     d->view->resourceProvider()->setCurrentCompositeOp(blendingMode);
212 }
213 
HDRExposure() const214 float View::HDRExposure() const
215 {
216     if (!d->view) return 0.0;
217     return d->view->resourceProvider()->HDRExposure();
218 }
219 
setHDRExposure(float exposure)220 void View::setHDRExposure(float exposure)
221 {
222     if (!d->view) return;
223     d->view->resourceProvider()->setHDRExposure(exposure);
224 }
225 
HDRGamma() const226 float View::HDRGamma() const
227 {
228     if (!d->view) return 0.0;
229     return d->view->resourceProvider()->HDRGamma();
230 }
231 
setHDRGamma(float gamma)232 void View::setHDRGamma(float gamma)
233 {
234     if (!d->view) return;
235     d->view->resourceProvider()->setHDRGamma(gamma);
236 }
237 
paintingOpacity() const238 qreal View::paintingOpacity() const
239 {
240     if (!d->view) return 0.0;
241     return d->view->resourceProvider()->opacity();
242 }
243 
setPaintingOpacity(qreal opacity)244 void View::setPaintingOpacity(qreal opacity)
245 {
246     if (!d->view) return;
247     d->view->resourceProvider()->setOpacity(opacity);
248 }
249 
brushSize() const250 qreal View::brushSize() const
251 {
252     if (!d->view) return 0.0;
253     return d->view->resourceProvider()->size();
254 }
255 
setBrushSize(qreal brushSize)256 void View::setBrushSize(qreal brushSize)
257 {
258     if (!d->view) return;
259     d->view->resourceProvider()->setSize(brushSize);
260 }
261 
paintingFlow() const262 qreal View::paintingFlow() const
263 {
264     if (!d->view) return 0.0;
265     return d->view->resourceProvider()->flow();
266 }
267 
setPaintingFlow(qreal flow)268 void View::setPaintingFlow(qreal flow)
269 {
270     if (!d->view) return;
271     d->view->resourceProvider()->setFlow(flow);
272 }
273 
selectedNodes() const274 QList<Node *> View::selectedNodes() const
275 {
276     if (!d->view) return QList<Node *>();
277     if (!d->view->viewManager()) return QList<Node *>();
278     if (!d->view->viewManager()->nodeManager()) return QList<Node *>();
279 
280     KisNodeList selectedNodes = d->view->viewManager()->nodeManager()->selectedNodes();
281     return LibKisUtils::createNodeList(selectedNodes, d->view->image());
282 }
showFloatingMessage(const QString & message,const QIcon & icon,int timeout,int priority)283 void View::showFloatingMessage(const QString &message, const QIcon& icon, int timeout, int priority)
284 {
285     if (!d->view) return;
286 
287     KisFloatingMessage::Priority p;
288     p = static_cast<KisFloatingMessage::Priority>(priority);
289 
290     d->view->showFloatingMessage(message, icon, timeout, p);
291 }
292