Code

Filter effects dialog:
authornicholasbishop <nicholasbishop@users.sourceforge.net>
Fri, 27 Jul 2007 05:44:24 +0000 (05:44 +0000)
committernicholasbishop <nicholasbishop@users.sourceforge.net>
Fri, 27 Jul 2007 05:44:24 +0000 (05:44 +0000)
* Double-clicking a filter now applies it to the selection
* Updating filter settings widgets no longer updates the filter primitive

src/ui/dialog/filter-effects-dialog.cpp
src/ui/dialog/filter-effects-dialog.h

index fbb4edcdad9a8d1fb7aece663ff2d3960df7dd9b..3be16ad1f8d889e39e82173cb324fa817ce91d31 100644 (file)
@@ -175,8 +175,10 @@ public:
 
         SPObject* ob = _dialog._primitive_list.get_selected();
 
+        _dialog.set_attrs_locked(true);
         for(unsigned i = 0; i < _attrwidgets[_current_type].size(); ++i)
             _attrwidgets[_current_type][i]->set_from_attribute(ob);
+        _dialog.set_attrs_locked(false);
     }
 
     void type(const NR::FilterPrimitiveType t)
@@ -307,15 +309,14 @@ FilterEffectsDialog::FilterModifier::FilterModifier()
     Gtk::TreeViewColumn* col = _list.get_column(selcol - 1);
     if(col)
        col->add_attribute(_cell_sel.property_sel(), _columns.sel);
-
-    _list.append_column_editable(_("_Filter"), _columns.id);
-    ((Gtk::CellRendererText*)_list.get_column(1)->get_first_cell_renderer())->
-        signal_edited().connect(sigc::mem_fun(*this, &FilterEffectsDialog::FilterModifier::filter_name_edited));
+    _list.append_column(_("_Filter"), _columns.id);
 
     sw->set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
     sw->set_shadow_type(Gtk::SHADOW_IN);
     show_all_children();
     _add.signal_clicked().connect(sigc::mem_fun(*this, &FilterModifier::add_filter));
