OSDN Git Service

LinGui:
authorjstebbins <jstebbins@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Thu, 21 May 2009 20:23:04 +0000 (20:23 +0000)
committerjstebbins <jstebbins@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Thu, 21 May 2009 20:23:04 +0000 (20:23 +0000)
add 'enable' checkbox to subtitle list and show all subtitles
in the list after scanning. Thanks eddyg for the suggestions.

git-svn-id: svn://localhost/HandBrake/trunk@2434 b64f7644-9d1e-0410-96f1-a4d463321fa5

gtk/src/ghb.ui
gtk/src/hb-backend.c
gtk/src/hb-backend.h
gtk/src/main.c
gtk/src/presets.c
gtk/src/subtitlehandler.c
gtk/src/subtitlehandler.h

index f740a90..581d2c4 100644 (file)
                                   </packing>
                                 </child>
                                 <child>
-                                  <object class="GtkTreeView" id="subtitle_list">
+                                  <object class="GtkScrolledWindow" id="scrolledwindow4">
                                     <property name="visible">True</property>
                                     <property name="can_focus">True</property>
                                     <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                    <property name="headers_clickable">True</property>
+                                    <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                                    <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                                    <child>
+                                      <object class="GtkTreeView" id="subtitle_list">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                        <property name="headers_clickable">True</property>
+                                      </object>
+                                    </child>
                                   </object>
                                   <packing>
                                     <property name="position">1</property>
index 0fbd691..5fa5549 100644 (file)
@@ -1981,6 +1981,63 @@ ghb_find_audio_track(
        return track;
 }
 
+void
+ghb_add_all_subtitles(signal_user_data_t *ud, gint titleindex)
+{
+       hb_list_t  * list;
+       hb_title_t * title;
+       hb_subtitle_t * subtitle;
+       gint ii;
+       gint count = 0;
+       GValue *subdict;
+       
+       g_debug("ghb_add_all_subtitles ()\n");
+       if (h_scan == NULL) 
+               return;
+       list = hb_get_titles( h_scan );
+       title = (hb_title_t*)hb_list_item( list, titleindex );
+       if (title == NULL)
+               return;
+
+       // Add special auto selection track
+       subdict = ghb_dict_value_new();
+       ghb_settings_set_boolean(subdict, "SubtitleEnabled", FALSE);
+       ghb_settings_set_int(subdict, "SubtitleTrack", -1);
+       ghb_settings_set_boolean(subdict, "SubtitleForced", FALSE);
+       ghb_settings_set_boolean(subdict, "SubtitleBurned", FALSE);
+       ghb_settings_set_string(subdict, "SubtitleLanguage", "auto");
+       ghb_add_subtitle(ud, subdict, FALSE);
+
+       count = hb_list_count( title->list_subtitle );
+       for (ii = 0; ii < count; ii++)
+       {
+               subtitle = (hb_subtitle_t*)hb_list_item( title->list_subtitle, ii );
+               subdict = ghb_dict_value_new();
+               ghb_settings_set_boolean(subdict, "SubtitleEnabled", FALSE);
+               ghb_settings_set_int(subdict, "SubtitleTrack", ii);
+               ghb_settings_set_boolean(subdict, "SubtitleForced", FALSE);
+               ghb_settings_set_boolean(subdict, "SubtitleBurned", FALSE);
+               ghb_settings_set_string(subdict, "SubtitleLanguage", 
+                                                               subtitle->iso639_2);
+               ghb_add_subtitle(ud, subdict, FALSE);
+       }
+}
+
+gint
+ghb_find_pref_subtitle_track(const gchar *lang)
+{
+       gint ii, count;
+       count = subtitle_opts.count;
+       for (ii = 0; ii < count; ii++)
+       {
+               if (strcmp(lang, subtitle_opts.map[ii].svalue) == 0)
+               {
+                       return subtitle_opts.map[ii].ivalue;
+               }
+       }
+       return -1;
+}
+
 gint
 ghb_find_subtitle_track(
        gint titleindex, 
@@ -1990,8 +2047,7 @@ ghb_find_subtitle_track(
        hb_list_t  * list;
        hb_title_t * title;
        hb_subtitle_t * subtitle;
-       gint ii;
-       gint count = 0;
+       gint count, ii;
        gboolean *used;
        
        g_debug("find_subtitle_track ()\n");
@@ -2023,20 +2079,8 @@ ghb_find_subtitle_track(
                                return ii;
                        }
                }
-               return -1;
-       }
-       else
-       {
-               count = subtitle_opts.count;
-               for (ii = 0; ii < count; ii++)
-               {
-                       if (strcmp(lang, subtitle_opts.map[ii].svalue) == 0)
-                       {
-                               return subtitle_opts.map[ii].ivalue;
-                       }
-               }
-               return -1;
        }
+       return -1;
 }
 
 gint
