summaryrefslogtreecommitdiffstats
path: root/src/widgets
diff options
context:
space:
mode:
authorTavmjong Bah <tavmjong@free.fr>2015-02-02 10:49:18 +0000
committertavmjong-free <tavmjong@free.fr>2015-02-02 10:49:18 +0000
commit9a037bc21c8b98650bf5be4c4e8feaac0a067e2d (patch)
tree1a223ebdfedd2ee5ff950decc451d9e52ba1ef71 /src/widgets
parentEnable experimental features for wider testing: meshes, LPE tool, additional ... (diff)
downloadinkscape-9a037bc21c8b98650bf5be4c4e8feaac0a067e2d.tar.gz
inkscape-9a037bc21c8b98650bf5be4c4e8feaac0a067e2d.zip
Experimental mesh smoothing code.
(bzr r13890)
Diffstat (limited to 'src/widgets')
-rw-r--r--src/widgets/mesh-toolbar.cpp224
-rw-r--r--src/widgets/toolbox.cpp2
2 files changed, 207 insertions, 19 deletions
diff --git a/src/widgets/mesh-toolbar.cpp b/src/widgets/mesh-toolbar.cpp
index e9e9fa344..674d0f350 100644
--- a/src/widgets/mesh-toolbar.cpp
+++ b/src/widgets/mesh-toolbar.cpp
@@ -74,34 +74,119 @@ static bool blocked = false;
//########################
/*
+ * Get the current selection and dragger status from the desktop
+ */
+void ms_read_selection( Inkscape::Selection *selection,
+ SPMeshGradient *&ms_selected,
+ bool &ms_selected_multi,
+ SPMeshSmooth &ms_smooth,
+ bool &ms_smooth_multi )
+{
+
+ // Read desktop selection
+ bool first = true;
+ ms_smooth = SP_MESH_SMOOTH_NONE;
+
+ for (GSList const* i = selection->itemList(); i; i = i->next) {
+ SPItem *item = SP_ITEM(i->data);
+ SPStyle *style = item->style;
+
+ if (style && (style->fill.isPaintserver())) {
+ SPPaintServer *server = item->style->getFillPaintServer();
+ if ( SP_IS_MESHGRADIENT(server) ) {
+
+ SPMeshGradient *gradient = SP_MESHGRADIENT(server); // ->getVector();
+ SPMeshSmooth smooth = gradient->smooth;
+ bool smooth_set = gradient->smooth_set;
+
+ if (gradient != ms_selected) {
+ if (ms_selected) {
+ ms_selected_multi = true;
+ } else {
+ ms_selected = gradient;
+ }
+ }
+ if( smooth != ms_smooth ) {
+ if (ms_smooth != SP_MESH_SMOOTH_NONE && !first) {
+ ms_smooth_multi = true;
+ } else {
+ ms_smooth = smooth;
+ }
+ }
+ first = false;
+ }
+ }
+
+ if (style && (style->stroke.isPaintserver())) {
+ SPPaintServer *server = item->style->getStrokePaintServer();
+ if ( SP_IS_MESHGRADIENT(server) ) {
+
+ SPMeshGradient *gradient = SP_MESHGRADIENT(server); // ->getVector();
+ SPMeshSmooth smooth = gradient->smooth;
+ bool smooth_set = gradient->smooth_set;
+
+ if (gradient != ms_selected) {
+ if (ms_selected) {
+ ms_selected_multi = true;
+ } else {
+ ms_selected = gradient;
+ }
+ }
+ if( smooth != ms_smooth ) {
+ if (ms_smooth != SP_MESH_SMOOTH_NONE && !first) {
+ ms_smooth_multi = true;
+ } else {
+ ms_smooth = smooth;
+ }
+ }
+ first = false;
+ }
+ }
+ }
+ }
+
+/*
* Core function, setup all the widgets whenever something changes on the desktop
*/
-static void ms_tb_selection_changed(Inkscape::Selection * /*selection*/, gpointer /*data*/)
+static void ms_tb_selection_changed(Inkscape::Selection * /*selection*/, gpointer data)
{
- // DOES NOTHING AT MOMENT
// std::cout << "ms_tb_selection_changed" << std::endl;
- // if (blocked)
- // return;
-
- // GtkWidget *widget = GTK_WIDGET(data);
+ if (blocked)
+ return;
- // SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data(G_OBJECT(widget), "desktop"));
- // if (!desktop) {
- // return;
- // }
+ GtkWidget *widget = GTK_WIDGET(data);
- // Inkscape::Selection *selection = desktop->getSelection(); // take from desktop, not from args
- // if (selection) {
- // ToolBase *ev = sp_desktop_event_context(desktop);
- // GrDrag *drag = NULL;
- // if (ev) {
- // drag = ev->get_drag();
- // // Hide/show handles?
- // }
+ SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data(G_OBJECT(widget), "desktop"));
+ if (!desktop) {
+ return;
+ }
- // }
+ Inkscape::Selection *selection = desktop->getSelection(); // take from desktop, not from args
+ if (selection) {
+ // ToolBase *ev = sp_desktop_event_context(desktop);
+ // GrDrag *drag = NULL;
+ // if (ev) {
+ // drag = ev->get_drag();
+ // // Hide/show handles?
+ // }
+
+ SPMeshGradient *ms_selected = 0;
+ SPMeshSmooth ms_smooth = SP_MESH_SMOOTH_NONE;
+ bool ms_selected_multi = false;
+ bool ms_smooth_multi = false;
+ ms_read_selection( selection, ms_selected, ms_selected_multi, ms_smooth, ms_smooth_multi );
+ // std::cout << " smooth: " << ms_smooth << std::endl;
+
+ EgeSelectOneAction* smooth = (EgeSelectOneAction *) g_object_get_data(G_OBJECT(widget), "mesh_select_smooth_action");
+ gtk_action_set_sensitive( GTK_ACTION(smooth), (ms_selected && !ms_selected_multi) );
+ if (ms_selected) {
+ blocked = TRUE;
+ ege_select_one_action_set_active( smooth, ms_smooth );
+ blocked = FALSE;
+ }
+ }
}
@@ -126,6 +211,33 @@ 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;
+
+ for (GSList const* i = selection->itemList(); i; i = i->next) {
+ SPItem *item = SP_ITEM(i->data); // 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
*/
@@ -178,6 +290,30 @@ static void ms_col_changed(GtkAdjustment *adj, GObject * /*tbl*/ )
blocked = FALSE;
}
+static void ms_smooth_changed(EgeSelectOneAction *act, GtkWidget *widget)
+{
+ // std::cout << "ms_smooth_changed" << std::endl;
+ if (blocked) {
+ return;
+ }
+
+ SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data(G_OBJECT(widget), "desktop"));
+ Inkscape::Selection *selection = desktop->getSelection();
+ SPMeshGradient *gradient = 0;
+ ms_get_dt_selected_gradient(selection, gradient);
+
+ if (gradient) {
+ SPMeshSmooth smooth = (SPMeshSmooth) ege_select_one_action_get_active(act);
+ // std::cout << " smooth: " << smooth << std::endl;
+ gradient->smooth = smooth;
+ gradient->smooth_set = true;
+ gradient->updateRepr();
+
+ DocumentUndo::done(desktop->getDocument(), SP_VERB_CONTEXT_GRADIENT,
+ _("Set mesh smoothing"));
+ }
+}
+
static void mesh_toolbox_watch_ec(SPDesktop* dt, Inkscape::UI::Tools::ToolBase* ec, GObject* holder);
/**
@@ -322,6 +458,56 @@ void sp_mesh_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, GObj
g_object_set_data(holder, "desktop", desktop);
desktop->connectEventContextChanged(sigc::bind(sigc::ptr_fun(mesh_toolbox_watch_ec), holder));
+
+ /* Warning */
+ {
+ GtkAction* act = gtk_action_new( "MeshWarningAction",
+ _("WARNING: Mesh SVG Syntax Subject to Change, Smoothing Experimental"), NULL, NULL );
+ gtk_action_group_add_action( mainActions, GTK_ACTION(act) );
+ }
+
+ /* Smoothing method */
+ {
+ GtkListStore* model = gtk_list_store_new( 2, G_TYPE_STRING, G_TYPE_INT );
+
+ GtkTreeIter iter;
+ gtk_list_store_append( model, &iter );
+ gtk_list_store_set( model, &iter, 0, C_("Smoothing", "None"), 1, SP_MESH_SMOOTH_NONE, -1 );
+
+ gtk_list_store_append( model, &iter );
+ gtk_list_store_set( model, &iter, 0, _("Default"), 1, SP_MESH_SMOOTH_SMOOTH, -1 );
+
+ gtk_list_store_append( model, &iter );
+ gtk_list_store_set( model, &iter, 0, _("Smooth1"), 1, SP_MESH_SMOOTH_SMOOTH1, -1 );
+
+ gtk_list_store_append( model, &iter );
+ gtk_list_store_set( model, &iter, 0, _("Smooth2"), 1, SP_MESH_SMOOTH_SMOOTH2, -1 );
+
+ gtk_list_store_append( model, &iter );
+ gtk_list_store_set( model, &iter, 0, _("Smooth3"), 1, SP_MESH_SMOOTH_SMOOTH3, -1 );
+
+ gtk_list_store_append( model, &iter );
+ gtk_list_store_set( model, &iter, 0, _("Smooth4"), 1, SP_MESH_SMOOTH_SMOOTH4, -1 );
+
+ gtk_list_store_append( model, &iter );
+ gtk_list_store_set( model, &iter, 0, _("Smooth5"), 1, SP_MESH_SMOOTH_SMOOTH5, -1 );
+
+ gtk_list_store_append( model, &iter );
+ gtk_list_store_set( model, &iter, 0, _("Smooth6"), 1, SP_MESH_SMOOTH_SMOOTH6, -1 );
+
+ gtk_list_store_append( model, &iter );
+ gtk_list_store_set( model, &iter, 0, _("Smooth7"), 1, SP_MESH_SMOOTH_SMOOTH7, -1 );
+
+ EgeSelectOneAction* act = ege_select_one_action_new( "MeshSmoothAction", _("None"),
+ _("If the mesh should be smoothed across patch boundaries."),
+ NULL, GTK_TREE_MODEL(model) );
+ g_object_set( act, "short_label", _("Smoothing:"), NULL );
+ ege_select_one_action_set_appearance( act, "compact" );
+ gtk_action_set_sensitive( GTK_ACTION(act), FALSE );
+ g_signal_connect( G_OBJECT(act), "changed", G_CALLBACK(ms_smooth_changed), holder );
+ gtk_action_group_add_action( mainActions, GTK_ACTION(act) );
+ g_object_set_data( holder, "mesh_select_smooth_action", act );
+ }
}
static void mesh_toolbox_watch_ec(SPDesktop* desktop, Inkscape::UI::Tools::ToolBase* ec, GObject* holder)
diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp
index 4f5682f7a..5d52db6f2 100644
--- a/src/widgets/toolbox.cpp
+++ b/src/widgets/toolbox.cpp
@@ -521,6 +521,8 @@ static gchar const * ui_descr =
// " <toolitem action='MeshEditFillAction' />"
// " <toolitem action='MeshEditStrokeAction' />"
// " <toolitem action='MeshShowHandlesAction' />"
+ " <toolitem action='MeshWarningAction' />"
+ " <toolitem action='MeshSmoothAction' />"
" <separator />"
" </toolbar>"