OSDN Git Service

LinGui:
authorjstebbins <jstebbins@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Wed, 20 May 2009 23:39:06 +0000 (23:39 +0000)
committerjstebbins <jstebbins@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Wed, 20 May 2009 23:39:06 +0000 (23:39 +0000)
- Move the subtitle track combo into the treeview list
  Each subtitle entry has its own combo to select the track now

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

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

index e2140d7..decc457 100644 (file)
@@ -1257,7 +1257,7 @@ title_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 
        titleindex = ghb_settings_combo_int(ud->settings, "title");
        ghb_update_ui_combo_box (ud, "AudioTrack", titleindex, FALSE);
-       ghb_update_ui_combo_box (ud, "SubtitleTrack", titleindex, FALSE);
+       ghb_subtitle_track_model(ud, titleindex);
 
        ghb_set_pref_subtitle(titleindex, ud);
        if (ghb_get_title_info (&tinfo, titleindex))
index 54e99ee..f740a90 100644 (file)
                                         <property name="position">1</property>
                                       </packing>
                                     </child>
-                                    <child>
-                                      <object class="GtkAlignment" id="alignment44">
-                                        <property name="visible">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="xalign">1</property>
-                                        <property name="xscale">0</property>
-                                        <property name="yscale">0</property>
-                                        <child>
-                                          <object class="GtkHBox" id="hbox21">
-                                            <property name="visible">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="spacing">5</property>
-                                            <child>
-                                              <object class="GtkLabel" id="label24">
-                                                <property name="visible">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="label" translatable="yes">Subtitle:</property>
-                                              </object>
-                                            </child>
-                                            <child>
-                                              <object class="GtkComboBox" id="SubtitleTrack">
-                                                <property name="visible">True</property>
-                                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                                <signal handler="subtitle_track_changed_cb" name="changed"/>
-                                              </object>
-                                              <packing>
-                                                <property name="position">1</property>
-                                                <property name="expand">False</property>
-                                              </packing>
-                                            </child>
-                                          </object>
-                                        </child>
-                                      </object>
-                                      <packing>
-                                        <property name="position">2</property>
-                                      </packing>
-                                    </child>
                                   </object>
                                   <packing>
                                     <property name="expand">False</property>
index b4635d2..0fbd691 100644 (file)
@@ -1349,6 +1349,8 @@ init_combo_box(GtkBuilder *builder, const gchar *name)
        g_debug("init_combo_box() %s\n", name);
        // First modify the combobox model to allow greying out of options
        combo = GTK_COMBO_BOX(GHB_WIDGET(builder, name));
+       if (combo == NULL)
+               return;
        // Store contains:
        // 1 - String to display
        // 2 - bool indicating whether the entry is selectable (grey or not)
@@ -1680,7 +1682,7 @@ audio_track_opts_set(GtkBuilder *builder, const gchar *name, gint titleindex)
 }
 
 void