@@ -4016,12 +4060,18 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex)
        for (ii = 0; ii < count; ii++)
        {
                GValue *ssettings;
-               gboolean burned, one_burned = FALSE;
+               gboolean burned, enabled, one_burned = FALSE;
 
                ssettings = ghb_array_get_nth(subtitle_list, ii);
 
+               enabled = ghb_settings_get_boolean(ssettings, "SubtitleEnabled");
+
+               if (!enabled)
+                       continue;
+
                subtitle = ghb_settings_get_int(ssettings, "SubtitleTrack");
                burned = ghb_settings_get_boolean(ssettings, "SubtitleBurned");
+
                if (subtitle == -1)
                {
                        job->indepth_scan = 1;
index 0d98a84..4b55897 100644 (file)
@@ -139,6 +139,8 @@ void ghb_update_ui_combo_box(
        signal_user_data_t *ud, const gchar *name, gint user_data, gboolean all);
 gint ghb_find_audio_track(
        gint titleindex, const gchar *lang, gint acodec, GHashTable *track_indices);
+void ghb_add_all_subtitles(signal_user_data_t *ud, gint titleindex);
+gint ghb_find_pref_subtitle_track(const gchar *lang);
 gint ghb_find_subtitle_track(
        gint titleindex, const gchar *lang, GHashTable *track_indices);
 gint ghb_pick_subtitle_track(signal_user_data_t *ud);
index 74f7bf8..9e21444 100644 (file)
@@ -377,6 +377,7 @@ bind_audio_tree_model (signal_user_data_t *ud)
 }
 
 extern G_MODULE_EXPORT void subtitle_list_selection_changed_cb(void);
+extern G_MODULE_EXPORT void subtitle_enable_toggled_cb(void);
 extern G_MODULE_EXPORT void subtitle_forced_toggled_cb(void);
 extern G_MODULE_EXPORT void subtitle_burned_toggled_cb(void);
 extern G_MODULE_EXPORT void subtitle_track_changed_cb(void);
@@ -398,41 +399,44 @@ bind_subtitle_tree_model (signal_user_data_t *ud)
        selection = gtk_tree_view_get_selection (treeview);
        // 6 columns in model.  4 are visible, the other 2 is for storing
        // values that I need
-       treestore = gtk_list_store_new(8
-                                                                       G_TYPE_STRING,
+       treestore = gtk_list_store_new(7
+                                                                       G_TYPE_BOOLEAN, G_TYPE_STRING,
                                                                        G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,
-                                                                       G_TYPE_STRING,  G_TYPE_STRING, 
-                                                                       G_TYPE_STRING,  G_TYPE_INT, 
-                                                                       G_TYPE_INT);
+                                                                       G_TYPE_STRING,  G_TYPE_STRING,
+                                                                       G_TYPE_BOOLEAN);
        gtk_tree_view_set_model(treeview, GTK_TREE_MODEL(treestore));
 
+       cell = gtk_cell_renderer_toggle_new();
+       column = gtk_tree_view_column_new_with_attributes(
+                                                                       _("On"), cell, "active", 0, NULL);
+       gtk_tree_view_append_column(treeview, GTK_TREE_VIEW_COLUMN(column));
+       g_signal_connect(cell, "toggled", subtitle_enable_toggled_cb, ud);
+
        cell = gtk_cell_renderer_combo_new();
        ghb_subtitle_track_model(ud, -1);
        g_object_set(G_OBJECT(cell), "model", ud->subtitle_track_model,
        "text-column", 0, "editable", TRUE, "width", 200, "has-entry", FALSE, NULL);
        column = gtk_tree_view_column_new_with_attributes( _("Track"), cell, 
-                               "text", 0, "foreground", 5, "weight", 6, "style", 7, NULL);
+                               "text", 1, NULL);
        gtk_tree_view_append_column(treeview, GTK_TREE_VIEW_COLUMN(column));
        g_signal_connect(cell, "changed", subtitle_track_changed_cb, ud);
 
        cell = gtk_cell_renderer_toggle_new();
        column = gtk_tree_view_column_new_with_attributes(
-                                                                       _("Forced Only"), cell, "active", 1, NULL);
-       gtk_tree_view_column_set_max_width (column, 50);
+                                                                       _("Forced Only"), cell, "active", 2, NULL);
        gtk_tree_view_append_column(treeview, GTK_TREE_VIEW_COLUMN(column));
        g_signal_connect(cell, "toggled", subtitle_forced_toggled_cb, ud);
 
        cell = gtk_cell_renderer_toggle_new();
        gtk_cell_renderer_toggle_set_radio(GTK_CELL_RENDERER_TOGGLE(cell), TRUE);
        column = gtk_tree_view_column_new_with_attributes(
-                               _("Burned In"), cell, "active", 2, "cell-background", 5, NULL);
-       gtk_tree_view_column_set_max_width (column, 50);
+                               _("Burned In"), cell, "active", 3, NULL);
        gtk_tree_view_append_column(treeview, GTK_TREE_VIEW_COLUMN(column));
        g_signal_connect(cell, "toggled", subtitle_burned_toggled_cb, ud);
 
        cell = gtk_cell_renderer_text_new();
        column = gtk_tree_view_column_new_with_attributes(
-                                                                       _("Type"), cell, "text", 3, NULL);
+                                                                       _("Type"), cell, "text", 4, NULL);
        gtk_tree_view_append_column(treeview, GTK_TREE_VIEW_COLUMN(column));
 
 
