summaryrefslogtreecommitdiff
path: root/libs/gtkmm2ext
diff options
context:
space:
mode:
authorJohannes Mueller <github@johannes-mueller.org>2019-04-20 12:37:07 +0200
committerJohannes Mueller <github@johannes-mueller.org>2019-04-20 15:25:32 +0200
commitb141d17274c5d778fc8847e6129b37105be858ae (patch)
treed5987acde88b56aef27e4e2b03d69cab4742d1c2 /libs/gtkmm2ext
parent8cbbd3dd00af150ac6b4f2f33771fa12b4a36f21 (diff)
Provide an API to get all available actions by one singleton class
The singleton ActionModel provides a Gtk::Treestore of all actions known to ardour. To be used for example by surface control editors to implement action bindings.
Diffstat (limited to 'libs/gtkmm2ext')
-rw-r--r--libs/gtkmm2ext/action_model.cc118
-rw-r--r--libs/gtkmm2ext/gtkmm2ext/action_model.h65
-rw-r--r--libs/gtkmm2ext/wscript1
3 files changed, 184 insertions, 0 deletions
diff --git a/libs/gtkmm2ext/action_model.cc b/libs/gtkmm2ext/action_model.cc
new file mode 100644
index 0000000000..cc3b62d9a6
--- /dev/null
+++ b/libs/gtkmm2ext/action_model.cc
@@ -0,0 +1,118 @@
+/*
+ Copyright (C) 2009-2013 Paul Davis
+ Author: Johannes Mueller
+
+ 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 <vector>
+
+#include "pbd/i18n.h"
+#include "pbd/strsplit.h"
+
+#include "gtkmm2ext/actions.h"
+#include "gtkmm2ext/action_model.h"
+
+using namespace std;
+using namespace Gtk;
+
+const ActionManager::ActionModel&
+ActionManager::ActionModel::instance ()
+{
+ static ActionManager::ActionModel am;
+ return am;
+}
+
+ActionManager::ActionModel::ActionModel ()
+{
+ _model = TreeStore::create (_columns);
+ _model->clear ();
+
+ typedef std::map<string,TreeIter> NodeMap;
+ NodeMap nodes;
+ NodeMap::iterator r;
+
+ TreeIter rowp;
+ TreeModel::Row parent;
+
+ rowp = _model->append ();
+ parent = *(rowp);
+ parent[_columns.name] = _("Disabled");
+
+ vector<string> paths;
+ vector<string> labels;
+ vector<string> tooltips;
+ vector<string> keys;
+ vector<Glib::RefPtr<Gtk::Action> > actions;
+
+ ActionManager::get_all_actions (paths, labels, tooltips, keys, actions);
+
+ vector<string>::iterator k;
+ vector<string>::iterator p;
+ vector<string>::iterator t;
+ vector<string>::iterator l;
+
+ for (l = labels.begin(), k = keys.begin(), p = paths.begin(), t = tooltips.begin(); l != labels.end(); ++k, ++p, ++t, ++l) {
+
+ TreeModel::Row row;
+ vector<string> parts;
+ parts.clear ();
+ split (*p, parts, '/');
+
+ if (parts.empty()) {
+ continue;
+ }
+
+ //kinda kludgy way to avoid displaying menu items as mappable
+ if ( parts[0] == _("Main_menu") )
+ continue;
+ if ( parts[0] == _("JACK") )
+ continue;
+ if ( parts[0] == _("redirectmenu") )
+ continue;
+ if ( parts[0] == _("Editor_menus") )
+ continue;
+ if ( parts[0] == _("RegionList") )
+ continue;
+ if ( parts[0] == _("ProcessorMenu") )
+ continue;
+
+ if ((r = nodes.find (parts[0])) == nodes.end()) {
+ /* top level is missing */
+
+ TreeIter rowp;
+ TreeModel::Row parent;
+ rowp = _model->append();
+ nodes[parts[0]] = rowp;
+ parent = *(rowp);
+ parent[_columns.name] = parts[0];
+
+ row = *(_model->append (parent.children()));
+ } else {
+ row = *(_model->append ((*r->second)->children()));
+ }
+
+ /* add this action */
+
+ if (l->empty ()) {
+ row[_columns.name] = *t;
+ } else {
+ row[_columns.name] = *l;
+ }
+
+ row[_columns.path] = *p;
+ }
+}
diff --git a/libs/gtkmm2ext/gtkmm2ext/action_model.h b/libs/gtkmm2ext/gtkmm2ext/action_model.h
new file mode 100644
index 0000000000..b269499ecc
--- /dev/null
+++ b/libs/gtkmm2ext/gtkmm2ext/action_model.h
@@ -0,0 +1,65 @@
+/*
+ Copyright (C) 2009-2013 Paul Davis
+ Author: Johannes Mueller
+
+ 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#include <string>
+
+#include <gtkmm/treestore.h>
+#include <gtkmm/treemodelcolumn.h>
+
+#include "gtkmm2ext/visibility.h"
+
+/*
+ The singleton ActionModel provides a Gtk::Treestore of all actions known to
+ ardour.
+
+ To be used for example by surface control editors to implement action bindings.
+*/
+
+namespace ActionManager {
+
+class LIBGTKMM2EXT_API ActionModel
+{
+public:
+ static const ActionModel& instance ();
+
+ const Glib::RefPtr<Gtk::TreeStore> model () const { return _model; }
+
+ const Gtk::TreeModelColumn<std::string>& name () const { return _columns.name; }
+ const Gtk::TreeModelColumn<std::string>& path () const { return _columns.path; }
+
+ struct Columns : public Gtk::TreeModel::ColumnRecord {
+ Columns() {
+ add (name);
+ add (path);
+ }
+ Gtk::TreeModelColumn<std::string> name;
+ Gtk::TreeModelColumn<std::string> path;
+ };
+
+ const Columns& columns() const { return _columns; }
+
+private:
+ ActionModel ();
+
+ const Columns _columns;
+ Glib::RefPtr<Gtk::TreeStore> _model;
+};
+
+}
diff --git a/libs/gtkmm2ext/wscript b/libs/gtkmm2ext/wscript
index 605596f951..7a64ea01d3 100644
--- a/libs/gtkmm2ext/wscript
+++ b/libs/gtkmm2ext/wscript
@@ -24,6 +24,7 @@ I18N_PACKAGE = 'gtkmm2ext3'
gtkmm2ext_sources = [
'actions.cc',
+ 'action_model.cc',
'application.cc',
'bindings.cc',
'cairo_packer.cc',