]> granicus.if.org Git - handbrake/commitdiff
LinGui: Split presets list out into separate window
authorJohn Stebbins <jstebbins.hb@gmail.com>
Wed, 13 Sep 2017 15:24:18 +0000 (08:24 -0700)
committerJohn Stebbins <jstebbins.hb@gmail.com>
Mon, 6 Nov 2017 16:19:49 +0000 (08:19 -0800)
gtk/src/callbacks.c
gtk/src/ghb.m4
gtk/src/internal_defaults.json
gtk/src/presets.c

index 649e7d227d7b103ae2a4025e8cbec8805b4f7cfc..5ac796680f4c72ebfc386de948c450a7fb6a6a3a 100644 (file)
@@ -4082,6 +4082,15 @@ show_activity_menu_toggled_cb(GtkWidget *widget, signal_user_data_t *ud)
     gtk_toggle_tool_button_set_active(button, active);
 }
 
+G_MODULE_EXPORT gboolean
+presets_window_delete_cb(GtkWidget *xwidget, GdkEvent *event, signal_user_data_t *ud)
+{
+    gtk_widget_set_visible(xwidget, FALSE);
+    GtkWidget *widget = GHB_WIDGET(ud->builder, "show_presets");
+    gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widget), FALSE);
+    return TRUE;
+}
+
 G_MODULE_EXPORT gboolean
 activity_window_delete_cb(GtkWidget *xwidget, GdkEvent *event, signal_user_data_t *ud)
 {
@@ -4250,25 +4259,47 @@ show_queue_menu_toggled_cb(GtkWidget *widget, signal_user_data_t *ud)
     gtk_toggle_tool_button_set_active(button, active);
 }
 
-G_MODULE_EXPORT void
-show_presets_toggled_cb(GtkWidget *widget, signal_user_data_t *ud)
+static void
+presets_window_set_visible(signal_user_data_t *ud, gboolean visible)
 {
-    GtkWidget *frame;
-    GtkWindow *hb_window;
+    GtkWidget     * presets_window;
+    GtkWidget     * hb_window;
+    int             x, y;
 
-    g_debug("show_presets_clicked_cb ()");
-    frame = GHB_WIDGET (ud->builder, "presets_frame");
-    ghb_widget_to_setting(ud->prefs, widget);
-    if (ghb_dict_get_bool(ud->prefs, "show_presets"))
+    hb_window = GHB_WIDGET(ud->builder, "hb_window");
+    if (!gtk_widget_is_visible(hb_window))
     {
-        gtk_widget_show_now(frame);
+        return;
     }
-    else
+
+    presets_window = GHB_WIDGET(ud->builder, "presets_window");
+    gtk_widget_set_visible(presets_window, visible);
+    if (visible)
     {
-        gtk_widget_hide(frame);
-        hb_window = GTK_WINDOW(GHB_WIDGET (ud->builder, "hb_window"));
-        gtk_window_resize(hb_window, 16, 16);
+        int w, h;
+        w = ghb_dict_get_int(ud->prefs, "presets_window_width");
+        h = ghb_dict_get_int(ud->prefs, "presets_window_height");
+        if (w > 200 && h > 200)
+        {
+            gtk_window_resize(GTK_WINDOW(presets_window), w, h);
+        }
+        gtk_window_get_position(GTK_WINDOW(hb_window), &x, &y);
+        x -= w + 10;
+        if (x < 0)
+        {
+            gtk_window_move(GTK_WINDOW(hb_window), w + 10, y);
+            x = 0;
+        }
+        gtk_window_move(GTK_WINDOW(presets_window), x, y);
     }
+}
+
+G_MODULE_EXPORT void
+show_presets_toggled_cb(GtkWidget *widget, signal_user_data_t *ud)
+{
+    ghb_widget_to_setting(ud->prefs, widget);
+    presets_window_set_visible(ud, ghb_dict_get_bool(ud->prefs,
+                                                     "show_presets"));
     ghb_pref_save(ud->prefs, "show_presets");
 }
 
@@ -5782,13 +5813,47 @@ ghb_notify_done(signal_user_data_t *ud)
     }
 }
 
