diff options
| author | Alexander Valavanis <valavanisalex@gmail.com> | 2019-01-19 13:58:46 +0000 |
|---|---|---|
| committer | Alexander Valavanis <valavanisalex@gmail.com> | 2019-01-19 13:58:46 +0000 |
| commit | e77e650354daef5ced80adddf6d5a334bb6216d3 (patch) | |
| tree | ac1237a3194056ac457b5a9a7468b0d61c3a7335 /src/ui/toolbar/spiral-toolbar.cpp | |
| parent | Merge branch 'master' of gitlab.com:inkscape/inkscape (diff) | |
| download | inkscape-e77e650354daef5ced80adddf6d5a334bb6216d3.tar.gz inkscape-e77e650354daef5ced80adddf6d5a334bb6216d3.zip | |
derive all toolbars from Inkscape::Toolbar
Diffstat (limited to 'src/ui/toolbar/spiral-toolbar.cpp')
| -rw-r--r-- | src/ui/toolbar/spiral-toolbar.cpp | 344 |
1 files changed, 176 insertions, 168 deletions
diff --git a/src/ui/toolbar/spiral-toolbar.cpp b/src/ui/toolbar/spiral-toolbar.cpp index 289dbfee6..acdf82b3b 100644 --- a/src/ui/toolbar/spiral-toolbar.cpp +++ b/src/ui/toolbar/spiral-toolbar.cpp @@ -53,38 +53,151 @@ using Inkscape::DocumentUndo; using Inkscape::UI::ToolboxFactory; using Inkscape::UI::PrefPusher; -//######################## -//## Spiral ## -//######################## +static Inkscape::XML::NodeEventVector spiral_tb_repr_events = { + nullptr, /* child_added */ + nullptr, /* child_removed */ + Inkscape::UI::Toolbar::SpiralToolbar::event_attr_changed, + nullptr, /* content_changed */ + nullptr /* order_changed */ +}; + +namespace Inkscape { +namespace UI { +namespace Toolbar { +SpiralToolbar::~SpiralToolbar() +{ + if(_repr) { + _repr->removeListenerByData(this); + GC::release(_repr); + _repr = nullptr; + } + + if(_connection) { + _connection->disconnect(); + delete _connection; + } +} -static void sp_spl_tb_value_changed(GtkAdjustment *adj, GObject *tbl, Glib::ustring const &value_name) +GtkWidget * +SpiralToolbar::prep(SPDesktop *desktop, GtkActionGroup* mainActions) { - SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data( tbl, "desktop" )); + auto toolbar = new SpiralToolbar(desktop); + + EgeAdjustmentAction* eact = nullptr; + GtkIconSize secondarySize = ToolboxFactory::prefToSize("/toolbox/secondary", 1); + + { + toolbar->_mode_action = ege_output_action_new( "SpiralStateAction", _("<b>New:</b>"), "", nullptr ); + ege_output_action_set_use_markup( toolbar->_mode_action, TRUE ); + gtk_action_group_add_action( mainActions, GTK_ACTION( toolbar->_mode_action ) ); + } + + /* Revolution */ + { + gchar const* labels[] = {_("just a curve"), nullptr, _("one full revolution"), nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}; + gdouble values[] = {0.01, 0.5, 1, 2, 3, 5, 10, 20, 50, 100}; + eact = create_adjustment_action( "SpiralRevolutionAction", + _("Number of turns"), _("Turns:"), _("Number of revolutions"), + "/tools/shapes/spiral/revolution", 3.0, + GTK_WIDGET(desktop->canvas), + nullptr, // dataKludge + TRUE, "altx-spiral", + 0.01, 1024.0, 0.1, 1.0, + labels, values, G_N_ELEMENTS(labels), + nullptr, // callback + nullptr /*unit tracker*/, 1, 2); + toolbar->_revolution_adj = Glib::wrap(ege_adjustment_action_get_adjustment(eact)); + toolbar->_revolution_adj->signal_value_changed().connect(sigc::bind(sigc::mem_fun(*toolbar, &SpiralToolbar::value_changed), + toolbar->_revolution_adj, "revolution")); + gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); + } + + /* Expansion */ + { + gchar const* labels[] = {_("circle"), _("edge is much denser"), _("edge is denser"), _("even"), _("center is denser"), _("center is much denser"), nullptr}; + gdouble values[] = {0, 0.1, 0.5, 1, 1.5, 5, 20}; + eact = create_adjustment_action( "SpiralExpansionAction", + _("Divergence"), _("Divergence:"), _("How much denser/sparser are outer revolutions; 1 = uniform"), + "/tools/shapes/spiral/expansion", 1.0, + GTK_WIDGET(desktop->canvas), + nullptr, // dataKludge + FALSE, nullptr, + 0.0, 1000.0, 0.01, 1.0, + labels, values, G_N_ELEMENTS(labels), + nullptr // dataKludge + ); + toolbar->_expansion_adj = Glib::wrap(ege_adjustment_action_get_adjustment(eact)); + toolbar->_expansion_adj->signal_value_changed().connect(sigc::bind(sigc::mem_fun(*toolbar, &SpiralToolbar::value_changed), + toolbar->_expansion_adj, "expansion")); + gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); + } - if (DocumentUndo::getUndoSensitive(desktop->getDocument())) { + /* T0 */ + { + gchar const* labels[] = {_("starts from center"), _("starts mid-way"), _("starts near edge")}; + gdouble values[] = {0, 0.5, 0.9}; + eact = create_adjustment_action( "SpiralT0Action", + _("Inner radius"), _("Inner radius:"), _("Radius of the innermost revolution (relative to the spiral size)"), + "/tools/shapes/spiral/t0", 0.0, + GTK_WIDGET(desktop->canvas), + nullptr, // dataKludge + FALSE, nullptr, + 0.0, 0.999, 0.01, 1.0, + labels, values, G_N_ELEMENTS(labels), + nullptr // callback + ); + toolbar->_t0_adj = Glib::wrap(ege_adjustment_action_get_adjustment(eact)); + toolbar->_t0_adj->signal_value_changed().connect(sigc::bind(sigc::mem_fun(*toolbar, &SpiralToolbar::value_changed), + toolbar->_t0_adj, "t0")); + gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); + } + + /* Reset */ + { + InkAction* inky = ink_action_new( "SpiralResetAction", + _("Defaults"), + _("Reset shape parameters to defaults (use Inkscape Preferences > Tools to change defaults)"), + INKSCAPE_ICON("edit-clear"), + secondarySize ); + g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(&SpiralToolbar::defaults), toolbar ); + gtk_action_group_add_action( mainActions, GTK_ACTION(inky) ); + } + + + toolbar->_connection = new sigc::connection( + desktop->getSelection()->connectChanged(sigc::mem_fun(*toolbar, &SpiralToolbar::selection_changed))); + + return GTK_WIDGET(toolbar->gobj()); +} + +void +SpiralToolbar::value_changed(Glib::RefPtr<Gtk::Adjustment> &adj, + Glib::ustring const &value_name) +{ + if (DocumentUndo::getUndoSensitive(_desktop->getDocument())) { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); prefs->setDouble("/tools/shapes/spiral/" + value_name, - gtk_adjustment_get_value(adj)); + adj->get_value()); } // quit if run by the attr_changed listener - if (g_object_get_data( tbl, "freeze" )) { + if (_freeze) { return; } // in turn, prevent listener from responding - g_object_set_data( tbl, "freeze", GINT_TO_POINTER(TRUE) ); + _freeze = true; gchar* namespaced_name = g_strconcat("sodipodi:", value_name.data(), NULL); bool modmade = false; - auto itemlist= desktop->getSelection()->items(); + auto itemlist= _desktop->getSelection()->items(); for(auto i=itemlist.begin();i!=itemlist.end(); ++i){ SPItem *item = *i; if (SP_IS_SPIRAL(item)) { Inkscape::XML::Node *repr = item->getRepr(); sp_repr_set_svg_double( repr, namespaced_name, - gtk_adjustment_get_value(adj) ); + adj->get_value() ); item->updateRepr(); modmade = true; } @@ -93,112 +206,47 @@ static void sp_spl_tb_value_changed(GtkAdjustment *adj, GObject *tbl, Glib::ustr g_free(namespaced_name); if (modmade) { - DocumentUndo::done(desktop->getDocument(), SP_VERB_CONTEXT_SPIRAL, + DocumentUndo::done(_desktop->getDocument(), SP_VERB_CONTEXT_SPIRAL, _("Change spiral")); } - g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) ); + _freeze = false; } -static void sp_spl_tb_revolution_value_changed(GtkAdjustment *adj, GObject *tbl) +void +SpiralToolbar::defaults(GtkWidget * /*widget*/, GObject *obj) { - sp_spl_tb_value_changed(adj, tbl, "revolution"); -} - -static void sp_spl_tb_expansion_value_changed(GtkAdjustment *adj, GObject *tbl) -{ - sp_spl_tb_value_changed(adj, tbl, "expansion"); -} - -static void sp_spl_tb_t0_value_changed(GtkAdjustment *adj, GObject *tbl) -{ - sp_spl_tb_value_changed(adj, tbl, "t0"); -} - -static void sp_spl_tb_defaults(GtkWidget * /*widget*/, GObject *obj) -{ - GtkWidget *tbl = GTK_WIDGET(obj); - - GtkAdjustment *adj; + auto toolbar = reinterpret_cast<SpiralToolbar *>(obj); // fixme: make settable gdouble rev = 3; gdouble exp = 1.0; gdouble t0 = 0.0; - adj = GTK_ADJUSTMENT(g_object_get_data(obj, "revolution")); - gtk_adjustment_set_value(adj, rev); - -#if !GTK_CHECK_VERSION(3,18,0) - gtk_adjustment_value_changed(adj); -#endif - - adj = GTK_ADJUSTMENT(g_object_get_data(obj, "expansion")); - gtk_adjustment_set_value(adj, exp); - gtk_adjustment_value_changed(adj); - - adj = GTK_ADJUSTMENT(g_object_get_data(obj, "t0")); - gtk_adjustment_set_value(adj, t0); + toolbar->_revolution_adj->set_value(rev); + toolbar->_expansion_adj->set_value(exp); + toolbar->_t0_adj->set_value(t0); #if !GTK_CHECK_VERSION(3,18,0) - gtk_adjustment_value_changed(adj); + toolbar->_revolution_adj->value_changed(); + toolbar->_expansion_adj->value_changed(); + toolbar->_t0_adj->value_changed(); #endif - spinbutton_defocus(tbl); + if(toolbar->_desktop->canvas) gtk_widget_grab_focus(GTK_WIDGET(toolbar->_desktop->canvas)); } - -static void spiral_tb_event_attr_changed(Inkscape::XML::Node *repr, - gchar const * /*name*/, - gchar const * /*old_value*/, - gchar const * /*new_value*/, - bool /*is_interactive*/, - gpointer data) -{ - GtkWidget *tbl = GTK_WIDGET(data); - - // quit if run by the _changed callbacks - if (g_object_get_data(G_OBJECT(tbl), "freeze")) { - return; - } - - // in turn, prevent callbacks from responding - g_object_set_data(G_OBJECT(tbl), "freeze", GINT_TO_POINTER(TRUE)); - - GtkAdjustment *adj; - adj = GTK_ADJUSTMENT(g_object_get_data(G_OBJECT(tbl), "revolution")); - double revolution = 3.0; - sp_repr_get_double(repr, "sodipodi:revolution", &revolution); - gtk_adjustment_set_value(adj, revolution); - - adj = GTK_ADJUSTMENT(g_object_get_data(G_OBJECT(tbl), "expansion")); - double expansion = 1.0; - sp_repr_get_double(repr, "sodipodi:expansion", &expansion); - gtk_adjustment_set_value(adj, expansion); - - adj = GTK_ADJUSTMENT(g_object_get_data(G_OBJECT(tbl), "t0")); - double t0 = 0.0; - sp_repr_get_double(repr, "sodipodi:t0", &t0); - gtk_adjustment_set_value(adj, t0); - - g_object_set_data(G_OBJECT(tbl), "freeze", GINT_TO_POINTER(FALSE)); -} - - -static Inkscape::XML::NodeEventVector spiral_tb_repr_events = { - nullptr, /* child_added */ - nullptr, /* child_removed */ - spiral_tb_event_attr_changed, - nullptr, /* content_changed */ - nullptr /* order_changed */ -}; - -static void sp_spiral_toolbox_selection_changed(Inkscape::Selection *selection, GObject *tbl) +void +SpiralToolbar::selection_changed(Inkscape::Selection *selection) { int n_selected = 0; Inkscape::XML::Node *repr = nullptr; - purge_repr_listener( tbl, tbl ); + if ( _repr ) { + _repr->removeListenerByData(this); + GC::release(_repr); + _repr = nullptr; + } auto itemlist= selection->items(); for(auto i=itemlist.begin();i!=itemlist.end(); ++i){ @@ -209,100 +257,60 @@ static void sp_spiral_toolbox_selection_changed(Inkscape::Selection *selection, } } - EgeOutputAction* act = EGE_OUTPUT_ACTION( g_object_get_data( tbl, "mode_action" ) ); - if (n_selected == 0) { - g_object_set( G_OBJECT(act), "label", _("<b>New:</b>"), NULL ); + gtk_action_set_label(GTK_ACTION(_mode_action), _("<b>New:</b>")); } else if (n_selected == 1) { - g_object_set( G_OBJECT(act), "label", _("<b>Change:</b>"), NULL ); + gtk_action_set_label(GTK_ACTION(_mode_action), _("<b>Change:</b>")); if (repr) { - g_object_set_data( tbl, "repr", repr ); - Inkscape::GC::anchor(repr); - sp_repr_add_listener(repr, &spiral_tb_repr_events, tbl); - sp_repr_synthesize_events(repr, &spiral_tb_repr_events, tbl); + _repr = repr; + Inkscape::GC::anchor(_repr); + _repr->addListener(&spiral_tb_repr_events, this); + _repr->synthesizeEvents(&spiral_tb_repr_events, this); } } else { // FIXME: implement averaging of all parameters for multiple selected //gtk_label_set_markup(GTK_LABEL(l), _("<b>Average:</b>")); - g_object_set( G_OBJECT(act), "label", _("<b>Change:</b>"), NULL ); + gtk_action_set_label(GTK_ACTION(_mode_action), _("<b>Change:</b>")); } } - -void sp_spiral_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder) +void +SpiralToolbar::event_attr_changed(Inkscape::XML::Node *repr, + gchar const * /*name*/, + gchar const * /*old_value*/, + gchar const * /*new_value*/, + bool /*is_interactive*/, + gpointer data) { - EgeAdjustmentAction* eact = nullptr; - GtkIconSize secondarySize = ToolboxFactory::prefToSize("/toolbox/secondary", 1); - - { - EgeOutputAction* act = ege_output_action_new( "SpiralStateAction", _("<b>New:</b>"), "", nullptr ); - ege_output_action_set_use_markup( act, TRUE ); - gtk_action_group_add_action( mainActions, GTK_ACTION( act ) ); - g_object_set_data( holder, "mode_action", act ); - } + auto toolbar = reinterpret_cast<SpiralToolbar *>(data); - /* Revolution */ - { - gchar const* labels[] = {_("just a curve"), nullptr, _("one full revolution"), nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}; - gdouble values[] = {0.01, 0.5, 1, 2, 3, 5, 10, 20, 50, 100}; - eact = create_adjustment_action( "SpiralRevolutionAction", - _("Number of turns"), _("Turns:"), _("Number of revolutions"), - "/tools/shapes/spiral/revolution", 3.0, - GTK_WIDGET(desktop->canvas), holder, TRUE, "altx-spiral", - 0.01, 1024.0, 0.1, 1.0, - labels, values, G_N_ELEMENTS(labels), - sp_spl_tb_revolution_value_changed, nullptr /*unit tracker*/, 1, 2); - gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); + // quit if run by the _changed callbacks + if (toolbar->_freeze) { + return; } - /* Expansion */ - { - gchar const* labels[] = {_("circle"), _("edge is much denser"), _("edge is denser"), _("even"), _("center is denser"), _("center is much denser"), nullptr}; - gdouble values[] = {0, 0.1, 0.5, 1, 1.5, 5, 20}; - eact = create_adjustment_action( "SpiralExpansionAction", - _("Divergence"), _("Divergence:"), _("How much denser/sparser are outer revolutions; 1 = uniform"), - "/tools/shapes/spiral/expansion", 1.0, - GTK_WIDGET(desktop->canvas), holder, FALSE, nullptr, - 0.0, 1000.0, 0.01, 1.0, - labels, values, G_N_ELEMENTS(labels), - sp_spl_tb_expansion_value_changed); - gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); - } + // in turn, prevent callbacks from responding + toolbar->_freeze = true; - /* T0 */ - { - gchar const* labels[] = {_("starts from center"), _("starts mid-way"), _("starts near edge")}; - gdouble values[] = {0, 0.5, 0.9}; - eact = create_adjustment_action( "SpiralT0Action", - _("Inner radius"), _("Inner radius:"), _("Radius of the innermost revolution (relative to the spiral size)"), - "/tools/shapes/spiral/t0", 0.0, - GTK_WIDGET(desktop->canvas), holder, FALSE, nullptr, - 0.0, 0.999, 0.01, 1.0, - labels, values, G_N_ELEMENTS(labels), - sp_spl_tb_t0_value_changed); - gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); - } + double revolution = 3.0; + sp_repr_get_double(repr, "sodipodi:revolution", &revolution); + toolbar->_revolution_adj->set_value(revolution); - /* Reset */ - { - InkAction* inky = ink_action_new( "SpiralResetAction", - _("Defaults"), - _("Reset shape parameters to defaults (use Inkscape Preferences > Tools to change defaults)"), - INKSCAPE_ICON("edit-clear"), - secondarySize ); - g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_spl_tb_defaults), holder ); - gtk_action_group_add_action( mainActions, GTK_ACTION(inky) ); - } + double expansion = 1.0; + sp_repr_get_double(repr, "sodipodi:expansion", &expansion); + toolbar->_expansion_adj->set_value(expansion); + double t0 = 0.0; + sp_repr_get_double(repr, "sodipodi:t0", &t0); + toolbar->_t0_adj->set_value(t0); - sigc::connection *connection = new sigc::connection( - desktop->getSelection()->connectChanged(sigc::bind(sigc::ptr_fun(sp_spiral_toolbox_selection_changed), holder)) - ); - g_signal_connect( holder, "destroy", G_CALLBACK(delete_connection), connection ); - g_signal_connect( holder, "destroy", G_CALLBACK(purge_repr_listener), holder ); + toolbar->_freeze = false; } +} +} +} /* Local Variables: |
