From 5ebed0cd5dc2eb2f71e18b24148903f3c10ebf69 Mon Sep 17 00:00:00 2001 From: Jon Bergli Heier Date: Sun, 21 Mar 2010 00:19:02 +0100 Subject: Implemented a very basic configuration dialog. This code is a bit hackish, all configuration options should be collected in a single place (eg. a config struct) in order to easily keep track of all configuration options. --- window_config.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 window_config.c (limited to 'window_config.c') diff --git a/window_config.c b/window_config.c new file mode 100644 index 0000000..a8de897 --- /dev/null +++ b/window_config.c @@ -0,0 +1,100 @@ +#include "window_config.h" +#include "config_ui.h" +#include "walls_conf.h" +#include "preload.h" +#include "wallpapers.h" + +struct window_config_t *window_config_new(GtkWindow *parent) { + GtkBuilder *builder; + GtkDialog *dialog; + GtkComboBox *interp_combo; + GtkHScale *preload_scale; + GtkListStore *liststore; + GtkTreeIter iter; + GError *error = NULL; + GtkCellRenderer *cell; + struct window_config_t *wct; + + int interp_mode = conf_get_int("walls", "interpolation_mode", GDK_INTERP_NEAREST); + int max_preload = conf_get_int("walls", "max_preload", 2); + + builder = gtk_builder_new(); + if(!gtk_builder_add_from_string(builder, config_ui_string, -1, &error)) { + g_warning("%s", error->message); + g_error_free(error); + return NULL; + } + + interp_combo = GTK_COMBO_BOX(gtk_builder_get_object(builder, "interp_combo")); + liststore = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT); + + gtk_list_store_append(liststore, &iter); + gtk_list_store_set(liststore, &iter, 0, "Nearest", 1, GDK_INTERP_NEAREST, -1); + + gtk_list_store_append(liststore, &iter); + gtk_list_store_set(liststore, &iter, 0, "Tiles", 1, GDK_INTERP_TILES, -1); + + gtk_list_store_append(liststore, &iter); + gtk_list_store_set(liststore, &iter, 0, "Bilinear", 1, GDK_INTERP_BILINEAR, -1); + + gtk_list_store_append(liststore, &iter); + gtk_list_store_set(liststore, &iter, 0, "Hyper", 1, GDK_INTERP_HYPER, -1); + + gtk_combo_box_set_model(interp_combo, GTK_TREE_MODEL(liststore)); + g_object_unref(liststore); + + cell = gtk_cell_renderer_text_new(); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(interp_combo), cell, TRUE); + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(interp_combo), cell, "text", 0, NULL); + + switch(interp_mode) { + case GDK_INTERP_TILES: + gtk_combo_box_set_active(interp_combo, 1); + break; + case GDK_INTERP_BILINEAR: + gtk_combo_box_set_active(interp_combo, 2); + break; + case GDK_INTERP_HYPER: + gtk_combo_box_set_active(interp_combo, 3); + break; + default: + gtk_combo_box_set_active(interp_combo, 0); + } + + preload_scale = GTK_HSCALE(gtk_builder_get_object(builder, "preload_scale")); + gtk_range_set_value(GTK_RANGE(preload_scale), max_preload); + + dialog = GTK_DIALOG(gtk_builder_get_object(builder, "config_dialog")); + gtk_window_set_transient_for(GTK_WINDOW(dialog), parent); + gtk_builder_connect_signals(builder, dialog); + g_object_unref(G_OBJECT(builder)); + + wct = g_malloc(sizeof(struct window_config_t)); + wct->dialog = dialog; + wct->interp_combo = interp_combo; + wct->preload_scale = GTK_RANGE(preload_scale); + + return wct; +} + +void window_config_save(struct window_config_t *wct) { + GValue value = {0}; + + int interp_mode = GDK_INTERP_NEAREST; + int max_preload = 2; + + GtkListStore *liststore = GTK_LIST_STORE(gtk_combo_box_get_model(wct->interp_combo)); + GtkTreeIter iter; + gtk_combo_box_get_active_iter(wct->interp_combo, &iter); + gtk_tree_model_get_value(GTK_TREE_MODEL(liststore), &iter, 1, &value); + interp_mode = g_value_get_int(&value); + g_value_unset(&value); + + max_preload = gtk_range_get_value(wct->preload_scale); + + g_key_file_set_integer(keyfile, "walls", "interpolation_mode", interp_mode); + interp_type = interp_mode; + + g_key_file_set_integer(keyfile, "walls", "max_preload", max_preload); + preload_max = max_preload; +} -- cgit v1.2.3