X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fextension%2Fprefdialog.cpp;h=9d3abae762e4f7138c43fb13a58179d43817537a;hb=eaedc86c02c5a96cc5369d1a216cedcf13eb5704;hp=86f1a50bed8518a9a4187a53589cecc3e448a813;hpb=8bc547b01926fa6f998028afe7298d32e65d48da;p=inkscape.git diff --git a/src/extension/prefdialog.cpp b/src/extension/prefdialog.cpp index 86f1a50be..9d3abae76 100644 --- a/src/extension/prefdialog.cpp +++ b/src/extension/prefdialog.cpp @@ -2,40 +2,239 @@ * Authors: * Ted Gould * - * Copyright (C) 2005-2006 Authors + * Copyright (C) 2005-2008 Authors * * Released under GNU GPL, read the file 'COPYING' for more information */ #include +#include +#include #include #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 { -PrefDialog::PrefDialog (Glib::ustring name, gchar const * help, Gtk::Widget * controls) : - Gtk::Dialog::Dialog(name + _(" Preferences"), true, true), _help(help), _name(name) + +/** \brief Creates a new preference dialog for extension preferences + \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, Effect * effect) : + Gtk::Dialog::Dialog(_(name.c_str()), true, true), + _help(help), + _name(name), + _button_ok(NULL), + _button_cancel(NULL), + _button_preview(NULL), + _param_preview(NULL), + _effect(effect), + _exEnv(NULL) { - this->get_vbox()->pack_start(*controls, true, true, 5); + 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)); + } - if (_help != NULL) - add_button(Gtk::Stock::HELP, Gtk::RESPONSE_HELP); - add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); + hbox->pack_start(*controls, true, true, 6); + hbox->show(); + this->get_vbox()->pack_start(*hbox, true, true, 6); - Gtk::Button * ok = add_button(Gtk::Stock::OK, Gtk::RESPONSE_OK); + /* + 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); - ok->grab_focus(); - + _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 = _param_preview->get_widget(NULL, NULL, &_signal_preview); + _button_preview->show(); + hbox->pack_start(*_button_preview, true, true,6); + hbox->show(); + this->get_vbox()->pack_start(*hbox, true, true, 6); + + Gtk::HBox * hbox = dynamic_cast(_button_preview); + if (hbox != NULL) { + Gtk::Widget * back = hbox->children().back().get_widget(); + Gtk::CheckButton * cb = dynamic_cast(back); + _checkbox_preview = cb; + } + + preview_toggle(); + _signal_preview.connect(sigc::mem_fun(this, &PrefDialog::preview_toggle)); + } + 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 + + This function overrides the run function in the GTKmm dialog + class, but basically it only calls it. This function only + handles the \c Gtk::RESPONSE_HELP return, and in that case it + brings up the help window. All other return values are returned + to the calling function. +*/ +int +PrefDialog::run (void) { + int resp = Gtk::RESPONSE_HELP; + while (resp == Gtk::RESPONSE_HELP) { + resp = Gtk::Dialog::run(); + if (resp == Gtk::RESPONSE_HELP) { + /* + if (_helpDialog == NULL) { + _helpDialog = new HelpDialog(_help); + } + */ + } + } + 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::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::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::live_param_xml = "false"; + }; }; /* namespace Inkscape, Extension */ /*