Finished preferred interpreters list
[projects/chimara/chimara.git] / player / preferences.c
index f2cbaf085973c09c1e24bfed7b1a33bc8c10656f..9626516b8d85298a78b6e77da8c642738f9fe577 100644 (file)
@@ -30,6 +30,7 @@
  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include <stdlib.h>
 #include <glib.h>
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>
 
 GObject *load_object(const gchar *name);
 static GtkTextTag *current_tag;
+static GtkListStore *preferred_list;
 
 static void style_tree_select_callback(GtkTreeSelection *selection, ChimaraGlk *glk);
 
+/* Internal functions to convert from human-readable names in the config file
+to enums and back. Later: replace with plugin functions. */
+static ChimaraIFFormat
+parse_format(const char *format)
+{
+       if(strcmp(format, "z5") == 0)
+               return CHIMARA_IF_FORMAT_Z5;
+       if(strcmp(format, "z6") == 0)
+               return CHIMARA_IF_FORMAT_Z6;
+       if(strcmp(format, "z8") == 0)
+               return CHIMARA_IF_FORMAT_Z8;
+       if(strcmp(format, "zblorb") == 0)
+               return CHIMARA_IF_FORMAT_Z_BLORB;
+       if(strcmp(format, "glulx") == 0)
+               return CHIMARA_IF_FORMAT_GLULX;
+       if(strcmp(format, "gblorb") == 0)
+               return CHIMARA_IF_FORMAT_GLULX_BLORB;
+       return CHIMARA_IF_FORMAT_NONE;
+}
+
+static const char *format_strings[CHIMARA_IF_NUM_FORMATS] = {
+       "z5", "z6", "z8", "zblorb", "glulx", "gblorb"
+};
+
+static const char *format_to_string(ChimaraIFFormat format)
+{
+       if(format >= 0 && format < CHIMARA_IF_NUM_FORMATS)
+               return format_strings[format];
+       return "unknown";
+}
+
+static const char *format_display_strings[CHIMARA_IF_NUM_FORMATS] = {
+       N_("Z-machine version 5"),
+       N_("Z-machine version 6"),
+       N_("Z-machine version 8"),
+       N_("Z-machine Blorb file"),
+       N_("Glulx"),
+       N_("Glulx Blorb file")
+};
+
+static const char *
+format_to_display_string(ChimaraIFFormat format)
+{
+       if(format >= 0 && format < CHIMARA_IF_NUM_FORMATS)
+               return gettext(format_display_strings[format]);
+       return _("Unknown");
+}
+
+static ChimaraIFInterpreter
+parse_interpreter(const char *interp)
+{
+       if(strcmp(interp, "frotz") == 0)
+               return CHIMARA_IF_INTERPRETER_FROTZ;
+       if(strcmp(interp, "nitfol") == 0)
+               return CHIMARA_IF_INTERPRETER_NITFOL;
+       if(strcmp(interp, "glulxe") == 0)
+               return CHIMARA_IF_INTERPRETER_GLULXE;
+       if(strcmp(interp, "git") == 0)
+               return CHIMARA_IF_INTERPRETER_GIT;
+       return CHIMARA_IF_INTERPRETER_NONE;
+}
+
+static const char *interpreter_strings[CHIMARA_IF_NUM_INTERPRETERS] = {
+       "frotz", "nitfol", "glulxe", "git"
+};
+
+static const char *
+interpreter_to_string(ChimaraIFInterpreter interp)
+{
+       if(interp >= 0 && interp < CHIMARA_IF_NUM_INTERPRETERS)
+               return interpreter_strings[interp];
+       return "unknown";
+}
+
+static const char *interpreter_display_strings[CHIMARA_IF_NUM_INTERPRETERS] = {
+       N_("Frotz"),
+       N_("Nitfol"),
+       N_("Glulxe"),
+       N_("Git")
+};
+
+static const char *
+interpreter_to_display_string(ChimaraIFInterpreter interp)
+{
+       if(interp >= 0 && interp < CHIMARA_IF_NUM_INTERPRETERS)
+               return gettext(interpreter_display_strings[interp]);
+       return _("Unknown");
+}
+
 /* Create the preferences dialog. */
 void
 preferences_create(ChimaraGlk *glk)
