summaryrefslogtreecommitdiffstats
path: root/src/ui/toolbar/spiral-toolbar.cpp
diff options
context:
space:
mode:
authorAlexander Valavanis <valavanisalex@gmail.com>2019-01-19 13:58:46 +0000
committerAlexander Valavanis <valavanisalex@gmail.com>2019-01-19 13:58:46 +0000
commite77e650354daef5ced80adddf6d5a334bb6216d3 (patch)
treeac1237a3194056ac457b5a9a7468b0d61c3a7335 /src/ui/toolbar/spiral-toolbar.cpp
parentMerge branch 'master' of gitlab.com:inkscape/inkscape (diff)
downloadinkscape-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.cpp344
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: