index 2bc971d01fb675ec37cf226bae18ee246c4d4a73..9d3abae762e4f7138c43fb13a58179d43817537a 100644 (file)
* Authors:
* Ted Gould <ted@gould.cx>
*
- * Copyright (C) 2005-2007 Authors
+ * Copyright (C) 2005-2008 Authors
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
#include <glibmm/i18n.h>
#include "../dialogs/dialog-events.h"
+#include "xml/repr.h"
+
+// Used to get SP_ACTIVE_DESKTOP
+#include "inkscape.h"
+#include "desktop.h"
+
+#include "effect.h"
+#include "implementation/implementation.h"
#include "prefdialog.h"
+
namespace Inkscape {
namespace Extension {
\param name Name of the Extension who's dialog this is
\param help The help string for the extension (NULL if none)
\param controls The extension specific widgets in the dialog
-
+
This function initializes the dialog with the name of the extension
in the title. It adds a few buttons and sets up handlers for
them. It also places the passed in widgets into the dialog.
*/
-PrefDialog::PrefDialog (Glib::ustring name, gchar const * help, Gtk::Widget * controls, ExecutionEnv * exEnv) :
+PrefDialog::PrefDialog (Glib::ustring name, gchar const * help, Gtk::Widget * controls, Effect * effect) :
Gtk::Dialog::Dialog(_(name.c_str()), true, true),
_help(help),
_name(name),
- _exEnv(exEnv),
_button_ok(NULL),
_button_cancel(NULL),
_button_preview(NULL),
- _button_pinned(NULL)
+ _param_preview(NULL),
+ _effect(effect),
+ _exEnv(NULL)
{
Gtk::HBox * hbox = Gtk::manage(new Gtk::HBox());
+ if (controls == NULL) {
+ if (_effect == NULL) {
+ std::cout << "AH!!! No controls and no effect!!!" << std::endl;
+ return;
+ }
+ controls = _effect->get_imp()->prefs_effect(_effect, SP_ACTIVE_DESKTOP, &_signal_param_change, NULL);
+ _signal_param_change.connect(sigc::mem_fun(this, &PrefDialog::param_change));
+ }
+
hbox->pack_start(*controls, true, true, 6);
hbox->show();
this->get_vbox()->pack_start(*hbox, true, true, 6);
- if (_exEnv != NULL) {
+ /*
+ Gtk::Button * help_button = add_button(Gtk::Stock::HELP, Gtk::RESPONSE_HELP);
+ if (_help == NULL)
+ help_button->set_sensitive(false);
+ */
+ _button_cancel = add_button(_effect == NULL ? Gtk::Stock::CANCEL : Gtk::Stock::CLOSE, Gtk::RESPONSE_CANCEL);
+ _button_cancel->set_use_stock(true);
+
+ _button_ok = add_button(_effect == NULL ? Gtk::Stock::OK : Gtk::Stock::APPLY, Gtk::RESPONSE_OK);
+ _button_ok->set_use_stock(true);
+ set_default_response(Gtk::RESPONSE_OK);
+ _button_ok->grab_focus();
+
+ if (_effect != NULL && !_effect->no_live_preview) {
+ if (_param_preview == NULL) {
+ XML::Document * doc = sp_repr_read_mem(live_param_xml, strlen(live_param_xml), NULL);
+ _param_preview = Parameter::make(doc->root(), _effect);
+ }
+
Gtk::HSeparator * sep = Gtk::manage(new Gtk::HSeparator());
sep->show();
this->get_vbox()->pack_start(*sep, true, true, 4);
hbox = Gtk::manage(new Gtk::HBox());
- _button_preview = Gtk::manage(new Gtk::CheckButton(_("Live Preview")));
+ _button_preview = _param_preview->get_widget(NULL, NULL, &_signal_preview);
_button_preview->show();
- _button_pinned = Gtk::manage(new Gtk::CheckButton(_("Pin Dialog")));
- _button_pinned->show();
hbox->pack_start(*_button_preview, true, true,6);
- hbox->pack_start(*_button_pinned, true, true,6);
hbox->show();
this->get_vbox()->pack_start(*hbox, true, true, 6);
- }
- /*
- Gtk::Button * help_button = add_button(Gtk::Stock::HELP, Gtk::RESPONSE_HELP);
- if (_help == NULL)
- help_button->set_sensitive(false);
- */
- _button_cancel = add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
+ Gtk::HBox * hbox = dynamic_cast<Gtk::HBox *>(_button_preview);
+ if (hbox != NULL) {
+ Gtk::Widget * back = hbox->children().back().get_widget();
+ Gtk::CheckButton * cb = dynamic_cast<Gtk::CheckButton *>(back);
+ _checkbox_preview = cb;
+ }
+
+ preview_toggle();
+ _signal_preview.connect(sigc::mem_fun(this, &PrefDialog::preview_toggle));
+ }
- _button_ok = add_button(Gtk::Stock::OK, Gtk::RESPONSE_OK);
- set_default_response(Gtk::RESPONSE_OK);
- _button_ok->grab_focus();
-
GtkWidget *dlg = GTK_WIDGET(gobj());
sp_transientize(dlg);
return;
}
+PrefDialog::~PrefDialog ( )
+{
+ if (_param_preview != NULL) {
+ delete _param_preview;
+ _param_preview = NULL;
+ }
+
+ if (_exEnv != NULL) {
+ _exEnv->cancel();
+ delete _exEnv;
+ _exEnv = NULL;
+ }
+
+ if (_effect != NULL) {
+ _effect->set_pref_dialog(NULL);
+ }
+
+ return;
+}
+
+#if 0
/** \brief Runs the dialog
\return The response to the dialog
}
return resp;
}
+#endif
+
+void
+PrefDialog::preview_toggle (void) {
+ if(_param_preview->get_bool(NULL, NULL)) {
+ set_modal(true);
+ if (_exEnv == NULL) {
+ _exEnv = new ExecutionEnv(_effect, SP_ACTIVE_DESKTOP, NULL, false, false);
+ _exEnv->run();
+ }
+ } else {
+ set_modal(false);
+ if (_exEnv != NULL) {
+ _exEnv->cancel();
+ _exEnv->undo();
+ delete _exEnv;
+ _exEnv = NULL;
+ }
+ }
+}
void
-PrefDialog::setPreviewState (Glib::ustring state) {
+PrefDialog::param_change (void) {
+ if (_exEnv != NULL) {
+ _timersig.disconnect();
+ _timersig = Glib::signal_timeout().connect(sigc::mem_fun(this, &PrefDialog::param_timer_expire),
+ 250, /* ms */
+ Glib::PRIORITY_DEFAULT_IDLE);
+ }
+
+ return;
+}
+bool
+PrefDialog::param_timer_expire (void) {
+ if (_exEnv != NULL) {
+ _exEnv->cancel();
+ _exEnv->undo();
+ _exEnv->run();
+ }
+
+ return false;
}
void
-PrefDialog::setPinned (bool in_pin) {
- set_modal(!in_pin);
+PrefDialog::on_response (int signal) {
+ if (signal == Gtk::RESPONSE_OK) {
+ if (_exEnv == NULL) {
+ if (_effect != NULL) {
+ _effect->effect(SP_ACTIVE_DESKTOP);
+ } else {
+ // Shutdown run()
+ return;
+ }
+ } else {
+ if (_exEnv->wait()) {
+ _exEnv->commit();
+ } else {
+ _exEnv->undo();
+ }
+ delete _exEnv;
+ _exEnv = NULL;
+ }
+ }
+
+ if (_param_preview != NULL) {
+ _checkbox_preview->set_active(false);
+ }
+
+ if ((signal == Gtk::RESPONSE_CANCEL || signal == Gtk::RESPONSE_DELETE_EVENT) && _effect != NULL) {
+ delete this;
+ }
+
+ return;
}
#include "internal/clear-n_.h"
-const char * PrefDialog::pinned_param_xml = "<param name=\"__pinned__\" type=\"boolean\" gui-text=\"" N_("Pin Dialog") "\" gui-description=\"" N_("Toggles whether the dialog stays for multiple executions or disappears after one") "\" scope=\"user\">false</param>";
-const char * PrefDialog::live_param_xml = "<param name=\"__live_effect__\" type=\"boolean\" gui-text=\"" N_("Live Preview") "\" gui-description=\"" N_("Controls whether the effect settings are rendered live on canvas") "\" scope=\"user\">false</param>";
+const char * PrefDialog::live_param_xml = "<param name=\"__live_effect__\" type=\"boolean\" gui-text=\"" N_("Live preview") "\" gui-description=\"" N_("Is the effect previewed live on canvas?") "\" scope=\"user\">false</param>";
}; }; /* namespace Inkscape, Extension */