LinGui: Add queue save/load options to queue pane
authorjstebbins <jstebbins.hb@gmail.com>
Wed, 18 Feb 2015 23:25:35 +0000 (23:25 +0000)
committerjstebbins <jstebbins.hb@gmail.com>
Wed, 18 Feb 2015 23:25:35 +0000 (23:25 +0000)
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@6925 b64f7644-9d1e-0410-96f1-a4d463321fa5

gtk/src/ghb-3.12.ui
gtk/src/ghb-3.14.ui
gtk/src/ghb.ui
gtk/src/queuehandler.c

index 13bf790f3b58b8888e41033f6f23d38b0cd03454..4f0d2ceac58eb0e42ac95525016ae08c21cefd8f 100644 (file)
@@ -6497,6 +6497,41 @@ Resets all queue jobs to pending and ready to run again.</property>
                         <property name="homogeneous">True</property>
                       </packing>
                     </child>
+                    <child>
+                      <object class="GtkToolButton" id="queue_save">
+                        <property name="visible">True</property>
+                        <property name="sensitive">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="is_important">True</property>
+                        <property name="label" translatable="yes">Save Queue</property>
+                        <property name="icon_name">document-save-as</property>
+                        <property name="tooltip_text" translatable="yes">Save the current queue of encode jobs to a file.
+This file may be reloaded at a later time to edit your jobs and re-encode.</property>
+                        <signal name="clicked" handler="queue_save_clicked_cb" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="homogeneous">True</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkToolButton" id="queue_open">
+                        <property name="visible">True</property>
+                        <property name="sensitive">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="is_important">True</property>
+                        <property name="label" translatable="yes">Load Queue File</property>
+                        <property name="icon_name">document-open</property>
+                        <property name="tooltip_text" translatable="yes">Load a previously saved queue file.</property>
+                        <signal name="clicked" handler="queue_open_clicked_cb" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="homogeneous">True</property>
+                      </packing>
+                    </child>
                   </object>
                   <packing>
                     <property name="expand">False</property>
index 084c22124e662b5297ba759df8fb2c2bd39d01e7..47275859d2d101cca838e9f7fdae7894e5c99c52 100644 (file)
@@ -15,6 +15,8 @@
   <object class="GtkFileFilter" id="SourceFilterVOB"/>
   <object class="GtkFileFilter" id="SourceFilterVideo"/>
   <object class="GtkFileFilter" id="SourceFilterWMV"/>
+  <object class="GtkFileFilter" id="QueueFilterAll"/>
+  <object class="GtkFileFilter" id="QueueFilterXML"/>
   <object class="GtkLabel" id="SubBurnedLabel">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
@@ -6501,6 +6503,41 @@ Resets all queue jobs to pending and ready to run again.</property>
                         <property name="homogeneous">True</property>
                       </packing>
                     </child>
+                    <child>
+                      <object class="GtkToolButton" id="queue_save">
+                        <property name="visible">True</property>
+                        <property name="sensitive">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="is_important">True</property>
+                        <property name="label" translatable="yes">Save Queue</property>
+                        <property name="icon_name">document-save-as</property>
+                        <property name="tooltip_text" translatable="yes">Save the current queue of encode jobs to a file.
+This file may be reloaded at a later time to edit your jobs and re-encode.</property>
+                        <signal name="clicked" handler="queue_save_clicked_cb" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="homogeneous">True</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkToolButton" id="queue_open">
+                        <property name="visible">True</property>
+                        <property name="sensitive">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="is_important">True</property>
+                        <property name="label" translatable="yes">Load Queue File</property>
+                        <property name="icon_name">document-open</property>
+                        <property name="tooltip_text" translatable="yes">Load a previously saved queue file.</property>
+                        <signal name="clicked" handler="queue_open_clicked_cb" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="homogeneous">True</property>
+                      </packing>
+                    </child>
                   </object>
                   <packing>
                     <property name="expand">False</property>