-subtitle_opts_set(signal_user_data_t *ud, const gchar *name, gint titleindex)
+ghb_subtitle_track_model(signal_user_data_t *ud, gint titleindex)
 {
        GtkTreeIter iter;
        GtkListStore *store;
@@ -1689,9 +1691,7 @@ subtitle_opts_set(signal_user_data_t *ud, const gchar *name, gint titleindex)
        hb_subtitle_t * subtitle;
        gint ii, count = 0;
        
-       g_debug("subtitle_opts_set () %s\n", name);
-       store = get_combo_box_store(ud->builder, name);
-       gtk_list_store_clear(store);
+       g_debug("ghb_subtitle_track_model ()\n");
        if (h_scan != NULL)
        {
                list = hb_get_titles( h_scan );
@@ -1713,6 +1713,23 @@ subtitle_opts_set(signal_user_data_t *ud, const gchar *name, gint titleindex)
                subtitle_opts.count = LANG_TABLE_SIZE+2;
                subtitle_opts.map = g_malloc((LANG_TABLE_SIZE+2)*sizeof(options_map_t));
        }
+       if (ud->subtitle_track_model == NULL)
+       {
+               // Store contains:
+               // 1 - String to display
+               // 2 - bool indicating whether the entry is selectable (grey or not)
+               // 3 - String that is used for presets
+               // 4 - Int value determined by backend
+               // 5 - String value determined by backend
+               store = gtk_list_store_new(5, G_TYPE_STRING, G_TYPE_BOOLEAN, 
+                                                          G_TYPE_STRING, G_TYPE_DOUBLE, G_TYPE_STRING);
+               ud->subtitle_track_model = store;
+       }
+       else
+       {
+               store = ud->subtitle_track_model;
+               gtk_list_store_clear(store);
+       }
        gtk_list_store_append(store, &iter);
        gtk_list_store_set(store, &iter, 
                                           0, "Autoselect", 
@@ -2039,7 +2056,7 @@ ghb_pick_subtitle_track(signal_user_data_t *ud)
                {
                        // Already in use, pick another
                        candidate++;
-                       if (candidate >= subtitle_opts.count)
+                       if (candidate >= subtitle_opts.count-1)
                        {
                                candidate = 0;
                        }
@@ -2223,7 +2240,6 @@ ghb_update_ui_combo_box(
                video_rate_opts_set(ud->builder, "VideoFramerate", hb_video_rates, hb_video_rates_count);
                mix_opts_set(ud->builder, "AudioMixdown");
                language_opts_set(ud->builder, "SourceAudioLang");
-               subtitle_opts_set(ud, "SubtitleTrack", user_data);
                title_opts_set(ud->builder, "title");
                audio_track_opts_set(ud->builder, "AudioTrack", user_data);
                generic_opts_set(ud->builder, "VideoQualityGranularity", &vqual_granularity_opts);
@@ -2256,8 +2272,6 @@ ghb_update_ui_combo_box(
                        mix_opts_set(ud->builder, "AudioMixdown");
                else if (strcmp(name, "SourceAudioLang") == 0)
                        language_opts_set(ud->builder, "SourceAudioLang");
-               else if (strcmp(name, "SubtitleTrack") == 0)
-                       subtitle_opts_set(ud, "SubtitleTrack", user_data);
                else if (strcmp(name, "title") == 0)
                        title_opts_set(ud->builder, "title");
                else if (strcmp(name, "AudioTrack") == 0)
@@ -2281,7 +2295,6 @@ init_ui_combo_boxes(GtkBuilder *builder)
        init_combo_box(builder, "VideoFramerate");
        init_combo_box(builder, "AudioMixdown");
        init_combo_box(builder, "SourceAudioLang");
-       init_combo_box(builder, "SubtitleTrack");
        init_combo_box(builder, "title");
        init_combo_box(builder, "AudioTrack");
        for (ii = 0; combo_name_map[ii].name != NULL; ii++)
index 43ad920..0d98a84 100644 (file)
@@ -152,6 +152,7 @@ gchar* ghb_dvd_volname(const gchar *device);
 gint ghb_get_title_number(gint titleindex);
 gint ghb_subtitle_track_source(signal_user_data_t *ud, gint track);
 const char* ghb_subtitle_track_source_name(signal_user_data_t *ud, gint track);
+void ghb_subtitle_track_model(signal_user_data_t *ud, gint titleindex);
 
 gboolean ghb_validate_vquality(GValue *settings);
 gboolean ghb_validate_audio(signal_user_data_t *ud);
index a9c07fa..74f7bf8 100644 (file)
@@ -379,6 +379,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_forced_toggled_cb(void);
 extern G_MODULE_EXPORT void subtitle_burned_toggled_cb(void);
+extern G_MODULE_EXPORT void subtitle_track_changed_cb(void);
 
 // Create and bind the tree model to the tree view for the subtitle track list
 // Also, connect up the signal that lets us know the selection has changed
@@ -405,10 +406,14 @@ bind_subtitle_tree_model (signal_user_data_t *ud)
                                                                        G_TYPE_INT);
        gtk_tree_view_set_model(treeview, GTK_TREE_MODEL(treestore));
 
-       cell = gtk_cell_renderer_text_new();
+       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);
        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(
index 072baf0..0616426 100644 (file)
@@ -53,6 +53,7 @@ typedef struct
        preview_t *preview;
        gchar *appcast;
        gint appcast_len;
+       GtkListStore *subtitle_track_model;
 } signal_user_data_t;
 
 enum
index 70f1a60..06ed0ec 100644 (file)
@@ -99,7 +99,6 @@ ghb_set_pref_subtitle(gint titleindex, signal_user_data_t *ud)
                        ghb_settings_set_int(subtitle, "SubtitleTrack", track);
                        // Add to subtitle list
                        add_pref(ud, subtitle);
-                       ghb_ui_update(ud, "SubtitleTrack", ghb_int64_value(track));
                }
        }
        g_hash_table_destroy(track_indices);
@@ -184,78 +183,6 @@ ghb_selected_subtitle_settings(signal_user_data_t *ud)
        return settings;
 }
 