index 35f7b9c..fafdd7f 100644 (file)
@@ -1133,14 +1133,14 @@ ghb_prefs_to_ui(signal_user_data_t *ud)
        // pointer will break strict-aliasing rules"
        while (g_hash_table_iter_next(
                        &iter, (gpointer*)(void*)&key, (gpointer*)(void*)&gval))
-    {
+       {
                const GValue *value = NULL;
                if (dict)
                        value = ghb_dict_lookup(dict, key);
                if (value == NULL)
                        value = gval;
                ghb_settings_set_value(ud->settings, key, value);
-    }
+       }
        internal = plist_get_dict(internalPlist, "Preferences");
        ghb_dict_iter_init(&iter, internal);
        // middle (void*) cast prevents gcc warning "defreferencing type-punned
@@ -1203,12 +1203,12 @@ ghb_prefs_save(GValue *settings)
        // pointer will break strict-aliasing rules"
        while (g_hash_table_iter_next(
                        &iter, (gpointer*)(void*)&key, (gpointer*)(void*)&value))
-    {
-           value = ghb_settings_get_value(settings, key);
-           if (value != NULL)
-           {
+       {
+               value = ghb_settings_get_value(settings, key);
+               if (value != NULL)
+               {
                        ghb_dict_insert(pref_dict, g_strdup(key), ghb_value_dup(value));
-           }
+               }
        }
        store_prefs();
        prefs_modified = FALSE;
@@ -1371,20 +1371,20 @@ ghb_prefs_load(signal_user_data_t *ud)
                prefsPlist = ghb_dict_value_new();
        dict = plist_get_dict(prefsPlist, "Preferences");
        internal = plist_get_dict(internalPlist, "Preferences");
-    if (dict == NULL && internal)
-    {
+       if (dict == NULL && internal)
+       {
                dict = ghb_dict_value_new();
                ghb_dict_insert(prefsPlist, g_strdup("Preferences"), dict);
 
-        // Get defaults from internal defaults 
+               // Get defaults from internal defaults 
                ghb_dict_iter_init(&iter, internal);
                // middle (void*) cast prevents gcc warning "defreferencing type-punned
                // pointer will break strict-aliasing rules"
                while (g_hash_table_iter_next(
                                &iter, (gpointer*)(void*)&key, (gpointer*)(void*)&gval))
-        {
+               {
                        ghb_dict_insert(dict, g_strdup(key), ghb_value_dup(gval));
-        }
+               }
                const gchar *dir = g_get_user_special_dir (G_USER_DIRECTORY_VIDEOS);
                if (dir == NULL)
                {
@@ -1405,7 +1405,7 @@ ghb_prefs_load(signal_user_data_t *ud)
                g_free(source);
 #endif
                store_prefs();
-    }
+       }
        // Read legacy default_preset preference and update accordingly
        path = ghb_dict_lookup(dict, "default_preset");
        if (path)
@@ -2618,7 +2618,7 @@ ghb_presets_reload(signal_user_data_t *ud)
        if (std_presets == NULL) return;
 
        remove_std_presets(ud);
-    indices = presets_find_default(presetsPlist, &len);
+       indices = presets_find_default(presetsPlist, &len);
        if (indices)
        {
                presets_clear_default(std_presets);
@@ -2946,10 +2946,23 @@ static void
 update_subtitle_presets(signal_user_data_t *ud)
 {
        g_debug("update_subtitle_presets");
-       const GValue *subtitle_list;
+       const GValue *subtitle_list, *subtitle;
+       GValue *slist, *dict;
+       gint count, ii;
 
        subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
-       ghb_settings_set_value(ud->settings, "SubtitleList", subtitle_list);
+       slist = ghb_array_value_new(8);
+       count = ghb_array_len(subtitle_list);
+       for (ii = 0; ii < count; ii++)
+       {
+               subtitle = ghb_array_get_nth(subtitle_list, ii);
+               if (ghb_settings_get_boolean(subtitle, "SubtitleEnabled"))
+               {
+                       dict = ghb_value_dup(subtitle);
+                       ghb_array_append(slist, dict);
+               }
+       }
+       ghb_settings_set_value(ud->settings, "SubtitleList", slist);
 }
 
 void
index 06ed0ec..b3b3a9b 100644 (file)
@@ -20,7 +20,8 @@
 #include "preview.h"
 #include "subtitlehandler.h"
 
-static void add_to_subtitle_list(signal_user_data_t *ud, GValue *settings);
+static void add_to_subtitle_list(
+       signal_user_data_t *ud, GValue *settings, gboolean can_delete);
 
 void
 free_subtitle_index_list(gpointer data)
@@ -35,15 +36,13 @@ free_subtitle_key(gpointer data)
                g_free(data);
 }
 
-static void
-add_pref(signal_user_data_t *ud, GValue *settings)
+void
+ghb_add_subtitle(signal_user_data_t *ud, GValue *settings, gboolean can_delete)
 {
        // Add the current subtitle settings to the list.
-       GtkWidget *widget;
-       gint count;
        GValue *subtitle_list;
        
-       g_debug("add_pref ()");
+       g_debug("ghb_add_subtitle ()");
 
        // Only allow up to 8 subtitle entries
        subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
@@ -53,12 +52,35 @@ add_pref(signal_user_data_t *ud, GValue *settings)
                ghb_settings_set_value(ud->settings, "subtitle_list", subtitle_list);
        }
        ghb_array_append(subtitle_list, settings);
-       add_to_subtitle_list(ud, settings);
-       count = ghb_array_len(subtitle_list);
-       if (count >= 8)
+       add_to_subtitle_list(ud, settings, can_delete);
+}
+
+static void
+add_all_pref_subtitles(signal_user_data_t *ud)
+{
+       const GValue *pref_subtitle;
+       GValue *subtitle;
+       gint count, ii, track;
+       char *lang;
+
+       pref_subtitle = ghb_settings_get_value(ud->settings, "SubtitleList");
+       count = ghb_array_len(pref_subtitle);
+       for (ii = 0; ii < count; ii++)
        {
-               widget = GHB_WIDGET(ud->builder, "subtitle_add");
-               gtk_widget_set_sensitive(widget, FALSE);
+               subtitle = ghb_value_dup(ghb_array_get_nth(pref_subtitle, ii));
+               ghb_settings_set_boolean(subtitle, "SubtitleEnabled", TRUE);
+               lang = ghb_settings_get_string(subtitle, "SubtitleLanguage");
+               // If there are multiple subtitles using the same language, then
+               // select sequential tracks for each.  The hash keeps track 
+               // of the tracks used for each language.
+               track = ghb_find_pref_subtitle_track(lang);
+               g_free(lang);
+               if (track >= 0)
+               {
+                       // Add to subtitle list
+                       ghb_settings_set_int(subtitle, "SubtitleTrack", track);
+                       ghb_add_subtitle(ud, subtitle, TRUE);
+               }
        }
 }
 
@@ -74,11 +96,17 @@ ghb_set_pref_subtitle(gint titleindex, signal_user_data_t *ud)
        GValue *subtitle;
        gint count, ii;
        
-       g_debug("ghb_set_pref_subtitle");
+       g_debug("ghb_set_pref_subtitle %d", titleindex);
        track_indices = g_hash_table_new_full(g_str_hash, g_str_equal, 
                                                                                        NULL, free_subtitle_index_list);
        // Clear the subtitle list
        ghb_clear_subtitle_list(ud);
+       if (titleindex < 0)
+       {
+               add_all_pref_subtitles(ud);
+               return;
+       }
+       ghb_add_all_subtitles(ud, titleindex);
        // Find "best" subtitle based on subtitle preferences
        button = GHB_WIDGET (ud->builder, "subtitle_add");
 
@@ -87,7 +115,7 @@ ghb_set_pref_subtitle(gint titleindex, signal_user_data_t *ud)
        count = ghb_array_len(pref_subtitle);
        for (ii = 0; ii < count; ii++)
        {
-               subtitle = ghb_value_dup(ghb_array_get_nth(pref_subtitle, ii));
+               subtitle = ghb_array_get_nth(pref_subtitle, ii);
                lang = ghb_settings_get_string(subtitle, "SubtitleLanguage");
                // If there are multiple subtitles using the same language, then
                // select sequential tracks for each.  The hash keeps track 
@@ -96,9 +124,8 @@ ghb_set_pref_subtitle(gint titleindex, signal_user_data_t *ud)
                g_free(lang);
                if (track >= 0)
                {
-                       ghb_settings_set_int(subtitle, "SubtitleTrack", track);
                        // Add to subtitle list
-                       add_pref(ud, subtitle);
+                       ghb_set_subtitle(ud, track, subtitle);
                }
        }
        g_hash_table_destroy(track_indices);
@@ -183,8 +210,47 @@ ghb_selected_subtitle_settings(signal_user_data_t *ud)
        return settings;
 }
 