+    _list.signal_button_press_event().connect_notify(
+        sigc::mem_fun(*this, &FilterModifier::filter_list_button_press));
     _list.signal_button_release_event().connect_notify(
         sigc::mem_fun(*this, &FilterModifier::filter_list_button_release));
     _menu = create_popup_menu(*this, sigc::mem_fun(*this, &FilterModifier::duplicate_filter),
@@ -369,9 +370,15 @@ void FilterEffectsDialog::FilterModifier::CellRendererSel::render_vfunc(
 }
 
 // When the selection changes, show the active filter(s) in the dialog
-void FilterEffectsDialog::FilterModifier::on_inkscape_change_selection(Inkscape::Application *inkscape,
-                                                                       Inkscape::Selection *sel,
+void FilterEffectsDialog::FilterModifier::on_inkscape_change_selection(Application *inkscape,
+                                                                       Selection *sel,
                                                                        FilterModifier* fm)
+{
+    if(fm && sel)
+        fm->update_selection(sel);
+}
+
+void FilterEffectsDialog::FilterModifier::update_selection(Selection *sel)
 {
     std::set<SPObject*> used;
 
@@ -388,16 +395,16 @@ void FilterEffectsDialog::FilterModifier::on_inkscape_change_selection(Inkscape:
 
     const int size = used.size();
 
-    for(Gtk::TreeIter iter = fm->_model->children().begin();
-        iter != fm->_model->children().end(); ++iter) {
-        if(used.find((*iter)[fm->_columns.filter]) != used.end()) {
+    for(Gtk::TreeIter iter = _model->children().begin();
+        iter != _model->children().end(); ++iter) {
+        if(used.find((*iter)[_columns.filter]) != used.end()) {
             // If only one filter is in use by the selection, select it
             if(size == 1)
-                fm->_list.get_selection()->select(iter);
-            (*iter)[fm->_columns.sel] = size;
+                _list.get_selection()->select(iter);
+            (*iter)[_columns.sel] = size;
         }
         else
-            (*iter)[fm->_columns.sel] = 0;
+            (*iter)[_columns.sel] = 0;
     }
 }
 
@@ -431,6 +438,31 @@ void FilterEffectsDialog::FilterModifier::select_filter(const SPFilter* filter)
     }
 }
 
+void FilterEffectsDialog::FilterModifier::filter_list_button_press(GdkEventButton* e)
+{
+    // Double-click
+    if(e->type == GDK_2BUTTON_PRESS) {
+        SPDesktop *desktop = SP_ACTIVE_DESKTOP;
+        SPDocument *doc = sp_desktop_document(desktop);
+        SPFilter* filter = get_selected_filter();
+        Inkscape::Selection *sel = sp_desktop_selection(desktop);
+
+        GSList const *items = sel->itemList();
+
+        for (GSList const *i = items; i != NULL; i = i->next) {
+            SPItem * item = SP_ITEM(i->data);
+            SPStyle *style = SP_OBJECT_STYLE(item);
+            g_assert(style != NULL);
+            
+            sp_style_set_property_url(SP_OBJECT(item), "filter", SP_OBJECT(filter), false);
+            SP_OBJECT(item)->requestDisplayUpdate((SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG ));
+        }
+
+        update_selection(sel);
+        sp_document_maybe_done(doc, "fillstroke:blur", SP_VERB_DIALOG_FILL_STROKE,  _("Change blur"));
+    }
+}
+
 void FilterEffectsDialog::FilterModifier::filter_list_button_release(GdkEventButton* event)
 {
     if((event->type == GDK_BUTTON_RELEASE) && (event->button == 3)) {
@@ -1042,7 +1074,8 @@ FilterEffectsDialog::FilterEffectsDialog()
       _primitive_list(*this),
       _add_primitive_type(FPConverter),
       _add_primitive(Gtk::Stock::ADD),
-      _empty_settings(_("No primitive selected"), Gtk::ALIGN_LEFT)
+      _empty_settings(_("No primitive selected"), Gtk::ALIGN_LEFT),
+      _locked(false)
 {
     _settings = new Settings(*this);
 
@@ -1089,6 +1122,11 @@ FilterEffectsDialog::~FilterEffectsDialog()
     delete _settings;
 }
 
+void FilterEffectsDialog::set_attrs_locked(const bool l)
+{
+    _locked = l;
+}
+
 void FilterEffectsDialog::init_settings_widgets()
 {
     // TODO: Find better range/climb-rate/digits values for the SpinSliders,
@@ -1202,16 +1240,18 @@ void FilterEffectsDialog::set_attr_direct(const SPAttributeEnum attr, const Attr
 
 void FilterEffectsDialog::set_attr(const SPAttributeEnum attr, const gchar* val)
 {
-    SPFilter *filter = _filter_modifier.get_selected_filter();
-    SPFilterPrimitive* prim = _primitive_list.get_selected();
-
-    if(filter && prim) {
-        update_settings_sensitivity();
-
-        SP_OBJECT_REPR(prim)->setAttribute((gchar*)sp_attribute_name(attr), val);
-        filter->requestModified(SP_OBJECT_MODIFIED_FLAG);
-
-        sp_document_done(filter->document, SP_VERB_DIALOG_FILTER_EFFECTS, _("Set filter primitive attribute"));
+    if(!_locked) {
+        SPFilter *filter = _filter_modifier.get_selected_filter();
+        SPFilterPrimitive* prim = _primitive_list.get_selected();
+        
+        if(filter && prim) {
+            update_settings_sensitivity();
+            
+            SP_OBJECT_REPR(prim)->setAttribute((gchar*)sp_attribute_name(attr), val);
+            filter->requestModified(SP_OBJECT_MODIFIED_FLAG);
+            
+            sp_document_done(filter->document, SP_VERB_DIALOG_FILTER_EFFECTS, _("Set filter primitive attribute"));
+        }
     }
 }
 
index 3509e21ad63244d0d993ff508a7fa4e33235a24f..51c1cc5fcab7456c0d3aa68f14e29a170077e629 100644 (file)
@@ -43,6 +43,8 @@ class FilterEffectsDialog : public Dialog {
 public:
     ~FilterEffectsDialog();
 
+    void set_attrs_locked(const bool);
+
     static FilterEffectsDialog *create() { return new FilterEffectsDialog(); }
 private:
     class FilterModifier : public Gtk::VBox, public FilterEffectChooser
@@ -70,9 +72,10 @@ private:
             Glib::Property<int> _sel;
         };
         
-        static void on_inkscape_change_selection(Inkscape::Application *, Inkscape::Selection *,
-                                                 FilterModifier*);
+        static void on_inkscape_change_selection(Application *, Selection *, FilterModifier*);
+        void update_selection(Selection *);
 
+        void filter_list_button_press(GdkEventButton*);
         void filter_list_button_release(GdkEventButton*);
         void add_filter();
         void remove_filter();
@@ -198,6 +201,9 @@ private:
     // For controlling setting sensitivity
     Gtk::Widget* _k1, *_k2, *_k3, *_k4;
 
+    // To prevent unwanted signals
+    bool _locked;
+
     FilterEffectsDialog(FilterEffectsDialog const &d);
     FilterEffectsDialog& operator=(FilterEffectsDialog const &d);
 };