OSDN Git Service

LinGui: first cut at anamorphic picture settings enhancements
[handbrake-jp/handbrake-jp-git.git] / gtk / src / callbacks.c
index 7f35808..61b6bf8 100644 (file)
@@ -29,6 +29,7 @@
 #include <dbus/dbus-glib.h>
 #include <dbus/dbus-glib-lowlevel.h>
 #include <gio/gio.h>
+#include <libnotify/notify.h>
 
 #include "hb.h"
 #include "callbacks.h"
@@ -48,6 +49,7 @@
 static void update_chapter_list(signal_user_data_t *ud);
 static GList* dvd_device_list();
 static void prune_logs(signal_user_data_t *ud);
+void ghb_notify_done(signal_user_data_t *ud);
 
 // This is a dependency map used for greying widgets
 // that are dependent on the state of another widget.
@@ -79,6 +81,7 @@ dep_check(signal_user_data_t *ud, const gchar *name, gboolean *out_hide)
        
        g_debug("dep_check () %s", name);
 
+       if (rev_map == NULL) return TRUE;
        array = ghb_dict_lookup(rev_map, name);
        count = ghb_array_len(array);
        *out_hide = FALSE;
@@ -172,6 +175,7 @@ ghb_check_dependency(signal_user_data_t *ud, GtkWidget *widget)
        name = gtk_widget_get_name(widget);
        g_debug("ghb_check_dependency () %s", name);
 
+       if (dep_map == NULL) return;
        array = ghb_dict_lookup(dep_map, name);
        count = ghb_array_len(array);
        for (ii = 0; ii < count; ii++)
@@ -219,6 +223,7 @@ ghb_check_all_depencencies(signal_user_data_t *ud)
        GObject *dep_object;
 
        g_debug("ghb_check_all_depencencies ()");
+       if (rev_map == NULL) return;
        ghb_dict_iter_init(&iter, rev_map);
        // middle (void*) cast prevents gcc warning "defreferencing type-punned
        // pointer will break strict-aliasing rules"
@@ -619,7 +624,6 @@ ghb_do_scan(
                        path = ghb_settings_get_string( ud->settings, "source");
                        gtk_progress_bar_set_fraction (progress, 0);
                        gtk_progress_bar_set_text (progress, "Scanning ...");
-                       ghb_hb_cleanup(TRUE);
                        prune_logs(ud);
                        gint preview_count;
                        preview_count = ghb_settings_get_int(ud->settings, "preview_count");
@@ -1027,10 +1031,11 @@ show_title_info(signal_user_data_t *ud, ghb_title_info_t *tinfo)
        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
-       gboolean keep_aspect, anamorphic;
+       gboolean keep_aspect;
+       gint pic_par;
        keep_aspect = ghb_settings_get_boolean(ud->settings, "PictureKeepRatio");
-       anamorphic = ghb_settings_get_boolean(ud->settings, "anamorphic");
-       if (!(keep_aspect || anamorphic))
+       pic_par = ghb_settings_combo_int(ud->settings, "PicturePAR");
+       if (!(keep_aspect || pic_par) || pic_par == 3)
        {
                ghb_ui_update(ud, "scale_height", 
                        ghb_int64_value(tinfo->height - tinfo->crop[0] - tinfo->crop[1]));
@@ -1116,7 +1121,7 @@ title_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        gint preview_count;
        preview_count = ghb_settings_get_int(ud->settings, "preview_count");
        widget = GHB_WIDGET(ud->builder, "preview_frame");
-       gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, preview_count);
+       gtk_range_set_range (GTK_RANGE(widget), 1, preview_count);
        ghb_ui_update(ud, "preview_frame", ghb_int64_value(2));
 
        ghb_set_preview_image (ud);
@@ -1337,7 +1342,24 @@ scale_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        text = ghb_settings_get_boolean(ud->settings, "autoscale") ? "On" : "Off";
        widget = GHB_WIDGET (ud->builder, "scale_auto");
        gtk_label_set_text (GTK_LABEL(widget), text);
-       text = ghb_settings_get_boolean(ud->settings, "anamorphic") ? "On" : "Off";
+       switch (ghb_settings_combo_int(ud->settings, "PicturePAR"))
+       {
+               case 0:
+                       text = "Off";
+                       break;
+               case 1:
+                       text = "Strict";
+                       break;
+               case 2:
+                       text = "Loose";
+                       break;
+               case 3:
+                       text = "Custom";
+                       break;
+               default:
+                       text = "Unknown";
+                       break;
+       }
        widget = GHB_WIDGET (ud->builder, "scale_anamorphic");
        gtk_label_set_text (GTK_LABEL(widget), text);
 }
@@ -1558,6 +1580,7 @@ ghb_start_next_job(signal_user_data_t *ud, gboolean find_first)
                }
                // Nothing pending
                ghb_uninhibit_gpm();
+               ghb_notify_done(ud);
                return NULL;
        }
        // Find the next pending item after the current running item
@@ -1597,6 +1620,7 @@ ghb_start_next_job(signal_user_data_t *ud, gboolean find_first)
        }
        // Nothing found
        ghb_uninhibit_gpm();