+void
+ghb_subtitle_exclusive_burn(signal_user_data_t *ud, gint track)
+{
+       GValue *subtitle_list;
+       GValue *settings;
+       gint ii, count, tt;
+       GtkTreeView  *tv;
+       GtkTreeModel *tm;
+       GtkTreeIter   ti;
+       gboolean burned;
+
+       g_debug("ghb_subtitle_exclusive_burn");
+       subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
+       count = ghb_array_len(subtitle_list);
+       for (ii = 0; ii < count; ii++)
+       {
+               settings = ghb_array_get_nth(subtitle_list, ii);
+               tt = ghb_settings_combo_int(settings, "SubtitleTrack");
+               burned = ghb_settings_get_boolean(settings, "SubtitleBurned");
+
+               tv = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
+               g_return_if_fail(tv != NULL);
+               tm = gtk_tree_view_get_model(tv);
+               gtk_tree_model_iter_nth_child(tm, &ti, NULL, ii);
+               if (burned && tt != track)
+               {
+
+                       ghb_settings_set_boolean(settings, "SubtitleBurned", FALSE);
+                       burned = FALSE;
+                       gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 3, FALSE, -1);
+               }
+               if (!burned && mustBurn(ud, tt))
+               {
+                       ghb_settings_set_boolean(settings, "SubtitleEnabled", FALSE);
+                       gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 0, FALSE, -1);
+               }
+       }
+}
+
 G_MODULE_EXPORT void
