From 10064587507ab9bc3d73c82971a46fdb3718f7e3 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 29 Oct 2011 20:18:06 +0000 Subject: Add missing files. git-svn-id: svn://localhost/ardour2/branches/3.0@10342 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/visibility_group.cc | 233 ++++++++++++++++++++++++++++++++++++++++ gtk2_ardour/visibility_group.h | 85 +++++++++++++++ 2 files changed, 318 insertions(+) create mode 100644 gtk2_ardour/visibility_group.cc create mode 100644 gtk2_ardour/visibility_group.h 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 + + 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 +#include +#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::iterator i = _members.begin(); i != _members.end(); ++i) { + items.push_back (CheckMenuElem (i->name)); + Gtk::CheckMenuItem* j = dynamic_cast (&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::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::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::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::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::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::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 (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::iterator j = (*i)[_model_columns._iterator]; + j->visible = !j->visible; + (*i)[_model_columns._visible] = j->visible; + + update (); +} diff --git a/gtk2_ardour/visibility_group.h b/gtk2_ardour/visibility_group.h new file mode 100644 index 0000000000..d9e13e1e93 --- /dev/null +++ b/gtk2_ardour/visibility_group.h @@ -0,0 +1,85 @@ +/* + Copyright (C) 2011 Paul Davis + Author: Carl Hetherington + + 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. + +*/ + +#ifndef __ardour_visibility_group__ +#define __ardour_visibility_group__ + +#include +#include "pbd/signals.h" + +class XMLNode; +class XMLProperty; + +/** A class to manage a group of widgets where the visibility of each + * can be configured by the user. The class can generate a menu to + * set up visibility, and save and restore visibility state to XML. + */ + +class VisibilityGroup +{ +public: + VisibilityGroup (std::string const &); + + void add (Gtk::Widget *, std::string const &, std::string const &, bool visible = true); + Gtk::Menu* menu (); + Gtk::Widget* list_view (); + bool button_press_event (GdkEventButton *); + void update (); + void set_state (XMLNode const &); + void set_state (std::string); + std::string get_state_name () const; + std::string get_state_value () const; + + PBD::Signal0 VisibilityChanged; + +private: + + struct Member { + Gtk::Widget* widget; + std::string id; + std::string name; + bool visible; + }; + + class ModelColumns : public Gtk::TreeModelColumnRecord { + public: + ModelColumns () { + add (_visible); + add (_name); + add (_iterator); + } + + Gtk::TreeModelColumn _visible; + Gtk::TreeModelColumn _name; + Gtk::TreeModelColumn::iterator> _iterator; + }; + + void toggle (std::vector::iterator); + void list_view_visible_changed (std::string const &); + void update_list_view (); + + std::vector _members; + std::string _xml_property_name; + ModelColumns _model_columns; + Glib::RefPtr _model; + bool _ignore_list_view_change; +}; + +#endif -- cgit v1.2.3