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/rect-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/rect-toolbar.cpp')
| -rw-r--r-- | src/ui/toolbar/rect-toolbar.cpp | 512 |
1 files changed, 258 insertions, 254 deletions
diff --git a/src/ui/toolbar/rect-toolbar.cpp b/src/ui/toolbar/rect-toolbar.cpp index cc615a35d..d4fa9d74f 100644 --- a/src/ui/toolbar/rect-toolbar.cpp +++ b/src/ui/toolbar/rect-toolbar.cpp @@ -61,55 +61,198 @@ using Inkscape::Util::Unit; using Inkscape::Util::Quantity; using Inkscape::Util::unit_table; +static Inkscape::XML::NodeEventVector rect_tb_repr_events = { + nullptr, /* child_added */ + nullptr, /* child_removed */ + Inkscape::UI::Toolbar::RectToolbar::event_attr_changed, + nullptr, /* content_changed */ + nullptr /* order_changed */ +}; -//######################## -//## Rect ## -//######################## +namespace Inkscape { +namespace UI { +namespace Toolbar { -static void sp_rtb_sensitivize( GObject *tbl ) +RectToolbar::RectToolbar(SPDesktop *desktop) + : Toolbar(desktop), + _tracker(new UnitTracker(Inkscape::Util::UNIT_TYPE_LINEAR)), + _freeze(false), + _single(true) { - GtkAdjustment *adj1 = GTK_ADJUSTMENT( g_object_get_data(tbl, "rx") ); - GtkAdjustment *adj2 = GTK_ADJUSTMENT( g_object_get_data(tbl, "ry") ); - GtkAction* not_rounded = GTK_ACTION( g_object_get_data(tbl, "not_rounded") ); + // rx/ry units menu: create + //tracker->addUnit( SP_UNIT_PERCENT, 0 ); + // fixme: add % meaning per cent of the width/height + _tracker->setActiveUnit(unit_table.getUnit("px")); +} - if (gtk_adjustment_get_value(adj1) == 0 && gtk_adjustment_get_value(adj2) == 0 && g_object_get_data(tbl, "single")) { // only for a single selected rect (for now) - gtk_action_set_sensitive( not_rounded, FALSE ); - } else { - gtk_action_set_sensitive( not_rounded, TRUE ); +RectToolbar::~RectToolbar() +{ + if (_repr) { // remove old listener + _repr->removeListenerByData(this); + Inkscape::GC::release(_repr); + _repr = nullptr; } } - -static void sp_rtb_value_changed(GtkAdjustment *adj, GObject *tbl, gchar const *value_name, - void (SPRect::*setter)(gdouble)) +GtkWidget * +RectToolbar::prep(SPDesktop *desktop, GtkActionGroup* mainActions) { - SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data( tbl, "desktop" )); + auto holder = new RectToolbar(desktop); + + EgeAdjustmentAction* eact = nullptr; + GtkIconSize secondarySize = ToolboxFactory::prefToSize("/toolbox/secondary", 1); + + { + holder->_mode_action = ege_output_action_new( "RectStateAction", _("<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 ) ); + } + + /* W */ + { + gchar const* labels[] = {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}; + gdouble values[] = {1, 2, 3, 5, 10, 20, 50, 100, 200, 500}; + holder->_width_action = create_adjustment_action( "RectWidthAction", + _("Width"), _("W:"), _("Width of rectangle"), + "/tools/shapes/rect/width", 0, + GTK_WIDGET(desktop->canvas), + nullptr, // dataKludge + TRUE, "altx-rect", + 0, 1e6, SPIN_STEP, SPIN_PAGE_STEP, + labels, values, G_N_ELEMENTS(labels), + nullptr, // callback + holder->_tracker); + + holder->_width_adj = Glib::wrap(ege_adjustment_action_get_adjustment(holder->_width_action)); + holder->_width_adj->signal_value_changed().connect(sigc::bind(sigc::mem_fun(*holder, &RectToolbar::value_changed), + holder->_width_adj, + "width", + &SPRect::setVisibleWidth)); + gtk_action_set_sensitive( GTK_ACTION(holder->_width_action), FALSE ); + gtk_action_group_add_action( mainActions, GTK_ACTION(holder->_width_action) ); + } + + /* H */ + { + gchar const* labels[] = {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}; + gdouble values[] = {1, 2, 3, 5, 10, 20, 50, 100, 200, 500}; + holder->_height_action = create_adjustment_action( "RectHeightAction", + _("Height"), _("H:"), _("Height of rectangle"), + "/tools/shapes/rect/height", 0, + GTK_WIDGET(desktop->canvas), + nullptr, // dataKludge + FALSE, nullptr, + 0, 1e6, SPIN_STEP, SPIN_PAGE_STEP, + labels, values, G_N_ELEMENTS(labels), + nullptr, // callback + holder->_tracker); + holder->_height_adj = Glib::wrap(ege_adjustment_action_get_adjustment(holder->_height_action)); + holder->_height_adj->signal_value_changed().connect(sigc::bind(sigc::mem_fun(*holder, &RectToolbar::value_changed), + holder->_height_adj, + "height", + &SPRect::setVisibleHeight)); + gtk_action_set_sensitive( GTK_ACTION(holder->_height_action), FALSE ); + gtk_action_group_add_action( mainActions, GTK_ACTION(holder->_height_action) ); + } + + /* rx */ + { + gchar const* labels[] = {_("not rounded"), nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}; + gdouble values[] = {0.5, 1, 2, 3, 5, 10, 20, 50, 100}; + eact = create_adjustment_action( "RadiusXAction", + _("Horizontal radius"), _("Rx:"), _("Horizontal radius of rounded corners"), + "/tools/shapes/rect/rx", 0, + GTK_WIDGET(desktop->canvas), + nullptr, // dataKludge + FALSE, nullptr, + 0, 1e6, SPIN_STEP, SPIN_PAGE_STEP, + labels, values, G_N_ELEMENTS(labels), + nullptr, // callback + holder->_tracker); + holder->_rx_adj = Glib::wrap(ege_adjustment_action_get_adjustment(eact)); + holder->_rx_adj->signal_value_changed().connect(sigc::bind(sigc::mem_fun(*holder, &RectToolbar::value_changed), + holder->_rx_adj, + "rx", + &SPRect::setVisibleRx)); + gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); + } + + /* ry */ + { + gchar const* labels[] = {_("not rounded"), nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}; + gdouble values[] = {0.5, 1, 2, 3, 5, 10, 20, 50, 100}; + eact = create_adjustment_action( "RadiusYAction", + _("Vertical radius"), _("Ry:"), _("Vertical radius of rounded corners"), + "/tools/shapes/rect/ry", 0, + GTK_WIDGET(desktop->canvas), + nullptr, // dataKludge + FALSE, nullptr, + 0, 1e6, SPIN_STEP, SPIN_PAGE_STEP, + labels, values, G_N_ELEMENTS(labels), + nullptr, // callback + holder->_tracker); + holder->_ry_adj = Glib::wrap(ege_adjustment_action_get_adjustment(eact)); + holder->_ry_adj->signal_value_changed().connect(sigc::bind(sigc::mem_fun(*holder, &RectToolbar::value_changed), + holder->_ry_adj, + "ry", + &SPRect::setVisibleRy)); + gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); + } + + // add the units menu + { + InkSelectOneAction* act = holder->_tracker->createAction( "RectUnitsAction", _("Units"), ("") ); + gtk_action_group_add_action( mainActions, act->gobj() ); + } - UnitTracker* tracker = reinterpret_cast<UnitTracker*>(g_object_get_data( tbl, "tracker" )); - Unit const *unit = tracker->getActiveUnit(); + /* Reset */ + { + holder->_not_rounded = ink_action_new( "RectResetAction", + _("Not rounded"), + _("Make corners sharp"), + INKSCAPE_ICON("rectangle-make-corners-sharp"), + secondarySize ); + g_signal_connect_after( G_OBJECT(holder->_not_rounded), "activate", G_CALLBACK(&RectToolbar::defaults), holder ); + gtk_action_group_add_action( mainActions, GTK_ACTION(holder->_not_rounded) ); + gtk_action_set_sensitive( GTK_ACTION(holder->_not_rounded), TRUE ); + } + + holder->sensitivize(); + + desktop->connectEventContextChanged(sigc::mem_fun(*holder, &RectToolbar::watch_ec)); + + return GTK_WIDGET(holder->gobj()); +} + +void +RectToolbar::value_changed(Glib::RefPtr<Gtk::Adjustment>& adj, + gchar const *value_name, + void (SPRect::*setter)(gdouble)) +{ + Unit const *unit = _tracker->getActiveUnit(); g_return_if_fail(unit != nullptr); - if (DocumentUndo::getUndoSensitive(desktop->getDocument())) { + if (DocumentUndo::getUndoSensitive(_desktop->getDocument())) { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); prefs->setDouble(Glib::ustring("/tools/shapes/rect/") + value_name, - Quantity::convert(gtk_adjustment_get_value(adj), unit, "px")); + Quantity::convert(adj->get_value(), unit, "px")); } // quit if run by the attr_changed listener - if (g_object_get_data( tbl, "freeze" ) || tracker->isUpdating()) { + if (_freeze || _tracker->isUpdating()) { return; } // in turn, prevent listener from responding - g_object_set_data( tbl, "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){ if (SP_IS_RECT(*i)) { - if (gtk_adjustment_get_value(adj) != 0) { - (SP_RECT(*i)->*setter)(Quantity::convert(gtk_adjustment_get_value(adj), unit, "px")); + if (adj->get_value() != 0) { + (SP_RECT(*i)->*setter)(Quantity::convert(adj->get_value(), unit, "px")); } else { (*i)->getRepr()->setAttribute(value_name, nullptr); } @@ -117,136 +260,86 @@ static void sp_rtb_value_changed(GtkAdjustment *adj, GObject *tbl, gchar const * } } - sp_rtb_sensitivize( tbl ); + sensitivize(); if (modmade) { - DocumentUndo::done(desktop->getDocument(), SP_VERB_CONTEXT_RECT, + DocumentUndo::done(_desktop->getDocument(), SP_VERB_CONTEXT_RECT, _("Change rectangle")); } - g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) ); + _freeze = false; } -static void sp_rtb_rx_value_changed(GtkAdjustment *adj, GObject *tbl) +void +RectToolbar::sensitivize() { - sp_rtb_value_changed(adj, tbl, "rx", &SPRect::setVisibleRx); -} - -static void sp_rtb_ry_value_changed(GtkAdjustment *adj, GObject *tbl) -{ - sp_rtb_value_changed(adj, tbl, "ry", &SPRect::setVisibleRy); -} - -static void sp_rtb_width_value_changed(GtkAdjustment *adj, GObject *tbl) -{ - sp_rtb_value_changed(adj, tbl, "width", &SPRect::setVisibleWidth); + if (_rx_adj->get_value() == 0 && _ry_adj->get_value() == 0 && _single) { // only for a single selected rect (for now) + gtk_action_set_sensitive( GTK_ACTION(_not_rounded), FALSE ); + } else { + gtk_action_set_sensitive( GTK_ACTION(_not_rounded), TRUE ); + } } -static void sp_rtb_height_value_changed(GtkAdjustment *adj, GObject *tbl) +void +RectToolbar::defaults( GtkWidget * /*widget*/, GObject *obj) { - sp_rtb_value_changed(adj, tbl, "height", &SPRect::setVisibleHeight); -} - + auto toolbar = reinterpret_cast<RectToolbar*>(obj); - -static void sp_rtb_defaults( GtkWidget * /*widget*/, GObject *obj) -{ - GtkAdjustment *adj = nullptr; - - adj = GTK_ADJUSTMENT( g_object_get_data(obj, "rx") ); - gtk_adjustment_set_value(adj, 0.0); + toolbar->_rx_adj->set_value(0.0); + toolbar->_ry_adj->set_value(0.0); #if !GTK_CHECK_VERSION(3,18,0) // this is necessary if the previous value was 0, but we still need to run the callback to change all selected objects - gtk_adjustment_value_changed(adj); + toolbar->_rx_adj->value_changed(); + toolbar->_ry_adj->value_changed(); #endif - adj = GTK_ADJUSTMENT( g_object_get_data(obj, "ry") ); - gtk_adjustment_set_value(adj, 0.0); - -#if !GTK_CHECK_VERSION(3,18,0) - gtk_adjustment_value_changed(adj); -#endif - - sp_rtb_sensitivize( obj ); + toolbar->sensitivize(); } -static void rect_tb_event_attr_changed(Inkscape::XML::Node * /*repr*/, gchar const * /*name*/, - gchar const * /*old_value*/, gchar const * /*new_value*/, - bool /*is_interactive*/, gpointer data) +void +RectToolbar::watch_ec(SPDesktop* desktop, Inkscape::UI::Tools::ToolBase* ec) { - GObject *tbl = G_OBJECT(data); - - // quit if run by the _changed callbacks - if (g_object_get_data( tbl, "freeze" )) { - return; - } - - // in turn, prevent callbacks from responding - g_object_set_data( tbl, "freeze", GINT_TO_POINTER(TRUE) ); - - UnitTracker* tracker = reinterpret_cast<UnitTracker*>( g_object_get_data( tbl, "tracker" ) ); - Unit const *unit = tracker->getActiveUnit(); - g_return_if_fail(unit != nullptr); - - gpointer item = g_object_get_data( tbl, "item" ); - if (item && SP_IS_RECT(item)) { - { - GtkAdjustment *adj = GTK_ADJUSTMENT( g_object_get_data( tbl, "rx" ) ); - - gdouble rx = SP_RECT(item)->getVisibleRx(); - gtk_adjustment_set_value(adj, Quantity::convert(rx, "px", unit)); - } - - { - GtkAdjustment *adj = GTK_ADJUSTMENT( g_object_get_data( tbl, "ry" ) ); - - gdouble ry = SP_RECT(item)->getVisibleRy(); - gtk_adjustment_set_value(adj, Quantity::convert(ry, "px", unit)); - } + static sigc::connection changed; - { - GtkAdjustment *adj = GTK_ADJUSTMENT( g_object_get_data( tbl, "width" ) ); + // use of dynamic_cast<> seems wrong here -- we just need to check the current tool - gdouble width = SP_RECT(item)->getVisibleWidth(); - gtk_adjustment_set_value(adj, Quantity::convert(width, "px", unit)); - } + if (dynamic_cast<Inkscape::UI::Tools::RectTool *>(ec)) { + Inkscape::Selection *sel = desktop->getSelection(); - { - GtkAdjustment *adj = GTK_ADJUSTMENT( g_object_get_data( tbl, "height" ) ); + changed = sel->connectChanged(sigc::mem_fun(*this, &RectToolbar::selection_changed)); - gdouble height = SP_RECT(item)->getVisibleHeight(); - gtk_adjustment_set_value(adj, Quantity::convert(height, "px", unit)); + // Synthesize an emission to trigger the update + selection_changed(sel); + } else { + if (changed) { + changed.disconnect(); + + if (_repr) { // remove old listener + _repr->removeListenerByData(this); + Inkscape::GC::release(_repr); + _repr = nullptr; + } } } - - sp_rtb_sensitivize( tbl ); - - g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) ); } - -static Inkscape::XML::NodeEventVector rect_tb_repr_events = { - nullptr, /* child_added */ - nullptr, /* child_removed */ - rect_tb_event_attr_changed, - nullptr, /* content_changed */ - nullptr /* order_changed */ -}; - /** * \param selection should not be NULL. */ -static void sp_rect_toolbox_selection_changed(Inkscape::Selection *selection, GObject *tbl) +void +RectToolbar::selection_changed(Inkscape::Selection *selection) { int n_selected = 0; Inkscape::XML::Node *repr = nullptr; SPItem *item = nullptr; - if ( g_object_get_data( tbl, "repr" ) ) { - g_object_set_data( tbl, "item", nullptr ); + if (_repr) { // remove old listener + _item = nullptr; + _repr->removeListenerByData(this); + Inkscape::GC::release(_repr); + _repr = nullptr; } - purge_repr_listener( tbl, tbl ); auto itemlist= selection->items(); for(auto i=itemlist.begin();i!=itemlist.end();++i){ @@ -257,169 +350,80 @@ static void sp_rect_toolbox_selection_changed(Inkscape::Selection *selection, GO } } - EgeOutputAction* act = EGE_OUTPUT_ACTION( g_object_get_data( tbl, "mode_action" ) ); - - g_object_set_data( tbl, "single", GINT_TO_POINTER(FALSE) ); + _single = false; if (n_selected == 0) { - g_object_set( G_OBJECT(act), "label", _("<b>New:</b>"), NULL ); - - GtkAction* w = GTK_ACTION( g_object_get_data( tbl, "width_action" ) ); - gtk_action_set_sensitive(w, FALSE); - GtkAction* h = GTK_ACTION( g_object_get_data( tbl, "height_action" ) ); - gtk_action_set_sensitive(h, FALSE); - + gtk_action_set_label(GTK_ACTION(_mode_action), _("<b>New:</b>")); + gtk_action_set_sensitive(GTK_ACTION(_width_action), FALSE); + gtk_action_set_sensitive(GTK_ACTION(_height_action), FALSE); } else if (n_selected == 1) { - g_object_set( G_OBJECT(act), "label", _("<b>Change:</b>"), NULL ); - g_object_set_data( tbl, "single", GINT_TO_POINTER(TRUE) ); - - GtkAction* w = GTK_ACTION( g_object_get_data( tbl, "width_action" ) ); - gtk_action_set_sensitive(w, TRUE); - GtkAction* h = GTK_ACTION( g_object_get_data( tbl, "height_action" ) ); - gtk_action_set_sensitive(h, TRUE); + gtk_action_set_label(GTK_ACTION(_mode_action), _("<b>Change:</b>")); + _single = true; + gtk_action_set_sensitive(GTK_ACTION(_width_action), TRUE); + gtk_action_set_sensitive(GTK_ACTION(_height_action), TRUE); if (repr) { - g_object_set_data( tbl, "repr", repr ); - g_object_set_data( tbl, "item", item ); - Inkscape::GC::anchor(repr); - sp_repr_add_listener(repr, &rect_tb_repr_events, tbl); - sp_repr_synthesize_events(repr, &rect_tb_repr_events, tbl); + _repr = repr; + _item = item; + Inkscape::GC::anchor(_repr); + _repr->addListener(&rect_tb_repr_events, this); + _repr->synthesizeEvents(&rect_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 ); - sp_rtb_sensitivize( tbl ); + gtk_action_set_label(GTK_ACTION(_mode_action), _("<b>Change:</b>")); + sensitivize(); } } -static void rect_toolbox_watch_ec(SPDesktop* dt, Inkscape::UI::Tools::ToolBase* ec, GObject* holder); - -void sp_rect_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder) +void RectToolbar::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); + auto toolbar = reinterpret_cast<RectToolbar*>(data); - { - EgeOutputAction* act = ege_output_action_new( "RectStateAction", _("<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 ); + // quit if run by the _changed callbacks + if (toolbar->_freeze) { + return; } - // rx/ry units menu: create - UnitTracker* tracker = new UnitTracker(Inkscape::Util::UNIT_TYPE_LINEAR); - //tracker->addUnit( SP_UNIT_PERCENT, 0 ); - // fixme: add % meaning per cent of the width/height - tracker->setActiveUnit(unit_table.getUnit("px")); - g_object_set_data( holder, "tracker", tracker ); - - /* W */ - { - gchar const* labels[] = {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}; - gdouble values[] = {1, 2, 3, 5, 10, 20, 50, 100, 200, 500}; - eact = create_adjustment_action( "RectWidthAction", - _("Width"), _("W:"), _("Width of rectangle"), - "/tools/shapes/rect/width", 0, - GTK_WIDGET(desktop->canvas), holder, TRUE, "altx-rect", - 0, 1e6, SPIN_STEP, SPIN_PAGE_STEP, - labels, values, G_N_ELEMENTS(labels), - sp_rtb_width_value_changed, tracker); - g_object_set_data( holder, "width_action", eact ); - gtk_action_set_sensitive( GTK_ACTION(eact), FALSE ); - gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); - } + // in turn, prevent callbacks from responding + toolbar->_freeze = true; - /* H */ - { - gchar const* labels[] = {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}; - gdouble values[] = {1, 2, 3, 5, 10, 20, 50, 100, 200, 500}; - eact = create_adjustment_action( "RectHeightAction", - _("Height"), _("H:"), _("Height of rectangle"), - "/tools/shapes/rect/height", 0, - GTK_WIDGET(desktop->canvas), holder, FALSE, nullptr, - 0, 1e6, SPIN_STEP, SPIN_PAGE_STEP, - labels, values, G_N_ELEMENTS(labels), - sp_rtb_height_value_changed, tracker); - g_object_set_data( holder, "height_action", eact ); - gtk_action_set_sensitive( GTK_ACTION(eact), FALSE ); - gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); - } + Unit const *unit = toolbar->_tracker->getActiveUnit(); + g_return_if_fail(unit != nullptr); - /* rx */ - { - gchar const* labels[] = {_("not rounded"), nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}; - gdouble values[] = {0.5, 1, 2, 3, 5, 10, 20, 50, 100}; - eact = create_adjustment_action( "RadiusXAction", - _("Horizontal radius"), _("Rx:"), _("Horizontal radius of rounded corners"), - "/tools/shapes/rect/rx", 0, - GTK_WIDGET(desktop->canvas), holder, FALSE, nullptr, - 0, 1e6, SPIN_STEP, SPIN_PAGE_STEP, - labels, values, G_N_ELEMENTS(labels), - sp_rtb_rx_value_changed, tracker); - gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); - } + if (toolbar->_item && SP_IS_RECT(toolbar->_item)) { + { + gdouble rx = SP_RECT(toolbar->_item)->getVisibleRx(); + toolbar->_rx_adj->set_value(Quantity::convert(rx, "px", unit)); + } - /* ry */ - { - gchar const* labels[] = {_("not rounded"), nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}; - gdouble values[] = {0.5, 1, 2, 3, 5, 10, 20, 50, 100}; - eact = create_adjustment_action( "RadiusYAction", - _("Vertical radius"), _("Ry:"), _("Vertical radius of rounded corners"), - "/tools/shapes/rect/ry", 0, - GTK_WIDGET(desktop->canvas), holder, FALSE, nullptr, - 0, 1e6, SPIN_STEP, SPIN_PAGE_STEP, - labels, values, G_N_ELEMENTS(labels), - sp_rtb_ry_value_changed, tracker); - gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); - } + { + gdouble ry = SP_RECT(toolbar->_item)->getVisibleRy(); + toolbar->_ry_adj->set_value(Quantity::convert(ry, "px", unit)); + } - // add the units menu - { - InkSelectOneAction* act = tracker->createAction( "RectUnitsAction", _("Units"), ("") ); - gtk_action_group_add_action( mainActions, act->gobj() ); - } + { + gdouble width = SP_RECT(toolbar->_item)->getVisibleWidth(); + toolbar->_width_adj->set_value(Quantity::convert(width, "px", unit)); + } - /* Reset */ - { - InkAction* inky = ink_action_new( "RectResetAction", - _("Not rounded"), - _("Make corners sharp"), - INKSCAPE_ICON("rectangle-make-corners-sharp"), - secondarySize ); - g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_rtb_defaults), holder ); - gtk_action_group_add_action( mainActions, GTK_ACTION(inky) ); - gtk_action_set_sensitive( GTK_ACTION(inky), TRUE ); - g_object_set_data( holder, "not_rounded", inky ); + { + gdouble height = SP_RECT(toolbar->_item)->getVisibleHeight(); + toolbar->_height_adj->set_value(Quantity::convert(height, "px", unit)); + } } - g_object_set_data( holder, "single", GINT_TO_POINTER(TRUE) ); - sp_rtb_sensitivize( holder ); - - desktop->connectEventContextChanged(sigc::bind(sigc::ptr_fun(rect_toolbox_watch_ec), holder)); - g_signal_connect( holder, "destroy", G_CALLBACK(purge_repr_listener), holder ); + toolbar->sensitivize(); + toolbar->_freeze = false; } -static void rect_toolbox_watch_ec(SPDesktop* desktop, Inkscape::UI::Tools::ToolBase* ec, GObject* holder) -{ - static sigc::connection changed; - - // use of dynamic_cast<> seems wrong here -- we just need to check the current tool - - if (dynamic_cast<Inkscape::UI::Tools::RectTool *>(ec)) { - Inkscape::Selection *sel = desktop->getSelection(); - - changed = sel->connectChanged(sigc::bind(sigc::ptr_fun(sp_rect_toolbox_selection_changed), holder)); - - // Synthesize an emission to trigger the update - sp_rect_toolbox_selection_changed(sel, holder); - } else { - if (changed) { - changed.disconnect(); - purge_repr_listener(nullptr, holder); - } - } } +} +} + /* Local Variables: |
