X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fgtkmm2ext%2Factions.cc;h=84a738f278559a84f1a6149327d6e9a8bbaa3abf;hb=66292718a1bde5d333b63c07c19d8d0d187cfc2e;hp=e9ff15fa461f263934cdac1b2ced7713f3920110;hpb=2ba936f0b3ae0472653c1d47c11819c8c5c70cce;p=ardour.git diff --git a/libs/gtkmm2ext/actions.cc b/libs/gtkmm2ext/actions.cc index e9ff15fa46..84a738f278 100644 --- a/libs/gtkmm2ext/actions.cc +++ b/libs/gtkmm2ext/actions.cc @@ -82,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) { @@ -93,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) { @@ -117,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. @@ -152,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); @@ -161,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. @@ -192,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)); @@ -220,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 */ - if ((_act = gtk_ui_manager_get_action (ui_manager->gobj(), path)) != 0) { - return Glib::wrap (_act, true); + int len = strlen (path); + + 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 @@ -237,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; @@ -259,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) { @@ -267,8 +344,20 @@ ActionManager::set_sensitive (vector >& actions, bool state) } } +void +ActionManager::check_toggleaction (string n) +{ + set_toggleaction_state (n, true); +} + void ActionManager::uncheck_toggleaction (string n) +{ + set_toggleaction_state (n, false); +} + +void +ActionManager::set_toggleaction_state (string n, bool s) { char const * name = n.c_str (); @@ -292,7 +381,7 @@ ActionManager::uncheck_toggleaction (string n) RefPtr act = get_action (group_name, action_name); if (act) { RefPtr tact = RefPtr::cast_dynamic(act); - tact->set_active (false); + tact->set_active (s); } else { error << string_compose (_("Unknown action name: %1"), name) << endmsg; } @@ -308,8 +397,30 @@ ActionManager::get_key_representation (const string& accel_path, AccelKey& 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()->name (key.get_key(), 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); + } + } +} +