OSDN Git Service

LinGui: Make preset key/values mostly align with macui presets.
[handbrake-jp/handbrake-jp-git.git] / gtk / src / callbacks.c
index c8d5e9c..c0a7e6b 100644 (file)
@@ -273,7 +273,7 @@ set_destination(signal_user_data_t *ud)
                gchar *dir, *new_name;
                
                filename = ghb_settings_get_string(ud->settings, "destination");
-               extension = ghb_settings_get_string(ud->settings, "container");
+               extension = ghb_settings_get_string(ud->settings, "FileFormat");
                dir = g_path_get_dirname (filename);
                vol_name = ghb_settings_get_string(ud->settings, "volume_label");
                if (ghb_settings_get_boolean(ud->settings, "chapters_in_destination"))
@@ -362,6 +362,28 @@ camel_convert(gchar *str)
        }
 }
 
+static gchar*
+get_file_label(const gchar *filename)
+{
+       static gchar *containers[] = 
+               {".vob", ".mpg", ".m2ts", ".mkv", ".mp4", ".m4v", ".avi", ".ogm", NULL};
+       gchar *base;
+       gint ii;
+
+       base = g_path_get_basename(filename);
+       for (ii = 0; containers[ii] != NULL; ii++)
+       {
+               if (g_str_has_suffix(base, containers[ii]))
+               {
+                       gchar *pos;
+                       pos = strrchr(base, '.');
+                       *pos = 0;
+                       break;
+               }
+       }
+       return base;
+}
+
 static gboolean
 update_source_label(signal_user_data_t *ud, const gchar *source)
 {
@@ -393,11 +415,7 @@ update_source_label(signal_user_data_t *ud, const gchar *source)
                label = ghb_dvd_volname (filename);
                if (label == NULL)
                {
-                       path = g_strsplit(filename, "/", -1);
-                       len = g_strv_length (path);
-                       // Just use the last combonent of the path
-                       label = g_strdup(path[len-1]);
-                       g_strfreev (path);
+                       label = get_file_label(filename);
                }
                else
                {
@@ -545,11 +563,36 @@ source_dialog_extra_widgets(GtkWidget *dialog, gboolean checkbutton_active)
        return GTK_WIDGET(vbox);
 }
 
-static void
-do_scan(signal_user_data_t *ud, const gchar *filename)
+extern GValue *ghb_queue_edit_settings;
+static gchar *last_scan_file = NULL;
+
+void
+ghb_do_scan(signal_user_data_t *ud, const gchar *filename, gboolean force)
 {
+       if (!force && last_scan_file != NULL &&
+               strcmp(last_scan_file, filename) == 0)
+       {
+               if (ghb_queue_edit_settings)
+               {
+                       gint jstatus;
+
+                       jstatus = ghb_settings_get_int(ghb_queue_edit_settings, "job_status");
+                       ghb_settings_to_ui(ud, ghb_queue_edit_settings);
+                       ghb_set_audio(ud, ghb_queue_edit_settings);
+                       if (jstatus == GHB_QUEUE_PENDING)
+                       {
+                               ghb_value_free(ghb_queue_edit_settings);
+                       }
+                       ghb_queue_edit_settings = NULL;
+               }
+               return;
+       }
+       if (last_scan_file != NULL)
+               g_free(last_scan_file);
+       last_scan_file = NULL;
        if (filename != NULL)
        {
+               last_scan_file = g_strdup(filename);
                ghb_settings_set_string(ud->settings, "source", filename);
                if (update_source_label(ud, filename))
                {
@@ -610,7 +653,7 @@ source_button_clicked_cb(GtkButton *button, signal_user_data_t *ud)
                filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
                if (filename != NULL)
                {
-                       do_scan(ud, filename);
+                       ghb_do_scan(ud, filename, TRUE);
                        if (strcmp(sourcename, filename) != 0)
                        {
                                ghb_settings_set_string (ud->settings, "default_source", filename);
@@ -632,7 +675,7 @@ dvd_source_activate_cb(GtkAction *action, signal_user_data_t *ud)
 
        sourcename = ghb_settings_get_string(ud->settings, "source");
        filename = gtk_action_get_name(action);
-       do_scan(ud, filename);
+       ghb_do_scan(ud, filename, TRUE);
        if (strcmp(sourcename, filename) != 0)
        {
                ghb_settings_set_string (ud->settings, "default_source", filename);
@@ -652,7 +695,7 @@ update_destination_extension(signal_user_data_t *ud)
        GtkEntry *entry;
 
        g_debug("update_destination_extension ()");
-       extension = ghb_settings_get_string(ud->settings, "container");
+       extension = ghb_settings_get_string(ud->settings, "FileFormat");
        entry = GTK_ENTRY(GHB_WIDGET(ud->builder, "destination"));
        filename = g_strdup(gtk_entry_get_text(entry));
        for (ii = 0; containers[ii] != NULL; ii++)
@@ -832,10 +875,10 @@ container_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        {
                gchar *container;
 
-               container = ghb_settings_get_string(ud->settings, "container");
+               container = ghb_settings_get_string(ud->settings, "FileFormat");
                if (strcmp(container, "mp4") == 0)
                {
-                       ghb_ui_update(ud, "container", ghb_string_value("m4v"));
+                       ghb_ui_update(ud, "FileFormat", ghb_string_value("m4v"));
                }
                g_free(container);
        }
@@ -905,7 +948,7 @@ show_title_info(signal_user_data_t *ud, ghb_title_info_t *tinfo)
                ghb_int64_value(tinfo->width - tinfo->crop[2] - tinfo->crop[3]));
        // If anamorphic or keep_aspect, the hight will be automatically calculated
        gboolean keep_aspect, anamorphic;
-       keep_aspect = ghb_settings_get_boolean(ud->settings, "keep_aspect");
+       keep_aspect = ghb_settings_get_boolean(ud->settings, "PictureKeepRatio");
        anamorphic = ghb_settings_get_boolean(ud->settings, "anamorphic");
        if (!(keep_aspect || anamorphic))
        {
@@ -917,22 +960,34 @@ show_title_info(signal_user_data_t *ud, ghb_title_info_t *tinfo)
        // you pass it a cropped width or height == 0.
        gint bound;
        bound = tinfo->height / 2 - 2;
-       widget = GHB_WIDGET (ud->builder, "crop_top");
+       widget = GHB_WIDGET (ud->builder, "PictureTopCrop");
        gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 0, bound);
-       widget = GHB_WIDGET (ud->builder, "crop_bottom");
+       widget = GHB_WIDGET (ud->builder, "PictureBottomCrop");
        gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 0, bound);
        bound = tinfo->width / 2 - 2;
-       widget = GHB_WIDGET (ud->builder, "crop_left");
+       widget = GHB_WIDGET (ud->builder, "PictureLeftCrop");
        gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 0, bound);
-       widget = GHB_WIDGET (ud->builder, "crop_right");
+       widget = GHB_WIDGET (ud->builder, "PictureRightCrop");
        gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 0, bound);
-       if (ghb_settings_get_boolean(ud->settings, "autocrop"))
-       {
-               ghb_ui_update(ud, "crop_top", ghb_int64_value(tinfo->crop[0]));
-               ghb_ui_update(ud, "crop_bottom", ghb_int64_value(tinfo->crop[1]));
-               ghb_ui_update(ud, "crop_left", ghb_int64_value(tinfo->crop[2]));
-               ghb_ui_update(ud, "crop_right", ghb_int64_value(tinfo->crop[3]));
-       }
+       if (ghb_settings_get_boolean(ud->settings, "PictureAutoCrop"))
+       {
+               ghb_ui_update(ud, "PictureTopCrop", ghb_int64_value(tinfo->crop[0]));
+               ghb_ui_update(ud, "PictureBottomCrop", ghb_int64_value(tinfo->crop[1]));
+               ghb_ui_update(ud, "PictureLeftCrop", ghb_int64_value(tinfo->crop[2]));
+               ghb_ui_update(ud, "PictureRightCrop", ghb_int64_value(tinfo->crop[3]));
+       }
+       gint width, height, crop[4];
+       crop[0] = ghb_settings_get_int(ud->settings, "PictureTopCrop");
+       crop[1] = ghb_settings_get_int(ud->settings, "PictureBottomCrop");
+       crop[2] = ghb_settings_get_int(ud->settings, "PictureLeftCrop");
+       crop[3] = ghb_settings_get_int(ud->settings, "PictureRightCrop");
+       width = tinfo->width - crop[2] - crop[3];
+       height = tinfo->height - crop[0] - crop[1];
+       widget = GHB_WIDGET (ud->builder, "crop_dimensions");
+       text = g_strdup_printf ("%d x %d", width, height);
+       gtk_label_set_text (GTK_LABEL(widget), text);
+       g_free(text);
+
        g_debug("setting max end chapter %d", tinfo->num_chapters);
        widget = GHB_WIDGET (ud->builder, "end_chapter");
        gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, tinfo->num_chapters);
@@ -995,19 +1050,16 @@ title_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 {
        ghb_title_info_t tinfo;
        gint titleindex;
-       gchar *preset;
        
        g_debug("title_changed_cb ()");
        ghb_widget_to_setting(ud->settings, widget);
        ghb_check_dependency(ud, widget);
 
        titleindex = ghb_settings_combo_int(ud->settings, "title");
-       ghb_update_ui_combo_box (ud->builder, "audio_track", titleindex, FALSE);
-       ghb_update_ui_combo_box (ud->builder, "subtitle_lang", titleindex, FALSE);
+       ghb_update_ui_combo_box (ud->builder, "AudioTrack", titleindex, FALSE);
+       ghb_update_ui_combo_box (ud->builder, "Subtitles", titleindex, FALSE);
 
-       preset = ghb_settings_get_string (ud->settings, "preset");
-       ghb_update_from_preset(ud, preset, "subtitle_lang");
-       g_free(preset);
+       ghb_update_from_preset(ud, "Subtitles");
        if (ghb_get_title_info (&tinfo, titleindex))
        {
                show_title_info(ud, &tinfo);
@@ -1018,7 +1070,7 @@ title_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        if (ghb_settings_get_boolean(ud->settings, "vquality_type_target"))
        {
                gint bitrate = ghb_calculate_target_bitrate (ud->settings, titleindex);
-               ghb_ui_update(ud, "video_bitrate", ghb_int64_value(bitrate));
+               ghb_ui_update(ud, "VideoAvgBitrate", ghb_int64_value(bitrate));
        }
 
        // Unfortunately, there is no way to query how many frames were
@@ -1078,7 +1130,7 @@ deint_tweak_focus_out_cb(GtkWidget *widget, GdkEventFocus *event,
        signal_user_data_t *ud)
 {
        g_debug("deint_tweak_focus_out_cb ()");
-       validate_filter_widget(ud, "tweak_deinterlace");
+       validate_filter_widget(ud, "tweak_PictureDeinterlace");
        return FALSE;
 }
 
@@ -1087,7 +1139,7 @@ denoise_tweak_focus_out_cb(GtkWidget *widget, GdkEventFocus *event,
        signal_user_data_t *ud)
 {
        g_debug("denoise_tweak_focus_out_cb ()");
-       validate_filter_widget(ud, "tweak_noise");
+       validate_filter_widget(ud, "tweak_PictureDenoise");
        return FALSE;
 }
 
@@ -1104,14 +1156,23 @@ http_opt_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 void
 vcodec_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 {
-       gint vqmin, vqmax;
+       gdouble vqmin, vqmax, step, page;
+       gint digits;
+       gint vcodec;
 
        ghb_widget_to_setting(ud->settings, widget);
        ghb_check_dependency(ud, widget);
        ghb_clear_presets_selection(ud);
-       ghb_vquality_range(ud, &vqmin, &vqmax);
-       GtkWidget *qp = GHB_WIDGET(ud->builder, "video_quality");
+       ghb_vquality_range(ud, &vqmin, &vqmax, &step, &page, &digits);
+       GtkWidget *qp = GHB_WIDGET(ud->builder, "VideoQualitySlider");
        gtk_range_set_range (GTK_RANGE(qp), vqmin, vqmax);
+       gtk_range_set_increments (GTK_RANGE(qp), step, page);
+       gtk_scale_set_digits(GTK_SCALE(qp), digits);
+       vcodec = ghb_settings_combo_int(ud->settings, "VideoEncoder");
+       if (vcodec != HB_VCODEC_X264 && vcodec != HB_VCODEC_FFMPEG)
+       {
+               ghb_ui_update(ud, "directqp", ghb_boolean_value(FALSE));
+       }
 }
 
 void
@@ -1127,7 +1188,7 @@ target_size_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
                gint titleindex;
                titleindex = ghb_settings_combo_int(ud->settings, "title");
                gint bitrate = ghb_calculate_target_bitrate (ud->settings, titleindex);
-               ghb_ui_update(ud, "video_bitrate", ghb_int64_value(bitrate));
+               ghb_ui_update(ud, "VideoAvgBitrate", ghb_int64_value(bitrate));
        }
 }
 
@@ -1214,10 +1275,10 @@ crop_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        ghb_check_dependency(ud, widget);
        ghb_set_scale (ud, GHB_SCALE_KEEP_NONE);
 
-       crop[0] = ghb_settings_get_int(ud->settings, "crop_top");
-       crop[1] = ghb_settings_get_int(ud->settings, "crop_bottom");
-       crop[2] = ghb_settings_get_int(ud->settings, "crop_left");
-       crop[3] = ghb_settings_get_int(ud->settings, "crop_right");
+       crop[0] = ghb_settings_get_int(ud->settings, "PictureTopCrop");
+       crop[1] = ghb_settings_get_int(ud->settings, "PictureBottomCrop");
+       crop[2] = ghb_settings_get_int(ud->settings, "PictureLeftCrop");
+       crop[3] = ghb_settings_get_int(ud->settings, "PictureRightCrop");
        titleindex = ghb_settings_combo_int(ud->settings, "title");
        if (ghb_get_title_info (&tinfo, titleindex))
        {
@@ -1251,7 +1312,7 @@ scale_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        
        gchar *text;
        
-       text = ghb_settings_get_boolean(ud->settings, "autocrop") ? "On" : "Off";
+       text = ghb_settings_get_boolean(ud->settings, "PictureAutoCrop") ? "On" : "Off";
        widget = GHB_WIDGET (ud->builder, "crop_auto");
        gtk_label_set_text (GTK_LABEL(widget), text);
        text = ghb_settings_get_boolean(ud->settings, "autoscale") ? "On" : "Off";
@@ -1560,6 +1621,19 @@ ghb_backend_events(signal_user_data_t *ud)
                }
                ghb_clear_state(GHB_STATE_SCANDONE);
                ghb_queue_buttons_grey(ud, work_started);
+               if (ghb_queue_edit_settings)
+               {
+                       gint jstatus;
+
+                       jstatus = ghb_settings_get_int(ghb_queue_edit_settings, "job_status");
+                       ghb_settings_to_ui(ud, ghb_queue_edit_settings);
+                       ghb_set_audio(ud, ghb_queue_edit_settings);
+                       if (jstatus == GHB_QUEUE_PENDING)
+                       {
+                               ghb_value_free(ghb_queue_edit_settings);
+                       }
+                       ghb_queue_edit_settings = NULL;
+               }
        }
        else if (status.queue_state & GHB_STATE_SCANNING)
        {
@@ -2170,30 +2244,30 @@ tweaks_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        ghb_pref_save(ud->settings, name);
 
        gboolean tweaks = ghb_settings_get_boolean(ud->settings, "allow_tweaks");
-       widget = GHB_WIDGET(ud->builder, "deinterlace");
+       widget = GHB_WIDGET(ud->builder, "PictureDeinterlace");
        tweaks ? gtk_widget_hide(widget) : gtk_widget_show(widget);
-       widget = GHB_WIDGET(ud->builder, "tweak_deinterlace");
+       widget = GHB_WIDGET(ud->builder, "tweak_PictureDeinterlace");
        !tweaks ? gtk_widget_hide(widget) : gtk_widget_show(widget);
 
-       widget = GHB_WIDGET(ud->builder, "denoise");
+       widget = GHB_WIDGET(ud->builder, "PictureDenoise");
        tweaks ? gtk_widget_hide(widget) : gtk_widget_show(widget);
-       widget = GHB_WIDGET(ud->builder, "tweak_denoise");
+       widget = GHB_WIDGET(ud->builder, "tweak_PictureDenoise");
        !tweaks ? gtk_widget_hide(widget) : gtk_widget_show(widget);
        if (tweaks)
        {
                const GValue *value;
-               value = ghb_settings_get_value(ud->settings, "deinterlace");
-               ghb_ui_update(ud, "tweak_deinterlace", value);
-               value = ghb_settings_get_value(ud->settings, "denoise");
-               ghb_ui_update(ud, "tweak_denoise", value);
+               value = ghb_settings_get_value(ud->settings, "PictureDeinterlace");
+               ghb_ui_update(ud, "tweak_PictureDeinterlace", value);
+               value = ghb_settings_get_value(ud->settings, "PictureDenoise");
+               ghb_ui_update(ud, "tweak_PictureDenoise", value);
        }
        else
        {
                const GValue *value;
-               value = ghb_settings_get_value(ud->settings, "tweak_deinterlace");
-               ghb_ui_update(ud, "deinterlace", value);
-               value = ghb_settings_get_value(ud->settings, "tweak_denoise");
-               ghb_ui_update(ud, "denoise", value);
+               value = ghb_settings_get_value(ud->settings, "tweak_PictureDeinterlace");
+               ghb_ui_update(ud, "PictureDeinterlace", value);
+               value = ghb_settings_get_value(ud->settings, "tweak_PictureDenoise");
+               ghb_ui_update(ud, "PictureDenoise", value);
        }
 }
 
@@ -2511,3 +2585,24 @@ format_deblock_cb(GtkScale *scale, gdouble val, signal_user_data_t *ud)
                return g_strdup_printf("%d", (gint)val);
        }
 }
+
+gchar*
+format_vquality_cb(GtkScale *scale, gdouble val, signal_user_data_t *ud)
+{
+       if (ghb_settings_get_boolean(ud->settings, "directqp"))
+       {
+               gint vcodec = ghb_settings_combo_int(ud->settings, "VideoEncoder");
+               // Only x264 and ffmpeg currently support direct qp/crf entry
+               if (vcodec != HB_VCODEC_X264 && vcodec != HB_VCODEC_FFMPEG)
+               {
+                       val *= 100;
+                       return g_strdup_printf("%.1f", val);
+               }
+               return g_strdup_printf("%d", (gint)val);
+       }
+       else
+       {
+               val *= 100;
+               return g_strdup_printf("%.1f", val);
+       }
+}