/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
/*
* settings.c
- * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
+ * Copyright (C) John Stebbins 2008-2011 <stebbins@stebbins>
*
* settings.c is free software.
*
// Map widget names to setting keys
// Widgets that map to settings have names
// of this format: s_<setting key>
-static const gchar*
-get_setting_key(GtkWidget *widget)
+const gchar*
+ghb_get_setting_key(GtkWidget *widget)
{
const gchar *name;
g_debug("get_setting_key ()\n");
if (widget == NULL) return NULL;
- if (GTK_IS_ACTION(widget))
- name = gtk_action_get_name(GTK_ACTION(widget));
- else
- name = gtk_widget_get_name(widget);
+ name = gtk_buildable_get_name(GTK_BUILDABLE(widget));
if (name == NULL)
{
}
type = GTK_WIDGET_TYPE(widget);
- if (GTK_IS_ACTION(widget))
- name = gtk_action_get_name(GTK_ACTION(widget));
- else
- name = gtk_widget_get_name(widget);
+ name = ghb_get_setting_key(widget);
g_debug("ghb_widget_value widget (%s)\n", name);
if (type == GTK_TYPE_ENTRY)
{
{
g_debug("\tradio_button");
gboolean bval;
- bval = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
- value = ghb_boolean_value_new(bval);
+ bval = gtk_toggle_button_get_inconsistent(GTK_TOGGLE_BUTTON(widget));
+ if (bval)
+ {
+ value = ghb_boolean_value_new(FALSE);
+ }
+ else
+ {
+ bval = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+ value = ghb_boolean_value_new(bval);
+ }
}
else if (type == GTK_TYPE_CHECK_BUTTON)
{
return bval;
}
+static void check_radio_consistency(GValue *settings, GtkWidget *widget)
+{
+ const gchar *key = NULL;
+ GValue *value;
+
+ if (widget == NULL) return;
+ if (G_OBJECT_TYPE(widget) == GTK_TYPE_RADIO_BUTTON)
+ {
+ // Find corresponding setting
+ key = ghb_get_setting_key(widget);
+ if (key == NULL) return;
+ value = ghb_widget_value(widget);
+ if (value == NULL) return;
+ if (ghb_value_boolean(value) == ghb_settings_get_boolean(settings, key))
+ {
+ gtk_toggle_button_set_inconsistent(GTK_TOGGLE_BUTTON(widget), FALSE);
+ }
+ }
+}
+
void
ghb_widget_to_setting(GValue *settings, GtkWidget *widget)
{
if (widget == NULL) return;
g_debug("ghb_widget_to_setting");
// Find corresponding setting
- key = get_setting_key(widget);
+ key = ghb_get_setting_key(widget);
if (key == NULL) return;
value = ghb_widget_value(widget);
if (value != NULL)
{
+ check_radio_consistency(settings, widget);
ghb_settings_take_value(settings, key, value);
}
else
else if (type == GTK_TYPE_RADIO_BUTTON)
{
g_debug("radio button");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), ival);
+ int cur_val = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+ if (cur_val && !ival)
+ {
+ gtk_toggle_button_set_inconsistent(GTK_TOGGLE_BUTTON(widget), TRUE);
+ }
+ else
+ {
+ gtk_toggle_button_set_inconsistent(GTK_TOGGLE_BUTTON(widget), FALSE);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), ival);
+ }
}
else if (type == GTK_TYPE_CHECK_BUTTON)
{
{
GtkFileChooserAction act;
act = gtk_file_chooser_get_action(GTK_FILE_CHOOSER(widget));
- if (act == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER ||
+ if (str[0] == 0)
+ {
+ // Do nothing
+ ;
+ }
+ else if (act == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER ||
act == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER)
{
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(widget), str);