#include <gtkmm/menu.h>
#include <gtkmm/menushell.h>
#include <gtkmm/treeview.h>
+
+#include "pbd/strsplit.h"
#include "pbd/xml++.h"
+
#include "visibility_group.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
* @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.
+ * @param override A functor to decide whether the visibility specified by the member should be
+ * overridden by some external factor; if the returned optional value is given, it will be used
+ * to override whatever visibility setting the member has.
*/
void
-VisibilityGroup::add (Gtk::Widget* widget, string const & id, string const & name, bool visible)
+VisibilityGroup::add (Gtk::Widget* widget, string const & id, string const & name, bool visible, boost::function<boost::optional<bool> ()> override)
{
Member m;
m.widget = widget;
m.id = id;
m.name = name;
m.visible = visible;
-
+ m.override = override;
+
_members.push_back (m);
}
return m;
}
+/** @return true if the member should be visible, even taking into account any override functor */
+bool
+VisibilityGroup::should_actually_be_visible (Member const & m) const
+{
+ if (m.override) {
+ boost::optional<bool> o = m.override ();
+ if (o) {
+ return o.get ();
+ }
+ }
+
+ return m.visible;
+}
+
/** 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) {
+ if (should_actually_be_visible (*i)) {
i->widget->show ();
} else {
i->widget->hide ();
}
v = v.substr (comma + 1);
-
+
} while (1);
update ();
}
+string
+VisibilityGroup::remove_element (std::string const& from, std::string const& element)
+{
+ std::vector<string> s;
+ std::string ret;
+
+ split (from, s, ',');
+ for (std::vector<string>::const_iterator i = s.begin(); i != s.end(); ++i) {
+ if ((*i) == element) {
+ continue;
+ }
+ if (!ret.empty()) {
+ ret += ',';
+ }
+ ret += *i;
+ }
+
+ return ret;
+}
+
+string
+VisibilityGroup::add_element (std::string const& from, std::string const& element)
+{
+ std::vector<string> s;
+ std::string ret;
+
+ split (from, s, ',');
+
+ for (std::vector<string>::const_iterator i = s.begin(); i != s.end(); ++i) {
+ if ((*i) == element) {
+ /* already present, just return the original */
+ return from;
+ }
+ }
+
+ ret = from;
+
+ if (!ret.empty()) {
+ ret += ',';
+ }
+
+ ret += element;
+
+ return ret;
+}
+
string
VisibilityGroup::get_state_name () const
{
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;
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);
+ 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;
if (_ignore_list_view_change) {
return;
}
-
+
Gtk::TreeModel::iterator i = _model->get_iter (path);
if (!i) {
return;