-subtitle_forced_toggled_cb(
+subtitle_enable_toggled_cb(
        GtkCellRendererToggle *cell, 
        gchar                 *path,
        signal_user_data_t    *ud)
@@ -196,6 +262,8 @@ subtitle_forced_toggled_cb(
        gint          row;
        GtkTreePath  *tp;
        gint *indices;
+       GValue *subtitle_list, *settings;
+       gint track;
 
        g_debug("forced toggled");
        tp = gtk_tree_path_new_from_string (path);
@@ -204,81 +272,77 @@ subtitle_forced_toggled_cb(
        tm = gtk_tree_view_get_model(tv);
        g_return_if_fail(tm != NULL);
        gtk_tree_model_get_iter(tm, &ti, tp);
-       gtk_tree_model_get(tm, &ti, 1, &active, -1);
+       gtk_tree_model_get(tm, &ti, 0, &active, -1);
        active ^= 1;
 
        // Get the row number
        indices = gtk_tree_path_get_indices (tp);
        row = indices[0];
        gtk_tree_path_free(tp);
+       subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
 
-       if (row >= 0)
-       {
-               GValue *subtitle_list, *settings;
-               gint source, track;
-
-               subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
-
-               settings = ghb_array_get_nth(subtitle_list, row);
-               track = ghb_settings_combo_int(settings, "SubtitleTrack");
-
-               source = ghb_subtitle_track_source(ud, track);
-               if (source != VOBSUB)
-                       return;
+       if (row < 0 || row >= ghb_array_len(subtitle_list))
+               return;
 
-               if (row < ghb_array_len(subtitle_list))
-               {
-                       GValue *settings;
+       settings = ghb_array_get_nth(subtitle_list, row);
+       track = ghb_settings_combo_int(settings, "SubtitleTrack");
 
-                       settings = ghb_array_get_nth(subtitle_list, row);
-                       ghb_settings_set_boolean(settings, "SubtitleForced", active);
-                       gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 1, active, -1);
-               }
+       if (active && mustBurn(ud, track))
+       {
+               ghb_settings_set_boolean(settings, "SubtitleBurned", TRUE);
+               gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 3, TRUE, -1);
+               ghb_subtitle_exclusive_burn(ud, track);
        }
+
+       ghb_settings_set_boolean(settings, "SubtitleEnabled", active);
+       gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 0, active, -1);
 }
 