index 1a2abcc185b59e02bc8a09980d12e8764de4227c..fe2e50559117680d4a5b558bc5ede0f7c7469546 100644 (file)
@@ -6497,6 +6497,41 @@ Resets all queue jobs to pending and ready to run again.</property>
                         <property name="homogeneous">True</property>
                       </packing>
                     </child>
+                    <child>
+                      <object class="GtkToolButton" id="queue_save">
+                        <property name="visible">True</property>
+                        <property name="sensitive">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="is_important">True</property>
+                        <property name="label" translatable="yes">Save Queue</property>
+                        <property name="icon_name">document-save-as</property>
+                        <property name="tooltip_text" translatable="yes">Save the current queue of encode jobs to a file.
+This file may be reloaded at a later time to edit your jobs and re-encode.</property>
+                        <signal name="clicked" handler="queue_save_clicked_cb" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="homogeneous">True</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkToolButton" id="queue_open">
+                        <property name="visible">True</property>
+                        <property name="sensitive">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="is_important">True</property>
+                        <property name="label" translatable="yes">Load Queue File</property>
+                        <property name="icon_name">document-open</property>
+                        <property name="tooltip_text" translatable="yes">Load a previously saved queue file.</property>
+                        <signal name="clicked" handler="queue_open_clicked_cb" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="homogeneous">True</property>
+                      </packing>
+                    </child>
                   </object>
                   <packing>
                     <property name="expand">False</property>
index b37b3dc388e32dc650b66c615be11ee5b61fb7b8..4fcabefa3d49570473e02a9ee45d8ab78a737d49 100644 (file)
@@ -23,6 +23,9 @@
 #include "presets.h"
 #include "audiohandler.h"
 #include "ghb-dvd.h"
+#include "plist.h"
+
+void ghb_queue_buttons_grey(signal_user_data_t *ud);
 
 G_MODULE_EXPORT void
 queue_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t *ud)
@@ -733,10 +736,136 @@ ghb_update_all_status(signal_user_data_t *ud, int status)
     }
 }
 
