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 | |
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')
-rw-r--r-- | libs/gtkmm2ext/action_model.cc | 118 | ||||
-rw-r--r-- | libs/gtkmm2ext/gtkmm2ext/action_model.h | 65 | ||||
-rw-r--r-- | libs/gtkmm2ext/wscript | 1 |
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', |