-void
-ghb_subtitle_exclusive_burn(signal_user_data_t *ud, gint track)
+G_MODULE_EXPORT void
+subtitle_forced_toggled_cb(
+       GtkCellRendererToggle *cell, 
+       gchar                 *path,
+       signal_user_data_t    *ud)
 {
-       GValue *subtitle_list;
-       GValue *settings;
-       gint ii, count, tt;
        GtkTreeView  *tv;
        GtkTreeModel *tm;
        GtkTreeIter   ti;
-       gboolean burned;
+       gboolean      active;
+       gint          row;
+       GtkTreePath  *tp;
+       gint *indices;
+       GValue *subtitle_list, *settings;
+       gint source, track;
+
+       g_debug("forced toggled");
+       tp = gtk_tree_path_new_from_string (path);
+       tv = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
+       g_return_if_fail(tv != NULL);
+       tm = gtk_tree_view_get_model(tv);
+       g_return_if_fail(tm != NULL);
+       gtk_tree_model_get_iter(tm, &ti, tp);
+       gtk_tree_model_get(tm, &ti, 2, &active, -1);
+       active ^= 1;
+
+       // Get the row number
+       indices = gtk_tree_path_get_indices (tp);
+       row = indices[0];
+       gtk_tree_path_free(tp);
 
-       g_debug("ghb_subtitle_exclusive_burn");
        subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
-       count = ghb_array_len(subtitle_list);
-       for (ii = 0; ii < count; ii++)
-       {
-               settings = ghb_array_get_nth(subtitle_list, ii);
-               tt = ghb_settings_combo_int(settings, "SubtitleTrack");
-               burned = ghb_settings_get_boolean(settings, "SubtitleBurned");
 
-               tv = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
-               g_return_if_fail(tv != NULL);
-               tm = gtk_tree_view_get_model(tv);
-               gtk_tree_model_iter_nth_child(tm, &ti, NULL, ii);
-               if (burned && tt != track)
-               {
+       if (row < 0 || row >= ghb_array_len(subtitle_list))
+               return;
 
-                       ghb_settings_set_boolean(settings, "SubtitleBurned", FALSE);
-                       burned = FALSE;
-                       gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 2, FALSE, -1);
-               }
-               if (!burned && mustBurn(ud, tt))
-               {
-                       gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 
-                               5, "red", 6, 800, 7, 2, -1);
-               }
-               else
-               {
-                       gtk_list_store_set(GTK_LIST_STORE(tm), &ti,
-                               5, NULL, 6, 400, 7, 0, -1);
-               }
-       }
+       settings = ghb_array_get_nth(subtitle_list, row);
+       track = ghb_settings_combo_int(settings, "SubtitleTrack");
+
+       source = ghb_subtitle_track_source(ud, track);
+       if (source != VOBSUB)
+               return;
+
+       ghb_settings_set_boolean(settings, "SubtitleForced", active);
+       gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 2, active, -1);
 }
 
 G_MODULE_EXPORT void
@@ -305,7 +369,7 @@ subtitle_burned_toggled_cb(
        tm = gtk_tree_view_get_model(tv);
        g_return_if_fail(tm != NULL);
        gtk_tree_model_get_iter(tm, &ti, tp);
-       gtk_tree_model_get(tm, &ti, 2, &active, -1);
+       gtk_tree_model_get(tm, &ti, 3, &active, -1);
        active ^= 1;
 
        // Get the row number
@@ -330,7 +394,7 @@ subtitle_burned_toggled_cb(
 
        ghb_settings_set_boolean(settings, "SubtitleBurned", active);
 
-       gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 2, active, -1);
+       gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 3, active, -1);
        // Unburn the rest
        ghb_subtitle_exclusive_burn(ud, track);
 }
@@ -408,43 +472,25 @@ subtitle_track_changed_cb(
        }
        ghb_settings_set_string(settings, "SubtitleLanguage", lang);
 
-       const gchar *track, *source, *color;
-       gboolean forced, burned;
+       const gchar *track, *source;
+       gboolean burned;
        gchar *s_track;
-       gint i_track, weight, style;
+       gint i_track;
 
        track = ghb_settings_combo_option(settings, "SubtitleTrack");
-       forced = ghb_settings_get_boolean(settings, "SubtitleForced");
        burned = ghb_settings_get_boolean(settings, "SubtitleBurned");
 
        s_track = ghb_settings_get_string(settings, "SubtitleTrack");
        i_track = ghb_settings_get_int(settings, "SubtitleTrack");
        source = ghb_subtitle_track_source_name(ud, i_track);
 
-       if (!burned && mustBurn(ud, i_track))
-       {
-               weight = 800;
-               style = 2;
-               color = "red";
-       }
-       else
-       {
-               weight = 400;
-               style = 0;
-               color = NULL;
-       }
-
        gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 
                        // These are displayed in list
-                       0, track,
-                       1, forced,
-                       2, burned,
-                       3, source,
+                       1, track,
+                       3, burned,
+                       4, source,
                        // These are used to set combo values when a list item is selected
-                       4, s_track,
-                       5, color,
-                       6, weight,
-                       7, style,
+                       5, s_track,
                        -1);
        g_free(s_track);
        ghb_live_reset(ud);
@@ -460,8 +506,7 @@ ghb_subtitle_adjust_burn(signal_user_data_t *ud)
        GtkTreeView  *tv;
        GtkTreeModel *tm;
        GtkTreeIter   ti;
-       gboolean burned;
-       gint burned_count = 0;
+       gboolean burned, enabled, found;
 
        g_debug("ghb_subtitle_adjust_burn");
        subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
