Code

Add option to align & distribute dialog to treat the selection as a group (closes...
[inkscape.git] / src / ui / dialog / livepatheffect-editor.cpp
index 232f2ebfe7f0b40217602643d7990faa80d5f89e..44f37083b0402f28bbe075ff130b84f028afc47e 100644 (file)
@@ -69,6 +69,7 @@ static void lpeeditor_selection_modified (Inkscape::Selection * selection, guint
 
 LivePathEffectEditor::LivePathEffectEditor()
     : UI::Widget::Panel("", "dialogs.livepatheffect", SP_VERB_DIALOG_LIVE_PATH_EFFECT),
+      lpe_list_locked(false),
       combo_effecttype(Inkscape::LivePathEffect::LPETypeConverter),
       effectwidget(NULL),
       explain_label("", Gtk::ALIGN_CENTER),
@@ -125,7 +126,6 @@ LivePathEffectEditor::LivePathEffectEditor()
     effectlist_store = Gtk::ListStore::create(columns);
     effectlist_view.set_model(effectlist_store);
 
-    effectlist_view.set_rules_hint();
     effectlist_view.set_headers_visible(false);
 
     // Handle tree selections
@@ -135,8 +135,7 @@ LivePathEffectEditor::LivePathEffectEditor()
     //Add the visibility icon column:
     Inkscape::UI::Widget::ImageToggler *eyeRenderer = manage( new Inkscape::UI::Widget::ImageToggler("visible", "hidden") );
     int visibleColNum = effectlist_view.append_column("is_visible", *eyeRenderer) - 1;
-//    eyeRenderer->signal_pre_toggle().connect( sigc::mem_fun(*this, &LayersPanel::_preToggle) );
-//    eyeRenderer->signal_toggled().connect( sigc::bind( sigc::mem_fun(*this, &LayersPanel::_toggled), (int)COL_VISIBLE) );
+    eyeRenderer->signal_toggled().connect( sigc::mem_fun(*this, &LivePathEffectEditor::on_visibility_toggled) );
     eyeRenderer->property_activatable() = true;
     Gtk::TreeViewColumn* col = effectlist_view.get_column(visibleColNum);
     if ( col ) {
@@ -196,6 +195,17 @@ LivePathEffectEditor::showParams(LivePathEffect::Effect* effect)
     // fixme: add resizing of dialog
 }
 
+void
+LivePathEffectEditor::selectInList(LivePathEffect::Effect* effect)
+{
+    Gtk::TreeNodeChildren chi = effectlist_view.get_model()->children();
+    for (Gtk::TreeIter ci = chi.begin() ; ci != chi.end(); ci++) {
+        if (ci->get_value(columns.lperef)->lpeobject->lpe == effect)
+            effectlist_view.get_selection()->select(ci);
+    }
+}
+
+
 void
 LivePathEffectEditor::showText(Glib::ustring const &str)
 {
@@ -226,6 +236,12 @@ LivePathEffectEditor::set_sensitize_all(bool sensitive)
 void
 LivePathEffectEditor::onSelectionChanged(Inkscape::Selection *sel)
 {
+    if (lpe_list_locked) {
+        // this was triggered by selecting a row in the list, so skip reloading
+        lpe_list_locked = false;
+        return;
+    } 
+
     effectlist_store->clear();
     current_lpeitem = NULL;
 
@@ -244,6 +260,8 @@ LivePathEffectEditor::onSelectionChanged(Inkscape::Selection *sel)
                     Inkscape::LivePathEffect::Effect *lpe = sp_lpe_item_get_current_lpe(lpeitem);
                     if (lpe) {
                         showParams(lpe);
+                        lpe_list_locked = true; 
+                        selectInList(lpe);
                     } else {
                         showText(_("Unknown effect is applied"));
                     }
@@ -336,7 +354,7 @@ LivePathEffectEditor::onApply()
 
             // If item is a SPRect, convert it to path first:
             if ( SP_IS_RECT(item) ) {
-                sp_selected_path_to_curves(false);
+                sp_selected_path_to_curves(current_desktop, false);
                 item = sel->singleItem(); // get new item
             }
 
@@ -409,11 +427,29 @@ void LivePathEffectEditor::on_effect_selection_changed()
     LivePathEffect::LPEObjectReference * lperef = (*it)[columns.lperef];
 
     if (lperef && current_lpeitem) {
+        lpe_list_locked = true; // prevent reload of the list which would lose selection
         sp_lpe_item_set_current_path_effect(current_lpeitem, lperef);
         showParams(lperef->lpeobject->lpe);
     }
 }
 
+void LivePathEffectEditor::on_visibility_toggled( Glib::ustring const& str )
+{
+    Gtk::TreeModel::Children::iterator iter = effectlist_view.get_model()->get_iter(str);
+    Gtk::TreeModel::Row row = *iter;
+
+    LivePathEffect::LPEObjectReference * lpeobjref = row[columns.lperef];
+
+    if ( lpeobjref ) {
+        bool newValue = !row[columns.col_visible];
+        row[columns.col_visible] = newValue;
+        /* FIXME: this explicit writing to SVG is wrong. The lpe_item should have a method to disable/enable an effect within its stack.
+         * So one can call:  lpe_item->setActive(lpeobjref->lpeobject); */
+        lpeobjref->lpeobject->lpe->getRepr()->setAttribute("is_visible", newValue ? "true" : "false");
+        sp_document_done( sp_desktop_document(current_desktop), SP_VERB_DIALOG_LIVE_PATH_EFFECT,
+                          newValue ? _("Activate path effect") : _("Deactivate path effect"));
+    }
+}
 
 } // namespace Dialog
 } // namespace UI