diff options
author | Johannes Mueller <github@johannes-mueller.org> | 2019-04-20 12:37:07 +0200 |
---|---|---|
committer | Johannes Mueller <github@johannes-mueller.org> | 2019-04-20 15:25:32 +0200 |
commit | b141d17274c5d778fc8847e6129b37105be858ae (patch) | |
tree | d5987acde88b56aef27e4e2b03d69cab4742d1c2 /libs/gtkmm2ext/action_model.cc | |
parent | 8cbbd3dd00af150ac6b4f2f33771fa12b4a36f21 (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/action_model.cc')
-rw-r--r-- | libs/gtkmm2ext/action_model.cc | 118 |
1 files changed, 118 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; + } +} |