summaryrefslogtreecommitdiffstats
path: root/src/gui/PortMenu.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2010-01-29 07:58:13 +0000
committerDavid Robillard <d@drobilla.net>2010-01-29 07:58:13 +0000
commitf02ac2f82a0342c3e548a81950734b4bce383b7d (patch)
tree06a51f5be2d41bdd8a52f1a6f8888f5f4d3db5f5 /src/gui/PortMenu.cpp
parent96613df7830699dbbfb5c2d9fe3ebdb0598e6aca (diff)
downloadingen-f02ac2f82a0342c3e548a81950734b4bce383b7d.tar.gz
ingen-f02ac2f82a0342c3e548a81950734b4bce383b7d.tar.bz2
ingen-f02ac2f82a0342c3e548a81950734b4bce383b7d.zip
Improved/quicker/easier handling of control port ranges.
* Add "Set minimum to current value", "Set maximum to current value", and "Reset range" to control port context menu. * Only serialise properties (e.g. lv2:minimum) if they differ from the meta object's (prototype's, e.g. plugin) value. git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@2395 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/gui/PortMenu.cpp')
-rw-r--r--src/gui/PortMenu.cpp65
1 files changed, 64 insertions, 1 deletions
diff --git a/src/gui/PortMenu.cpp b/src/gui/PortMenu.cpp
index 3cb8c071..4a6ce582 100644
--- a/src/gui/PortMenu.cpp
+++ b/src/gui/PortMenu.cpp
@@ -32,6 +32,10 @@ PortMenu::PortMenu(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml
: ObjectMenu(cobject, xml)
, _patch_port(NULL)
{
+ xml->get_widget("port_menu", _port_menu);
+ xml->get_widget("port_set_min_menuitem", _set_min_menuitem);
+ xml->get_widget("port_set_max_menuitem", _set_max_menuitem);
+ xml->get_widget("port_reset_range_menuitem", _reset_range_menuitem);
}
@@ -41,6 +45,15 @@ PortMenu::init(SharedPtr<PortModel> port, bool patch_port)
ObjectMenu::init(port);
_patch_port = patch_port;
+ _set_min_menuitem->signal_activate().connect(sigc::mem_fun(this,
+ &PortMenu::on_menu_set_min));
+
+ _set_max_menuitem->signal_activate().connect(sigc::mem_fun(this,
+ &PortMenu::on_menu_set_max));
+
+ _reset_range_menuitem->signal_activate().connect(sigc::mem_fun(this,
+ &PortMenu::on_menu_reset_range));
+
if ( ! PtrCast<PatchModel>(port->parent()) ) {
_polyphonic_menuitem->set_sensitive(false);
_rename_menuitem->hide();
@@ -50,9 +63,21 @@ PortMenu::init(SharedPtr<PortModel> port, bool patch_port)
if (port->type() == PortType::EVENTS)
_polyphonic_menuitem->hide();
- if (port->type() == PortType::CONTROL)
+ if (port->type() == PortType::CONTROL) {
_learn_menuitem->show();
+ items().push_front(Gtk::Menu_Helpers::SeparatorElem());
+
+ _port_menu->remove(*_reset_range_menuitem);
+ insert(*_reset_range_menuitem, 0);
+
+ _port_menu->remove(*_set_max_menuitem);
+ insert(*_set_max_menuitem, 0);
+
+ _port_menu->remove(*_set_min_menuitem);
+ insert(*_set_min_menuitem, 0);
+ }
+
_enable_signal = true;
}
@@ -70,6 +95,44 @@ PortMenu::on_menu_disconnect()
}
+void
+PortMenu::on_menu_set_min()
+{
+ SharedPtr<PortModel> model = PtrCast<PortModel>(_object);
+ const Raul::Atom& value = model->get_property("ingen:value");
+ std::cout << model->path() << " SET MIN " << value << std::endl;
+ if (value.is_valid())
+ App::instance().engine()->set_property(_object->path(), "lv2:minimum", value);
+}
+
+
+void
+PortMenu::on_menu_set_max()
+{
+ SharedPtr<PortModel> model = PtrCast<PortModel>(_object);
+ const Raul::Atom& value = model->get_property("ingen:value");
+ if (value.is_valid())
+ App::instance().engine()->set_property(_object->path(), "lv2:maximum", value);
+}
+
+
+void
+PortMenu::on_menu_reset_range()
+{
+ SharedPtr<PortModel> model = PtrCast<PortModel>(_object);
+ SharedPtr<NodeModel> parent = PtrCast<NodeModel>(_object->parent());
+
+ float min, max;
+ parent->default_port_value_range(model, min, max);
+
+ if (!isnan(min))
+ App::instance().engine()->set_property(_object->path(), "lv2:minimum", min);
+
+ if (!isnan(max))
+ App::instance().engine()->set_property(_object->path(), "lv2:maximum", max);
+}
+
+
} // namespace GUI
} // namespace Ingen