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