summaryrefslogtreecommitdiffstats
path: root/src/widgets/mesh-toolbar.cpp
diff options
context:
space:
mode:
authorJabiertxof <jtx@jtx>2016-12-16 22:49:53 +0000
committerJabiertxof <jtx@jtx>2016-12-16 22:49:53 +0000
commit5927b3bf5d9d8dcc9f519b4b9060669bd2599a28 (patch)
tree3b51f70f9b467bb016c678afcaae650e3afd395b /src/widgets/mesh-toolbar.cpp
parentworking with mirrors (diff)
downloadinkscape-5927b3bf5d9d8dcc9f519b4b9060669bd2599a28.tar.gz
inkscape-5927b3bf5d9d8dcc9f519b4b9060669bd2599a28.zip
Rollback 15315
(bzr r15295.1.25)
Diffstat (limited to 'src/widgets/mesh-toolbar.cpp')
-rw-r--r--src/widgets/mesh-toolbar.cpp165
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 */