@@ -98,6 +189,42 @@ preferences_create(ChimaraGlk *glk)
                gtk_file_chooser_set_filename(blorb_chooser, filename);
                g_free(filename);
        }
+
+       /* Populate the list of available interpreters */
+       GtkListStore *interp_list = GTK_LIST_STORE( load_object("available_interpreters") );
+       unsigned int count;
+       GtkTreeIter tree_iter;
+       for(count = 0; count < CHIMARA_IF_NUM_INTERPRETERS; count++) {
+               gtk_list_store_append(interp_list, &tree_iter);
+               gtk_list_store_set(interp_list, &tree_iter,
+                       0, interpreter_to_display_string(count),
+                       -1);
+       }
+
+       /* Get the list of preferred interpreters from the preferences */
+       GVariantIter *iter;
+       char *format, *plugin;
+       g_settings_get(prefs_settings, "preferred-interpreters", "a{ss}", &iter);
+       while(g_variant_iter_loop(iter, "{ss}", &format, &plugin)) {
+               ChimaraIFFormat format_num = parse_format(format);
+               if(format_num == CHIMARA_IF_FORMAT_NONE)
+                       continue;
+               ChimaraIFInterpreter interp_num = parse_interpreter(plugin);
+               if(interp_num == CHIMARA_IF_INTERPRETER_NONE)
+                       continue;
+               chimara_if_set_preferred_interpreter(CHIMARA_IF(glk), format_num, interp_num);
+       }
+       g_variant_iter_free(iter);
+
+       /* Display it all in the list */
+       preferred_list = GTK_LIST_STORE( load_object("interpreters") );
+       for(count = 0; count < CHIMARA_IF_NUM_FORMATS; count++) {
+               gtk_list_store_append(preferred_list, &tree_iter);
+               gtk_list_store_set(preferred_list, &tree_iter,
+                       0, format_to_display_string(count),
+                       1, interpreter_to_display_string(chimara_if_get_preferred_interpreter(CHIMARA_IF(glk), count)),
+                       -1);
+       }
 }
 
 static void
@@ -256,3 +383,38 @@ on_resource_file_set(GtkFileChooserButton *button, ChimaraGlk *glk)
        g_settings_set(prefs_settings, "resource-path", "ms", filename);
        g_free(filename);
 }
+
+void
+on_interpreter_cell_changed(GtkCellRendererCombo *combo, char *path_string, GtkTreeIter *new_iter, ChimaraGlk *glk)
+{
+       unsigned int format, interpreter;
+       format = (unsigned int)strtol(path_string, NULL, 10);
+       GtkTreeModel *combo_model;
+       g_object_get(combo, "model", &combo_model, NULL);
+       char *combo_string = gtk_tree_model_get_string_from_iter(combo_model, new_iter);
+       interpreter = (unsigned int)strtol(combo_string, NULL, 10);
+       g_free(combo_string);
+
+       chimara_if_set_preferred_interpreter(CHIMARA_IF(glk), format, interpreter);
+
+       /* Display the new setting in the list */
+       GtkTreeIter iter;
+       GtkTreePath *path = gtk_tree_path_new_from_string(path_string);
+       gtk_tree_model_get_iter(GTK_TREE_MODEL(preferred_list), &iter, path);
+       gtk_tree_path_free(path);
+       gtk_list_store_set(preferred_list, &iter,
+               1, interpreter_to_display_string(interpreter),
+               -1);
+
+       /* Save the new settings in the preferences file */
+       extern GSettings *prefs_settings;
+       GVariantBuilder *builder = g_variant_builder_new( G_VARIANT_TYPE("a{ss}") );
+       unsigned int count;
+       for(count = 0; count < CHIMARA_IF_NUM_FORMATS; count++) {
+               g_variant_builder_add(builder, "{ss}",
+                       format_to_string(count),
+                       interpreter_to_string(chimara_if_get_preferred_interpreter(CHIMARA_IF(glk), count)));
+       }
+       g_settings_set(prefs_settings, "preferred-interpreters", "a{ss}", builder);
+       g_variant_builder_unref(builder);
+}
\ No newline at end of file