OSDN Git Service

LinGui: When translating legacy presets, vquality 0 means RF 0, not 0%
[handbrake-jp/handbrake-jp-git.git] / gtk / src / callbacks.c
index 532ac69..fa57422 100644 (file)
@@ -296,7 +296,7 @@ on_quit1_activate(GtkMenuItem *quit, signal_user_data_t *ud)
 {
        gint state = ghb_get_queue_state();
        g_debug("on_quit1_activate ()");
-       if (state & GHB_STATE_WORKING)
+       if (state & (GHB_STATE_WORKING|GHB_STATE_SEARCHING))
        {
                if (ghb_cancel_encode2(ud, "Closing HandBrake will terminate encoding.\n"))
                {
@@ -580,7 +580,8 @@ set_destination(signal_user_data_t *ud)
                                title = ghb_settings_combo_int(ud->settings, "title");
                                g_string_append_printf(str, " - %d", title+1);
                        }
-                       if (ghb_settings_get_boolean(
+                       if (ghb_settings_combo_int(ud->settings, "PtoPType") == 0 && 
+                               ghb_settings_get_boolean(
                                        ud->settings, "chapters_in_destination"))
                        {
                                gint start, end;
@@ -590,8 +591,8 @@ set_destination(signal_user_data_t *ud)
                                {
                                        g_string_append_printf(str, " -");
                                }
-                               start = ghb_settings_get_int(ud->settings, "start_chapter");
-                               end = ghb_settings_get_int(ud->settings, "end_chapter");
+                               start = ghb_settings_get_int(ud->settings, "start_point");
+                               end = ghb_settings_get_int(ud->settings, "end_point");
                                if (start == end)
                                        g_string_append_printf(str, " Ch %d", start);
                                else
@@ -900,7 +901,11 @@ start_scan(
                return;
 
        widget = GHB_WIDGET(ud->builder, "sourcetoolbutton");
-       gtk_widget_set_sensitive(widget, FALSE);
+       gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(widget), "hb-stop");
+       gtk_tool_button_set_label(GTK_TOOL_BUTTON(widget), "Stop Scan");
+       gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(widget), "Stop Scan");
+       //gtk_widget_set_sensitive(widget, FALSE);
+
        action = GHB_ACTION(ud->builder, "source_action");
        gtk_action_set_sensitive(action, FALSE);
        action = GHB_ACTION(ud->builder, "source_single_action");
@@ -936,14 +941,14 @@ ghb_do_scan(
        if (filename != NULL)
        {
                last_scan_file = g_strdup(filename);
-               ghb_settings_set_string(ud->settings, "source", filename);
+               ghb_settings_set_string(ud->settings, "scan_source", filename);
                if (update_source_label(ud, filename, TRUE))
                {
                        gchar *path;
                        gint preview_count;
 
                        show_scan_progress(ud);
-                       path = ghb_settings_get_string( ud->settings, "source");
+                       path = ghb_settings_get_string( ud->settings, "scan_source");
                        prune_logs(ud);
 
                        preview_count = ghb_settings_get_int(ud->settings, "preview_count");
@@ -964,7 +969,7 @@ update_source_name(gpointer data)
        GtkWidget *dialog;
        gchar *sourcename;
 
-       sourcename = ghb_settings_get_string(ud->settings, "source");
+       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);
@@ -981,7 +986,7 @@ do_source_dialog(GtkButton *button, gboolean single, signal_user_data_t *ud)
        gboolean checkbutton_active;
 
        g_debug("source_browse_clicked_cb ()");
-       sourcename = ghb_settings_get_string(ud->settings, "source");
+       sourcename = ghb_settings_get_string(ud->settings, "scan_source");
        checkbutton_active = FALSE;
        if (g_file_test(sourcename, G_FILE_TEST_IS_DIR))
        {
@@ -1038,7 +1043,16 @@ do_source_dialog(GtkButton *button, gboolean single, signal_user_data_t *ud)
 G_MODULE_EXPORT void
 source_button_clicked_cb(GtkButton *button, signal_user_data_t *ud)
 {
-       do_source_dialog(button, FALSE, ud);
+       ghb_status_t status;
+       ghb_get_status(&status);
+       if (status.scan.state & GHB_STATE_SCANNING)
+       {
+               ghb_backend_scan_stop();
+       }
+       else
+       {
+               do_source_dialog(button, FALSE, ud);
+       }
 }
 
 G_MODULE_EXPORT void
@@ -1053,7 +1067,7 @@ dvd_source_activate_cb(GtkAction *action, signal_user_data_t *ud)
        const gchar *filename;
        gchar *sourcename;
 
-       sourcename = ghb_settings_get_string(ud->settings, "source");
+       sourcename = ghb_settings_get_string(ud->settings, "scan_source");
        filename = gtk_action_get_name(action);
        ghb_do_scan(ud, filename, 0, TRUE);
        if (strcmp(sourcename, filename) != 0)
@@ -1246,7 +1260,7 @@ window_delete_event_cb(GtkWidget *widget, GdkEvent *event, signal_user_data_t *u
 {
        gint state = ghb_get_queue_state();
        g_debug("window_delete_event_cb ()");
-       if (state & GHB_STATE_WORKING)
+       if (state & (GHB_STATE_WORKING|GHB_STATE_SEARCHING))
        {
                if (ghb_cancel_encode2(ud, "Closing HandBrake will terminate encoding.\n"))
                {
@@ -1309,25 +1323,87 @@ get_rate_string(gint rate_base, gint rate)
        rate_s = g_strdup_printf("%.6g", rate_f);
        return rate_s;
 }
+
 static void
-show_title_info(signal_user_data_t *ud, ghb_title_info_t *tinfo)
+update_title_duration(signal_user_data_t *ud)
 {
-       GtkWidget *widget;
+       gint ti;
+       gint hh, mm, ss, start, end;
        gchar *text;
+       GtkWidget *widget;
 
-       ud->dont_clear_presets = TRUE;
+       ti = ghb_settings_combo_int(ud->settings, "title");
        widget = GHB_WIDGET (ud->builder, "title_duration");
-       if (tinfo->duration != 0)
+
+       if (ghb_settings_combo_int(ud->settings, "PtoPType") == 0)
        {
-               text = g_strdup_printf ("%02d:%02d:%02d", tinfo->hours, 
-                               tinfo->minutes, tinfo->seconds);
+               start = ghb_settings_get_int(ud->settings, "start_point");
+               end = ghb_settings_get_int(ud->settings, "end_point");
+               ghb_part_duration(ti, start, end, &hh, &mm, &ss);
        }
-       else
+       else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 1)
        {
-               text = g_strdup_printf ("Unknown");
+               gint duration;
+
+               start = ghb_settings_get_int(ud->settings, "start_point");
+               end = ghb_settings_get_int(ud->settings, "end_point");
+               duration = end - start;
+               hh = duration / (60*60);
+               mm = (duration / 60) % 60;
+               ss = duration % 60;
        }
+       else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 2)
+       {
+               ghb_title_info_t tinfo;
+
+               if (ghb_get_title_info (&tinfo, ti))
+               {
+                       gint64 frames;
+                       gint duration;
+
+                       start = ghb_settings_get_int(ud->settings, "start_point");
+                       end = ghb_settings_get_int(ud->settings, "end_point");
+                       frames = end - start + 1;
+                       duration = frames * tinfo.rate_base / tinfo.rate;
+                       hh = duration / (60*60);
+                       mm = (duration / 60) % 60;
+                       ss = duration % 60;
+               }
+               else
+               {
+                       hh = mm = ss = 0;
+               }
+       }
+       text = g_strdup_printf("%02d:%02d:%02d", hh, mm, ss);
        gtk_label_set_text (GTK_LABEL(widget), text);
        g_free(text);
+}
+
+static void
+show_title_info(signal_user_data_t *ud, ghb_title_info_t *tinfo)
+{
+       GtkWidget *widget;
+       gchar *text;
+
+       ghb_settings_set_string(ud->settings, "source", tinfo->path);
+       if (tinfo->type == HB_STREAM_TYPE)
+       {
+               GtkWidget *widget = GHB_WIDGET (ud->builder, "source_title");
+               if (tinfo->name != NULL && tinfo->name[0] != 0)
+               {
+                       gtk_label_set_text (GTK_LABEL(widget), tinfo->name);
+                       ghb_settings_set_string(ud->settings, "volume_label", tinfo->name);
+                       set_destination(ud);
+               }
+               else
+               {
+                       gchar *label = "No Title Found";
+                       gtk_label_set_text (GTK_LABEL(widget), label);
+                       ghb_settings_set_string(ud->settings, "volume_label", label);
+               }
+       }
+       ud->dont_clear_presets = TRUE;
+       update_title_duration(ud);
        widget = GHB_WIDGET (ud->builder, "source_dimensions");
        text = g_strdup_printf ("%d x %d", tinfo->width, tinfo->height);
        gtk_label_set_text (GTK_LABEL(widget), text);
@@ -1390,17 +1466,46 @@ show_title_info(signal_user_data_t *ud, ghb_title_info_t *tinfo)
        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);
-       gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), tinfo->num_chapters);
-       widget = GHB_WIDGET (ud->builder, "start_chapter");
-       gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), 1);
-       gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, tinfo->num_chapters);
+
+       gint duration = tinfo->duration / 90000;
+
+       if (ghb_settings_combo_int(ud->settings, "PtoPType") == 0)
+       {
+               widget = GHB_WIDGET (ud->builder, "start_point");
+               gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, tinfo->num_chapters);
+               gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), 1);
+
+               widget = GHB_WIDGET (ud->builder, "end_point");
+               gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, tinfo->num_chapters);
+               gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), tinfo->num_chapters);
+       }
+       else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 1)
+       {
+
+               widget = GHB_WIDGET (ud->builder, "start_point");
+               gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 0, duration-1);
+               gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), 0);
+
+               widget = GHB_WIDGET (ud->builder, "end_point");
+               gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, duration);
+               gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), duration);
+       }
+       else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 2)
+       {
+               gdouble max_frames = (gdouble)duration * tinfo->rate / tinfo->rate_base;
+               widget = GHB_WIDGET (ud->builder, "start_point");
+               gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, max_frames);
+               gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), 1);
+
+               widget = GHB_WIDGET (ud->builder, "end_point");
+               gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, max_frames);
+               gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), max_frames);
+       }
 
        widget = GHB_WIDGET (ud->builder, "angle");
        gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), 1);
        gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, tinfo->angle_count);
