From 74c4c4d9badcd6ffc452baf8bea5530f44e95b4d Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 16 Feb 2020 21:37:27 +0100 Subject: Implement ui:requestValue --- src/jalv_gtk.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'src/jalv_gtk.c') diff --git a/src/jalv_gtk.c b/src/jalv_gtk.c index 71259bd..5cf9a97 100644 --- a/src/jalv_gtk.c +++ b/src/jalv_gtk.c @@ -630,6 +630,42 @@ patch_put_get(Jalv* jalv, return 0; } +static LV2UI_Request_Value_Status +on_request_value(LV2UI_Feature_Handle handle, + const LV2_URID key, + const LV2_URID type, + const LV2_Feature* const* features) +{ + Jalv* jalv = (Jalv*)handle; + ControlID* control = get_property_control(&jalv->controls, key); + + if (!control) { + return LV2UI_REQUEST_VALUE_ERR_UNKNOWN; + } else if (control->value_type != jalv->forge.Path) { + return LV2UI_REQUEST_VALUE_ERR_UNSUPPORTED; + } + + GtkWidget* dialog = + gtk_file_chooser_dialog_new("Choose file", + GTK_WINDOW(jalv->window), + GTK_FILE_CHOOSER_ACTION_OPEN, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) { + char* path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + + set_control(control, strlen(path), jalv->forge.Path, path); + + g_free(path); + } + + gtk_widget_destroy(dialog); + + return 0; +} + static void property_changed(Jalv* jalv, LV2_URID key, const LV2_Atom* value) { @@ -1197,6 +1233,8 @@ jalv_open_ui(Jalv* jalv) jalv_ui_instantiate(jalv, jalv_native_ui_type(), alignment); } + jalv->features.request_value.request = on_request_value; + if (jalv->ui_instance) { GtkWidget* widget = (GtkWidget*)suil_instance_get_widget( jalv->ui_instance); -- cgit v1.2.1