diff options
Diffstat (limited to 'src/widgets/mesh-toolbar.cpp')
| -rw-r--r-- | src/widgets/mesh-toolbar.cpp | 165 |
1 files changed, 95 insertions, 70 deletions
diff --git a/src/widgets/mesh-toolbar.cpp b/src/widgets/mesh-toolbar.cpp index ea0faf1df..f7b7a6ec9 100644 --- a/src/widgets/mesh-toolbar.cpp +++ b/src/widgets/mesh-toolbar.cpp @@ -67,79 +67,76 @@ static bool blocked = false; //## Mesh ## //######################## - -// Get a list of selected meshes taking into account fill/stroke toggles -std::vector<SPMeshGradient *> ms_get_dt_selected_gradients(Inkscape::Selection *selection) +/* + * Get the current selection and dragger status from the desktop + */ +void ms_read_selection( Inkscape::Selection *selection, + SPMeshGradient *&ms_selected, + bool &ms_selected_multi, + SPMeshType &ms_type, + bool &ms_type_multi ) { - std::vector<SPMeshGradient *> ms_selected; - - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - bool edit_fill = prefs->getBool("/tools/mesh/edit_fill", true); - bool edit_stroke = prefs->getBool("/tools/mesh/edit_stroke", true); + // Read desktop selection + bool first = true; + ms_type = SP_MESH_TYPE_COONS; + auto itemlist= selection->items(); for(auto i=itemlist.begin();i!=itemlist.end();++i){ - SPItem *item = *i;// get the items gradient, not the getVector() version + SPItem *item = *i; SPStyle *style = item->style; - if (style) { + if (style && (style->fill.isPaintserver())) { + SPPaintServer *server = item->style->getFillPaintServer(); + if ( SP_IS_MESHGRADIENT(server) ) { - - if (edit_fill && style->fill.isPaintserver()) { - SPPaintServer *server = item->style->getFillPaintServer(); - SPMeshGradient *mesh = dynamic_cast<SPMeshGradient *>(server); - if (mesh) { - ms_selected.push_back(mesh); - } - } + SPMeshGradient *gradient = SP_MESHGRADIENT(server); // ->getVector(); + SPMeshType type = gradient->type; - if (edit_stroke && style->stroke.isPaintserver()) { - SPPaintServer *server = item->style->getStrokePaintServer(); - SPMeshGradient *mesh = dynamic_cast<SPMeshGradient *>(server); - if (mesh) { - ms_selected.push_back(mesh); + if (gradient != ms_selected) { + if (ms_selected) { + ms_selected_multi = true; + } else { + ms_selected = gradient; + } } + if( type != ms_type ) { + if (ms_type != SP_MESH_TYPE_COONS && !first) { + ms_type_multi = true; + } else { + ms_type = type; + } + } + first = false; } } - } - return ms_selected; -} + if (style && (style->stroke.isPaintserver())) { + SPPaintServer *server = item->style->getStrokePaintServer(); + if ( SP_IS_MESHGRADIENT(server) ) { + SPMeshGradient *gradient = SP_MESHGRADIENT(server); // ->getVector(); + SPMeshType type = gradient->type; -/* - * Get the current selection status from the desktop - */ -void ms_read_selection( Inkscape::Selection *selection, - SPMeshGradient *&ms_selected, - bool &ms_selected_multi, - SPMeshType &ms_type, - bool &ms_type_multi ) -{ - ms_selected = NULL; - ms_selected_multi = false; - ms_type = SP_MESH_TYPE_COONS; - ms_type_multi = false; - - bool first = true; - - // Read desktop selection, taking into account fill/stroke toggles - std::vector<SPMeshGradient *> meshes = ms_get_dt_selected_gradients( selection ); - for (auto i = meshes.begin(); i != meshes.end(); ++i) { - if (first) { - ms_selected = (*i); - ms_type = (*i)->type; - first = false; - } else { - if (ms_selected != (*i)) { - ms_selected_multi = true; - } - if (ms_type != (*i)->type) { - ms_type_multi = true; + if (gradient != ms_selected) { + if (ms_selected) { + ms_selected_multi = true; + } else { + ms_selected = gradient; + } + } + if( type != ms_type ) { + if (ms_type != SP_MESH_TYPE_COONS && !first) { + ms_type_multi = true; + } else { + ms_type = type; + } + } + first = false; } } } -} + } /* * Core function, setup all the widgets whenever something changes on the desktop @@ -176,7 +173,7 @@ static void ms_tb_selection_changed(Inkscape::Selection * /*selection*/, gpointe // std::cout << " type: " << ms_type << std::endl; EgeSelectOneAction* type = (EgeSelectOneAction *) g_object_get_data(G_OBJECT(widget), "mesh_select_type_action"); - gtk_action_set_sensitive( GTK_ACTION(type), (ms_selected && !ms_type_multi) ); + gtk_action_set_sensitive( GTK_ACTION(type), (ms_selected && !ms_selected_multi) ); if (ms_selected) { blocked = TRUE; ege_select_one_action_set_active( type, ms_type ); @@ -207,6 +204,34 @@ static void ms_defs_modified(SPObject * /*defs*/, guint /*flags*/, GObject *widg ms_tb_selection_changed(NULL, widget); } +void ms_get_dt_selected_gradient(Inkscape::Selection *selection, SPMeshGradient *&ms_selected) +{ + SPMeshGradient *gradient = 0; + + auto itemlist= selection->items(); + for(auto i=itemlist.begin();i!=itemlist.end();++i){ + SPItem *item = *i;// get the items gradient, not the getVector() version + SPStyle *style = item->style; + SPPaintServer *server = 0; + + if (style && (style->fill.isPaintserver())) { + server = item->style->getFillPaintServer(); + } + if (style && (style->stroke.isPaintserver())) { + server = item->style->getStrokePaintServer(); + } + + if ( SP_IS_MESHGRADIENT(server) ) { + gradient = SP_MESHGRADIENT(server); + } + } + + if (gradient) { + ms_selected = gradient; + } +} + + /* * Callback functions for user actions */ @@ -271,17 +296,18 @@ static void ms_type_changed(EgeSelectOneAction *act, GtkWidget *widget) SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data(G_OBJECT(widget), "desktop")); Inkscape::Selection *selection = desktop->getSelection(); - std::vector<SPMeshGradient *> meshes = ms_get_dt_selected_gradients(selection); + SPMeshGradient *gradient = 0; + ms_get_dt_selected_gradient(selection, gradient); - SPMeshType type = (SPMeshType) ege_select_one_action_get_active(act); - for (auto i = meshes.begin(); i != meshes.end(); ++i) { + if (gradient) { + SPMeshType type = (SPMeshType) ege_select_one_action_get_active(act); // std::cout << " type: " << type << std::endl; - (*i)->type = type; - (*i)->type_set = true; - (*i)->updateRepr(); - } - if (!meshes.empty() ) { - DocumentUndo::done(desktop->getDocument(), SP_VERB_CONTEXT_MESH,_("Set mesh type")); + gradient->type = type; + gradient->type_set = true; + gradient->updateRepr(); + + DocumentUndo::done(desktop->getDocument(), SP_VERB_CONTEXT_MESH, + _("Set mesh type")); } } @@ -340,7 +366,7 @@ static void ms_toggle_handles(void) } } -static void ms_toggle_fill_stroke(InkToggleAction * /*act*/, gpointer data) +static void ms_toggle_fill_stroke(void) { MeshTool *mt = get_mesh_tool(); if (mt) { @@ -348,7 +374,6 @@ static void ms_toggle_fill_stroke(InkToggleAction * /*act*/, gpointer data) drag->updateDraggers(); drag->updateLines(); drag->updateLevels(); - ms_tb_selection_changed(NULL, data); // Need to update Type widget } } @@ -482,7 +507,7 @@ void sp_mesh_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, GObj gtk_action_group_add_action( mainActions, GTK_ACTION( act ) ); PrefPusher *pusher = new PrefPusher(GTK_TOGGLE_ACTION(act), "/tools/mesh/edit_fill"); g_signal_connect( holder, "destroy", G_CALLBACK(delete_prefspusher), pusher); - g_signal_connect_after( G_OBJECT(act), "activate", G_CALLBACK(ms_toggle_fill_stroke), holder); + g_signal_connect_after( G_OBJECT(act), "activate", G_CALLBACK(ms_toggle_fill_stroke), 0); } /* Edit stroke mesh */ @@ -495,7 +520,7 @@ void sp_mesh_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, GObj gtk_action_group_add_action( mainActions, GTK_ACTION( act ) ); PrefPusher *pusher = new PrefPusher(GTK_TOGGLE_ACTION(act), "/tools/mesh/edit_stroke"); g_signal_connect( holder, "destroy", G_CALLBACK(delete_prefspusher), pusher); - g_signal_connect_after( G_OBJECT(act), "activate", G_CALLBACK(ms_toggle_fill_stroke), holder); + g_signal_connect_after( G_OBJECT(act), "activate", G_CALLBACK(ms_toggle_fill_stroke), 0); } /* Show/hide side and tensor handles */ |