+       ghb_settings_set_int(ud->settings, "angle_count", tinfo->angle_count);
        ud->dont_clear_presets = FALSE;
 }
 
@@ -1414,7 +1519,6 @@ title_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        
        g_debug("title_changed_cb ()");
        ghb_widget_to_setting(ud->settings, widget);
-       ghb_check_dependency(ud, widget, NULL);
 
        titleindex = ghb_settings_combo_int(ud->settings, "title");
        ghb_update_ui_combo_box (ud, "AudioTrack", titleindex, FALSE);
@@ -1424,6 +1528,7 @@ title_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        {
                show_title_info(ud, &tinfo);
        }
+       ghb_check_dependency(ud, widget, NULL);
        update_chapter_list (ud);
        ghb_adjust_audio_rate_combos(ud);
        ghb_set_pref_audio(titleindex, ud);
@@ -1451,6 +1556,66 @@ title_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
                set_destination(ud);
        }
        ghb_preview_set_visible(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);
+       }
+}
+
+G_MODULE_EXPORT void
+ptop_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
+{
+       gint ti;
+       ghb_title_info_t tinfo;
+
+       ghb_widget_to_setting(ud->settings, widget);
+       ghb_check_dependency(ud, widget, NULL);
+       ghb_live_reset(ud);
+
+       ti = ghb_settings_combo_int(ud->settings, "title");
+       if (!ghb_get_title_info (&tinfo, ti))
+               return;
+
+       gint duration = tinfo.duration / 90000;
+       if (ghb_settings_combo_int(ud->settings, "PtoPType") == 0)
+       {
+               widget = GHB_WIDGET (ud->builder, "start_point");
+               gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, tinfo.num_chapters);
+               gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), 1);
+
+               widget = GHB_WIDGET (ud->builder, "end_point");
+               gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, tinfo.num_chapters);
+               gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), tinfo.num_chapters);
+       }
+       else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 1)
+       {
+               widget = GHB_WIDGET (ud->builder, "start_point");
+               gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 0, duration-1);
+               gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), 0);
+
+               widget = GHB_WIDGET (ud->builder, "end_point");
+               gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, duration);
+               gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), duration);
+       }
+       else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 2)
+       {
+               gdouble max_frames = (gdouble)duration * tinfo.rate / tinfo.rate_base;
+               widget = GHB_WIDGET (ud->builder, "start_point");
+               gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, max_frames);
+               gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), 1);
+
+               widget = GHB_WIDGET (ud->builder, "end_point");
+               gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, max_frames);
+               gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), max_frames);
+       }
 }
 
 G_MODULE_EXPORT void
