summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client/PluginModel.cpp19
-rw-r--r--src/gui/Port.cpp33
-rw-r--r--src/gui/Port.hpp3
-rw-r--r--src/shared/URIs.cpp1
4 files changed, 56 insertions, 0 deletions
diff --git a/src/client/PluginModel.cpp b/src/client/PluginModel.cpp
index 9c5bd2bb..7d5aa993 100644
--- a/src/client/PluginModel.cpp
+++ b/src/client/PluginModel.cpp
@@ -185,6 +185,25 @@ PluginModel::port_human_name(uint32_t i) const
return "";
}
+PluginModel::ScalePoints
+PluginModel::port_scale_points(uint32_t i) const
+{
+ // TODO: Non-float scale points
+ ScalePoints points;
+ if (_lilv_plugin) {
+ const LilvPort* port = lilv_plugin_get_port_by_index(_lilv_plugin, i);
+ LilvScalePoints* sp = lilv_port_get_scale_points(_lilv_plugin, port);
+ LILV_FOREACH(scale_points, i, sp) {
+ const LilvScalePoint* p = lilv_scale_points_get(sp, i);
+ points.push_back(
+ std::make_pair(
+ lilv_node_as_float(lilv_scale_point_get_value(p)),
+ lilv_node_as_string(lilv_scale_point_get_label(p))));
+ }
+ }
+ return points;
+}
+
bool
PluginModel::has_ui() const
{
diff --git a/src/gui/Port.cpp b/src/gui/Port.cpp
index 0a7536a2..e99b0285 100644
--- a/src/gui/Port.cpp
+++ b/src/gui/Port.cpp
@@ -163,6 +163,34 @@ Port::value_changed(const Atom& value)
}
}
+void
+Port::on_scale_point_activated(float f)
+{
+ _app.engine()->set_property(model()->path(),
+ _app.world()->uris()->ingen_value,
+ _app.world()->forge().make(f));
+}
+
+Gtk::Menu*
+Port::build_enum_menu()
+{
+ SharedPtr<const NodeModel> node = PtrCast<NodeModel>(model()->parent());
+ Gtk::Menu* menu = Gtk::manage(new Gtk::Menu());
+
+ PluginModel::ScalePoints points = node->plugin_model()->port_scale_points(
+ model()->index());
+ for (PluginModel::ScalePoints::iterator i = points.begin();
+ i != points.end(); ++i) {
+ menu->items().push_back(Gtk::Menu_Helpers::MenuElem(i->second));
+ Gtk::MenuItem* menu_item = &(menu->items().back());
+ menu_item->signal_activate().connect(
+ sigc::bind(sigc::mem_fun(this, &Port::on_scale_point_activated),
+ i->first));
+ }
+
+ return menu;
+}
+
bool
Port::on_event(GdkEvent* ev)
{
@@ -182,6 +210,11 @@ Port::on_event(GdkEvent* ev)
break;
case GDK_BUTTON_PRESS:
if (ev->button.button == 1) {
+ if (model()->is_enumeration()) {
+ Gtk::Menu* menu = build_enum_menu();
+ menu->popup(ev->button.button, ev->button.time);
+ return true;
+ }
_pressed = true;
} else if (ev->button.button == 3) {
return show_menu(&ev->button);
diff --git a/src/gui/Port.hpp b/src/gui/Port.hpp
index f0872e39..0e5ad508 100644
--- a/src/gui/Port.hpp
+++ b/src/gui/Port.hpp
@@ -19,6 +19,7 @@
#include <cassert>
#include <string>
+#include <gtkmm/menu.h>
#include "ganv/Port.hpp"
#include "raul/SharedPtr.hpp"
#include "raul/WeakPtr.hpp"
@@ -70,12 +71,14 @@ private:
const std::string& name,
bool flip = false);
+ Gtk::Menu* build_enum_menu();
PatchBox* get_patch_box() const;
void property_changed(const Raul::URI& key, const Raul::Atom& value);
void moved();
void on_value_changed(GVariant* value);
+ void on_scale_point_activated(float f);
bool on_event(GdkEvent* ev);
App& _app;
diff --git a/src/shared/URIs.cpp b/src/shared/URIs.cpp
index b1ecda5f..db5c5bfd 100644
--- a/src/shared/URIs.cpp
+++ b/src/shared/URIs.cpp
@@ -102,6 +102,7 @@ URIs::URIs(Ingen::Forge& f, LV2URIMap* map)
, lv2_name (forge, map, LV2_CORE__name)
, lv2_portProperty (forge, map, LV2_CORE__portProperty)
, lv2_sampleRate (forge, map, LV2_CORE__sampleRate)
+ , lv2_scalePoint (forge, map, LV2_CORE__scalePoint)
, lv2_symbol (forge, map, LV2_CORE__symbol)
, lv2_toggled (forge, map, LV2_CORE__toggled)
, midi_Bender (forge, map, LV2_MIDI__Bender)