-static void
-subtitle_list_refresh_selected(signal_user_data_t *ud)
-{
-       GtkTreeView *treeview;
-       GtkTreePath *treepath;
-       GtkTreeSelection *selection;
-       GtkTreeModel *store;
-       GtkTreeIter iter;
-       gint *indices;
-       gint row;
-       GValue *settings = NULL;
-       const GValue *subtitle_list;
-       
-       g_debug("subtitle_list_refresh_selected ()");
-       treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
-       selection = gtk_tree_view_get_selection (treeview);
-       if (gtk_tree_selection_get_selected(selection, &store, &iter))
-       {
-               const gchar *track, *source, *color;
-               gboolean forced, burned;
-               gchar *s_track;
-               gint i_track, weight, style;
-
-               // Get the row number
-               treepath = gtk_tree_model_get_path (store, &iter);
-               indices = gtk_tree_path_get_indices (treepath);
-               row = indices[0];
-               gtk_tree_path_free(treepath);
-               // find subtitle settings
-               if (row < 0) return;
-               subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
-               if (row >= ghb_array_len(subtitle_list))
-                       return;
-               settings = ghb_array_get_nth(subtitle_list, row);
-
-               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(store), &iter, 
-                       // These are displayed in list
-                       0, track,
-                       1, forced,
-                       2, burned,
-                       3, source,
-                       // These are used to set combo values when a list item is selected
-                       4, s_track,
-                       5, color,
-                       6, weight,
-                       7, style,
-                       -1);
-               g_free(s_track);
-       }
-}
-
 G_MODULE_EXPORT void
 subtitle_forced_toggled_cb(
        GtkCellRendererToggle *cell, 
@@ -279,7 +206,6 @@ subtitle_forced_toggled_cb(
        gtk_tree_model_get_iter(tm, &ti, tp);
        gtk_tree_model_get(tm, &ti, 1, &active, -1);
        active ^= 1;
-       gtk_list_store_set(GTK_LIST_STORE(tm), &ti, 1, active, -1);
 
        // Get the row number
        indices = gtk_tree_path_get_indices (tp);
@@ -288,15 +214,25 @@ subtitle_forced_toggled_cb(
 
        if (row >= 0)
        {
-               GValue *subtitle_list;
+               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 < ghb_array_len(subtitle_list))
                {
                        GValue *settings;
 
                        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);
                }
        }
 }