@@ -1545,62 +1710,106 @@ target_size_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 }
 
 G_MODULE_EXPORT void
-start_chapter_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
+start_point_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 {
        gint start, end;
        const gchar *name = gtk_widget_get_name(widget);
 
-       g_debug("start_chapter_changed_cb () %s", name);
+       g_debug("start_point_changed_cb () %s", name);
        ghb_widget_to_setting(ud->settings, widget);
-       start = ghb_settings_get_int(ud->settings, "start_chapter");
-       end = ghb_settings_get_int(ud->settings, "end_chapter");
-       if (start > end)
-               ghb_ui_update(ud, "end_chapter", ghb_int_value(start));
-       ghb_check_dependency(ud, widget, NULL);
-       if (ghb_settings_get_boolean(ud->settings, "chapters_in_destination"))
-       {
-               set_destination(ud);
+       if (ghb_settings_combo_int(ud->settings, "PtoPType") == 0)
+       {
+               start = ghb_settings_get_int(ud->settings, "start_point");
+               end = ghb_settings_get_int(ud->settings, "end_point");
+               if (start > end)
+                       ghb_ui_update(ud, "end_point", ghb_int_value(start));
+               ghb_check_dependency(ud, widget, NULL);
+               if (ghb_settings_get_boolean(ud->settings, "chapters_in_destination"))
+               {
+                       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);
+               }
+               update_title_duration(ud);
        }
-       widget = GHB_WIDGET (ud->builder, "chapters_tab");
-       // End may have been changed above, get it again
-       end = ghb_settings_get_int(ud->settings, "end_chapter");
-       if (start == end)
+       else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 1)
        {
-               gtk_widget_hide(widget);
+               start = ghb_settings_get_int(ud->settings, "start_point");
+               end = ghb_settings_get_int(ud->settings, "end_point");
+               if (start >= end)
+                       ghb_ui_update(ud, "end_point", ghb_int_value(start+1));
+               ghb_check_dependency(ud, widget, NULL);
+               update_title_duration(ud);
        }
