diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2009-12-04 20:52:04 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2009-12-04 20:52:04 +0000 |
commit | 0fe48475db40e30d921a90921d4112e9c0a000a6 (patch) | |
tree | 146b21ab23d3a9a899c063731d547d5a3a3ebd34 /libs/gtkmm2ext | |
parent | 3293f957bd8424344195603cc8c1f08601453563 (diff) |
switch ActionManager to a namespace; move generic part into libgtkmm2ext
git-svn-id: svn://localhost/ardour2/branches/3.0@6285 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/gtkmm2ext')
-rw-r--r-- | libs/gtkmm2ext/actions.cc | 296 | ||||
-rw-r--r-- | libs/gtkmm2ext/gtkmm2ext/actions.h | 82 | ||||
-rw-r--r-- | libs/gtkmm2ext/wscript | 1 |
3 files changed, 379 insertions, 0 deletions
diff --git a/libs/gtkmm2ext/actions.cc b/libs/gtkmm2ext/actions.cc new file mode 100644 index 0000000000..1145987764 --- /dev/null +++ b/libs/gtkmm2ext/actions.cc @@ -0,0 +1,296 @@ +/* + Copyright (C) 2005 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include <cstring> +#include <vector> +#include <string> +#include <list> + +#include <gtk/gtkaccelmap.h> +#include <gtk/gtkuimanager.h> +#include <gtk/gtkactiongroup.h> + +#include <gtkmm/accelmap.h> +#include <gtkmm/uimanager.h> + +#include "pbd/error.h" + +#include "gtkmm2ext/actions.h" + +#include "i18n.h" + +using namespace std; +using namespace Gtk; +using namespace Glib; +using namespace sigc; +using namespace PBD; + +RefPtr<UIManager> ActionManager::ui_manager; +string ActionManager::unbound_string = "--"; + + +RefPtr<Action> +ActionManager::register_action (RefPtr<ActionGroup> group, const char * name, const char * label, slot<void> sl) +{ + RefPtr<Action> act; + + act = Action::create (name, label); + group->add (act, sl); + + return act; +} + +RefPtr<Action> +ActionManager::register_action (RefPtr<ActionGroup> group, const char * name, const char * label) +{ + RefPtr<Action> act; + + act = Action::create (name, label); + group->add (act); + + return act; +} + + +RefPtr<Action> +ActionManager::register_radio_action (RefPtr<ActionGroup> group, RadioAction::Group& rgroup, const char * name, const char * label, slot<void> sl) +{ + RefPtr<Action> act; + + act = RadioAction::create (rgroup, name, label); + group->add (act, sl); + + return act; +} + +RefPtr<Action> +ActionManager::register_toggle_action (RefPtr<ActionGroup> group, const char * name, const char * label, slot<void> sl) +{ + RefPtr<Action> act; + + act = ToggleAction::create (name, label); + group->add (act, sl); + + return act; +} + +bool +ActionManager::lookup_entry (const ustring accel_path, Gtk::AccelKey& key) +{ + GtkAccelKey gkey; + bool known = gtk_accel_map_lookup_entry (accel_path.c_str(), &gkey); + + if (known) { + key = AccelKey (gkey.accel_key, Gdk::ModifierType (gkey.accel_mods)); + } else { + key = AccelKey (GDK_VoidSymbol, Gdk::ModifierType (0)); + } + + return known; +} + +struct SortActionsByLabel { + bool operator() (Glib::RefPtr<Gtk::Action> a, Glib::RefPtr<Gtk::Action> b) { + ustring astr = a->get_accel_path(); + ustring bstr = b->get_accel_path(); + return astr < bstr; + } +}; + +void +ActionManager::get_all_actions (vector<string>& groups, vector<string>& names, vector<AccelKey>& bindings) +{ + /* 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; + + /* first pass: collect them all */ + + typedef std::list<Glib::RefPtr<Gtk::Action> > action_list; + action_list the_acts; + + for (acts = gtk_action_group_list_actions (group); acts; acts = g_list_next (acts)) { + GtkAction* action = (GtkAction*) acts->data; + the_acts.push_back (Glib::wrap (action, true)); + } + + /* now sort by label */ + + SortActionsByLabel cmp; + the_acts.sort (cmp); + + for (action_list::iterator a = the_acts.begin(); a != the_acts.end(); ++a) { + + string accel_path = (*a)->get_accel_path (); + + groups.push_back (gtk_action_group_get_name(group)); + names.push_back (accel_path.substr (accel_path.find_last_of ('/') + 1)); + + AccelKey key; + lookup_entry (accel_path, key); + bindings.push_back (AccelKey (key.get_key(), Gdk::ModifierType (key.get_mod()))); + } + } +} + +void +ActionManager::get_all_actions (vector<string>& names, vector<string>& paths, vector<string>& keys, vector<AccelKey>& bindings) +{ + /* 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; + + /* first pass: collect them all */ + + typedef std::list<Glib::RefPtr<Gtk::Action> > action_list; + action_list the_acts; + + for (acts = gtk_action_group_list_actions (group); acts; acts = g_list_next (acts)) { + GtkAction* action = (GtkAction*) acts->data; + the_acts.push_back (Glib::wrap (action, true)); + } + + /* now sort by label */ + + SortActionsByLabel cmp; + the_acts.sort (cmp); + + 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(); + + names.push_back (label); + paths.push_back (accel_path); + + AccelKey key; + keys.push_back (get_key_representation (accel_path, key)); + bindings.push_back (AccelKey (key.get_key(), Gdk::ModifierType (key.get_mod()))); + } + } +} + +void +ActionManager::add_action_group (RefPtr<ActionGroup> grp) +{ + ui_manager->insert_action_group (grp); +} + +Widget* +ActionManager::get_widget (const char * name) +{ + return ui_manager->get_widget (name); +} + +RefPtr<Action> +ActionManager::get_action (const char* path) +{ + GtkAction* _act; + RefPtr<Action> act; + + if ((_act = gtk_ui_manager_get_action (ui_manager->gobj(), path)) != 0) { + return Glib::wrap (_act, true); + } + + return act; +} + +RefPtr<Action> +ActionManager::get_action (const char* group_name, const char* action_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; + RefPtr<Action> act; + + for (node = list; node; node = g_list_next (node)) { + + GtkActionGroup* _ag = (GtkActionGroup*) node->data; + + if (strcmp (group_name, gtk_action_group_get_name (_ag)) == 0) { + + GtkAction* _act; + + if ((_act = gtk_action_group_get_action (_ag, action_name)) != 0) { + act = Glib::wrap (_act, true); + break; + } + } + } + + return act; +} + +void +ActionManager::set_sensitive (vector<RefPtr<Action> >& actions, bool state) +{ + for (vector<RefPtr<Action> >::iterator i = actions.begin(); i != actions.end(); ++i) { + (*i)->set_sensitive (state); + } +} + +void +ActionManager::uncheck_toggleaction (const char * name) +{ + const char *last_slash = strrchr (name, '/'); + + if (last_slash == 0) { + fatal << string_compose ("programmer error: %1 %2", "illegal toggle action name", name) << endmsg; + /*NOTREACHED*/ + return; + } + + /* 10 = strlen ("<Actions>/") */ + size_t len = last_slash - (name + 10); + + char* group_name = new char[len+1]; + memcpy (group_name, name + 10, len); + group_name[len] = '\0'; + + const char* action_name = last_slash + 1; + + RefPtr<Action> act = get_action (group_name, action_name); + if (act) { + RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act); + tact->set_active (false); + } else { + error << string_compose (_("Unknown action name: %1"), name) << endmsg; + } + + delete [] group_name; +} diff --git a/libs/gtkmm2ext/gtkmm2ext/actions.h b/libs/gtkmm2ext/gtkmm2ext/actions.h new file mode 100644 index 0000000000..3c3825944f --- /dev/null +++ b/libs/gtkmm2ext/gtkmm2ext/actions.h @@ -0,0 +1,82 @@ +/* + Copyright (C) 2000-2007 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef __libgtkmm2ext_actions_h__ +#define __libgtkmm2ext_actions_h__ + +#include <vector> +#include <gtkmm/action.h> +#include <gtkmm/radioaction.h> +#include <gtkmm/toggleaction.h> +#include <gtkmm/actiongroup.h> +#include <gtkmm/accelkey.h> + +namespace Gtk { + class UIManager; +} + +namespace ActionManager { + + extern std::string unbound_string; /* the key string returned if an action is not bound */ + extern Glib::RefPtr<Gtk::UIManager> ui_manager; + + extern void set_sensitive (std::vector<Glib::RefPtr<Gtk::Action> >& actions, bool); + extern std::string get_key_representation (const std::string& accel_path, Gtk::AccelKey& key); + + extern Gtk::Widget* get_widget (const char * name); + extern Glib::RefPtr<Gtk::Action> get_action (const char* group, const char* name); + extern Glib::RefPtr<Gtk::Action> get_action (const char* path); + + extern void add_action_group (Glib::RefPtr<Gtk::ActionGroup>); + + extern Glib::RefPtr<Gtk::Action> register_action (Glib::RefPtr<Gtk::ActionGroup> group, + const char * name, const char * label); + extern Glib::RefPtr<Gtk::Action> register_action (Glib::RefPtr<Gtk::ActionGroup> group, + const char * name, const char * label, sigc::slot<void> sl, + guint key, Gdk::ModifierType mods); + extern Glib::RefPtr<Gtk::Action> register_action (Glib::RefPtr<Gtk::ActionGroup> group, + const char * name, const char * label, sigc::slot<void> sl); + + extern Glib::RefPtr<Gtk::Action> register_radio_action (Glib::RefPtr<Gtk::ActionGroup> group, Gtk::RadioAction::Group&, + const char * name, const char * label, sigc::slot<void> sl, + guint key, Gdk::ModifierType mods); + extern Glib::RefPtr<Gtk::Action> register_radio_action (Glib::RefPtr<Gtk::ActionGroup> group, Gtk::RadioAction::Group&, + const char * name, const char * label, sigc::slot<void> sl); + + extern Glib::RefPtr<Gtk::Action> register_toggle_action (Glib::RefPtr<Gtk::ActionGroup> group, + const char * name, const char * label, sigc::slot<void> sl, + guint key, Gdk::ModifierType mods); + extern Glib::RefPtr<Gtk::Action> register_toggle_action (Glib::RefPtr<Gtk::ActionGroup> group, + const char * name, const char * label, sigc::slot<void> sl); + + extern bool lookup_entry (const Glib::ustring accel_path, Gtk::AccelKey& key); + + extern void get_all_actions (std::vector<std::string>& names, + std::vector<std::string>& paths, + std::vector<std::string>& keys, + std::vector<Gtk::AccelKey>& bindings); + + extern void get_all_actions (std::vector<std::string>& groups, + std::vector<std::string>& paths, + std::vector<Gtk::AccelKey>& bindings); + + extern void uncheck_toggleaction (const char * actionname); +}; + +#endif /* __libgtkmm2ext_actions_h__ */ diff --git a/libs/gtkmm2ext/wscript b/libs/gtkmm2ext/wscript index 5ca8d5344d..8e348602cb 100644 --- a/libs/gtkmm2ext/wscript +++ b/libs/gtkmm2ext/wscript @@ -19,6 +19,7 @@ APPNAME = 'gtkmm2ext' VERSION = GTKMM2EXT_VERSION gtkmm2ext_sources = [ + 'actions.cc', 'auto_spin.cc', 'barcontroller.cc', 'binding_proxy.cc', |