From 18f0fe2a37a130c6eff70868d574ee476f2b84cc Mon Sep 17 00:00:00 2001 From: gouldtj Date: Sat, 1 Sep 2007 04:36:03 +0000 Subject: [PATCH] r16442@tres: ted | 2007-08-30 21:51:42 -0700 One preference dialog per effect. Nothing crazy here. Also setting the timer to be ref counted in lock/unlock mode. This way the whole thing stays locked while the dialog is shown. --- src/extension/effect.cpp | 22 ++++++++++++++++++++-- src/extension/effect.h | 5 +++++ src/extension/prefdialog.cpp | 7 +++++++ src/extension/timer.cpp | 9 ++++----- src/extension/timer.h | 6 +++--- 5 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/extension/effect.cpp b/src/extension/effect.cpp index a20f1c6e9..7ac4825a3 100644 --- a/src/extension/effect.cpp +++ b/src/extension/effect.cpp @@ -35,7 +35,8 @@ Effect::Effect (Inkscape::XML::Node * in_repr, Implementation::Implementation * _name_noprefs(Glib::ustring(get_name()) + _(" (No preferences)")), _verb(get_id(), get_name(), NULL, NULL, this, true), _verb_nopref(_id_noprefs.c_str(), _name_noprefs.c_str(), NULL, NULL, this, false), - _menu_node(NULL), _workingDialog(true) + _menu_node(NULL), _workingDialog(true), + _prefDialog(NULL) { Inkscape::XML::Node * local_effects_menu = NULL; @@ -206,6 +207,11 @@ Effect::check (void) bool Effect::prefs (Inkscape::UI::View::View * doc) { + if (_prefDialog != NULL) { + _prefDialog->raise(); + return true; + } + if (!loaded()) set_state(Extension::STATE_LOADED); if (!loaded()) return false; @@ -237,7 +243,7 @@ Effect::prefs (Inkscape::UI::View::View * doc) void Effect::effect (Inkscape::UI::View::View * doc) { - printf("Execute effect\n"); + //printf("Execute effect\n"); if (!loaded()) set_state(Extension::STATE_LOADED); if (!loaded()) return; @@ -300,6 +306,18 @@ Effect::get_info_widget(void) return Extension::get_info_widget(); } +void +Effect::set_pref_dialog (PrefDialog * prefdialog) +{ + _prefDialog = prefdialog; + if (_prefDialog == NULL) { + timer->unlock(); + } else { + timer->lock(); + } + return; +} + /** \brief Create an action for a \c EffectVerb \param view Which view the action should be created for \return The built action. diff --git a/src/extension/effect.h b/src/extension/effect.h index bebdb1c4f..44d18146a 100644 --- a/src/extension/effect.h +++ b/src/extension/effect.h @@ -18,6 +18,7 @@ #include #include "verbs.h" +#include "prefdialog.h" #include "extension.h" struct SPDocument; @@ -88,6 +89,9 @@ class Effect : public Extension { Inkscape::XML::Node * _menu_node; /** \brief Whehter a working dialog should be shown */ bool _workingDialog; + + /** \brief The preference dialog if it is shown */ + PrefDialog * _prefDialog; public: Effect (Inkscape::XML::Node * in_repr, Implementation::Implementation * in_imp); @@ -109,6 +113,7 @@ public: bool no_doc; // if true, the effect does not process SVG document at all, so no need to save, read, and watch for errors + void set_pref_dialog (PrefDialog * prefdialog); private: static gchar * remove_ (gchar * instr); }; diff --git a/src/extension/prefdialog.cpp b/src/extension/prefdialog.cpp index cef642d50..0174fd585 100644 --- a/src/extension/prefdialog.cpp +++ b/src/extension/prefdialog.cpp @@ -107,11 +107,18 @@ PrefDialog::PrefDialog (Glib::ustring name, gchar const * help, Gtk::Widget * co GtkWidget *dlg = GTK_WIDGET(gobj()); sp_transientize(dlg); + if (_effect != NULL) { + _effect->set_pref_dialog(this); + } + return; } PrefDialog::~PrefDialog ( ) { + if (_effect != NULL) { + _effect->set_pref_dialog(NULL); + } if (_param_preview != NULL) { delete _param_preview; } diff --git a/src/extension/timer.cpp b/src/extension/timer.cpp index 0e7a6ad11..c7a9331a0 100644 --- a/src/extension/timer.cpp +++ b/src/extension/timer.cpp @@ -33,11 +33,10 @@ bool ExpirationTimer::timer_started = false; the first timer extension, the timer is kicked off. This function also sets up teh circularly linked list of all the timers. */ -ExpirationTimer::ExpirationTimer (Extension * in_extension) +ExpirationTimer::ExpirationTimer (Extension * in_extension): + locked(0), + extension(in_extension) { - locked = false; - extension = in_extension; - /* Fix Me! */ if (timer_list == NULL) { next = this; @@ -124,7 +123,7 @@ ExpirationTimer::touch (void) bool ExpirationTimer::expired (void) const { - if (locked) return false; + if (locked > 0) return false; Glib::TimeVal current; current.assign_current_time(); diff --git a/src/extension/timer.h b/src/extension/timer.h index b9649e899..7855ed170 100644 --- a/src/extension/timer.h +++ b/src/extension/timer.h @@ -31,7 +31,7 @@ class ExpirationTimer { static bool timer_started; /** \brief Is this extension locked from being unloaded? */ - bool locked; + int locked; /** \brief Next entry in the list */ ExpirationTimer * next; /** \brief When this timer expires */ @@ -49,8 +49,8 @@ public: ~ExpirationTimer(void); void touch (void); - void lock (void) { locked = true; }; - void unlock (void) { locked = false; }; + void lock (void) { locked++; }; + void unlock (void) { locked--; }; /** \brief Set the timeout variable */ static void set_timeout (long in_seconds) { timeout = in_seconds; }; -- 2.30.2