-       else
+       else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 2)
        {
-               gtk_widget_show(widget);
+               start = ghb_settings_get_int(ud->settings, "start_point");
+               end = ghb_settings_get_int(ud->settings, "end_point");
+               if (start > end)
+                       ghb_ui_update(ud, "end_point", ghb_int_value(start));
+               ghb_check_dependency(ud, widget, NULL);
+               update_title_duration(ud);
        }
 }
 
 G_MODULE_EXPORT void
-end_chapter_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
+end_point_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 {
        gint start, end;
        const gchar *name = gtk_widget_get_name(widget);
 
-       g_debug("end_chapter_changed_cb () %s", name);
+       g_debug("end_point_changed_cb () %s", name);
        ghb_widget_to_setting(ud->settings, widget);
-       start = ghb_settings_get_int(ud->settings, "start_chapter");
-       end = ghb_settings_get_int(ud->settings, "end_chapter");
-       if (start > end)
-               ghb_ui_update(ud, "start_chapter", ghb_int_value(end));
-       ghb_check_dependency(ud, widget, NULL);
-       if (ghb_settings_get_boolean(ud->settings, "chapters_in_destination"))
-       {
-               set_destination(ud);
+       if (ghb_settings_combo_int(ud->settings, "PtoPType") == 0)
+       {
+               start = ghb_settings_get_int(ud->settings, "start_point");
+               end = ghb_settings_get_int(ud->settings, "end_point");
+               if (start > end)
+                       ghb_ui_update(ud, "start_point", ghb_int_value(end));
+               ghb_check_dependency(ud, widget, NULL);
+               if (ghb_settings_get_boolean(ud->settings, "chapters_in_destination"))
+               {
+                       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);
+               }
+               update_title_duration(ud);
        }
-       widget = GHB_WIDGET (ud->builder, "chapters_tab");
-       // Start may have been changed above, get it again
-       start = ghb_settings_get_int(ud->settings, "start_chapter");
-       if (start == end)
+       else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 1)
        {
-               gtk_widget_hide(widget);
+               start = ghb_settings_get_int(ud->settings, "start_point");
+               end = ghb_settings_get_int(ud->settings, "end_point");
+               if (start >= end)
+                       ghb_ui_update(ud, "start_point", ghb_int_value(end-1));
+               ghb_check_dependency(ud, widget, NULL);
+               update_title_duration(ud);
        }