+G_MODULE_EXPORT gboolean
+window_map_cb(
+    GtkWidget *widget,
+    GdkEventAny *event,
+    signal_user_data_t *ud)
+{
+    presets_window_set_visible(ud, ghb_dict_get_bool(ud->prefs,
+                                                     "show_presets"));
+    return FALSE;
+}
+
+G_MODULE_EXPORT gboolean
+presets_window_configure_cb(
+    GtkWidget *widget,
+    GdkEventConfigure *event,
+    signal_user_data_t *ud)
+{
+    if (gtk_widget_get_visible(widget))
+    {
+        gint w, h;
+        w = ghb_dict_get_int(ud->prefs, "presets_window_width");
+        h = ghb_dict_get_int(ud->prefs, "presets_window_height");
+
+        if ( w != event->width || h != event->height )
+        {
+            ghb_dict_set_int(ud->prefs, "presets_window_width", event->width);
+            ghb_dict_set_int(ud->prefs, "presets_window_height", event->height);
+            ghb_pref_set(ud->prefs, "presets_window_width");
+            ghb_pref_set(ud->prefs, "presets_window_height");
+            ghb_prefs_store();
+        }
+    }
+    return FALSE;
+}
+
 G_MODULE_EXPORT gboolean
 window_configure_cb(
     GtkWidget *widget,
     GdkEventConfigure *event,
     signal_user_data_t *ud)
 {
-    //g_message("preview_configure_cb()");
     if (gtk_widget_get_visible(widget))
     {
         gint w, h;
index adf68c13694ad92c0ee8f068309615ae92c3335e..67a76a3b6a98694365012f911d5236068e306537 100644 (file)
@@ -87,6 +87,165 @@ conjunction with the "Forced" option.</property>
     <property name="label" translatable="yes">&lt;b&gt;Track&lt;/b&gt;</property>
     <property name="use_markup">True</property>
   </object>
+
+  <object class="GtkWindow" id="presets_window">
+    <property name="visible">False</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="type_hint">utility</property>
+    <property name="skip_taskbar_hint">True</property>
+    <property name="skip_pager_hint">True</property>
+    <property name="transient_for">hb_window</property>
+    <property name="default_width">300</property>
+    <property name="default_height">600</property>
+    <signal name="delete-event" handler="presets_window_delete_cb" swapped="no"/>
+    <signal name="configure-event" handler="presets_window_configure_cb" swapped="no"/>
+    <child>
+      <object class="GtkBox" id="presets_window_box">
+        <property name="orientation">vertical</property>
+        <property name="visible">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>
+        <child>
+          <object class="GtkMenuBar" id="presets_menu_bar">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkMenuItem" id="presets_window_menu">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">_Presets</property>
+                <property name="use_underline">True</property>
+                <child type="submenu">
+                  <object class="GtkMenu" id="presets_window_submenu">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <child>
+                      <object class="GtkMenuItem" id="presets_window_save">
+                        <property name="label" translatable="yes">_Save</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="use_underline">True</property>
+                        <signal name="activate" handler="presets_save_clicked_cb" swapped="no"/>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkMenuItem" id="presets_window_remove">
+                        <property name="label" translatable="yes">_Delete</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="use_underline">True</property>
+                        <signal name="activate" handler="presets_remove_clicked_cb" swapped="no"/>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkMenuItem" id="presets_window_default">
+                        <property name="label" translatable="yes">_Make Default</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="use_underline">True</property>
+                        <signal name="activate" handler="presets_default_clicked_cb" swapped="no"/>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkMenuItem" id="presets_window_new_folder">
+                        <property name="label" translatable="yes">_New Folder</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="use_underline">True</property>
+                        <signal name="activate" handler="presets_new_folder_clicked_cb" swapped="no"/>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkMenuItem" id="presets_window_export">
+                        <property name="label" translatable="yes">_Export</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="use_underline">True</property>
+                        <signal name="activate" handler="preset_export_clicked_cb" swapped="no"/>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkMenuItem" id="presets_window_import">
+                        <property name="label" translatable="yes">_Import</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="use_underline">True</property>
+                        <signal name="activate" handler="preset_import_clicked_cb" swapped="no"/>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkMenuItem" id="presets_window_restore">
+                        <property name="label" translatable="yes">_Reload Built-in Presets</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="use_underline">True</property>
+                        <signal name="activate" handler="presets_restore_clicked_cb" swapped="no"/>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkFrame" id="presets_frame">
+            <property name="visible">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="label_xalign">0</property>
+            <property name="shadow_type">none</property>
+            <property name="margin-start">6</property>
+            <property name="margin-end">6</property>
+            <property name="margin-top">6</property>
+            <property name="margin-bottom">6</property>
+            <child>
+              <object class="GtkScrolledWindow" id="presets_scroll">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="shadow_type">etched-in</property>
+                <property name="margin-top">6</property>
+                <property name="min_content_width">200</property>
+                <child>
+                  <object class="GtkTreeView" id="presets_list">
+                    <property name="width_request">206</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="headers_visible">False</property>
+                    <child internal-child="selection">
+                      <object class="GtkTreeSelection" id="treeview-selection4"/>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child type="label">
+              <object class="GtkLabel" id="label34">
+                <property name="visible">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="label" translatable="yes">&lt;b&gt;Presets List&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+
   <object class="GtkWindow" id="activity_window">
     <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>
@@ -594,6 +753,7 @@ libx264 authors:
     <property name="default_width">500</property>
     <property name="default_height">400</property>
     <property name="icon_name">hb-icon</property>
+    <signal name="map-event" handler="window_map_cb" swapped="no"/>
     <signal name="configure-event" handler="window_configure_cb" swapped="no"/>
     <signal name="delete-event" handler="window_delete_event_cb" swapped="no"/>
     <signal name="destroy-event" handler="window_destroy_event_cb" swapped="no"/>
@@ -1410,51 +1570,6 @@ This is often the feature title of a DVD.</property>
                 <property name="position">0</property>
               </packing>
             </child>
-            <child>
-              <object class="GtkFrame" id="presets_frame">
-                <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="label_xalign">0</property>
-                <property name="shadow_type">none</property>
-                <property name="margin-end">6</property>
-                <property name="margin-bottom">6</property>
-                <child>
-                  <object class="GtkScrolledWindow" id="presets_scroll">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="shadow_type">etched-in</property>
-                    <property name="margin-top">6</property>
-                    <property name="min_content_width">200</property>
-                    <child>
-                      <object class="GtkTreeView" id="presets_list">
-                        <property name="width_request">206</property>
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                        <property name="headers_visible">False</property>
-                        <child internal-child="selection">
-                          <object class="GtkTreeSelection" id="treeview-selection4"/>
-                        </child>
-                      </object>
-                    </child>
-                  </object>
-                </child>
-                <child type="label">
-                  <object class="GtkLabel" id="label34">
-                    <property name="visible">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="label" translatable="yes">&lt;b&gt;Presets List&lt;/b&gt;</property>
-                    <property name="use_markup">True</property>
-                  </object>
-                </child>
-              </object>
-              <packing>
-                <property name="expand">True</property>
-                <property name="fill">True</property>
-                <property name="position">1</property>
-              </packing>
-            </child>
           </object>
           <packing>
             <property name="expand">False</property>
index 7d70db5fac22b2de71f209a4b2d2996a714787a5..be47bfbc41b2ffabb7bd4740f8d9c2f85daa5eac 100644 (file)
         "WhenComplete": "notify",
         "SrtDir": "",
         "window_width": 1,
-        "window_height": 1
+        "window_height": 1,
+        "preset_window_width": 1,
+        "preset_window_height": 1
     }
 }
index a4d736fe0c81e2bad2167d5adee5562dd4705646..cc80434bd3cf093ccf17840dfe05e362657c320c 100644 (file)
@@ -1871,16 +1871,26 @@ preset_export_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
     GtkResponseType    response;
     const gchar       *exportDir;
     gchar             *filename;
+    GhbValue          *dict;
 
     path = get_selected_path(ud);
     if (path == NULL || path->depth <= 0)
     {
+        char * new_name;
+
+        free(path);
+        dict = ghb_settings_to_preset(ud->settings);
+        name = ghb_dict_get_string(dict, "PresetName");
+        new_name = g_strdup_printf("%s (modified)", name);
+        ghb_dict_set_string(dict, "PresetName", new_name);
+        free(new_name);
+    }
+    else
+    {
+        dict = hb_value_dup(hb_preset_get(path));
         free(path);
-        return;
     }
 
-    GhbValue *dict = hb_preset_get(path);
-    free(path);
     if (dict == NULL)
     {
         return;
@@ -1925,6 +1935,7 @@ preset_export_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
         g_free(filename);
     }
     gtk_widget_destroy(dialog);
+    hb_value_free(&dict);
 }
 
 G_MODULE_EXPORT void