execution-env.cpp revision 85d441f1749ae014e8d0757dd5ed3eb447cd518a
/*
* Authors:
* Ted Gould <ted@gould.cx>
*
* Copyright (C) 2007 Authors
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
#include <config.h>
#include "gtkmm/messagedialog.h"
#include "execution-env.h"
#include "prefdialog.h"
#include "implementation/implementation.h"
#include "selection.h"
#include "effect.h"
#include "document.h"
#include "ui/view/view.h"
#include "sp-namedview.h"
#include "desktop-handles.h"
#include "util/glib-list-iterators.h"
namespace Inkscape {
namespace Extension {
ExecutionEnv::ExecutionEnv (Effect * effect, Inkscape::UI::View::View * doc, Gtk::Widget * controls, Gtk::Dialog * prefDialog) :
_visibleDialog(NULL),
_effect(effect),
_prefsVisible(false),
_finished(false),
_humanWait(false),
_canceled(false),
_prefsChanged(false),
_livePreview(true),
_selfdelete(false),
_doc(doc) {
SPDesktop *desktop = (SPDesktop *)_doc;
sp_namedview_document_from_window(desktop);
if (desktop != NULL) {
Inkscape::Util::GSListConstIterator<SPItem *> selected =
sp_desktop_selection(desktop)->itemList();
while ( selected != NULL ) {
Glib::ustring selected_id;
selected_id = SP_OBJECT_ID(*selected);
_selected.insert(_selected.end(), selected_id);
//std::cout << "Selected: " << selected_id << std::endl;
++selected;
}
}
_mainloop = Glib::MainLoop::create(false);
if (prefDialog == NULL) {
if (controls != NULL) {
createPrefsDialog(controls);
} else {
createWorkingDialog();
}
} else {
_visibleDialog = prefDialog;
_prefsVisible = true;
}
return;
}
ExecutionEnv::~ExecutionEnv (void) {
_dialogsig.disconnect();
if (_visibleDialog != NULL && !_shutdown) {
delete _visibleDialog;
}
return;
}
void
ExecutionEnv::preferencesChange (void) {
//std::cout << "Preferences are a changin'" << std::endl;
_prefsChanged = true;
if (_humanWait) {
_mainloop->quit();
documentCancel();
_humanWait = false;
} else {
processingCancel();
documentCancel();
}
return;
}
void
ExecutionEnv::createPrefsDialog (Gtk::Widget * controls) {
if (_visibleDialog != NULL) {
delete _visibleDialog;
}
_visibleDialog = new PrefDialog(_effect->get_name(), _effect->get_help(), controls, this, _effect);
_visibleDialog->signal_response().connect(sigc::mem_fun(this, &ExecutionEnv::preferencesResponse));
_visibleDialog->show();
_dialogsig = _visibleDialog->signal_response().connect(sigc::mem_fun(this, &ExecutionEnv::preferencesResponse));
_prefsVisible = true;
return;
}
void
ExecutionEnv::createWorkingDialog (void) {
if (_visibleDialog != NULL) {
delete _visibleDialog;
}
gchar * dlgmessage = g_strdup_printf(_("'%s' working, please wait..."), _effect->get_name());
_visibleDialog = new Gtk::MessageDialog(dlgmessage,
false, // use markup
Gtk::MESSAGE_INFO,
Gtk::BUTTONS_CANCEL,
true); // modal
_dialogsig = _visibleDialog->signal_response().connect(sigc::mem_fun(this, &ExecutionEnv::workingCanceled));
g_free(dlgmessage);
_visibleDialog->show();
_prefsVisible = false;
return;
}
void
ExecutionEnv::workingCanceled (const int resp) {
processingCancel();
documentCancel();
_finished = true;
return;
}
void
ExecutionEnv::preferencesResponse (const int resp) {
if (resp == Gtk::RESPONSE_OK) {
if (_humanWait) {
documentCommit();
_mainloop->quit();
_finished = true;
} else {
createWorkingDialog();
}
} else {
if (_humanWait) {
_mainloop->quit();
} else {
processingCancel();
}
documentCancel();
_finished = true;
}
return;
}
void
ExecutionEnv::processingComplete(void) {
//std::cout << "Processing Complete" << std::endl;
if (_prefsChanged) { return; } // do it all again
if (_prefsVisible) {
_humanWait = true;
} else {
documentCommit();
_finished = true;
}
return;
}
void
ExecutionEnv::processingCancel (void) {
_effect->get_imp()->cancelProcessing();
return;
}
void
ExecutionEnv::documentCancel (void) {
_canceled = true;
return;
}
void
ExecutionEnv::documentCommit (void) {
sp_document_done(_doc->doc(), SP_VERB_NONE, _(_effect->get_name()));
Effect::set_last_effect(_effect);
return;
}
void
ExecutionEnv::reselect (void) {
if (_doc == NULL) { return; }
SPDocument * doc = _doc->doc();
if (doc == NULL) { return; }
SPDesktop *desktop = (SPDesktop *)_doc;
sp_namedview_document_from_window(desktop);
if (desktop == NULL) { return; }
Inkscape::Selection * selection = sp_desktop_selection(desktop);
for (std::list<Glib::ustring>::iterator i = _selected.begin(); i != _selected.end(); i++) {
SPObject * obj = doc->getObjectById(i->c_str());
if (obj != NULL) {
selection->add(obj);
}
}
return;
}
void
ExecutionEnv::run (void) {
while (!_finished) {
_canceled = false;
if (_humanWait || !_livePreview) {
_mainloop->run();
} else {
_prefsChanged = false;
_effect->get_imp()->effect(_effect, _doc);
processingComplete();
}
if (_canceled) {
sp_document_cancel(_doc->doc());
reselect();
}
}
if (_selfdelete) {
delete this;
}
return;
}
void
ExecutionEnv::livePreview (bool state) {
_mainloop->quit();
if (_livePreview && !state) {
documentCancel();
}
if (!_livePreview && state) {
_humanWait = false;
}
_livePreview = state;
return;
}
void
ExecutionEnv::shutdown (bool del) {
if (_humanWait) {
_mainloop->quit();
} else {
processingCancel();
}
documentCancel();
_finished = true;
_visibleDialog = NULL;
}
_selfdelete = del;
return;
}
} } /* namespace Inkscape, Extension */
/*
Local Variables:
mode:c++
c-file-style:"stroustrup"
c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :