From fe709e1e1168c8e08724bcef3e170a5fa4fb6c74 Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Wed, 23 Sep 2020 20:35:51 +0200 Subject: [PATCH] Change Gio::Action 'transform-translate' to use a tuple Glib::Variant (dd). --- src/actions/actions-transform.cpp | 26 +++++++++----------------- src/inkscape-application.cpp | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/src/actions/actions-transform.cpp b/src/actions/actions-transform.cpp index 3f21a198de..cfb3aeb5b3 100644 --- a/src/actions/actions-transform.cpp +++ b/src/actions/actions-transform.cpp @@ -24,24 +24,14 @@ void transform_translate(const Glib::VariantBase& value, InkscapeApplication *app) { - Glib::Variant s = Glib::VariantBase::cast_dynamic >(value); - - std::vector tokens = Glib::Regex::split_simple(",", s.get()); - if (tokens.size() != 2) { - std::cerr << "action:transform_translate: requires two comma separated numbers" << std::endl; - return; - } - double dx = 0; - double dy = 0; - - try { - dx = std::stod(tokens[0]); - dy = std::stod(tokens[1]); - } catch (...) { - std::cerr << "action:transform-move: invalid arguments" << std::endl; - return; + if (value.get_type_string() != "(dd)") { + std::cerr << "transform_translate: wrong variant type: " << value.get_type_string() << " (should be '(dd)')" << std::endl; } + auto tuple = Glib::VariantBase::cast_dynamic>>(value); + + auto [dx, dy] = tuple.get(); + auto selection = app->get_active_selection(); selection->move(dx, dy); @@ -102,12 +92,14 @@ add_actions_transform(ConcreteInkscapeApplication* app) Glib::VariantType Int( Glib::VARIANT_TYPE_INT32); Glib::VariantType Double(Glib::VARIANT_TYPE_DOUBLE); Glib::VariantType String(Glib::VARIANT_TYPE_STRING); + std::vector dd = {Glib::VARIANT_TYPE_DOUBLE, Glib::VARIANT_TYPE_DOUBLE}; + Glib::VariantType Tuple_DD = Glib::VariantType::create_tuple(dd); // Debian 9 has 2.50.0 #if GLIB_CHECK_VERSION(2, 52, 0) // clang-format off - app->add_action_with_parameter( "transform-translate", String, sigc::bind(sigc::ptr_fun(&transform_translate), app)); + app->add_action_with_parameter( "transform-translate", Tuple_DD, sigc::bind(sigc::ptr_fun(&transform_translate), app)); app->add_action_with_parameter( "transform-rotate", Double, sigc::bind(sigc::ptr_fun(&transform_rotate), app)); app->add_action_with_parameter( "transform-scale", Double, sigc::bind(sigc::ptr_fun(&transform_scale), app)); app->add_action( "transform-remove", sigc::bind(sigc::ptr_fun(&transform_remove), app)); diff --git a/src/inkscape-application.cpp b/src/inkscape-application.cpp index adbf2f3e35..eb439505f3 100644 --- a/src/inkscape-application.cpp +++ b/src/inkscape-application.cpp @@ -1110,6 +1110,25 @@ ConcreteInkscapeApplication::parse_actions(const Glib::ustring& input, action } else if (type.get_string() == "s") { action_vector.push_back( std::make_pair( action, Glib::Variant::create(value) )); + } else if (type.get_string() == "(dd)") { + std::vector tokens3 = Glib::Regex::split_simple(",", value); + if (tokens3.size() != 2) { + std::cerr << "InkscapeApplication::parse_actions: " << action << " requires two comma separated numbers" << std::endl; + continue; + } + double d0 = 0; + double d1 = 0; + + try { + d0 = std::stod(tokens3[0]); + d1 = std::stod(tokens3[1]); + } catch (...) { + std::cerr << "InkscapeApplication::parse_actions: " << action << " requires two comma separated numbers" << std::endl; + continue; + } + + action_vector.push_back( + std::make_pair( action, Glib::Variant>::create(std::tuple(d0, d1)))); } else { std::cerr << "InkscapeApplication::parse_actions: unhandled action value: " << action << ": " << type.get_string() << std::endl; -- GitLab