-       else
+       else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 2)
        {
-               gtk_widget_show(widget);
+               start = ghb_settings_get_int(ud->settings, "start_point");
+               end = ghb_settings_get_int(ud->settings, "end_point");
+               if (start > end)
+                       ghb_ui_update(ud, "start_point", ghb_int_value(end));
+               ghb_check_dependency(ud, widget, NULL);
+               update_title_duration(ud);
        }
 }
 
@@ -2335,6 +2544,46 @@ working_status_string(signal_user_data_t *ud, ghb_instance_status_t *status)
        return status_str;
 }
 
+gchar*
+searching_status_string(signal_user_data_t *ud, ghb_instance_status_t *status)
+{
+       gchar *task_str, *job_str, *status_str;
+       gint qcount;
+       gint index;
+       GValue *js;
+
+       qcount = ghb_array_len(ud->queue);
+       index = find_queue_job(ud->queue, status->unique_id, &js);
+       if (qcount > 1)
+       {
+               job_str = g_strdup_printf("job %d of %d, ", index+1, qcount);
+       }
+       else
+       {
+               job_str = g_strdup("");
+       }
+       task_str = g_strdup_printf("Searching for start time, ");
+       if(status->seconds > -1)
+       {
+               status_str= g_strdup_printf(
+                       "Encoding: %s%s%.2f %%"
+                       " (ETA %02dh%02dm%02ds)",
+                       job_str, task_str,
+                       100.0 * status->progress,
+                       status->hours, status->minutes, status->seconds );
+       }
+       else
+       {
+               status_str= g_strdup_printf(
+                       "Encoding: %s%s%.2f %%",
+                       job_str, task_str,
+                       100.0 * status->progress );
+       }
+       g_free(task_str);
+       g_free(job_str);
+       return status_str;
+}
+
 static void
 ghb_backend_events(signal_user_data_t *ud)
 {
@@ -2410,19 +2659,27 @@ ghb_backend_events(signal_user_data_t *ud)
                GtkAction *action;
 
                widget = GHB_WIDGET(ud->builder, "sourcetoolbutton");
-               gtk_widget_set_sensitive(widget, TRUE);
+               gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(widget), "hb-source");
+               gtk_tool_button_set_label(GTK_TOOL_BUTTON(widget), "Source");
+               gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(widget), "Choose Video Source");
+
                action = GHB_ACTION(ud->builder, "source_action");
                gtk_action_set_sensitive(action, TRUE);
                action = GHB_ACTION(ud->builder, "source_single_action");
                gtk_action_set_sensitive(action, TRUE);
 
-               source = ghb_settings_get_string(ud->settings, "source");
+               source = ghb_settings_get_string(ud->settings, "scan_source");
                update_source_label(ud, source, FALSE);
 
                scan_prog = GTK_PROGRESS_BAR(GHB_WIDGET (ud->builder, "scan_prog"));
                gtk_progress_bar_set_fraction (scan_prog, 1.0);
                gtk_widget_hide(GTK_WIDGET(scan_prog));
 
+               if (!ghb_settings_get_boolean(ud->settings, "preset_modified"))
+               {
+                       ghb_refresh_preset(ud);
+               }
+
                ghb_title_info_t tinfo;
                        
                ghb_update_ui_combo_box(ud, "title", 0, FALSE);
@@ -2465,6 +2722,44 @@ ghb_backend_events(signal_user_data_t *ud)
        {
                gtk_label_set_text (work_status, "Paused");
        }