@@ -469,39 +514,46 @@ ghb_subtitle_adjust_burn(signal_user_data_t *ud)
        for (ii = 0; ii < count; ii++)
        {
                settings = ghb_array_get_nth(subtitle_list, ii);
-               track = ghb_settings_combo_int(settings, "SubtitleTrack");
-               if (mustBurn(ud, track))
+               enabled = ghb_settings_get_boolean(settings, "SubtitleEnabled");
+               burned = ghb_settings_get_boolean(settings, "SubtitleBurned");
+               if (enabled && burned)
                {
-                       burned_count++;
+                       found = TRUE;
+                       break;
                }
        }
        for (ii = 0; ii < count; ii++)
        {
                settings = ghb_array_get_nth(subtitle_list, ii);
                track = ghb_settings_combo_int(settings, "SubtitleTrack");
+
+               if (!mustBurn(ud, track))
+                       continue;
+
+               enabled = ghb_settings_get_boolean(settings, "SubtitleEnabled");
                burned = ghb_settings_get_boolean(settings, "SubtitleBurned");
 
                tv = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
                g_return_if_fail(tv != NULL);
                tm = gtk_tree_view_get_model(tv);
                gtk_tree_model_iter_nth_child(tm, &ti, NULL, ii);
-               if (!burned && mustBurn(ud, track))
+
+               if (!found)
                {
-                       if (burned_count > 1)
-                       {
-                               gtk_list_store_set(GTK_LIST_STORE(tm), &ti,
-                                       5, "red", 6, 800, 7, 2, -1);
-                       }
-                       else
+                       if (enabled && !burned)
                        {
                                ghb_settings_set_boolean(settings, "SubtitleBurned", TRUE);
-                               gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 2, TRUE, -1);
+                               gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 3, TRUE, -1);
+                               found = TRUE;
                        }
                }
                else
                {
-                       gtk_list_store_set(GTK_LIST_STORE(tm), &ti,
-                               5, NULL, 6, 400, 7, 0, -1);
+                       if (enabled && !burned)
+                       {
+                               ghb_settings_set_boolean(settings, "SubtitleEnabled", FALSE);
+                               gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 0, FALSE, -1);
+                       }
                }
        }
 }
@@ -528,16 +580,19 @@ ghb_clear_subtitle_list(signal_user_data_t *ud)
 }
 
 static void
-add_to_subtitle_list(signal_user_data_t *ud, GValue *settings)
+add_to_subtitle_list(
+       signal_user_data_t *ud, 
+       GValue *settings, 
+       gboolean can_delete)
 {
        GtkTreeView *treeview;
        GtkTreeIter iter;
        GtkListStore *store;
        GtkTreeSelection *selection;
-       const gchar *track, *source, *color;
-       gboolean forced, burned;
+       const gchar *track, *source;
+       gboolean forced, burned, enabled;
        gchar *s_track;
-       gint i_track, weight, style;
+       gint i_track;
        
        g_debug("add_to_subtitle_list ()");
        treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
@@ -545,6 +600,7 @@ add_to_subtitle_list(signal_user_data_t *ud, GValue *settings)
        store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview));
 
        track = ghb_settings_combo_option(settings, "SubtitleTrack");
+       enabled = ghb_settings_get_boolean(settings, "SubtitleEnabled");
        forced = ghb_settings_get_boolean(settings, "SubtitleForced");
        burned = ghb_settings_get_boolean(settings, "SubtitleBurned");
 
@@ -552,31 +608,17 @@ add_to_subtitle_list(signal_user_data_t *ud, GValue *settings)
        i_track = ghb_settings_get_int(settings, "SubtitleTrack");
        source = ghb_subtitle_track_source_name(ud, i_track);
 
-       if (!burned && mustBurn(ud, i_track))
-       {
-               weight = 800;
-               style = 2;
-               color = "red";
-       }
-       else
-       {
-               weight = 400;
-               style = 0;
-               color = NULL;
-       }
-
        gtk_list_store_append(store, &iter);
        gtk_list_store_set(store, &iter, 
                // These are displayed in list
-               0, track,
-               1, forced,
-               2, burned,
-               3, source,
+               0, enabled,
+               1, track,
+               2, forced,
+               3, burned,
+               4, source,
                // These are used to set combo box values when a list item is selected
-               4, s_track,
-               5, color,
-               6, weight,
-               7, style,
+               5, s_track,
+               6, can_delete,
                -1);
        gtk_tree_selection_select_iter(selection, &iter);
        g_free(s_track);
@@ -595,17 +637,21 @@ subtitle_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data
        if (gtk_tree_selection_get_selected(selection, &store, &iter))
        {
                const gchar *track;
+               gboolean can_delete;
 
-               gtk_tree_model_get(store, &iter, 4, &track, -1);
+               gtk_tree_model_get(store, &iter, 5, &track, 6, &can_delete, -1);
                ghb_settings_set_string(ud->settings, "SubtitleTrack", track);
 
-               widget = GHB_WIDGET (ud->builder, "subtitle_remove");
-               gtk_widget_set_sensitive(widget, TRUE);
-       }
-       else
-       {
-               widget = GHB_WIDGET (ud->builder, "subtitle_remove");
-               gtk_widget_set_sensitive(widget, FALSE);
+               if (can_delete)
+               {
+                       widget = GHB_WIDGET (ud->builder, "subtitle_remove");
+                       gtk_widget_set_sensitive(widget, TRUE);
+               }
+               else
+               {
+                       widget = GHB_WIDGET (ud->builder, "subtitle_remove");
+                       gtk_widget_set_sensitive(widget, FALSE);
+               }
        }
 }
 