@@ -359,7 +295,7 @@ subtitle_burned_toggled_cb(
        gint          row;
        gint *indices;
        GValue *subtitle_list;
-       gint count, track;
+       gint count, track, source;
        GValue *settings;
 
        g_debug("burned toggled");
@@ -384,6 +320,11 @@ subtitle_burned_toggled_cb(
 
        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 (!active && mustBurn(ud, track))
                return;
 
@@ -415,41 +356,99 @@ trackUsed(signal_user_data_t *ud, gint track)
 }
 
 G_MODULE_EXPORT void
-subtitle_track_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
+subtitle_track_changed_cb(
+       GtkCellRendererCombo *combo,
+       gchar *path,
+       GtkTreeIter *iter,
+       signal_user_data_t *ud)
 {
-       GValue *settings;
+       GtkTreeView  *tv;
+       GtkTreeModel *tm;
+       GtkTreeIter   ti;
+       GtkTreePath  *tp;
+       gdouble dtrack;
+       gint *indices;
+       int tt, row;
+       GValue *subtitle_list, *settings;
+       const char *lang;
 
        g_debug("subtitle_track_changed_cb ()");
-       ghb_check_dependency(ud, widget);
-       settings = ghb_selected_subtitle_settings(ud);
-       if (settings != NULL)
+       gtk_tree_model_get(GTK_TREE_MODEL(ud->subtitle_track_model), iter, 
+                                               3, &dtrack, -1);
+       tt = (gint)dtrack;
+       if (trackUsed(ud, tt))
+               return;
+
+       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);
+
+       // 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 >= ghb_array_len(subtitle_list))
+               return;
+       settings = ghb_array_get_nth(subtitle_list, row);
+
+       ghb_settings_set_int(settings, "SubtitleTrack", tt);
+       lang = ghb_settings_combo_string(settings, "SubtitleTrack");
+       if (mustBurn(ud, tt))
        {
-               const gchar *lang;
-               GValue *gval;
-               GtkWidget *widget;
-               gint track;
-
-               widget = GHB_WIDGET (ud->builder, "SubtitleTrack");
-               gval = ghb_widget_value(widget);
-               track = ghb_value_int(gval);
-               ghb_value_free(gval);
-               if (trackUsed(ud, track))
-                       return;
-               ghb_widget_to_setting(settings, widget);
-               track = ghb_settings_combo_int(settings, "SubtitleTrack");
-               lang = ghb_settings_combo_string(settings, "SubtitleTrack");
-               if (mustBurn(ud, track))
-               {
-                       ghb_settings_set_boolean(settings, "SubtitleBurned", TRUE);
-               }
-               else
-               {
-                       ghb_settings_set_boolean(settings, "SubtitleBurned", FALSE);
-               }
-               ghb_settings_set_string(settings, "SubtitleLanguage", lang);
-               subtitle_list_refresh_selected(ud);
+               ghb_settings_set_boolean(settings, "SubtitleBurned", TRUE);
+       }
+       else
+       {
+               ghb_settings_set_boolean(settings, "SubtitleBurned", FALSE);
+       }
+       ghb_settings_set_string(settings, "SubtitleLanguage", lang);
+
+       const gchar *track, *source, *color;
+       gboolean forced, burned;
+       gchar *s_track;
+       gint i_track, weight, style;
+
+       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,
+                       // These are used to set combo values when a list item is selected
+                       4, s_track,
+                       5, color,
+                       6, weight,
+                       7, style,
+                       -1);
+       g_free(s_track);
        ghb_live_reset(ud);
+
 }
 
 void
@@ -581,7 +580,8 @@ add_to_subtitle_list(signal_user_data_t *ud, GValue *settings)
                -1);
        gtk_tree_selection_select_iter(selection, &iter);
        g_free(s_track);
-       ghb_subtitle_exclusive_burn(ud, i_track);
+       if (burned)
+               ghb_subtitle_exclusive_burn(ud, i_track);
 }
 
 G_MODULE_EXPORT void
@@ -597,7 +597,8 @@ subtitle_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data
                const gchar *track;
 
                gtk_tree_model_get(store, &iter, 4, &track, -1);
-               ghb_ui_update(ud, "SubtitleTrack", ghb_string_value(track));
+               ghb_settings_set_string(ud->settings, "SubtitleTrack", track);
+
                widget = GHB_WIDGET (ud->builder, "subtitle_remove");
                gtk_widget_set_sensitive(widget, TRUE);
        }
@@ -613,7 +614,6 @@ subtitle_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
 {
        // Add the current subtitle settings to the list.
        GValue *settings;
-       GtkWidget *widget;
        gint count;
        GValue *subtitle_list;
        gboolean burned = FALSE;
@@ -630,7 +630,6 @@ subtitle_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
        }
        settings = ghb_dict_value_new();
        // Only allow up to 8 subtitle entries
-       widget = GHB_WIDGET(ud->builder, "SubtitleTrack");
        ghb_settings_set_int(settings, "SubtitleTrack", track);
        ghb_settings_take_value(settings, "SubtitleForced", 
                                                        ghb_boolean_value_new(FALSE));