aboutsummaryrefslogtreecommitdiff
path: root/src/format-selection.c
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2012-05-30 15:51:08 +0200
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2012-05-30 15:56:45 +0200
commit5bea3fb45b100f0890e54a36fa3d0e7863ab1042 (patch)
treee0685d36c1c9e49d11ed1af1b2924988b73b38de /src/format-selection.c
parente06da304f57c46bb91c2be0cc2335e6c064f53b0 (diff)
downloadexperiment-player-5bea3fb45b100f0890e54a36fa3d0e7863ab1042.tar.gz
implemented selection of format files by combo box
* each transcript widget has its own box, they share their content (via a common GtkListStore) * currently the filename is displayed in the combo boxes
Diffstat (limited to 'src/format-selection.c')
-rw-r--r--src/format-selection.c171
1 files changed, 171 insertions, 0 deletions
diff --git a/src/format-selection.c b/src/format-selection.c
new file mode 100644
index 0000000..f7c3c22
--- /dev/null
+++ b/src/format-selection.c
@@ -0,0 +1,171 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <assert.h>
+
+#include <glib.h>
+#include <glib/gprintf.h>
+
+#include <gtk/gtk.h>
+
+#include <gtk-experiment-transcript.h>
+
+#include "experiment-player.h"
+
+static void refresh_formats_store(GtkListStore *store);
+
+GtkWidget *transcript_wizard_combo,
+ *transcript_proband_combo;
+
+static gchar *formats_directory;
+
+enum {
+ COL_NAME,
+ COL_FILENAME,
+ NUM_COLS
+};
+
+/*
+ * GtkBuilder signal callbacks
+ * NOTE: for some strange reason the parameters are switched
+ */
+
+void
+formats_menu_choosedir_item_activate_cb(GtkWidget *widget,
+ gpointer data __attribute__((unused)))
+{
+ GtkTreeModel *model =
+ gtk_combo_box_get_model(GTK_COMBO_BOX(transcript_wizard_combo));
+
+ GtkWidget *dialog;
+
+ dialog = gtk_file_chooser_dialog_new("Choose Directory...", GTK_WINDOW(widget),
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
+ NULL);
+ gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),
+ formats_directory);
+
+ if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
+ g_free(formats_directory);
+ formats_directory =
+ gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
+
+ refresh_formats_store(GTK_LIST_STORE(model));
+ }
+
+ gtk_widget_destroy(dialog);
+}
+
+void
+formats_menu_refresh_item_activate_cb(GtkWidget *widget,
+ gpointer data __attribute__((unused)))
+{
+ GtkTreeModel *model = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
+
+ refresh_formats_store(GTK_LIST_STORE(model));
+}
+
+void
+generic_transcript_combo_changed_cb(gpointer user_data, GtkComboBox *combo)
+{
+ GtkExperimentTranscript *trans = GTK_EXPERIMENT_TRANSCRIPT(user_data);
+
+ GtkTreeModel *model = gtk_combo_box_get_model(combo);
+ GtkTreeIter iter;
+ gchar *filename;
+
+ if (!gtk_combo_box_get_active_iter(combo, &iter))
+ return;
+
+ gtk_tree_model_get(model, &iter, COL_FILENAME, &filename, -1);
+
+ /*
+ * filename may be empty (null-entry) in which case any active format
+ * will be reset
+ */
+ gtk_experiment_transcript_load_formats(trans, filename);
+ g_free(filename);
+
+ refresh_formats_store(GTK_LIST_STORE(model));
+}
+
+void
+generic_transcript_entry_changed_cb(gpointer user_data, GtkEditable *editable)
+{
+ GtkExperimentTranscript *trans = GTK_EXPERIMENT_TRANSCRIPT(user_data);
+ const gchar *text = gtk_entry_get_text(GTK_ENTRY(editable));
+
+ /** @todo enable/disable markup */
+ gtk_experiment_transcript_set_interactive_format(trans, text, TRUE);
+}
+
+static void
+refresh_formats_store(GtkListStore *store)
+{
+ static GPatternSpec *pattern = NULL;
+
+ GDir *dir;
+ const gchar *name;
+ GtkTreeIter iter;
+
+ if (pattern == NULL)
+ pattern = g_pattern_spec_new(EXPERIMENT_FORMAT_FILTER);
+
+ gtk_list_store_clear(store);
+ /* add null-entry */
+ gtk_list_store_append(store, &iter);
+
+ dir = g_dir_open(formats_directory, 0, NULL);
+
+ while ((name = g_dir_read_name(dir)) != NULL) {
+ gchar *fullname;
+
+ if (!g_pattern_match_string(pattern, name))
+ continue;
+
+ fullname = g_build_filename(formats_directory, name, NULL);
+
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter,
+ COL_NAME, name,
+ COL_FILENAME, fullname,
+ -1);
+
+ g_free(fullname);
+ }
+
+ g_dir_close(dir);
+}
+
+void
+format_selection_init(const gchar *dir)
+{
+ GtkListStore *formats_store;
+ GtkCellRenderer *renderer;
+
+ formats_directory = g_strdup(dir);
+
+ formats_store = gtk_list_store_new(NUM_COLS,
+ G_TYPE_STRING, G_TYPE_STRING);
+ gtk_combo_box_set_model(GTK_COMBO_BOX(transcript_wizard_combo),
+ GTK_TREE_MODEL(formats_store));
+ gtk_combo_box_set_model(GTK_COMBO_BOX(transcript_proband_combo),
+ GTK_TREE_MODEL(formats_store));
+
+ renderer = gtk_cell_renderer_text_new();
+ gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(transcript_wizard_combo),
+ renderer, TRUE);
+ gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(transcript_wizard_combo),
+ renderer, "text", COL_NAME);
+ gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(transcript_proband_combo),
+ renderer, TRUE);
+ gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(transcript_proband_combo),
+ renderer, "text", COL_NAME);
+
+ refresh_formats_store(formats_store);
+
+ g_object_unref(formats_store);
+}