1 /*
2 * Authors:
3 * Ted Gould <ted@gould.cx>
4 *
5 * Copyright (C) 2007 Authors
6 *
7 * Released under GNU GPL, read the file 'COPYING' for more information
8 */
10 #include <config.h>
12 #include "gtkmm/messagedialog.h"
14 #include "execution-env.h"
15 #include "prefdialog.h"
16 #include "implementation/implementation.h"
18 #include "selection.h"
19 #include "effect.h"
20 #include "document.h"
21 #include "ui/view/view.h"
22 #include "sp-namedview.h"
23 #include "desktop-handles.h"
25 #include "util/glib-list-iterators.h"
27 namespace Inkscape {
28 namespace Extension {
31 ExecutionEnv::ExecutionEnv (Effect * effect, Inkscape::UI::View::View * doc, Gtk::Widget * controls, sigc::signal<void> * changeSignal, Gtk::Dialog * prefDialog) :
32 _visibleDialog(NULL),
33 _effect(effect),
34 _prefsVisible(false),
35 _finished(false),
36 _humanWait(false),
37 _canceled(false),
38 _prefsChanged(false),
39 _livePreview(true),
40 _selfdelete(false),
41 _changeSignal(changeSignal),
42 _doc(doc) {
44 SPDesktop *desktop = (SPDesktop *)_doc;
45 sp_namedview_document_from_window(desktop);
47 if (desktop != NULL) {
48 Inkscape::Util::GSListConstIterator<SPItem *> selected =
49 sp_desktop_selection(desktop)->itemList();
50 while ( selected != NULL ) {
51 Glib::ustring selected_id;
52 selected_id = SP_OBJECT_ID(*selected);
53 _selected.insert(_selected.end(), selected_id);
54 //std::cout << "Selected: " << selected_id << std::endl;
55 ++selected;
56 }
57 }
59 _mainloop = Glib::MainLoop::create(false);
61 if (prefDialog == NULL) {
62 if (controls != NULL) {
63 createPrefsDialog(controls);
64 } else {
65 createWorkingDialog();
66 }
67 } else {
68 _visibleDialog = prefDialog;
69 _prefsVisible = true;
70 }
72 if (_changeSignal != NULL) {
73 _changesig = _changeSignal->connect(sigc::mem_fun(this, &ExecutionEnv::preferencesChange));
74 }
76 return;
77 }
79 ExecutionEnv::~ExecutionEnv (void) {
80 _dialogsig.disconnect();
81 _changesig.disconnect();
82 if (_visibleDialog != NULL && !_shutdown) {
83 delete _visibleDialog;
84 }
85 if (_changeSignal != NULL && !_shutdown) {
86 delete _changeSignal;
87 }
88 return;
89 }
91 void
92 ExecutionEnv::preferencesChange (void) {
93 //std::cout << "Preferences are a changin'" << std::endl;
94 _prefsChanged = true;
95 if (_humanWait) {
96 _mainloop->quit();
97 documentCancel();
98 _humanWait = false;
99 } else {
100 processingCancel();
101 documentCancel();
102 }
103 return;
104 }
106 void
107 ExecutionEnv::createPrefsDialog (Gtk::Widget * controls) {
108 _visibleDialog = new PrefDialog(_effect->get_name(), _effect->get_help(), controls, this, _effect, _changeSignal);
109 _visibleDialog->signal_response().connect(sigc::mem_fun(this, &ExecutionEnv::preferencesResponse));
110 _visibleDialog->show();
111 _dialogsig = _visibleDialog->signal_response().connect(sigc::mem_fun(this, &ExecutionEnv::preferencesResponse));
113 _prefsVisible = true;
114 return;
115 }
117 void
118 ExecutionEnv::createWorkingDialog (void) {
119 if (_visibleDialog != NULL) {
120 delete _visibleDialog;
121 }
122 if (_changeSignal != NULL) {
123 delete _changeSignal;
124 }
126 gchar * dlgmessage = g_strdup_printf(_("'%s' working, please wait..."), _effect->get_name());
127 _visibleDialog = new Gtk::MessageDialog(dlgmessage,
128 false, // use markup
129 Gtk::MESSAGE_INFO,
130 Gtk::BUTTONS_CANCEL,
131 true); // modal
132 _dialogsig = _visibleDialog->signal_response().connect(sigc::mem_fun(this, &ExecutionEnv::workingCanceled));
133 g_free(dlgmessage);
134 _visibleDialog->show();
136 _prefsVisible = false;
137 return;
138 }
140 void
141 ExecutionEnv::workingCanceled (const int resp) {
142 processingCancel();
143 documentCancel();
144 _finished = true;
145 return;
146 }
148 void
149 ExecutionEnv::preferencesResponse (const int resp) {
150 if (resp == Gtk::RESPONSE_OK) {
151 if (_humanWait) {
152 documentCommit();
153 _mainloop->quit();
154 _finished = true;
155 } else {
156 createWorkingDialog();
157 }
158 } else {
159 if (_humanWait) {
160 _mainloop->quit();
161 } else {
162 processingCancel();
163 }
164 documentCancel();
165 _finished = true;
166 }
167 return;
168 }
170 void
171 ExecutionEnv::processingComplete(void) {
172 //std::cout << "Processing Complete" << std::endl;
173 if (_prefsChanged) { return; } // do it all again
174 if (_prefsVisible) {
175 _humanWait = true;
176 } else {
177 documentCommit();
178 _finished = true;
179 }
180 return;
181 }
183 void
184 ExecutionEnv::processingCancel (void) {
185 _effect->get_imp()->cancelProcessing();
186 return;
187 }
189 void
190 ExecutionEnv::documentCancel (void) {
191 _canceled = true;
192 return;
193 }
195 void
196 ExecutionEnv::documentCommit (void) {
197 sp_document_done(_doc->doc(), SP_VERB_NONE, _(_effect->get_name()));
198 Effect::set_last_effect(_effect);
199 return;
200 }
202 void
203 ExecutionEnv::reselect (void) {
204 if (_doc == NULL) { return; }
205 SPDocument * doc = _doc->doc();
206 if (doc == NULL) { return; }
208 SPDesktop *desktop = (SPDesktop *)_doc;
209 sp_namedview_document_from_window(desktop);
211 if (desktop == NULL) { return; }
213 Inkscape::Selection * selection = sp_desktop_selection(desktop);
215 for (std::list<Glib::ustring>::iterator i = _selected.begin(); i != _selected.end(); i++) {
216 SPObject * obj = doc->getObjectById(i->c_str());
217 if (obj != NULL) {
218 selection->add(obj);
219 }
220 }
222 return;
223 }
225 void
226 ExecutionEnv::run (void) {
227 while (!_finished) {
228 _canceled = false;
229 if (_humanWait || !_livePreview) {
230 _mainloop->run();
231 } else {
232 _prefsChanged = false;
233 _effect->get_imp()->effect(_effect, _doc);
234 processingComplete();
235 }
236 if (_canceled) {
237 sp_document_cancel(_doc->doc());
238 reselect();
239 }
240 }
241 if (_selfdelete) {
242 delete this;
243 }
244 return;
245 }
247 void
248 ExecutionEnv::livePreview (bool state) {
249 _mainloop->quit();
250 if (_livePreview && !state) {
251 documentCancel();
252 }
253 if (!_livePreview && state) {
254 _humanWait = false;
255 }
256 _livePreview = state;
257 return;
258 }
260 void
261 ExecutionEnv::shutdown (bool del) {
262 if (_humanWait) {
263 _mainloop->quit();
264 } else {
265 processingCancel();
266 }
267 documentCancel();
269 _finished = true;
270 _visibleDialog = NULL;
271 }
272 _selfdelete = del;
274 return;
275 }
277 } } /* namespace Inkscape, Extension */
281 /*
282 Local Variables:
283 mode:c++
284 c-file-style:"stroustrup"
285 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
286 indent-tabs-mode:nil
287 fill-column:99
288 End:
289 */
290 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :