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 + +#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 NodeMap; + NodeMap nodes; + NodeMap::iterator r; + + TreeIter rowp; + TreeModel::Row parent; + + rowp = _model->append (); + parent = *(rowp); + parent[_columns.name] = _("Disabled"); + + vector paths; + vector labels; + vector tooltips; + vector keys; + vector > actions; + + ActionManager::get_all_actions (paths, labels, tooltips, keys, actions); + + vector::iterator k; + vector::iterator p; + vector::iterator t; + vector::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 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 + +#include +#include + +#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 model () const { return _model; } + + const Gtk::TreeModelColumn& name () const { return _columns.name; } + const Gtk::TreeModelColumn& path () const { return _columns.path; } + + struct Columns : public Gtk::TreeModel::ColumnRecord { + Columns() { + add (name); + add (path); + } + Gtk::TreeModelColumn name; + Gtk::TreeModelColumn path; + }; + + const Columns& columns() const { return _columns; } + +private: + ActionModel (); + + const Columns _columns; + Glib::RefPtr _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',