diff options
-rw-r--r-- | src/jalv_gtk2.c | 73 | ||||
-rw-r--r-- | src/jalv_internal.h | 3 | ||||
-rw-r--r-- | src/state.c | 8 |
3 files changed, 49 insertions, 35 deletions
diff --git a/src/jalv_gtk2.c b/src/jalv_gtk2.c index d6829b5..178e14a 100644 --- a/src/jalv_gtk2.c +++ b/src/jalv_gtk2.c @@ -98,6 +98,21 @@ typedef struct { LilvNode* preset; } PresetRecord; +char* +symbolify(const char* in) +{ + const size_t len = strlen(in); + char* out = calloc(len + 1, 1); + for (size_t i = 0; i < len; ++i) { + if (g_ascii_isalnum(in[i])) { + out[i] = in[i]; + } else { + out[i] = '_'; + } + } + return out; +} + static void on_save_preset_activate(GtkWidget* widget, void* ptr) { @@ -106,7 +121,7 @@ on_save_preset_activate(GtkWidget* widget, void* ptr) GtkWidget* dialog = gtk_file_chooser_dialog_new( "Save Preset", jalv->window, - GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, + GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); @@ -115,41 +130,37 @@ on_save_preset_activate(GtkWidget* widget, void* ptr) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), dot_lv2); free(dot_lv2); - GtkWidget* content = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); - GtkTable* table = GTK_TABLE(gtk_table_new(2, 2, FALSE)); - GtkWidget* label_label = gtk_label_new("Label:"); - GtkWidget* uri_label = gtk_label_new("URI:"); - GtkWidget* label_entry = gtk_entry_new(); - GtkWidget* uri_entry = gtk_entry_new(); - gtk_misc_set_alignment(GTK_MISC(label_label), 1.0, 0.5); - gtk_misc_set_alignment(GTK_MISC(uri_label), 1.0, 0.5); - gtk_table_attach(table, label_label, - 0, 1, 0, 1, GTK_SHRINK, GTK_SHRINK, 6, 12); - gtk_table_attach(table, label_entry, - 1, 2, 0, 1, - GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 6, 6); - gtk_table_attach(table, uri_label, - 0, 1, 1, 2, - GTK_SHRINK, GTK_SHRINK, 6, 12); - gtk_table_attach(table, uri_entry, - 1, 2, 1, 2, - GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 6, 6); - gtk_box_pack_start(GTK_BOX(content), GTK_WIDGET(table), FALSE, FALSE, 6); + GtkWidget* content = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); + GtkBox* box = GTK_BOX(gtk_hbox_new(FALSE, 8)); + GtkWidget* uri_label = gtk_label_new("URI (Optional):"); + GtkWidget* uri_entry = gtk_entry_new(); + + gtk_box_pack_start(box, uri_label, FALSE, TRUE, 2); + gtk_box_pack_start(box, uri_entry, TRUE, TRUE, 2); + gtk_box_pack_start(GTK_BOX(content), GTK_WIDGET(box), FALSE, FALSE, 6); gtk_widget_show_all(GTK_WIDGET(dialog)); - gtk_entry_set_activates_default(GTK_ENTRY(label_entry), TRUE); gtk_entry_set_activates_default(GTK_ENTRY(uri_entry), TRUE); gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { - const char* path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); - const char* label = gtk_entry_get_text(GTK_ENTRY(label_entry)); - const char* uri = gtk_entry_get_text(GTK_ENTRY(uri_entry)); - char* l = ((strlen(label) > 0) - ? g_strdup(label) - : g_path_get_basename(path)); - - jalv_save_preset(jalv, path, (strlen(uri) ? uri : NULL), l); - free(l); + const char* path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + const char* uri = gtk_entry_get_text(GTK_ENTRY(uri_entry)); + + char* dirname = g_path_get_dirname(path); + char* basename = g_path_get_basename(path); + char* sym = symbolify(basename); + char* bundle = g_strjoin(NULL, sym, ".lv2", NULL); + char* file = g_strjoin(NULL, sym, ".ttl", NULL); + char* dir = g_build_filename(dirname, bundle, NULL); + + jalv_save_preset(jalv, dir, (strlen(uri) ? uri : NULL), basename, file); + + g_free(dir); + g_free(file); + g_free(bundle); + free(sym); + g_free(basename); + g_free(dirname); } gtk_widget_destroy(GTK_WIDGET(dialog)); diff --git a/src/jalv_internal.h b/src/jalv_internal.h index 631994d..06114f2 100644 --- a/src/jalv_internal.h +++ b/src/jalv_internal.h @@ -229,7 +229,8 @@ int jalv_save_preset(Jalv* jalv, const char* dir, const char* uri, - const char* label); + const char* label, + const char* filename); void jalv_save(Jalv* jalv, const char* dir); diff --git a/src/state.c b/src/state.c index a75ef3b..1d94fe8 100644 --- a/src/state.c +++ b/src/state.c @@ -192,7 +192,8 @@ int jalv_save_preset(Jalv* jalv, const char* dir, const char* uri, - const char* label) + const char* label, + const char* filename) { LilvState* const state = lilv_state_new_from_instance( jalv->plugin, jalv->instance, &jalv->map, @@ -204,8 +205,9 @@ jalv_save_preset(Jalv* jalv, lilv_state_set_label(state, label); } - int ret = lilv_state_save(jalv->world, &jalv->map, &jalv->unmap, state, - uri, dir, "state.ttl"); + int ret = lilv_state_save( + jalv->world, &jalv->map, &jalv->unmap, state, uri, dir, filename); + lilv_state_free(state); return ret; |