about summary refs log tree commit diff
diff options
context:
space:
mode:
authorZach DeCook <zachdecook@librem.one>2023-08-26 08:53:26 -0400
committerZach DeCook <zachdecook@librem.one>2023-08-26 08:54:08 -0400
commit2b1d0578c13ad8bfd80571c10a0b4b35d9891258 (patch)
tree035be889d9a3cb22ae264aa3b4d51faead13578e
parent9f8bd924afebcdf68c8930347a9540b71946de25 (diff)
downloadshemuvi-2b1d0578c13ad8bfd80571c10a0b4b35d9891258.tar.gz
Open menu: Improve filters for file selection
-rw-r--r--main.c104
1 files changed, 58 insertions, 46 deletions
diff --git a/main.c b/main.c
index 3d08fff..0b31738 100644
--- a/main.c
+++ b/main.c
@@ -1,25 +1,17 @@
 #include <gtk/gtk.h>
 
-// from the example
-static void
-set_file (GFile    *file,
-          gpointer  data)
-{
-  char *name;
-
-  if (!file)
-    {
-      //gtk_widget_set_sensitive (app_picker, FALSE);
-      //g_object_set_data (G_OBJECT (app_picker), "file", NULL);
-      return;
-    }
-
-  name = g_file_get_basename (file);
-  gtk_label_set_label (GTK_LABEL (data), name);
-  g_free (name);
-
-  //gtk_widget_set_sensitive (app_picker, TRUE);
-  //g_object_set_data_full (G_OBJECT (app_picker), "file", g_object_ref (file), g_object_unref);
+/* Called when a file is chosen by the open menu. */
+static void set_file (GFile *file, gpointer data) {
+	char *name;
+
+	if (!file) {
+		return;
+	}
+
+	name = g_file_get_path (file);
+	puts(name);
+	/* TODO: load this into verovio */
+	g_free (name);
 }
 
 static void
@@ -51,43 +43,63 @@ abort_mission (gpointer data)
   return G_SOURCE_REMOVE;
 }
 
-static void
-open_file (GtkButton *picker,
-           GtkLabel  *label)
-{
+static void open_file (GtkButton *picker, GtkLabel *label) {
   GtkWindow *parent = GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (picker)));
-  GtkFileDialog *dialog;
-  GCancellable *cancellable;
-
-  dialog = gtk_file_dialog_new ();
+	GtkFileDialog *dialog;
 
-  cancellable = g_cancellable_new ();
+	dialog = gtk_file_dialog_new ();
 
-  g_timeout_add_seconds_full (G_PRIORITY_DEFAULT,
-                              20,
-                              abort_mission, g_object_ref (cancellable), g_object_unref);
 	gtk_file_dialog_set_title (dialog, "Select Sheet Music File");
 	// Filters for the different types that are supported.
-	//GListStore *filters;
-	//(abc, darms, humdrum, pae)
-	// Only allow mei,musicxml,xml
+	GListStore *filters;
+	filters = g_list_store_new (GTK_TYPE_FILE_FILTER);
+
+	// Note: Files are usually recognized by extension (not mime type).
 	GtkFileFilter *filter;
+
+	// abc notation https://abcnotation.com/
+	filter = gtk_file_filter_new();
+	gtk_file_filter_set_name (filter, "ABC");
+	gtk_file_filter_add_mime_type(filter, "text/vnd.abc");
+	gtk_file_filter_add_suffix(filter, "abc");
+	g_list_store_append (filters, filter);
+	g_object_unref (filter);
+	// TODO: do DARMS and PAE have common extension or mimetype?
+	// DARMS https://wiki.ccarh.org/wiki/DARMS
+	// PAE https://www.iaml.info/plaine-easie-code
+
+	// Humdrum https://www.humdrum.org/
+	filter = gtk_file_filter_new();
+	gtk_file_filter_set_name (filter, "Humdrum");
+	gtk_file_filter_add_suffix(filter, "krn");
+	g_list_store_append (filters, filter);
+	g_object_unref (filter);
+
+	// MEI https://music-encoding.org/
+	// MusicXML https://www.musicxml.com/
 	filter = gtk_file_filter_new();
 	gtk_file_filter_set_name (filter, "MEI, MusicXML");
-	gtk_file_filter_add_mime_type (filter, "application/xml");
-	gtk_file_filter_add_mime_type (filter, "text/xml");
-	//g_list_store_append (filters, filter);
+	// Generic XML?
+	//gtk_file_filter_add_mime_type (filter, "application/xml");
+	//gtk_file_filter_add_mime_type (filter, "text/xml");
+	gtk_file_filter_add_suffix(filter, "xml");
+	// MusicXML
+	gtk_file_filter_add_mime_type(filter, "application/vnd.recordare.musicxml+xml");
+	gtk_file_filter_add_suffix(filter, "musicxml");
+	// Compressed MusicXML
+	gtk_file_filter_add_mime_type(filter, "application/vnd.recordare.musicxml");
+	gtk_file_filter_add_suffix(filter, "mxl");
+	// MEI
+	gtk_file_filter_add_suffix(filter, "mei");
+	g_list_store_append (filters, filter);
 	gtk_file_dialog_set_default_filter (dialog, filter);
-	//g_object_unref (filter);
-
-	//gtk_file_dialog_set_filters (dialog, G_LIST_MODEL (filters));
-	//g_object_unref (filters);
-
+	g_object_unref (filter);
 
-  gtk_file_dialog_open (dialog, parent, cancellable, file_opened, label);
+	gtk_file_dialog_set_filters (dialog, G_LIST_MODEL (filters));
+	g_object_unref (filters);
 
-  g_object_unref (cancellable);
-  g_object_unref (dialog);
+	gtk_file_dialog_open (dialog, parent, NULL, file_opened, label);
+	g_object_unref (dialog);
 }
 
 static void activate (GtkApplication* app, gpointer user_data) {