OSDN Git Service

LinGui: remove target file size option
[handbrake-jp/handbrake-jp-git.git] / gtk / src / callbacks.c
index b66e48e..9355e80 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
 /*
  * callbacks.c
- * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
+ * Copyright (C) John Stebbins 2008-2011 <stebbins@stebbins>
  * 
  * callbacks.c is free software.
  * 
@@ -535,19 +535,12 @@ get_extension(signal_user_data_t *ud)
 {
        int container;
        const gchar *extension = "error";
-       GValue *audio_list;
-       GValue *subtitle_list;
 
        container = ghb_settings_combo_int(ud->settings, "FileFormat");
        if (container == HB_MUX_MP4)
        {
                extension = "mp4";
-               audio_list = ghb_settings_get_value(ud->settings, "audio_list");
-               subtitle_list = ghb_settings_get_value(ud->settings, "subtitle_list");
-               if (ghb_ac3_in_audio_list(audio_list) ||
-                       ghb_soft_in_subtitle_list(subtitle_list) ||
-                       ghb_settings_get_boolean(ud->settings, "ChapterMarkers") ||
-                       ghb_settings_get_boolean(ud->settings, "UseM4v"))
+               if (ghb_settings_get_boolean(ud->settings, "UseM4v"))
                {
                        extension = "m4v";
                }
@@ -768,6 +761,8 @@ chooser_file_selected_cb(GtkFileChooser *dialog, signal_user_data_t *ud)
        gboolean foundit = FALSE;
        GtkComboBox *combo;
        
+       g_debug("chooser_file_selected_cb ()");
+
        if (name == NULL) return;
        combo = GTK_COMBO_BOX(GHB_WIDGET(ud->builder, "source_device"));
        store = gtk_combo_box_get_model(combo);
@@ -797,6 +792,7 @@ dvd_device_changed_cb(GtkComboBox *combo, signal_user_data_t *ud)
        GtkWidget *dialog;
        gint ii;
 
+       g_debug("dvd_device_changed_cb ()");
        ii = gtk_combo_box_get_active (combo);
        if (ii > 0)
        {
@@ -813,52 +809,17 @@ dvd_device_changed_cb(GtkComboBox *combo, signal_user_data_t *ud)
        }
 }
 
-G_MODULE_EXPORT void
-source_type_changed_cb(GtkToggleButton *toggle, signal_user_data_t *ud)
-{
-       gchar *folder;
-       GtkFileChooser *chooser;
-       GtkWidget *dvd_device_combo;
-       
-       g_debug("source_type_changed_cb ()");
-       chooser = GTK_FILE_CHOOSER(GHB_WIDGET(ud->builder, "source_dialog"));
-       dvd_device_combo = GHB_WIDGET(ud->builder, "source_device");
-       folder = gtk_file_chooser_get_current_folder (chooser);
-       if (gtk_toggle_button_get_active (toggle))
-       {
-               gtk_file_chooser_set_action (chooser, 
-                                                                       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
-               gtk_widget_set_sensitive (dvd_device_combo, FALSE);
-               gtk_combo_box_set_active (GTK_COMBO_BOX(dvd_device_combo), 0);
-       }
-       else
-       {
-               gtk_file_chooser_set_action (chooser, GTK_FILE_CHOOSER_ACTION_OPEN);
-               gtk_widget_set_sensitive (dvd_device_combo, TRUE);
-       }
-       if (folder != NULL)
-       {
-               gtk_file_chooser_set_current_folder(chooser, folder);
-               g_free(folder);
-       }
-}
-
 static void
 source_dialog_extra_widgets(
        signal_user_data_t *ud,
-       GtkWidget *dialog, 
-       gboolean checkbutton_active)
+       GtkWidget *dialog)
 {
-       GtkToggleButton *checkbutton;
        GtkComboBox *combo;
        GList *drives, *link;
        
-       checkbutton = GTK_TOGGLE_BUTTON(
-               GHB_WIDGET(ud->builder, "source_folder_flag"));
-       gtk_toggle_button_set_active(checkbutton, checkbutton_active);
+       g_debug("source_dialog_extra_widgets ()");
        combo = GTK_COMBO_BOX(GHB_WIDGET(ud->builder, "source_device"));
-       gtk_list_store_clear(GTK_LIST_STORE(
-                                               gtk_combo_box_get_model(combo)));
+       gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(combo)));
 
        link = drives = dvd_device_list();
        gtk_combo_box_append_text (combo, "Not Selected");
@@ -871,6 +832,7 @@ source_dialog_extra_widgets(
                link = link->next;
        }
        g_list_free(drives);
+       gtk_combo_box_set_active (combo, 0);
 }
 
 extern GValue *ghb_queue_edit_settings;
@@ -915,7 +877,24 @@ start_scan(
        gtk_action_set_sensitive(action, FALSE);
        action = GHB_ACTION(ud->builder, "source_single_action");
        gtk_action_set_sensitive(action, FALSE);
-       ghb_backend_scan(path, titlenum, preview_count);
+       ghb_backend_scan(path, titlenum, preview_count, 
+                       90000L * ghb_settings_get_int64(ud->settings, "MinTitleDuration"));
+}
+
+gboolean
+ghb_idle_scan(signal_user_data_t *ud)
+{
+       gchar *path;
+       gint preview_count;
+
+       show_scan_progress(ud);
+       path = ghb_settings_get_string( ud->settings, "scan_source");
+       prune_logs(ud);
+
+       preview_count = ghb_settings_get_int(ud->settings, "preview_count");
+       start_scan(ud, path, 0, preview_count);
+       g_free(path);
+       return FALSE;
 }
 
 void
@@ -967,41 +946,15 @@ ghb_do_scan(
        }
 }
 
-static gboolean 
-update_source_name(gpointer data)
-{
-       signal_user_data_t *ud = (signal_user_data_t*)data;
-       GtkWidget *dialog;
-       gchar *sourcename;
-
-       sourcename = ghb_settings_get_string(ud->settings, "scan_source");
-       dialog = GHB_WIDGET(ud->builder, "source_dialog");
-       gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), sourcename);
-       g_free(sourcename);
-       return FALSE;
-}
-
 static void
 do_source_dialog(GtkButton *button, gboolean single, signal_user_data_t *ud)
 {
        GtkWidget *dialog;
        gchar *sourcename;
        gint    response;
-       GtkFileChooserAction action;
-       gboolean checkbutton_active;
 
        g_debug("source_browse_clicked_cb ()");
        sourcename = ghb_settings_get_string(ud->settings, "scan_source");
-       checkbutton_active = FALSE;
-       if (g_file_test(sourcename, G_FILE_TEST_IS_DIR))
-       {
-               action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER;
-               checkbutton_active = TRUE;
-       }
-       else
-       {
-               action = GTK_FILE_CHOOSER_ACTION_OPEN;
-       }
        GtkWidget *widget;
        widget = GHB_WIDGET(ud->builder, "single_title_box");
        if (single)
@@ -1009,16 +962,11 @@ do_source_dialog(GtkButton *button, gboolean single, signal_user_data_t *ud)
        else
                gtk_widget_hide(widget);
        dialog = GHB_WIDGET(ud->builder, "source_dialog");
-       source_dialog_extra_widgets(ud, dialog, checkbutton_active);
-       gtk_file_chooser_set_action(GTK_FILE_CHOOSER(dialog), action);
-       // Updating the filename in the file chooser dialog doesn't seem
-       // to work unless the dialog is running for some reason.
-       // So handle it in an "idle" event.
-       //gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), sourcename);
-       g_idle_add((GSourceFunc)update_source_name, ud);
+       source_dialog_extra_widgets(ud, dialog);
+       gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), sourcename);
        response = gtk_dialog_run(GTK_DIALOG (dialog));
        gtk_widget_hide(dialog);
-       if (response == GTK_RESPONSE_ACCEPT)
+       if (response == GTK_RESPONSE_NO)
        {
                gchar *filename;
 
@@ -1426,6 +1374,9 @@ show_title_info(signal_user_data_t *ud, ghb_title_info_t *tinfo)
        gtk_label_set_text (GTK_LABEL(widget), text);
        g_free(text);
 
+       //widget = GHB_WIDGET (ud->builder, "source_interlaced");
+       //gtk_label_set_text (GTK_LABEL(widget), tinfo->interlaced ? "Yes" : "No");
+
        ghb_ui_update(ud, "scale_width", 
                ghb_int64_value(tinfo->width - tinfo->crop[2] - tinfo->crop[3]));
        // If anamorphic or keep_aspect, the hight will be automatically calculated
@@ -1540,11 +1491,6 @@ title_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        ghb_adjust_audio_rate_combos(ud);
        ghb_set_pref_audio(titleindex, ud);
        ghb_set_pref_subtitle(titleindex, ud);
-       if (ghb_settings_get_boolean(ud->settings, "vquality_type_target"))
-       {
-               gint bitrate = ghb_calculate_target_bitrate (ud->settings, titleindex);
-               ghb_ui_update(ud, "VideoAvgBitrate", ghb_int64_value(bitrate));
-       }
 
        // Unfortunately, there is no way to query how many frames were
        // actually generated during the scan.
@@ -1566,15 +1512,15 @@ title_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 
        gint end;
        widget = GHB_WIDGET (ud->builder, "ChapterMarkers");
-       gtk_widget_set_sensitive(widget, TRUE);
        end = ghb_settings_get_int(ud->settings, "end_point");
        if (1 == end)
        {
-               ud->dont_clear_presets = TRUE;
-               ghb_ui_update(ud, "ChapterMarkers", ghb_boolean_value(FALSE));
-               ud->dont_clear_presets = FALSE;
                gtk_widget_set_sensitive(widget, FALSE);
        }
+       else
+       {
+               gtk_widget_set_sensitive(widget, TRUE);
+       }
 }
 
 G_MODULE_EXPORT void
@@ -1626,6 +1572,28 @@ ptop_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 }
 
 G_MODULE_EXPORT void
+framerate_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
+{
+       ghb_widget_to_setting(ud->settings, widget);
+
+       if (ghb_settings_combo_int(ud->settings, "VideoFramerate") != 0)
+       {
+               if (!ghb_settings_get_boolean(ud->settings, "VideoFrameratePFR"))
+        {
+                   ghb_ui_update(ud, "VideoFramerateCFR", ghb_boolean_value(TRUE));
+        }
+       }
+       if (ghb_settings_combo_int(ud->settings, "VideoFramerate") == 0 &&
+               ghb_settings_get_boolean(ud->settings, "VideoFrameratePFR"))
+       {
+               ghb_ui_update(ud, "VideoFramerateVFR", ghb_boolean_value(TRUE));
+       }
+       ghb_check_dependency(ud, widget, NULL);
+       ghb_clear_presets_selection(ud);
+       ghb_live_reset(ud);
+}
+
+G_MODULE_EXPORT void
 setting_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 {
        ghb_widget_to_setting(ud->settings, widget);
@@ -1699,24 +1667,6 @@ vcodec_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 }
 
 G_MODULE_EXPORT void
-target_size_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
-{
-       const gchar *name = ghb_get_setting_key(widget);
-       g_debug("target_size_changed_cb () %s", name);
-       ghb_widget_to_setting(ud->settings, widget);
-       ghb_check_dependency(ud, widget, NULL);
-       ghb_clear_presets_selection(ud);
-       ghb_live_reset(ud);
-       if (ghb_settings_get_boolean(ud->settings, "vquality_type_target"))
-       {
-               gint titleindex;
-               titleindex = ghb_settings_combo_int(ud->settings, "title");
-               gint bitrate = ghb_calculate_target_bitrate (ud->settings, titleindex);
-               ghb_ui_update(ud, "VideoAvgBitrate", ghb_int64_value(bitrate));
-       }
-}
-
-G_MODULE_EXPORT void
 start_point_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 {
        gint start, end;
@@ -1736,16 +1686,16 @@ start_point_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
                        set_destination(ud);
                }
                widget = GHB_WIDGET (ud->builder, "ChapterMarkers");
-               gtk_widget_set_sensitive(widget, TRUE);
                // End may have been changed above, get it again
                end = ghb_settings_get_int(ud->settings, "end_point");
                if (start == end)
                {
-                       ud->dont_clear_presets = TRUE;
-                       ghb_ui_update(ud, "ChapterMarkers", ghb_boolean_value(FALSE));
-                       ud->dont_clear_presets = FALSE;
                        gtk_widget_set_sensitive(widget, FALSE);
                }
+               else
+               {
+                       gtk_widget_set_sensitive(widget, TRUE);
+               }
                update_title_duration(ud);
        }
        else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 1)
@@ -1788,16 +1738,16 @@ end_point_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
                        set_destination(ud);
                }
                widget = GHB_WIDGET (ud->builder, "ChapterMarkers");
-               gtk_widget_set_sensitive(widget, TRUE);
                // Start may have been changed above, get it again
                start = ghb_settings_get_int(ud->settings, "start_point");
                if (start == end)
                {
-                       ud->dont_clear_presets = TRUE;
-                       ghb_ui_update(ud, "ChapterMarkers", ghb_boolean_value(FALSE));
-                       ud->dont_clear_presets = FALSE;
                        gtk_widget_set_sensitive(widget, FALSE);
                }
+               else
+               {
+                       gtk_widget_set_sensitive(widget, TRUE);
+               }
                update_title_duration(ud);
        }
        else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 1)
@@ -2032,9 +1982,32 @@ typedef struct
        const gchar *msg;
        const gchar *action;
        gint timeout;
+       signal_user_data_t *ud;
 } countdown_t;
 
 static gboolean
+quit_cb(countdown_t *cd)
+{
+       gchar *str;
+
+       cd->timeout--;
+       if (cd->timeout == 0)
+       {
+               ghb_hb_cleanup(FALSE);
+               prune_logs(cd->ud);
+
+               gtk_widget_destroy (GTK_WIDGET(cd->dlg));
+               gtk_main_quit();
+               return FALSE;
+       }
+       str = g_strdup_printf("%s\n\n%s in %d seconds ...", 
+                                                       cd->msg, cd->action, cd->timeout);
+       gtk_message_dialog_set_markup(cd->dlg, str);
+       g_free(str);
+       return TRUE;
+}
+
+static gboolean
 shutdown_cb(countdown_t *cd)
 {
        gchar *str;
@@ -2042,6 +2015,9 @@ shutdown_cb(countdown_t *cd)
        cd->timeout--;
        if (cd->timeout == 0)
        {
+               ghb_hb_cleanup(FALSE);
+               prune_logs(cd->ud);
+
                ghb_shutdown_gsm();
                gtk_main_quit();
                return FALSE;
@@ -2079,6 +2055,7 @@ ghb_countdown_dialog(
        const gchar *action, 
        const gchar *cancel, 
        GSourceFunc action_func,
+       signal_user_data_t *ud,
        gint timeout)
 {
        GtkWidget *dialog;
@@ -2089,6 +2066,7 @@ ghb_countdown_dialog(
        cd.msg = message;
        cd.action = action;
        cd.timeout = timeout;
+       cd.ud = ud;
 
        // Toss up a warning dialog
        dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL,
@@ -2173,7 +2151,7 @@ ghb_cancel_encode(signal_user_data_t *ud, const gchar *extra_msg)
                                                   NULL);
        response = gtk_dialog_run(GTK_DIALOG(dialog));
        gtk_widget_destroy (dialog);
-       switch (response)
+       switch ((int)response)
        {
                case 1:
                        ghb_stop_queue();
@@ -2211,7 +2189,7 @@ ghb_cancel_encode2(signal_user_data_t *ud, const gchar *extra_msg)
                                                   NULL);
        response = gtk_dialog_run(GTK_DIALOG(dialog));
        gtk_widget_destroy (dialog);
-       switch (response)
+       switch ((int)response)
        {
                case 1:
                        ghb_stop_queue();
@@ -4626,7 +4604,14 @@ format_vquality_cb(GtkScale *scale, gdouble val, signal_user_data_t *ud)
        {
                case HB_VCODEC_X264:
                {
-                       return g_strdup_printf("RF: %.4g", val);
+                       if (val == 0.0)
+                       {
+                               return g_strdup_printf("RF: %.4g (Warning: lossless)", val);
+                       }
+                       else
+                       {
+                               return g_strdup_printf("RF: %.4g", val);
+                       }
                } break;
 
                case HB_VCODEC_FFMPEG:
@@ -4910,7 +4895,7 @@ ghb_notify_done(signal_user_data_t *ud)
                        ghb_countdown_dialog(GTK_MESSAGE_WARNING, 
                                "Your encode is complete.",
                                "Shutting down the computer", 
-                               "Cancel", (GSourceFunc)shutdown_cb, 60);
+                               "Cancel", (GSourceFunc)shutdown_cb, ud, 60);
                }
        }
        if (ghb_settings_combo_int(ud->settings, "WhenComplete") == 2)
@@ -4920,7 +4905,14 @@ ghb_notify_done(signal_user_data_t *ud)
                        ghb_countdown_dialog(GTK_MESSAGE_WARNING, 
                                "Your encode is complete.",
                                "Putting computer to sleep", 
-                               "Cancel", (GSourceFunc)suspend_cb, 60);
+                               "Cancel", (GSourceFunc)suspend_cb, ud, 60);
                }
        }
+       if (ghb_settings_combo_int(ud->settings, "WhenComplete") == 4)
+       {
+               ghb_countdown_dialog(GTK_MESSAGE_WARNING, 
+                                                       "Your encode is complete.",
+                                                       "Quiting Handbrake", 
+                                                       "Cancel", (GSourceFunc)quit_cb, ud, 60);
+       }
 }