X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fgtkmm2ext%2Factions.cc;h=74533f96a4b087393164fcfbeeb857fdb707a00c;hb=99c1aacc236fcba1f297804baf9f5d1b0825e2ee;hp=1145987764727669ffeec15612957033ff8b85d4;hpb=0fe48475db40e30d921a90921d4112e9c0a000a6;p=ardour.git diff --git a/libs/gtkmm2ext/actions.cc b/libs/gtkmm2ext/actions.cc index 1145987764..74533f96a4 100644 --- a/libs/gtkmm2ext/actions.cc +++ b/libs/gtkmm2ext/actions.cc @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -32,6 +33,7 @@ #include "pbd/error.h" #include "gtkmm2ext/actions.h" +#include "gtkmm2ext/utils.h" #include "i18n.h" @@ -40,6 +42,7 @@ using namespace Gtk; using namespace Glib; using namespace sigc; using namespace PBD; +using namespace Gtkmm2ext; RefPtr ActionManager::ui_manager; string ActionManager::unbound_string = "--"; @@ -79,6 +82,19 @@ ActionManager::register_radio_action (RefPtr group, RadioAction::Gr return act; } +RefPtr +ActionManager::register_radio_action ( + RefPtr group, RadioAction::Group& rgroup, string const & name, string const & label, string const & tooltip, slot sl + ) +{ + RefPtr act; + + act = RadioAction::create (rgroup, name, label, tooltip); + group->add (act, sl); + + return act; +} + RefPtr ActionManager::register_toggle_action (RefPtr group, const char * name, const char * label, slot sl) { @@ -90,6 +106,17 @@ ActionManager::register_toggle_action (RefPtr group, const char * n return act; } +RefPtr +ActionManager::register_toggle_action (RefPtr group, string const & name, string const & label, string const & tooltip, slot sl) +{ + RefPtr act; + + act = ToggleAction::create (name, label, tooltip); + group->add (act, sl); + + return act; +} + bool ActionManager::lookup_entry (const ustring accel_path, Gtk::AccelKey& key) { @@ -114,7 +141,7 @@ struct SortActionsByLabel { }; void -ActionManager::get_all_actions (vector& groups, vector& names, vector& bindings) +ActionManager::get_all_actions (vector& groups, vector& names, vector& tooltips, vector& bindings) { /* the C++ API for functions used here appears to be broken in gtkmm2.6, so we fall back to the C level. @@ -149,6 +176,7 @@ ActionManager::get_all_actions (vector& groups, vector& names, v groups.push_back (gtk_action_group_get_name(group)); names.push_back (accel_path.substr (accel_path.find_last_of ('/') + 1)); + tooltips.push_back ((*a)->get_tooltip ()); AccelKey key; lookup_entry (accel_path, key); @@ -158,7 +186,7 @@ ActionManager::get_all_actions (vector& groups, vector& names, v } void -ActionManager::get_all_actions (vector& names, vector& paths, vector& keys, vector& bindings) +ActionManager::get_all_actions (vector& names, vector& paths, vector& tooltips, vector& keys, vector& bindings) { /* the C++ API for functions used here appears to be broken in gtkmm2.6, so we fall back to the C level. @@ -189,11 +217,12 @@ ActionManager::get_all_actions (vector& names, vector& paths, ve for (action_list::iterator a = the_acts.begin(); a != the_acts.end(); ++a) { - string accel_path = (*a)->get_accel_path (); - ustring label = (*a)->property_label(); + ustring const label = (*a)->property_label (); + string const accel_path = (*a)->get_accel_path (); names.push_back (label); paths.push_back (accel_path); + tooltips.push_back ((*a)->get_tooltip ()); AccelKey key; keys.push_back (get_key_representation (accel_path, key)); @@ -217,14 +246,35 @@ ActionManager::get_widget (const char * name) RefPtr ActionManager::get_action (const char* path) { - GtkAction* _act; - RefPtr act; + if (!path) { + return RefPtr(); + } + + /* Skip / in path */ + + int len = strlen (path); - if ((_act = gtk_ui_manager_get_action (ui_manager->gobj(), path)) != 0) { - return Glib::wrap (_act, true); + if (len < 3) { + /* shortest possible path: "a/b" */ + return RefPtr(); } - return act; + if (len > 10 && !strncmp (path, "/", 10 )) { + path = path+10; + } else if (path[0] == '/') { + path++; + } + + char copy[len+1]; + strcpy (copy, path); + char* slash = strchr (copy, '/'); + if (!slash) { + return RefPtr (); + } + *slash = '\0'; + + return get_action (copy, ++slash); + } RefPtr @@ -234,6 +284,10 @@ ActionManager::get_action (const char* group_name, const char* action_name) gtkmm2.6, so we fall back to the C level. */ + if (ui_manager == 0) { + return RefPtr (); + } + GList* list = gtk_ui_manager_get_action_groups (ui_manager->gobj()); GList* node; RefPtr act; @@ -256,6 +310,32 @@ ActionManager::get_action (const char* group_name, const char* action_name) return act; } +RefPtr +ActionManager::get_action_from_name (const char* name) +{ + /* the C++ API for functions used here appears to be broken in + gtkmm2.6, so we fall back to the C level. + */ + + GList* list = gtk_ui_manager_get_action_groups (ui_manager->gobj()); + GList* node; + GList* acts; + + for (node = list; node; node = g_list_next (node)) { + + GtkActionGroup* group = (GtkActionGroup*) node->data; + + for (acts = gtk_action_group_list_actions (group); acts; acts = g_list_next (acts)) { + GtkAction* action = (GtkAction*) acts->data; + if (!strcmp (gtk_action_get_name (action), name)) { + return Glib::wrap (action, true); + } + } + } + + return RefPtr(); +} + void ActionManager::set_sensitive (vector >& actions, bool state) { @@ -265,8 +345,10 @@ ActionManager::set_sensitive (vector >& actions, bool state) } void -ActionManager::uncheck_toggleaction (const char * name) +ActionManager::uncheck_toggleaction (string n) { + char const * name = n.c_str (); + const char *last_slash = strrchr (name, '/'); if (last_slash == 0) { @@ -294,3 +376,39 @@ ActionManager::uncheck_toggleaction (const char * name) delete [] group_name; } + +string +ActionManager::get_key_representation (const string& accel_path, AccelKey& key) +{ + bool known = lookup_entry (accel_path, key); + + if (known) { + uint32_t k = possibly_translate_legal_accelerator_to_real_key (key.get_key()); + key = AccelKey (k, Gdk::ModifierType (key.get_mod())); + return ui_manager->get_accel_group()->get_label (key.get_key(), Gdk::ModifierType (key.get_mod())); + } + + return unbound_string; +} + +void +ActionManager::do_action (const char* group, const char*action) +{ + Glib::RefPtr act = ActionManager::get_action (group, action); + if (act) { + act->activate (); + } +} + +void +ActionManager::set_toggle_action (const char* group, const char*action, bool yn) +{ + Glib::RefPtr act = ActionManager::get_action (group, action); + if (act) { + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic (act); + if (tact) { + tact->set_active (yn); + } + } +} +