2 Copyright (C) 2011 Paul Davis
3 Author: Carl Hetherington <cth@carlh.net>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include <gtkmm/menu.h>
22 #include <gtkmm/menushell.h>
23 #include <gtkmm/treeview.h>
24 #include "pbd/xml++.h"
25 #include "visibility_group.h"
31 VisibilityGroup::VisibilityGroup (std::string const & name)
32 : _xml_property_name (name)
33 , _ignore_list_view_change (false)
38 /** Add a widget to the group.
39 * @param widget The widget.
40 * @param id Some single-word ID to be used for the state of this member in XML.
41 * @param name User-visible name for the widget.
42 * @param visible true to default to visible, otherwise false.
46 VisibilityGroup::add (Gtk::Widget* widget, string const & id, string const & name, bool visible)
54 _members.push_back (m);
57 /** Pop up a menu (on right-click) to configure visibility of members */
59 VisibilityGroup::button_press_event (GdkEventButton* ev)
61 if (ev->button != 3) {
65 menu()->popup (1, ev->time);
70 VisibilityGroup::menu ()
72 using namespace Gtk::Menu_Helpers;
74 Gtk::Menu* m = Gtk::manage (new Gtk::Menu);
75 MenuList& items = m->items ();
77 for (vector<Member>::iterator i = _members.begin(); i != _members.end(); ++i) {
78 items.push_back (CheckMenuElem (i->name));
79 Gtk::CheckMenuItem* j = dynamic_cast<Gtk::CheckMenuItem*> (&items.back ());
80 j->set_active (i->visible);
81 j->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &VisibilityGroup::toggle), i));
87 /** Update visible consequences of any changes to our _members vector */
89 VisibilityGroup::update ()
91 for (vector<Member>::iterator i = _members.begin(); i != _members.end(); ++i) {
94 cout << "VG show " << i->name << "\n";
97 cout << "VG hide " << i->name << "\n";
105 VisibilityChanged (); /* EMIT SIGNAL */
109 VisibilityGroup::toggle (vector<Member>::iterator m)
111 m->visible = !m->visible;
116 VisibilityGroup::set_state (XMLNode const & node)
118 XMLProperty const * p = node.property (_xml_property_name);
123 set_state (p->value ());
127 VisibilityGroup::set_state (string v)
129 for (vector<Member>::iterator i = _members.begin(); i != _members.end(); ++i) {
134 string::size_type const comma = v.find_first_of (',');
135 string segment = v.substr (0, comma);
137 for (vector<Member>::iterator i = _members.begin(); i != _members.end(); ++i) {
138 if (segment == i->id) {
143 if (comma == string::npos) {
147 v = v.substr (comma + 1);
155 VisibilityGroup::get_state_name () const
157 return _xml_property_name;
161 VisibilityGroup::get_state_value () const
164 for (vector<Member>::const_iterator i = _members.begin(); i != _members.end(); ++i) {
166 if (!result.empty ()) {
177 VisibilityGroup::update_list_view ()
183 _ignore_list_view_change = true;
187 for (vector<Member>::iterator i = _members.begin(); i != _members.end(); ++i) {
188 Gtk::TreeModel::iterator j = _model->append ();
189 Gtk::TreeModel::Row row = *j;
190 row[_model_columns._visible] = i->visible;
191 row[_model_columns._name] = i->name;
192 row[_model_columns._iterator] = i;
195 _ignore_list_view_change = false;
199 VisibilityGroup::list_view ()
201 _model = Gtk::ListStore::create (_model_columns);
205 Gtk::TreeView* v = Gtk::manage (new Gtk::TreeView (_model));
206 v->set_headers_visible (false);
207 v->append_column (_(""), _model_columns._visible);
208 v->append_column (_(""), _model_columns._name);
210 Gtk::CellRendererToggle* visible_cell = dynamic_cast<Gtk::CellRendererToggle*> (v->get_column_cell_renderer (0));
211 visible_cell->property_activatable() = true;
212 visible_cell->signal_toggled().connect (sigc::mem_fun (*this, &VisibilityGroup::list_view_visible_changed));
217 VisibilityGroup::list_view_visible_changed (string const & path)
219 if (_ignore_list_view_change) {
223 Gtk::TreeModel::iterator i = _model->get_iter (path);
228 vector<Member>::iterator j = (*i)[_model_columns._iterator];
229 j->visible = !j->visible;
230 (*i)[_model_columns._visible] = j->visible;