+       ghb_notify_done(ud);
        return NULL;
 }
 
@@ -2232,17 +2256,22 @@ update_chapter_list(signal_user_data_t *ud)
 
                        if (ii < count)
                        {
-                               gchar *chapter;
+                               gchar *chapter, *duration;
+                               gint hh, mm, ss;
 
                                // Update row with settings data
                                g_debug("Updating row");
                                chapter = ghb_value_string(ghb_array_get_nth(chapters, ii));
+                               ghb_get_chapter_duration(titleindex, ii, &hh, &mm, &ss);
+                               duration = g_strdup_printf("%02d:%02d:%02d", hh, mm, ss);
                                gtk_list_store_set(store, &iter, 
                                        0, ii+1,
-                                       1, chapter,
-                                       2, TRUE,
+                                       1, duration,
+                                       2, chapter,
+                                       3, TRUE,
                                        -1);
                                g_free(chapter);
+                               g_free(duration);
                                ii++;
                                done = !gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter);
                        }
@@ -2256,18 +2285,23 @@ update_chapter_list(signal_user_data_t *ud)
        }
        while (ii < count)
        {
-               gchar *chapter;
+               gchar *chapter, *duration;
+               gint hh, mm, ss;
 
                // Additional settings, add row
                g_debug("Adding row");
                chapter = ghb_value_string(ghb_array_get_nth(chapters, ii));
+               ghb_get_chapter_duration(titleindex, ii, &hh, &mm, &ss);
+               duration = g_strdup_printf("%02d:%02d:%02d", hh, mm, ss);
                gtk_list_store_append(store, &iter);
                gtk_list_store_set(store, &iter, 
                        0, ii+1,
-                       1, chapter,
-                       2, TRUE,
+                       1, duration,
+                       2, chapter,
+                       3, TRUE,
                        -1);
                g_free(chapter);
+               g_free(duration);
                ii++;
        }
 }
@@ -2309,8 +2343,8 @@ chapter_edited_cb(
        row = pi[0];
        gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, treepath);
        gtk_list_store_set(store, &iter, 
-               1, text,
-               2, TRUE,
+               2, text,
+               3, TRUE,
                -1);
        gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, 0, &index, -1);
 
@@ -2350,14 +2384,14 @@ chapter_edited_cb(
                // I got industrious and made my own CellTextRendererText that
                // passes on the key-press-event. So now I have much better
                // control of this.
-               column = gtk_tree_view_get_column(treeview, 1);
+               column = gtk_tree_view_get_column(treeview, 2);
                gtk_tree_view_set_cursor(treeview, treepath, column, TRUE);
        }
        else if (chapter_edit_key == GDK_Up && row > 0)
        {
                GtkTreeViewColumn *column;
                gtk_tree_path_prev(treepath);
-               column = gtk_tree_view_get_column(treeview, 1);
+               column = gtk_tree_view_get_column(treeview, 2);
                gtk_tree_view_set_cursor(treeview, treepath, column, TRUE);
        }
        gtk_tree_path_free (treepath);
@@ -2598,7 +2632,6 @@ drive_changed_cb(GVolumeMonitor *gvm, GDrive *gd, signal_user_data_t *ud)
                        gtk_progress_bar_set_text (progress, "Scanning ...");
                        gtk_progress_bar_set_fraction (progress, 0);
                        update_source_label(ud, device);
-                       ghb_hb_cleanup(TRUE);
                        prune_logs(ud);
                        gint preview_count;
                        preview_count = ghb_settings_get_int(ud->settings, "preview_count");
@@ -2606,7 +2639,6 @@ drive_changed_cb(GVolumeMonitor *gvm, GDrive *gd, signal_user_data_t *ud)
                }
                else
                {
-                       ghb_hb_cleanup(TRUE);
                        prune_logs(ud);
                        ghb_backend_scan("/dev/null", 0, 1);
                }
@@ -3137,3 +3169,35 @@ check_stable_update(signal_user_data_t *ud)
        return NULL;
 }
 
+void
+status_activate_cb(GtkStatusIcon *si, signal_user_data_t *ud)
+{
+       GtkWindow *window;
+
+       window = GTK_WINDOW(GHB_WIDGET(ud->builder, "hb_window"));
+       gtk_window_present(window);
+}
+
+static void
+notify_closed_cb(NotifyNotification *notification, signal_user_data_t *ud)
+{
+       g_object_unref(G_OBJECT(notification));
+}
+
+void
+ghb_notify_done(signal_user_data_t *ud)
+{
+       NotifyNotification *notification;
+       GtkStatusIcon *si;
+
+       si = GTK_STATUS_ICON(GHB_OBJECT(ud->builder, "hb_status"));
+       gtk_status_icon_set_from_icon_name(si, "hb-status-empty");
+       notification = notify_notification_new(
+               "Encode Complete",
+               "Put down that cocktail, Your HandBrake queue is done!",
+               "hb-icon",
+               NULL);
+       notify_notification_attach_to_status_icon(notification, si);
+       g_signal_connect(notification, "closed", (GCallback)notify_closed_cb, ud);
+       notify_notification_show(notification, NULL);
+}