summaryrefslogtreecommitdiff
path: root/gtk2_ardour/visibility_group.cc
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2011-10-29 20:18:06 +0000
committerCarl Hetherington <carl@carlh.net>2011-10-29 20:18:06 +0000
commit10064587507ab9bc3d73c82971a46fdb3718f7e3 (patch)
tree51ed6d1c04a37771850d634e3cbef5fc074581f0 /gtk2_ardour/visibility_group.cc
parentdb429c2362f69664805c14419b95ad6b02759948 (diff)
Add missing files.
git-svn-id: svn://localhost/ardour2/branches/3.0@10342 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/visibility_group.cc')
-rw-r--r--gtk2_ardour/visibility_group.cc233
1 files changed, 233 insertions, 0 deletions
diff --git a/gtk2_ardour/visibility_group.cc b/gtk2_ardour/visibility_group.cc
new file mode 100644
index 0000000000..ecdf12be33
--- /dev/null
+++ b/gtk2_ardour/visibility_group.cc
@@ -0,0 +1,233 @@
+/*
+ Copyright (C) 2011 Paul Davis
+ Author: Carl Hetherington <cth@carlh.net>
+
+ 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 <gtkmm/menu.h>
+#include <gtkmm/menushell.h>
+#include <gtkmm/treeview.h>
+#include "pbd/xml++.h"
+#include "visibility_group.h"
+
+#include "i18n.h"
+
+using namespace std;
+
+VisibilityGroup::VisibilityGroup (std::string const & name)
+ : _xml_property_name (name)
+ , _ignore_list_view_change (false)
+{
+
+}
+
+/** Add a widget to the group.
+ * @param widget The widget.
+ * @param id Some single-word ID to be used for the state of this member in XML.
+ * @param name User-visible name for the widget.
+ * @param visible true to default to visible, otherwise false.
+ */
+
+void
+VisibilityGroup::add (Gtk::Widget* widget, string const & id, string const & name, bool visible)
+{
+ Member m;
+ m.widget = widget;
+ m.id = id;
+ m.name = name;
+ m.visible = visible;
+
+ _members.push_back (m);
+}
+
+/** Pop up a menu (on right-click) to configure visibility of members */
+bool
+VisibilityGroup::button_press_event (GdkEventButton* ev)
+{
+ if (ev->button != 3) {
+ return false;
+ }
+
+ menu()->popup (1, ev->time);
+ return true;
+}
+
+Gtk::Menu*
+VisibilityGroup::menu ()
+{
+ using namespace Gtk::Menu_Helpers;
+
+ Gtk::Menu* m = Gtk::manage (new Gtk::Menu);
+ MenuList& items = m->items ();
+
+ for (vector<Member>::iterator i = _members.begin(); i != _members.end(); ++i) {
+ items.push_back (CheckMenuElem (i->name));
+ Gtk::CheckMenuItem* j = dynamic_cast<Gtk::CheckMenuItem*> (&items.back ());
+ j->set_active (i->visible);
+ j->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &VisibilityGroup::toggle), i));
+ }
+
+ return m;
+}
+
+/** Update visible consequences of any changes to our _members vector */
+void
+VisibilityGroup::update ()
+{
+ for (vector<Member>::iterator i = _members.begin(); i != _members.end(); ++i) {
+ if (i->widget) {
+ if (i->visible) {
+ cout << "VG show " << i->name << "\n";
+ i->widget->show ();
+ } else {
+ cout << "VG hide " << i->name << "\n";
+ i->widget->hide ();
+ }
+ }
+ }
+
+ update_list_view ();
+
+ VisibilityChanged (); /* EMIT SIGNAL */
+}
+
+void
+VisibilityGroup::toggle (vector<Member>::iterator m)
+{
+ m->visible = !m->visible;
+ update ();
+}
+
+void
+VisibilityGroup::set_state (XMLNode const & node)
+{
+ XMLProperty const * p = node.property (_xml_property_name);
+ if (!p) {
+ return;
+ }
+
+ set_state (p->value ());
+}
+
+void
+VisibilityGroup::set_state (string v)
+{
+ for (vector<Member>::iterator i = _members.begin(); i != _members.end(); ++i) {
+ i->visible = false;
+ }
+
+ do {
+ string::size_type const comma = v.find_first_of (',');
+ string segment = v.substr (0, comma);
+
+ for (vector<Member>::iterator i = _members.begin(); i != _members.end(); ++i) {
+ if (segment == i->id) {
+ i->visible = true;
+ }
+ }
+
+ if (comma == string::npos) {
+ break;
+ }
+
+ v = v.substr (comma + 1);
+
+ } while (1);
+
+ update ();
+}
+
+string
+VisibilityGroup::get_state_name () const
+{
+ return _xml_property_name;
+}
+
+string
+VisibilityGroup::get_state_value () const
+{
+ string result;
+ for (vector<Member>::const_iterator i = _members.begin(); i != _members.end(); ++i) {
+ if (i->visible) {
+ if (!result.empty ()) {
+ result += ',';
+ }
+ result += i->id;
+ }
+ }
+
+ return result;
+}
+
+void
+VisibilityGroup::update_list_view ()
+{
+ if (!_model) {
+ return;
+ }
+
+ _ignore_list_view_change = true;
+
+ _model->clear ();
+
+ for (vector<Member>::iterator i = _members.begin(); i != _members.end(); ++i) {
+ Gtk::TreeModel::iterator j = _model->append ();
+ Gtk::TreeModel::Row row = *j;
+ row[_model_columns._visible] = i->visible;
+ row[_model_columns._name] = i->name;
+ row[_model_columns._iterator] = i;
+ }
+
+ _ignore_list_view_change = false;
+}
+
+Gtk::Widget *
+VisibilityGroup::list_view ()
+{
+ _model = Gtk::ListStore::create (_model_columns);
+
+ update_list_view ();
+
+ Gtk::TreeView* v = Gtk::manage (new Gtk::TreeView (_model));
+ v->set_headers_visible (false);
+ v->append_column (_(""), _model_columns._visible);
+ v->append_column (_(""), _model_columns._name);
+
+ Gtk::CellRendererToggle* visible_cell = dynamic_cast<Gtk::CellRendererToggle*> (v->get_column_cell_renderer (0));
+ visible_cell->property_activatable() = true;
+ visible_cell->signal_toggled().connect (sigc::mem_fun (*this, &VisibilityGroup::list_view_visible_changed));
+ return v;
+}
+
+void
+VisibilityGroup::list_view_visible_changed (string const & path)
+{
+ if (_ignore_list_view_change) {
+ return;
+ }
+
+ Gtk::TreeModel::iterator i = _model->get_iter (path);
+ if (!i) {
+ return;
+ }
+
+ vector<Member>::iterator j = (*i)[_model_columns._iterator];
+ j->visible = !j->visible;
+ (*i)[_model_columns._visible] = j->visible;
+
+ update ();
+}