+static void
+save_queue_file(signal_user_data_t *ud)
+{
+    int ii, count;
+    GValue *queue = ghb_value_dup(ud->queue);
+
+    count = ghb_array_len(queue);
+    for (ii = 0; ii < count; ii++)
+    {
+        GValue *settings = ghb_array_get_nth(ud->queue, ii);
+        if (settings == NULL)
+            continue;
+        ghb_settings_set_int(settings, "job_status", GHB_QUEUE_PENDING);
+    }
+
+    GtkWidget *dialog;
+    GtkWindow *hb_window;
+
+    hb_window = GTK_WINDOW(GHB_WIDGET(ud->builder, "hb_window"));
+    dialog = gtk_file_chooser_dialog_new("Queue Destination",
+                      hb_window,
+                      GTK_FILE_CHOOSER_ACTION_SAVE,
+                      GHB_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                      GHB_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
+                      NULL);
+    gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), "queue.xml");
+    if (gtk_dialog_run(GTK_DIALOG (dialog)) != GTK_RESPONSE_ACCEPT)
+    {
+        ghb_value_free(queue);
+        gtk_widget_destroy(dialog);
+        return;
+    }
+
+    char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER (dialog));
+    gtk_widget_destroy(dialog);
+
+    FILE *file = g_fopen(filename, "w");
+    if (file != NULL)
+    {
+        ghb_plist_write(file, queue);
+        fclose(file);
+    }
+    g_free (filename);
+    ghb_value_free(queue);
+}
+
+static void
+open_queue_file(signal_user_data_t *ud)
+{
+    GtkWidget *dialog;
+    GtkWindow *hb_window;
+
+    hb_window = GTK_WINDOW(GHB_WIDGET(ud->builder, "hb_window"));
+    dialog = gtk_file_chooser_dialog_new("Queue Destination",
+                      hb_window,
+                      GTK_FILE_CHOOSER_ACTION_OPEN,
+                      GHB_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                      GHB_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+                      NULL);
+
+    // Add filters
+    GtkFileFilter *filter;
+    GtkFileChooser *chooser = GTK_FILE_CHOOSER(dialog);
+    filter = GTK_FILE_FILTER(GHB_OBJECT(ud->builder, "QueueFilterAll"));
+    gtk_file_filter_set_name(filter, _("All"));
+    gtk_file_filter_add_pattern(filter, "*");
+    gtk_file_chooser_add_filter(chooser, filter);
+    filter = GTK_FILE_FILTER(GHB_OBJECT(ud->builder, "QueueFilterXML"));
+    gtk_file_filter_set_name(filter, "XML");
+    gtk_file_filter_add_pattern(filter, "*.xml");
+    gtk_file_filter_add_pattern(filter, "*.XML");
+    gtk_file_filter_add_pattern(filter, "*.plist");
+    gtk_file_filter_add_pattern(filter, "*.PLIST");
+    gtk_file_chooser_add_filter(chooser, filter);
+
+    if (gtk_dialog_run(GTK_DIALOG (dialog)) != GTK_RESPONSE_ACCEPT)
+    {
+        gtk_widget_destroy(dialog);
+        return;
+    }
+
+    GValue *queue;
+    char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER (dialog));
+    gtk_widget_destroy(dialog);
+
+    if (g_file_test(filename, G_FILE_TEST_IS_REGULAR))
+    {
+        queue = ghb_plist_parse_file(filename);
+        if (queue != NULL)
+        {
+            int ii, count;
+            count = ghb_array_len(queue);
+            for (ii = 0; ii < count; ii++)
+            {
+                GValue *settings = ghb_array_get_nth(queue, ii);
+                ghb_array_remove(queue, ii);
+                ghb_settings_set_int(settings, "job_status", GHB_QUEUE_PENDING);
+                ghb_settings_set_int(settings, "job_unique_id", 0);
+
+                if (ud->queue == NULL)
+                    ud->queue = ghb_array_value_new(32);
+                ghb_array_append(ud->queue, settings);
+                add_to_queue_list(ud, settings, NULL);
+            }
+            ghb_queue_buttons_grey(ud);
+            ghb_save_queue(ud->queue);
+            ghb_value_free(queue);
+        }
+    }
+    g_free (filename);
+}
+
+G_MODULE_EXPORT void
+queue_save_clicked_cb(GtkWidget *widget, signal_user_data_t *ud)
+{
+    save_queue_file(ud);
+}
+
+G_MODULE_EXPORT void
+queue_open_clicked_cb(GtkWidget *widget, signal_user_data_t *ud)
+{
+    open_queue_file(ud);
+}
+
 G_MODULE_EXPORT void
 queue_reload_all_clicked_cb(GtkWidget *widget, signal_user_data_t *ud)
 {
     ghb_update_all_status(ud, GHB_QUEUE_PENDING);
+    ghb_save_queue(ud->queue);
+    ghb_update_pending(ud);
 }
 
 G_MODULE_EXPORT void
@@ -946,6 +1075,7 @@ queue_add(signal_user_data_t *ud, GValue *settings, gint batch)
     add_to_queue_list(ud, settings, NULL);
     ghb_save_queue(ud->queue);
     ghb_update_pending(ud);
+    ghb_queue_buttons_grey(ud);
 
     return TRUE;
 }
@@ -1803,6 +1933,8 @@ ghb_queue_buttons_grey(signal_user_data_t *ud)
 
     paused = queue_state & GHB_STATE_PAUSED;
 
+    widget = GHB_WIDGET(ud->builder, "queue_save");
+    gtk_widget_set_sensitive(widget, !!queue_count);
     widget = GHB_WIDGET(ud->builder, "queue_add");
     gtk_widget_set_sensitive(widget, show_start);
     widget = GHB_WIDGET(ud->builder, "queue_add_menu");