@@ -631,6 +677,7 @@ subtitle_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
        settings = ghb_dict_value_new();
        // Only allow up to 8 subtitle entries
        ghb_settings_set_int(settings, "SubtitleTrack", track);
+       ghb_settings_set_boolean(settings, "SubtitleEnabled", TRUE);
        ghb_settings_take_value(settings, "SubtitleForced", 
                                                        ghb_boolean_value_new(FALSE));
        ghb_settings_take_value(settings, "SubtitleBurned", 
@@ -643,12 +690,8 @@ subtitle_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
                ghb_settings_set_value(ud->settings, "subtitle_list", subtitle_list);
        }
        ghb_array_append(subtitle_list, settings);
-       add_to_subtitle_list(ud, settings);
+       add_to_subtitle_list(ud, settings, TRUE);
        count = ghb_array_len(subtitle_list);
-       if (count >= 8)
-       {
-               gtk_widget_set_sensitive(xwidget, FALSE);
-       }
 }
 
 G_MODULE_EXPORT void
@@ -702,36 +745,45 @@ subtitle_remove_clicked_cb(GtkWidget *widget, signal_user_data_t *ud)
 }
 
 void
-ghb_set_subtitle(signal_user_data_t *ud, GValue *settings)
+ghb_set_subtitle(signal_user_data_t *ud, gint track, GValue *settings)
 {
-       GtkWidget *button;
-
+       GtkTreeView  *tv;
+       GtkTreeModel *tm;
+       GtkTreeIter   ti;
        GValue *slist;
-       GValue *track, *subtitle;
-       //GValue *forced, *burned;
-       gint count, ii, i_track;
+       GValue *subtitle;
+       gint count, ii, tt;
+       gboolean forced, burned;
        
-       g_debug("set_subtitle");
-       // Clear the subtitle list
-       ghb_clear_subtitle_list(ud);
-       button = GHB_WIDGET (ud->builder, "subtitle_add");
-       slist = ghb_settings_get_value(settings, "subtitle_list");
+       g_debug("ghb_set_subtitle");
+       slist = ghb_settings_get_value(ud->settings, "subtitle_list");
 
        count = ghb_array_len(slist);
        for (ii = 0; ii < count; ii++)
        {
                subtitle = ghb_array_get_nth(slist, ii);
-               track = ghb_settings_get_value(subtitle, "SubtitleTrack");
-               i_track = ghb_settings_get_int(subtitle, "SubtitleTrack");
-               //forced = ghb_settings_get_value(subtitle, "SubtitleForced");
-               //burned = ghb_settings_get_value(subtitle, "SubtitleBurned");
+               tt = ghb_settings_get_int(subtitle, "SubtitleTrack");
+               if (track != tt)
+                       continue;
+               
+               forced = ghb_settings_get_boolean(settings, "SubtitleForced");
+               burned = ghb_settings_get_boolean(settings, "SubtitleBurned");
 
-               if (i_track != -2)
-               {
-                       // Add to subtitle list
-                       g_signal_emit_by_name(button, "clicked", ud);
-                       ghb_ui_update(ud, "AudioTrack", track);
-               }
+               tv = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
+               g_return_if_fail(tv != NULL);
+               tm = gtk_tree_view_get_model(tv);
+               gtk_tree_model_iter_nth_child(tm, &ti, NULL, ii);
+
+               ghb_settings_set_boolean(subtitle, "SubtitleEnabled", TRUE);
+               ghb_settings_set_boolean(subtitle, "SubtitleForced", forced);
+               ghb_settings_set_boolean(subtitle, "SubtitleBurned", burned);
+               gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 
+                       0, TRUE, 
+                       2, forced, 
+                       3, burned, 
+                       6, FALSE, 
+                       -1);
+               break;
        }
 }
 
index 9b37e58..eb9ce78 100644 (file)
 
 void ghb_set_pref_subtitle(gint titleindex, signal_user_data_t *ud);
 void ghb_clear_subtitle_list(signal_user_data_t *ud);
-void ghb_set_subtitle(signal_user_data_t *ud, GValue *settings);
+void ghb_set_subtitle(signal_user_data_t *ud, gint track, GValue *settings);
 void ghb_subtitle_adjust_burn(signal_user_data_t *ud);
 GValue* ghb_selected_subtitle_settings(signal_user_data_t *ud);
 gint ghb_selected_subtitle_row(signal_user_data_t *ud);
+void ghb_add_subtitle(
+       signal_user_data_t *ud, GValue *settings, gboolean can_delete);
 
 #endif // _SUBTITLEHANDLER_H_