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/star-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/star-toolbar.cpp')
| -rw-r--r-- | src/ui/toolbar/star-toolbar.cpp | 719 |
1 files changed, 356 insertions, 363 deletions
diff --git a/src/ui/toolbar/star-toolbar.cpp b/src/ui/toolbar/star-toolbar.cpp index 2fa354f42..5aa88f1e0 100644 --- a/src/ui/toolbar/star-toolbar.cpp +++ b/src/ui/toolbar/star-toolbar.cpp @@ -58,324 +58,466 @@ using Inkscape::UI::PrefPusher; //## Star ## //######################## -static void sp_star_magnitude_value_changed( GtkAdjustment *adj, GObject *dataKludge ) +static Inkscape::XML::NodeEventVector star_tb_repr_events = { - SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data( dataKludge, "desktop" )); + nullptr, /* child_added */ + nullptr, /* child_removed */ + Inkscape::UI::Toolbar::StarToolbar::event_attr_changed, + nullptr, /* content_changed */ + nullptr /* order_changed */ +}; - if (DocumentUndo::getUndoSensitive(desktop->getDocument())) { - // do not remember prefs if this call is initiated by an undo change, because undoing object - // creation sets bogus values to its attributes before it is deleted +namespace Inkscape { +namespace UI { +namespace Toolbar { +StarToolbar::~StarToolbar() +{ + if (_repr) { // remove old listener + _repr->removeListenerByData(this); + Inkscape::GC::release(_repr); + _repr = nullptr; + } +} + +GtkWidget * +StarToolbar::prep(SPDesktop *desktop, GtkActionGroup* mainActions) +{ + auto holder = new StarToolbar(desktop); + + GtkIconSize secondarySize = ToolboxFactory::prefToSize("/toolbox/secondary", 1); + + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + bool isFlatSided = prefs->getBool("/tools/shapes/star/isflatsided", true); + + EgeAdjustmentAction* eact = nullptr; + + { + holder->_mode_action = ege_output_action_new( "StarStateAction", _("<b>New:</b>"), "", nullptr ); + ege_output_action_set_use_markup( holder->_mode_action, TRUE ); + gtk_action_group_add_action( mainActions, GTK_ACTION( holder->_mode_action ) ); + } + + /* Flatsided checkbox */ + { + InkSelectOneActionColumns columns; + + Glib::RefPtr<Gtk::ListStore> store = Gtk::ListStore::create(columns); + + Gtk::TreeModel::Row row; + + row = *(store->append()); + row[columns.col_label ] = _("Polygon"); + row[columns.col_tooltip ] = _("Regular polygon (with one handle) instead of a star"); + row[columns.col_icon ] = INKSCAPE_ICON("draw-polygon"); + row[columns.col_sensitive] = true; + + row = *(store->append()); + row[columns.col_label ] = _("Star"); + row[columns.col_tooltip ] = _("Star instead of a regular polygon (with one handle)"); + row[columns.col_icon ] = INKSCAPE_ICON("draw-star"); + row[columns.col_sensitive] = true; + + holder->_flat_action = + InkSelectOneAction::create( "FlatAction", // Name + (""), // Label + (""), // Tooltip + "Not Used", // Icon + store ); // Tree store + holder->_flat_action->use_radio( true ); + holder->_flat_action->use_label( false ); + holder->_flat_action->set_active( isFlatSided ? 0 : 1 ); + + gtk_action_group_add_action( mainActions, GTK_ACTION( holder->_flat_action->gobj() )); + + holder->_flat_action->signal_changed().connect(sigc::mem_fun(*holder, &StarToolbar::side_mode_changed)); + } + + /* Magnitude */ + { + gchar const* labels[] = {_("triangle/tri-star"), _("square/quad-star"), _("pentagon/five-pointed star"), _("hexagon/six-pointed star"), nullptr, nullptr, nullptr, nullptr, nullptr}; + gdouble values[] = {3, 4, 5, 6, 7, 8, 10, 12, 20}; + eact = create_adjustment_action( "MagnitudeAction", + _("Corners"), _("Corners:"), _("Number of corners of a polygon or star"), + "/tools/shapes/star/magnitude", 3, + GTK_WIDGET(desktop->canvas), + nullptr, // dataKludge + FALSE, nullptr, + 3, 1024, 1, 5, + labels, values, G_N_ELEMENTS(labels), + nullptr, // callback + nullptr /*unit tracker*/, + 1.0, 0 ); + + holder->_magnitude_adj = Glib::wrap(ege_adjustment_action_get_adjustment(eact)); + holder->_magnitude_adj->signal_value_changed().connect(sigc::mem_fun(*holder, &StarToolbar::magnitude_value_changed)); + gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); + gtk_action_set_sensitive( GTK_ACTION(eact), TRUE ); + } + + /* Spoke ratio */ + { + gchar const* labels[] = {_("thin-ray star"), nullptr, _("pentagram"), _("hexagram"), _("heptagram"), _("octagram"), _("regular polygon")}; + gdouble values[] = {0.01, 0.2, 0.382, 0.577, 0.692, 0.765, 1}; + holder->_prop_action = create_adjustment_action( "SpokeAction", + _("Spoke ratio"), _("Spoke ratio:"), + // TRANSLATORS: Tip radius of a star is the distance from the center to the farthest handle. + // Base radius is the same for the closest handle. + _("Base radius to tip radius ratio"), + "/tools/shapes/star/proportion", 0.5, + GTK_WIDGET(desktop->canvas), + nullptr, // dataKludge + FALSE, nullptr, + 0.01, 1.0, 0.01, 0.1, + labels, values, G_N_ELEMENTS(labels), + nullptr // callback + ); + holder->_spoke_adj = Glib::wrap(ege_adjustment_action_get_adjustment(holder->_prop_action)); + holder->_spoke_adj->signal_value_changed().connect(sigc::mem_fun(*holder, &StarToolbar::proportion_value_changed)); + gtk_action_group_add_action( mainActions, GTK_ACTION(holder->_prop_action) ); + + if ( !isFlatSided ) { + gtk_action_set_visible( GTK_ACTION(holder->_prop_action), TRUE ); + } else { + gtk_action_set_visible( GTK_ACTION(holder->_prop_action), FALSE ); + } + } + + /* Roundedness */ + { + gchar const* labels[] = {_("stretched"), _("twisted"), _("slightly pinched"), _("NOT rounded"), _("slightly rounded"), + _("visibly rounded"), _("well rounded"), _("amply rounded"), nullptr, _("stretched"), _("blown up")}; + gdouble values[] = {-1, -0.2, -0.03, 0, 0.05, 0.1, 0.2, 0.3, 0.5, 1, 10}; + eact = create_adjustment_action( "RoundednessAction", + _("Rounded"), _("Rounded:"), _("How much rounded are the corners (0 for sharp)"), + "/tools/shapes/star/rounded", 0.0, + GTK_WIDGET(desktop->canvas), + nullptr, // dataKludge + FALSE, nullptr, + -10.0, 10.0, 0.01, 0.1, + labels, values, G_N_ELEMENTS(labels), + nullptr // callback + ); + holder->_roundedness_adj = Glib::wrap(ege_adjustment_action_get_adjustment(eact)); + holder->_roundedness_adj->signal_value_changed().connect(sigc::mem_fun(*holder, &StarToolbar::rounded_value_changed)); + gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); + gtk_action_set_sensitive( GTK_ACTION(eact), TRUE ); + } + + /* Randomization */ + { + gchar const* labels[] = {_("NOT randomized"), _("slightly irregular"), _("visibly randomized"), _("strongly randomized"), _("blown up")}; + gdouble values[] = {0, 0.01, 0.1, 0.5, 10}; + eact = create_adjustment_action( "RandomizationAction", + _("Randomized"), _("Randomized:"), _("Scatter randomly the corners and angles"), + "/tools/shapes/star/randomized", 0.0, + GTK_WIDGET(desktop->canvas), + nullptr, // dataKludge + FALSE, nullptr, + -10.0, 10.0, 0.001, 0.01, + labels, values, G_N_ELEMENTS(labels), + nullptr, // callback + nullptr /*unit tracker*/, 0.1, 3 ); + holder->_randomization_adj = Glib::wrap(ege_adjustment_action_get_adjustment(eact)); + holder->_randomization_adj->signal_value_changed().connect(sigc::mem_fun(*holder, &StarToolbar::randomized_value_changed)); + gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); + gtk_action_set_sensitive( GTK_ACTION(eact), TRUE ); + } + + /* Reset */ + { + InkAction* inky = ink_action_new( "StarResetAction", + _("Defaults"), + _("Reset shape parameters to defaults (use Inkscape Preferences > Tools to change defaults)"), + INKSCAPE_ICON("edit-clear"), + GTK_ICON_SIZE_SMALL_TOOLBAR); + g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(StarToolbar::defaults), holder); + gtk_action_group_add_action( mainActions, GTK_ACTION(inky) ); + gtk_action_set_sensitive( GTK_ACTION(inky), TRUE ); + } + + desktop->connectEventContextChanged(sigc::mem_fun(*holder, &StarToolbar::watch_ec)); + + return GTK_WIDGET(holder->gobj()); +} + +void +StarToolbar::side_mode_changed(int mode) +{ + bool flat = (mode == 0); + + if (DocumentUndo::getUndoSensitive(_desktop->getDocument())) { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setInt("/tools/shapes/star/magnitude", - (gint)gtk_adjustment_get_value(adj)); + prefs->setBool( "/tools/shapes/star/isflatsided", flat ); } // quit if run by the attr_changed listener - if (g_object_get_data( dataKludge, "freeze" )) { + if (_freeze) { return; } // in turn, prevent listener from responding - g_object_set_data( dataKludge, "freeze", GINT_TO_POINTER(TRUE) ); + _freeze = true; + Inkscape::Selection *selection = _desktop->getSelection(); bool modmade = false; - Inkscape::Selection *selection = desktop->getSelection(); + if ( _prop_action ) { + gtk_action_set_visible( GTK_ACTION(_prop_action), !flat ); + } + auto itemlist= selection->items(); for(auto i=itemlist.begin();i!=itemlist.end();++i){ SPItem *item = *i; if (SP_IS_STAR(item)) { Inkscape::XML::Node *repr = item->getRepr(); - sp_repr_set_int(repr,"sodipodi:sides", - (gint)gtk_adjustment_get_value(adj)); - double arg1 = 0.5; - sp_repr_get_double(repr, "sodipodi:arg1", &arg1); - sp_repr_set_svg_double(repr, "sodipodi:arg2", - (arg1 + M_PI / (gint)gtk_adjustment_get_value(adj))); + repr->setAttribute("inkscape:flatsided", flat ? "true" : "false" ); item->updateRepr(); modmade = true; } } + if (modmade) { - DocumentUndo::done(desktop->getDocument(), SP_VERB_CONTEXT_STAR, - _("Star: Change number of corners")); + DocumentUndo::done(_desktop->getDocument(), SP_VERB_CONTEXT_STAR, + flat ? _("Make polygon") : _("Make star")); } - g_object_set_data( dataKludge, "freeze", GINT_TO_POINTER(FALSE) ); + _freeze = false; } -static void sp_star_proportion_value_changed( GtkAdjustment *adj, GObject *dataKludge ) +void +StarToolbar::magnitude_value_changed() { - SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data( dataKludge, "desktop" )); - - if (DocumentUndo::getUndoSensitive(desktop->getDocument())) { - if (!IS_NAN(gtk_adjustment_get_value(adj))) { - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setDouble("/tools/shapes/star/proportion", - gtk_adjustment_get_value(adj)); - } + if (DocumentUndo::getUndoSensitive(_desktop->getDocument())) { + // do not remember prefs if this call is initiated by an undo change, because undoing object + // creation sets bogus values to its attributes before it is deleted + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setInt("/tools/shapes/star/magnitude", + (gint)_magnitude_adj->get_value()); } // quit if run by the attr_changed listener - if (g_object_get_data( dataKludge, "freeze" )) { + if (_freeze) { return; } // in turn, prevent listener from responding - g_object_set_data( dataKludge, "freeze", GINT_TO_POINTER(TRUE) ); + _freeze = true; bool modmade = false; - Inkscape::Selection *selection = desktop->getSelection(); + + Inkscape::Selection *selection = _desktop->getSelection(); auto itemlist= selection->items(); for(auto i=itemlist.begin();i!=itemlist.end();++i){ SPItem *item = *i; if (SP_IS_STAR(item)) { Inkscape::XML::Node *repr = item->getRepr(); - - gdouble r1 = 1.0; - gdouble r2 = 1.0; - sp_repr_get_double(repr, "sodipodi:r1", &r1); - sp_repr_get_double(repr, "sodipodi:r2", &r2); - if (r2 < r1) { - sp_repr_set_svg_double(repr, "sodipodi:r2", - r1*gtk_adjustment_get_value(adj)); - } else { - sp_repr_set_svg_double(repr, "sodipodi:r1", - r2*gtk_adjustment_get_value(adj)); - } - + sp_repr_set_int(repr,"sodipodi:sides", + (gint)_magnitude_adj->get_value()); + double arg1 = 0.5; + sp_repr_get_double(repr, "sodipodi:arg1", &arg1); + sp_repr_set_svg_double(repr, "sodipodi:arg2", + (arg1 + M_PI / (gint)_magnitude_adj->get_value())); item->updateRepr(); modmade = true; } } - if (modmade) { - DocumentUndo::done(desktop->getDocument(), SP_VERB_CONTEXT_STAR, - _("Star: Change spoke ratio")); + DocumentUndo::done(_desktop->getDocument(), SP_VERB_CONTEXT_STAR, + _("Star: Change number of corners")); } - g_object_set_data( dataKludge, "freeze", GINT_TO_POINTER(FALSE) ); + _freeze = false; } -static void sp_star_side_mode_changed( GObject *dataKludge, int mode ) +void +StarToolbar::proportion_value_changed() { - bool flat = (mode == 0); - - SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data( dataKludge, "desktop" )); - - if (DocumentUndo::getUndoSensitive(desktop->getDocument())) { - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setBool( "/tools/shapes/star/isflatsided", flat ); + if (DocumentUndo::getUndoSensitive(_desktop->getDocument())) { + if (!IS_NAN(_spoke_adj->get_value())) { + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setDouble("/tools/shapes/star/proportion", + _spoke_adj->get_value()); + } } // quit if run by the attr_changed listener - if (g_object_get_data( dataKludge, "freeze" )) { + if (_freeze) { return; } // in turn, prevent listener from responding - g_object_set_data( dataKludge, "freeze", GINT_TO_POINTER(TRUE) ); + _freeze = true; - Inkscape::Selection *selection = desktop->getSelection(); - GtkAction* prop_action = GTK_ACTION( g_object_get_data( dataKludge, "prop_action" ) ); bool modmade = false; - - if ( prop_action ) { - gtk_action_set_visible( prop_action, !flat ); - } - + Inkscape::Selection *selection = _desktop->getSelection(); auto itemlist= selection->items(); for(auto i=itemlist.begin();i!=itemlist.end();++i){ SPItem *item = *i; if (SP_IS_STAR(item)) { Inkscape::XML::Node *repr = item->getRepr(); - repr->setAttribute("inkscape:flatsided", flat ? "true" : "false" ); + + gdouble r1 = 1.0; + gdouble r2 = 1.0; + sp_repr_get_double(repr, "sodipodi:r1", &r1); + sp_repr_get_double(repr, "sodipodi:r2", &r2); + if (r2 < r1) { + sp_repr_set_svg_double(repr, "sodipodi:r2", + r1*_spoke_adj->get_value()); + } else { + sp_repr_set_svg_double(repr, "sodipodi:r1", + r2*_spoke_adj->get_value()); + } + item->updateRepr(); modmade = true; } } if (modmade) { - DocumentUndo::done(desktop->getDocument(), SP_VERB_CONTEXT_STAR, - flat ? _("Make polygon") : _("Make star")); + DocumentUndo::done(_desktop->getDocument(), SP_VERB_CONTEXT_STAR, + _("Star: Change spoke ratio")); } - g_object_set_data( dataKludge, "freeze", GINT_TO_POINTER(FALSE) ); + _freeze = false; } -static void sp_star_rounded_value_changed( GtkAdjustment *adj, GObject *dataKludge ) +void +StarToolbar::rounded_value_changed() { - SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data( dataKludge, "desktop" )); - - if (DocumentUndo::getUndoSensitive(desktop->getDocument())) { + if (DocumentUndo::getUndoSensitive(_desktop->getDocument())) { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setDouble("/tools/shapes/star/rounded", (gdouble) gtk_adjustment_get_value(adj)); + prefs->setDouble("/tools/shapes/star/rounded", (gdouble) _roundedness_adj->get_value()); } // quit if run by the attr_changed listener - if (g_object_get_data( dataKludge, "freeze" )) { + if (_freeze) { return; } // in turn, prevent listener from responding - g_object_set_data( dataKludge, "freeze", GINT_TO_POINTER(TRUE) ); + _freeze = true; bool modmade = false; - Inkscape::Selection *selection = desktop->getSelection(); + Inkscape::Selection *selection = _desktop->getSelection(); auto itemlist= selection->items(); for(auto i=itemlist.begin();i!=itemlist.end();++i){ SPItem *item = *i; if (SP_IS_STAR(item)) { Inkscape::XML::Node *repr = item->getRepr(); sp_repr_set_svg_double(repr, "inkscape:rounded", - (gdouble) gtk_adjustment_get_value(adj)); + (gdouble) _roundedness_adj->get_value()); item->updateRepr(); modmade = true; } } if (modmade) { - DocumentUndo::done(desktop->getDocument(), SP_VERB_CONTEXT_STAR, + DocumentUndo::done(_desktop->getDocument(), SP_VERB_CONTEXT_STAR, _("Star: Change rounding")); } - g_object_set_data( dataKludge, "freeze", GINT_TO_POINTER(FALSE) ); + _freeze = false; } -static void sp_star_randomized_value_changed( GtkAdjustment *adj, GObject *dataKludge ) +void +StarToolbar::randomized_value_changed() { - SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data( dataKludge, "desktop" )); - - if (DocumentUndo::getUndoSensitive(desktop->getDocument())) { + if (DocumentUndo::getUndoSensitive(_desktop->getDocument())) { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); prefs->setDouble("/tools/shapes/star/randomized", - (gdouble) gtk_adjustment_get_value(adj)); + (gdouble) _randomization_adj->get_value()); } // quit if run by the attr_changed listener - if (g_object_get_data( dataKludge, "freeze" )) { + if (_freeze) { return; } // in turn, prevent listener from responding - g_object_set_data( dataKludge, "freeze", GINT_TO_POINTER(TRUE) ); + _freeze = true; bool modmade = false; - Inkscape::Selection *selection = desktop->getSelection(); + Inkscape::Selection *selection = _desktop->getSelection(); auto itemlist= selection->items(); for(auto i=itemlist.begin();i!=itemlist.end();++i){ SPItem *item = *i; if (SP_IS_STAR(item)) { Inkscape::XML::Node *repr = item->getRepr(); sp_repr_set_svg_double(repr, "inkscape:randomized", - (gdouble) gtk_adjustment_get_value(adj)); + (gdouble) _randomization_adj->get_value()); item->updateRepr(); modmade = true; } } if (modmade) { - DocumentUndo::done(desktop->getDocument(), SP_VERB_CONTEXT_STAR, + DocumentUndo::done(_desktop->getDocument(), SP_VERB_CONTEXT_STAR, _("Star: Change randomization")); } - g_object_set_data( dataKludge, "freeze", GINT_TO_POINTER(FALSE) ); + _freeze = false; } - -static void star_tb_event_attr_changed(Inkscape::XML::Node *repr, gchar const *name, - gchar const * /*old_value*/, gchar const * /*new_value*/, - bool /*is_interactive*/, gpointer dataPointer) +void +StarToolbar::defaults(GtkWidget * /*widget*/, gpointer user_data) { - GObject *dataKludge = G_OBJECT( dataPointer ); - - // quit if run by the _changed callbacks - if (g_object_get_data(dataKludge, "freeze")) { - return; - } + auto toolbar = reinterpret_cast<StarToolbar *>(user_data); - // in turn, prevent callbacks from responding - g_object_set_data(dataKludge, "freeze", GINT_TO_POINTER(TRUE)); + // FIXME: in this and all other _default functions, set some flag telling the value_changed + // callbacks to lump all the changes for all selected objects in one undo step GtkAdjustment *adj = nullptr; - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - bool isFlatSided = prefs->getBool("/tools/shapes/star/isflatsided", true); - - if (!strcmp(name, "inkscape:randomized")) { - - adj = GTK_ADJUSTMENT( g_object_get_data(dataKludge, "randomized") ); - double randomized = 0.0; - sp_repr_get_double(repr, "inkscape:randomized", &randomized); - gtk_adjustment_set_value(adj, randomized); - - } else if (!strcmp(name, "inkscape:rounded")) { - - adj = GTK_ADJUSTMENT( g_object_get_data(dataKludge, "rounded") ); - double rounded = 0.0; - sp_repr_get_double(repr, "inkscape:rounded", &rounded); - gtk_adjustment_set_value(adj, rounded); - - } else if (!strcmp(name, "inkscape:flatsided")) { - - GtkAction* prop_action = GTK_ACTION( g_object_get_data(dataKludge, "prop_action") ); - char const *flatsides = repr->attribute("inkscape:flatsided"); - - InkSelectOneAction* flat_action = - static_cast<InkSelectOneAction *>(g_object_get_data( dataKludge, "flat_action" ) ); - if ( flatsides && !strcmp(flatsides,"false") ) { - flat_action->set_active(1); - gtk_action_set_visible( prop_action, TRUE ); - } else { - flat_action->set_active(0); - gtk_action_set_visible( prop_action, FALSE ); - } + // fixme: make settable in prefs! + gint mag = 5; + gdouble prop = 0.5; + gboolean flat = FALSE; + gdouble randomized = 0; + gdouble rounded = 0; - } else if ((!strcmp(name, "sodipodi:r1") || !strcmp(name, "sodipodi:r2")) && (!isFlatSided) ) { + toolbar->_flat_action->set_active ( flat ? 0 : 1 ); - adj = GTK_ADJUSTMENT(g_object_get_data(dataKludge, "proportion")); - gdouble r1 = 1.0; - gdouble r2 = 1.0; - sp_repr_get_double(repr, "sodipodi:r1", &r1); - sp_repr_get_double(repr, "sodipodi:r2", &r2); - if (r2 < r1) { - gtk_adjustment_set_value(adj, r2/r1); - } else { - gtk_adjustment_set_value(adj, r1/r2); - } + gtk_action_set_visible( GTK_ACTION(toolbar->_prop_action), !flat ); - } else if (!strcmp(name, "sodipodi:sides")) { + toolbar->_magnitude_adj->set_value(mag); + toolbar->_spoke_adj->set_value(prop); + toolbar->_roundedness_adj->set_value(rounded); + toolbar->_randomization_adj->set_value(randomized); - adj = GTK_ADJUSTMENT(g_object_get_data(dataKludge, "magnitude")); - int sides = 0; - sp_repr_get_int(repr, "sodipodi:sides", &sides); - gtk_adjustment_set_value(adj, sides); - } - - g_object_set_data(dataKludge, "freeze", GINT_TO_POINTER(FALSE)); +#if !GTK_CHECK_VERSION(3,18,0) + toolbar->_magnitude_adj->value_changed(); + toolbar->_spoke_adj->value_changed(); + toolbar->_roundedness_adj->value_changed(); + toolbar->_randomization_adj->value_changed(); +#endif } - -static Inkscape::XML::NodeEventVector star_tb_repr_events = +void +StarToolbar::watch_ec(SPDesktop* desktop, Inkscape::UI::Tools::ToolBase* ec) { - nullptr, /* child_added */ - nullptr, /* child_removed */ - star_tb_event_attr_changed, - nullptr, /* content_changed */ - nullptr /* order_changed */ -}; - + if (dynamic_cast<Inkscape::UI::Tools::StarTool const*>(ec) != nullptr) { + _changed = desktop->getSelection()->connectChanged(sigc::mem_fun(*this, &StarToolbar::selection_changed)); + selection_changed(desktop->getSelection()); + } else { + if (_changed) + _changed.disconnect(); + } +} /** * \param selection Should not be NULL. */ -static void -sp_star_toolbox_selection_changed(Inkscape::Selection *selection, GObject *dataKludge) +void +StarToolbar::selection_changed(Inkscape::Selection *selection) { int n_selected = 0; Inkscape::XML::Node *repr = nullptr; - purge_repr_listener( dataKludge, dataKludge ); + if (_repr) { // remove old listener + _repr->removeListenerByData(this); + Inkscape::GC::release(_repr); + _repr = nullptr; + } auto itemlist= selection->items(); for(auto i=itemlist.begin();i!=itemlist.end();++i){ @@ -386,18 +528,16 @@ sp_star_toolbox_selection_changed(Inkscape::Selection *selection, GObject *dataK } } - EgeOutputAction* act = EGE_OUTPUT_ACTION( g_object_get_data( dataKludge, "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( dataKludge, "repr", repr ); - Inkscape::GC::anchor(repr); - sp_repr_add_listener(repr, &star_tb_repr_events, dataKludge); - sp_repr_synthesize_events(repr, &star_tb_repr_events, dataKludge); + _repr = repr; + Inkscape::GC::anchor(_repr); + _repr->addListener(&star_tb_repr_events, this); + _repr->synthesizeEvents(&star_tb_repr_events, this); } } else { // FIXME: implement averaging of all parameters for multiple selected stars @@ -406,209 +546,62 @@ sp_star_toolbox_selection_changed(Inkscape::Selection *selection, GObject *dataK } } - -static void sp_star_defaults( GtkWidget * /*widget*/, GObject *dataKludge ) +void +StarToolbar::event_attr_changed(Inkscape::XML::Node *repr, gchar const *name, + gchar const * /*old_value*/, gchar const * /*new_value*/, + bool /*is_interactive*/, gpointer dataPointer) { - // FIXME: in this and all other _default functions, set some flag telling the value_changed - // callbacks to lump all the changes for all selected objects in one undo step - - GtkAdjustment *adj = nullptr; - - // fixme: make settable in prefs! - gint mag = 5; - gdouble prop = 0.5; - gboolean flat = FALSE; - gdouble randomized = 0; - gdouble rounded = 0; - - InkSelectOneAction* flat_action = - static_cast<InkSelectOneAction *>(g_object_get_data( dataKludge, "flat_action" ) ); - flat_action->set_active ( flat ? 0 : 1 ); + auto toolbar = reinterpret_cast<StarToolbar *>(dataPointer); - GtkAction* sb2 = GTK_ACTION( g_object_get_data( dataKludge, "prop_action" ) ); - gtk_action_set_visible( sb2, !flat ); - - adj = GTK_ADJUSTMENT( g_object_get_data( dataKludge, "magnitude" ) ); - gtk_adjustment_set_value(adj, mag); - -#if !GTK_CHECK_VERSION(3,18,0) - gtk_adjustment_value_changed(adj); -#endif - - adj = GTK_ADJUSTMENT( g_object_get_data( dataKludge, "proportion" ) ); - gtk_adjustment_set_value(adj, prop); - -#if !GTK_CHECK_VERSION(3,18,0) - gtk_adjustment_value_changed(adj); -#endif - - adj = GTK_ADJUSTMENT( g_object_get_data( dataKludge, "rounded" ) ); - gtk_adjustment_set_value(adj, rounded); - -#if !GTK_CHECK_VERSION(3,18,0) - gtk_adjustment_value_changed(adj); -#endif - - adj = GTK_ADJUSTMENT( g_object_get_data( dataKludge, "randomized" ) ); - gtk_adjustment_set_value(adj, randomized); - -#if !GTK_CHECK_VERSION(3,18,0) - gtk_adjustment_value_changed(adj); -#endif -} - -static void star_toolbox_watch_ec(SPDesktop* dt, Inkscape::UI::Tools::ToolBase* ec, GObject* dataKludge); + // quit if run by the _changed callbacks + if (toolbar->_freeze) { + return; + } -void sp_star_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* dataKludge) -{ - GtkIconSize secondarySize = ToolboxFactory::prefToSize("/toolbox/secondary", 1); + // in turn, prevent callbacks from responding + toolbar->_freeze = true; Inkscape::Preferences *prefs = Inkscape::Preferences::get(); bool isFlatSided = prefs->getBool("/tools/shapes/star/isflatsided", true); - EgeAdjustmentAction* eact = nullptr; - - { - EgeOutputAction* act = ege_output_action_new( "StarStateAction", _("<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( dataKludge, "mode_action", act ); - } - - /* Flatsided checkbox */ - { - InkSelectOneActionColumns columns; - - Glib::RefPtr<Gtk::ListStore> store = Gtk::ListStore::create(columns); - - Gtk::TreeModel::Row row; - - row = *(store->append()); - row[columns.col_label ] = _("Polygon"); - row[columns.col_tooltip ] = _("Regular polygon (with one handle) instead of a star"); - row[columns.col_icon ] = INKSCAPE_ICON("draw-polygon"); - row[columns.col_sensitive] = true; - - row = *(store->append()); - row[columns.col_label ] = _("Star"); - row[columns.col_tooltip ] = _("Star instead of a regular polygon (with one handle)"); - row[columns.col_icon ] = INKSCAPE_ICON("draw-star"); - row[columns.col_sensitive] = true; - - InkSelectOneAction* act = - InkSelectOneAction::create( "FlatAction", // Name - (""), // Label - (""), // Tooltip - "Not Used", // Icon - store ); // Tree store - act->use_radio( true ); - act->use_label( false ); - act->set_active( isFlatSided ? 0 : 1 ); - - gtk_action_group_add_action( mainActions, GTK_ACTION( act->gobj() )); - g_object_set_data( dataKludge, "flat_action", act ); - - act->signal_changed().connect(sigc::bind<0>(sigc::ptr_fun(&sp_star_side_mode_changed), dataKludge)); - } - - /* Magnitude */ - { - gchar const* labels[] = {_("triangle/tri-star"), _("square/quad-star"), _("pentagon/five-pointed star"), _("hexagon/six-pointed star"), nullptr, nullptr, nullptr, nullptr, nullptr}; - gdouble values[] = {3, 4, 5, 6, 7, 8, 10, 12, 20}; - eact = create_adjustment_action( "MagnitudeAction", - _("Corners"), _("Corners:"), _("Number of corners of a polygon or star"), - "/tools/shapes/star/magnitude", 3, - GTK_WIDGET(desktop->canvas), dataKludge, FALSE, nullptr, - 3, 1024, 1, 5, - labels, values, G_N_ELEMENTS(labels), - sp_star_magnitude_value_changed, nullptr /*unit tracker*/, - 1.0, 0 ); - gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); - gtk_action_set_sensitive( GTK_ACTION(eact), TRUE ); - } - - /* Spoke ratio */ - { - gchar const* labels[] = {_("thin-ray star"), nullptr, _("pentagram"), _("hexagram"), _("heptagram"), _("octagram"), _("regular polygon")}; - gdouble values[] = {0.01, 0.2, 0.382, 0.577, 0.692, 0.765, 1}; - eact = create_adjustment_action( "SpokeAction", - _("Spoke ratio"), _("Spoke ratio:"), - // TRANSLATORS: Tip radius of a star is the distance from the center to the farthest handle. - // Base radius is the same for the closest handle. - _("Base radius to tip radius ratio"), - "/tools/shapes/star/proportion", 0.5, - GTK_WIDGET(desktop->canvas), dataKludge, FALSE, nullptr, - 0.01, 1.0, 0.01, 0.1, - labels, values, G_N_ELEMENTS(labels), - sp_star_proportion_value_changed ); - gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); - g_object_set_data( dataKludge, "prop_action", eact ); - - if ( !isFlatSided ) { - gtk_action_set_visible( GTK_ACTION(eact), TRUE ); + if (!strcmp(name, "inkscape:randomized")) { + double randomized = 0.0; + sp_repr_get_double(repr, "inkscape:randomized", &randomized); + toolbar->_randomization_adj->set_value(randomized); + } else if (!strcmp(name, "inkscape:rounded")) { + double rounded = 0.0; + sp_repr_get_double(repr, "inkscape:rounded", &rounded); + toolbar->_roundedness_adj->set_value(rounded); + } else if (!strcmp(name, "inkscape:flatsided")) { + char const *flatsides = repr->attribute("inkscape:flatsided"); + if ( flatsides && !strcmp(flatsides,"false") ) { + toolbar->_flat_action->set_active(1); + gtk_action_set_visible( GTK_ACTION(toolbar->_prop_action), TRUE ); } else { - gtk_action_set_visible( GTK_ACTION(eact), FALSE ); + toolbar->_flat_action->set_active(0); + gtk_action_set_visible( GTK_ACTION(toolbar->_prop_action), FALSE ); } + } else if ((!strcmp(name, "sodipodi:r1") || !strcmp(name, "sodipodi:r2")) && (!isFlatSided) ) { + gdouble r1 = 1.0; + gdouble r2 = 1.0; + sp_repr_get_double(repr, "sodipodi:r1", &r1); + sp_repr_get_double(repr, "sodipodi:r2", &r2); + if (r2 < r1) { + toolbar->_spoke_adj->set_value(r2/r1); + } else { + toolbar->_spoke_adj->set_value(r1/r2); + } + } else if (!strcmp(name, "sodipodi:sides")) { + int sides = 0; + sp_repr_get_int(repr, "sodipodi:sides", &sides); + toolbar->_magnitude_adj->set_value(sides); } - /* Roundedness */ - { - gchar const* labels[] = {_("stretched"), _("twisted"), _("slightly pinched"), _("NOT rounded"), _("slightly rounded"), - _("visibly rounded"), _("well rounded"), _("amply rounded"), nullptr, _("stretched"), _("blown up")}; - gdouble values[] = {-1, -0.2, -0.03, 0, 0.05, 0.1, 0.2, 0.3, 0.5, 1, 10}; - eact = create_adjustment_action( "RoundednessAction", - _("Rounded"), _("Rounded:"), _("How much rounded are the corners (0 for sharp)"), - "/tools/shapes/star/rounded", 0.0, - GTK_WIDGET(desktop->canvas), dataKludge, FALSE, nullptr, - -10.0, 10.0, 0.01, 0.1, - labels, values, G_N_ELEMENTS(labels), - sp_star_rounded_value_changed ); - gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); - gtk_action_set_sensitive( GTK_ACTION(eact), TRUE ); - } - - /* Randomization */ - { - gchar const* labels[] = {_("NOT randomized"), _("slightly irregular"), _("visibly randomized"), _("strongly randomized"), _("blown up")}; - gdouble values[] = {0, 0.01, 0.1, 0.5, 10}; - eact = create_adjustment_action( "RandomizationAction", - _("Randomized"), _("Randomized:"), _("Scatter randomly the corners and angles"), - "/tools/shapes/star/randomized", 0.0, - GTK_WIDGET(desktop->canvas), dataKludge, FALSE, nullptr, - -10.0, 10.0, 0.001, 0.01, - labels, values, G_N_ELEMENTS(labels), - sp_star_randomized_value_changed, nullptr /*unit tracker*/, 0.1, 3 ); - gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); - gtk_action_set_sensitive( GTK_ACTION(eact), TRUE ); - } - - /* Reset */ - { - InkAction* inky = ink_action_new( "StarResetAction", - _("Defaults"), - _("Reset shape parameters to defaults (use Inkscape Preferences > Tools to change defaults)"), - INKSCAPE_ICON("edit-clear"), - GTK_ICON_SIZE_SMALL_TOOLBAR); - g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_star_defaults), dataKludge ); - gtk_action_group_add_action( mainActions, GTK_ACTION(inky) ); - gtk_action_set_sensitive( GTK_ACTION(inky), TRUE ); - } - - desktop->connectEventContextChanged(sigc::bind(sigc::ptr_fun(star_toolbox_watch_ec), dataKludge)); - g_signal_connect(dataKludge, "destroy", G_CALLBACK(purge_repr_listener), dataKludge); + toolbar->_freeze = false; } -static void star_toolbox_watch_ec(SPDesktop* desktop, Inkscape::UI::Tools::ToolBase* ec, GObject* dataKludge) -{ - static sigc::connection changed; - - if (dynamic_cast<Inkscape::UI::Tools::StarTool const*>(ec) != nullptr) { - changed = desktop->getSelection()->connectChanged(sigc::bind(sigc::ptr_fun(sp_star_toolbox_selection_changed), dataKludge)); - sp_star_toolbox_selection_changed(desktop->getSelection(), dataKludge); - } else { - if (changed) - changed.disconnect(); - } +} +} } /* |