+       else if (status.queue.state & GHB_STATE_SEARCHING)
+       {
+               static gint working = 0;
+
+               // This needs to be in scanning and working since scanning
+               // happens fast enough that it can be missed
+               index = find_queue_job(ud->queue, status.queue.unique_id, &js);
+               if (status.queue.unique_id != 0 && index >= 0)
+               {
+                       gchar working_icon[] = "hb-working0";
+                       working_icon[10] = '0' + working;
+                       working = (working+1) % 6;
+                       treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "queue_list"));
+                       store = GTK_TREE_STORE(gtk_tree_view_get_model(treeview));
+                       gchar *path = g_strdup_printf ("%d", index);
+                       if (gtk_tree_model_get_iter_from_string(
+                                       GTK_TREE_MODEL(store), &iter, path))
+                       {
+                               gtk_tree_store_set(store, &iter, 0, working_icon, -1);
+                       }
+                       g_free(path);
+               }
+               GtkLabel *label;
+               gchar *status_str;
+
+               status_str = searching_status_string(ud, &status.queue);
+               label = GTK_LABEL(GHB_WIDGET(ud->builder, "queue_status"));
+               gtk_label_set_text (label, status_str);
+#if !GTK_CHECK_VERSION(2, 16, 0)
+               GtkStatusIcon *si;
+
+               si = GTK_STATUS_ICON(GHB_OBJECT(ud->builder, "hb_status"));
+               gtk_status_icon_set_tooltip(si, status_str);
+#endif
+               gtk_label_set_text (work_status, status_str);
+               gtk_progress_bar_set_fraction (progress, status.queue.progress);
+               g_free(status_str);
+       }
        else if (status.queue.state & GHB_STATE_WORKING)
        {
                static gint working = 0;
@@ -2632,6 +2927,8 @@ status_icon_query_tooltip_cb(
        ghb_get_status(&status);
        if (status.queue.state & GHB_STATE_WORKING)
                status_str = working_status_string(ud, &status.queue);
+       else if (status.queue.state & GHB_STATE_SEARCHING)
+               status_str = searching_status_string(ud, &status.queue);
        else if (status.queue.state & GHB_STATE_WORKDONE)
                status_str = g_strdup("Encode Complete");
        else
@@ -3546,7 +3843,7 @@ handle_media_change(const gchar *device, gboolean insert, signal_user_data_t *ud
                                update_source_label(ud, device, TRUE);
                                gint preview_count;
                                preview_count = ghb_settings_get_int(ud->settings, "preview_count");
-                               ghb_settings_set_string(ud->settings, "source", device);
+                               ghb_settings_set_string(ud->settings, "scan_source", device);
                                start_scan(ud, device, 0, preview_count);
                        }
                }
@@ -3563,7 +3860,7 @@ handle_media_change(const gchar *device, gboolean insert, signal_user_data_t *ud
                        {
                                ghb_hb_cleanup(TRUE);
                                prune_logs(ud);
-                               ghb_settings_set_string(ud->settings, "source", "/dev/null");
+                               ghb_settings_set_string(ud->settings, "scan_source", "/dev/null");
                                start_scan(ud, "/dev/null", 0, 1);
                        }
                }
@@ -3650,7 +3947,7 @@ drive_changed_cb(GVolumeMonitor *gvm, GDrive *gd, signal_user_data_t *ud)
                        update_source_label(ud, device, TRUE);
                        gint preview_count;
                        preview_count = ghb_settings_get_int(ud->settings, "preview_count");
-                       ghb_settings_set_string(ud->settings, "source", device);
+                       ghb_settings_set_string(ud->settings, "scan_source", device);
                        start_scan(ud, device, 0, preview_count);
                }
        }
@@ -3658,7 +3955,7 @@ drive_changed_cb(GVolumeMonitor *gvm, GDrive *gd, signal_user_data_t *ud)
        {
                ghb_hb_cleanup(TRUE);
                prune_logs(ud);
-               ghb_settings_set_string(ud->settings, "source", "/dev/null");
+               ghb_settings_set_string(ud->settings, "scan_source", "/dev/null");
                start_scan(ud, "/dev/null", 0, 1);
        }
 }
@@ -4359,35 +4656,29 @@ format_drc_cb(GtkScale *scale, gdouble val, signal_user_data_t *ud)
 G_MODULE_EXPORT gchar*
 format_vquality_cb(GtkScale *scale, gdouble val, signal_user_data_t *ud)
 {
-       gdouble percent;
-
        gint vcodec = ghb_settings_combo_int(ud->settings, "VideoEncoder");
        switch (vcodec)
        {
                case HB_VCODEC_X264:
                {
-                       percent = 100. * (51 - val) / 51.;
-                       return g_strdup_printf("RF: %.4g (%.0f%%)", val, percent);
+                       return g_strdup_printf("RF: %.4g", val);
                } break;
 
                case HB_VCODEC_FFMPEG:
                {
-                       percent = 100. * (30 - (val - 1)) / 30.;
-                       return g_strdup_printf("QP: %d (%.0f%%)", (int)val, percent);
+                       return g_strdup_printf("QP: %d", (int)val);
                } break;
 
                case HB_VCODEC_THEORA:
                {
-                       percent = 100. * val / 63.;
-                       return g_strdup_printf("QP: %d (%.0f%%)", (int)val, percent);
+                       return g_strdup_printf("QP: %d", (int)val);
                } break;
 
                default:
                {
-                       percent = 0;
                } break;
        }
-       return g_strdup_printf("QP: %.1f / %.1f%%", val, percent);
+       return g_strdup_printf("QP: %.4g", val);
 }
 
 static void