OSDN Git Service

MacGui: Remove Target Size as a rate control option as it doesn't really work correct...
[handbrake-jp/handbrake-jp-git.git] / gtk / src / settings.c
index 20c1416..afe4180 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- 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.
  * 
@@ -158,26 +158,35 @@ ghb_settings_combo_int(const GValue *settings, const gchar *key)
        return ghb_lookup_combo_int(key, ghb_settings_get_value(settings, key));
 }
 
+gdouble
+ghb_settings_combo_double(const GValue *settings, const gchar *key)
+{
+       return ghb_lookup_combo_double(key, ghb_settings_get_value(settings, key));
+}
+
 const gchar*
 ghb_settings_combo_option(const GValue *settings, const gchar *key)
 {
        return ghb_lookup_combo_option(key, ghb_settings_get_value(settings, key));
 }
 
+const gchar*
+ghb_settings_combo_string(const GValue *settings, const gchar *key)
+{
+       return ghb_lookup_combo_string(key, ghb_settings_get_value(settings, key));
+}
+
 // 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)
        {
@@ -202,10 +211,7 @@ ghb_widget_value(GtkWidget *widget)
        }
 
        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)
        {
@@ -216,8 +222,16 @@ ghb_widget_value(GtkWidget *widget)
        {
                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)
        {
@@ -226,6 +240,20 @@ ghb_widget_value(GtkWidget *widget)
                bval = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
                value = ghb_boolean_value_new(bval);
        }
+       else if (type == GTK_TYPE_TOGGLE_TOOL_BUTTON)
+       {
+               g_debug("\ttoggle_tool_button");
+               gboolean bval;
+               bval = gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(widget));
+               value = ghb_boolean_value_new(bval);
+       }
+       else if (type == GTK_TYPE_TOGGLE_BUTTON)
+       {
+               g_debug("\ttoggle_button");
+               gboolean bval;
+               bval = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+               value = ghb_boolean_value_new(bval);
+       }
        else if (type == GTK_TYPE_TOGGLE_ACTION)
        {
                g_debug("\ttoggle action");
@@ -303,6 +331,13 @@ ghb_widget_value(GtkWidget *widget)
                        value = ghb_int_value_new(dval);
                }
        }
+       else if (type == GTK_TYPE_SCALE_BUTTON)
+       {
+               gdouble dval;
+
+               dval = gtk_scale_button_get_value(GTK_SCALE_BUTTON(widget));
+               value = ghb_double_value_new(dval);
+       }
        else if (type == GTK_TYPE_TEXT_VIEW)
        {
                GtkTextBuffer *buffer;
@@ -323,9 +358,13 @@ ghb_widget_value(GtkWidget *widget)
        }
        else if (type == GTK_TYPE_FILE_CHOOSER_BUTTON)
        {
-               const gchar *str;
+               gchar *str;
                str = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(widget));
+               if (str == NULL)
+                       str = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(widget));
                value = ghb_string_value_new(str);
+               if (str != NULL)
+                       g_free(str);
        }
        else
        {
@@ -396,6 +435,26 @@ ghb_widget_boolean(GtkWidget *widget)
        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)
 {
@@ -405,11 +464,12 @@ 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
@@ -443,13 +503,32 @@ update_widget(GtkWidget *widget, const GValue *value)
        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)
        {
                g_debug("check button");
                gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), ival);
        }
+       else if (type == GTK_TYPE_TOGGLE_TOOL_BUTTON)
+       {
+               g_debug("toggle button");
+               gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(widget), ival);
+       }
+       else if (type == GTK_TYPE_TOGGLE_BUTTON)
+       {
+               g_debug("toggle button");
+               gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), ival);
+       }
        else if (type == GTK_TYPE_TOGGLE_ACTION)
        {
                g_debug("toggle action");
@@ -465,7 +544,7 @@ update_widget(GtkWidget *widget, const GValue *value)
                GtkTreeModel *store;
                GtkTreeIter iter;
                gchar *shortOpt;
-               gint ivalue;
+               gdouble ivalue;
                gboolean foundit = FALSE;
 
                g_debug("combo (%s)", str);
@@ -491,7 +570,7 @@ update_widget(GtkWidget *widget, const GValue *value)
                        do
                        {
                                gtk_tree_model_get(store, &iter, 3, &ivalue, -1);
-                               if (ivalue == ival)
+                               if ((gint)ivalue == ival || ivalue == dval)
                                {
                                        gtk_combo_box_set_active_iter (
                                                GTK_COMBO_BOX(widget), &iter);
@@ -510,7 +589,7 @@ update_widget(GtkWidget *widget, const GValue *value)
                GtkTreeModel *store;
                GtkTreeIter iter;
                gchar *shortOpt;
-               gint ivalue;
+               gdouble ivalue;
                gboolean foundit = FALSE;
 
                g_debug("GTK_COMBO_BOX_ENTRY");
@@ -536,7 +615,7 @@ update_widget(GtkWidget *widget, const GValue *value)
                        do
                        {
                                gtk_tree_model_get(store, &iter, 3, &ivalue, -1);
-                               if (ivalue == ival)
+                               if ((gint)ivalue == ival || ivalue == dval)
                                {
                                        gtk_combo_box_set_active_iter (
                                                GTK_COMBO_BOX(widget), &iter);
@@ -564,6 +643,11 @@ update_widget(GtkWidget *widget, const GValue *value)
                g_debug("hscale");
                gtk_range_set_value(GTK_RANGE(widget), dval);
        }
+       else if (type == GTK_TYPE_SCALE_BUTTON)
+       {
+               g_debug("scale_button");
+               gtk_scale_button_set_value(GTK_SCALE_BUTTON(widget), dval);
+       }
        else if (type == GTK_TYPE_TEXT_VIEW)
        {
                g_debug("textview (%s)", str);
@@ -573,21 +657,47 @@ update_widget(GtkWidget *widget, const GValue *value)
        }
        else if (type == GTK_TYPE_LABEL)
        {
-               gtk_label_set_text (GTK_LABEL(widget), str);
+               gtk_label_set_markup (GTK_LABEL(widget), str);
        }
        else if (type == GTK_TYPE_FILE_CHOOSER_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);
                }
-               else
+               else if (act == GTK_FILE_CHOOSER_ACTION_SAVE)
                {
                        gtk_file_chooser_set_filename (GTK_FILE_CHOOSER(widget), str);
                }
+               else
+               {
+                       if (g_file_test(str, G_FILE_TEST_IS_DIR))
+                       {
+                               gtk_file_chooser_set_current_folder(
+                                       GTK_FILE_CHOOSER(widget), str);
+                       }
+                       else if (g_file_test(str, G_FILE_TEST_EXISTS))
+                       {
+                               gtk_file_chooser_set_filename (GTK_FILE_CHOOSER(widget), str);
+                       }
+                       else
+                       {
+                               gchar *dirname;
+
+                               dirname = g_path_get_dirname(str);
+                               gtk_file_chooser_set_current_folder(
+                                       GTK_FILE_CHOOSER(widget), dirname);
+                               g_free(dirname);
+                       }
+               }
        }
        else
        {