From f58af197e455202cf75995ce004570b1761eea08 Mon Sep 17 00:00:00 2001
From: David Robillard <d@drobilla.net>
Date: Mon, 23 Apr 2012 00:42:09 +0000
Subject: Use modern presets extension.

git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@4246 a436a847-0d15-0410-975c-d299462d15a1
---
 src/gui/NodeMenu.cpp | 47 +++++++++++++++++++++++++++--------------------
 1 file changed, 27 insertions(+), 20 deletions(-)

(limited to 'src')

diff --git a/src/gui/NodeMenu.cpp b/src/gui/NodeMenu.cpp
index b9b6467c..f63384d3 100644
--- a/src/gui/NodeMenu.cpp
+++ b/src/gui/NodeMenu.cpp
@@ -73,46 +73,53 @@ NodeMenu::init(App& app, SharedPtr<const NodeModel> node)
 	}
 
 	if (plugin && plugin->type() == PluginModel::LV2) {
-		LilvNode* preset_pred = lilv_new_uri(
-			plugin->lilv_world(),
-			"http://lv2plug.in/ns/ext/presets#hasPreset");
-		LilvNode* title_pred = lilv_new_uri(
-			plugin->lilv_world(),
-			"http://www.w3.org/2000/01/rdf-schema#label");
-		LilvNodes* presets = lilv_plugin_get_value(
-			plugin->lilv_plugin(), preset_pred);
+
+		LilvNode* pset_Preset = lilv_new_uri(plugin->lilv_world(),
+		                                     LV2_PRESETS__Preset);
+		LilvNode* rdfs_label = lilv_new_uri(plugin->lilv_world(),
+		                                    LILV_NS_RDFS "label");
+		LilvNodes* presets = lilv_plugin_get_related(plugin->lilv_plugin(),
+		                                             pset_Preset);
 		if (presets) {
 			_presets_menu = Gtk::manage(new Gtk::Menu());
 
 			LILV_FOREACH(nodes, i, presets) {
-				const LilvNode* uri = lilv_nodes_get(presets, i);
-				LilvNodes* titles   = lilv_world_find_nodes(
-					plugin->lilv_world(), uri, title_pred, NULL);
-				if (titles) {
-					const LilvNode* title = lilv_nodes_get_first(titles);
+				const LilvNode* preset = lilv_nodes_get(presets, i);
+				lilv_world_load_resource(plugin->lilv_world(), preset);
+				LilvNodes* labels = lilv_world_find_nodes(
+					plugin->lilv_world(), preset, rdfs_label, NULL);
+				if (labels) {
+					const LilvNode* label = lilv_nodes_get_first(labels);
 					_presets_menu->items().push_back(
 						Gtk::Menu_Helpers::MenuElem(
-							lilv_node_as_string(title),
+							lilv_node_as_string(label),
 							sigc::bind(
 								sigc::mem_fun(this, &NodeMenu::on_preset_activated),
-								string(lilv_node_as_string(uri)))));
+								string(lilv_node_as_string(preset)))));
 
 					// I have no idea why this is necessary, signal_activated doesn't work
 					// in this menu (and only this menu)
 					Gtk::MenuItem* item = &(_presets_menu->items().back());
 					item->signal_button_release_event().connect(
 						sigc::bind<0>(sigc::mem_fun(this, &NodeMenu::on_preset_clicked),
-						              string(lilv_node_as_string(uri))));
+						              string(lilv_node_as_string(preset))));
+
+					lilv_nodes_free(labels);
+				} else {
+					Raul::error << "Preset <"
+					            << lilv_node_as_string(lilv_nodes_get(presets, i))
+					            << "> has no rdfs:label" << std::endl;
 				}
 			}
+
 			items().push_front(Gtk::Menu_Helpers::ImageMenuElem("_Presets",
-					*(manage(new Gtk::Image(Gtk::Stock::INDEX, Gtk::ICON_SIZE_MENU)))));
+			                                                    *(manage(new Gtk::Image(Gtk::Stock::INDEX, Gtk::ICON_SIZE_MENU)))));
 			Gtk::MenuItem* presets_menu_item = &(items().front());
 			presets_menu_item->set_submenu(*_presets_menu);
+			lilv_nodes_free(presets);
 		}
-		lilv_nodes_free(presets);
-		lilv_node_free(title_pred);
-		lilv_node_free(preset_pred);
+		lilv_node_free(pset_Preset);
+		lilv_node_free(rdfs_label);
 	}
 
 	if (has_control_inputs())
-- 
cgit v1.2.1