]> granicus.if.org Git - handbrake/commitdiff
LinGui: add preset options inline menu
authorJohn Stebbins <jstebbins.hb@gmail.com>
Fri, 22 Dec 2017 22:04:15 +0000 (14:04 -0800)
committerJohn Stebbins <jstebbins.hb@gmail.com>
Fri, 22 Dec 2017 22:04:15 +0000 (14:04 -0800)
gtk/src/ghb.m4
gtk/src/main.c
gtk/src/presets.c

index d6cdd99db45ba912f795ac4a7eaa7f3ac39bb7c3..7b8c3c74d2c600212ae2a7caede02a558394aa8b 100644 (file)
@@ -8,6 +8,48 @@ filter_output([
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
+  <menu id="presets-mm">
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Set De_fault</attribute>
+        <attribute name="action">app.preset-default</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">_Save</attribute>
+        <attribute name="action">app.preset-save</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Save _As</attribute>
+        <attribute name="action">app.preset-save-as</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">_Rename</attribute>
+        <attribute name="action">app.preset-rename</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">_Delete</attribute>
+        <attribute name="action">app.preset-remove</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">_Import</attribute>
+        <attribute name="action">app.preset-import</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">_Export</attribute>
+        <attribute name="action">app.preset-export</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Reset _Built-in Presets</attribute>
+        <attribute name="action">app.presets-reload</attribute>
+      </item>
+    </section>
+  </menu>
   <object class="GtkFileFilter" id="SourceFilterAVI"/>
   <object class="GtkFileFilter" id="SourceFilterAll"/>
   <object class="GtkFileFilter" id="SourceFilterEVO"/>
@@ -137,6 +179,15 @@ conjunction with the "Forced" option.</property>
                         <property name="action-name">app.preset-save-as</property>
                       </object>
                     </child>
+                    <child>
+                      <object class="GtkMenuItem" id="presets_window_rename">
+                        <property name="label" translatable="yes">_Rename</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="action-name">app.preset-rename</property>
+                      </object>
+                    </child>
                     <child>
                       <object class="GtkMenuItem" id="presets_window_remove">
                         <property name="label" translatable="yes">_Delete</property>
@@ -148,7 +199,7 @@ conjunction with the "Forced" option.</property>
                     </child>
                     <child>
                       <object class="GtkMenuItem" id="presets_window_default">
-                        <property name="label" translatable="yes">_Make Default</property>
+                        <property name="label" translatable="yes">Set De_fault</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
@@ -156,26 +207,26 @@ conjunction with the "Forced" option.</property>
                       </object>
                     </child>
                     <child>
-                      <object class="GtkMenuItem" id="presets_window_export">
-                        <property name="label" translatable="yes">_Export</property>
+                      <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>
-                        <property name="action-name">app.preset-export</property>
+                        <property name="action-name">app.preset-import</property>
                       </object>
                     </child>
                     <child>
-                      <object class="GtkMenuItem" id="presets_window_import">
-                        <property name="label" translatable="yes">_Import</property>
+                      <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>
-                        <property name="action-name">app.preset-import</property>
+                        <property name="action-name">app.preset-export</property>
                       </object>
                     </child>
                     <child>
                       <object class="GtkMenuItem" id="presets_window_restore">
-                        <property name="label" translatable="yes">_Reload Built-in Presets</property>
+                        <property name="label" translatable="yes">Reset _Built-in Presets</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
@@ -949,6 +1000,15 @@ libx264 authors:
                         <property name="action-name">app.preset-save-as</property>
                       </object>
                     </child>
+                    <child>
+                      <object class="GtkMenuItem" id="presets_rename">
+                        <property name="label" translatable="yes">_Rename</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="action-name">app.preset-rename</property>
+                      </object>
+                    </child>
                     <child>
                       <object class="GtkMenuItem" id="presets_remove">
                         <property name="label" translatable="yes">_Delete</property>
@@ -960,7 +1020,7 @@ libx264 authors:
                     </child>
                     <child>
                       <object class="GtkMenuItem" id="presets_default">
-                        <property name="label" translatable="yes">_Make Default</property>
+                        <property name="label" translatable="yes">Set De_fault</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
@@ -968,26 +1028,26 @@ libx264 authors:
                       </object>
                     </child>
                     <child>
-                      <object class="GtkMenuItem" id="presets_export">
-                        <property name="label" translatable="yes">_Export</property>
+                      <object class="GtkMenuItem" id="presets_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>
-                        <property name="action-name">app.preset-export</property>
+                        <property name="action-name">app.preset-import</property>
                       </object>
                     </child>
                     <child>
-                      <object class="GtkMenuItem" id="presets_import">
-                        <property name="label" translatable="yes">_Import</property>
+                      <object class="GtkMenuItem" id="presets_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>
-                        <property name="action-name">app.preset-import</property>
+                        <property name="action-name">app.preset-export</property>
                       </object>
                     </child>
                     <child>
                       <object class="GtkMenuItem" id="presets_restore">
-                        <property name="label" translatable="yes">_Reload Built-in Presets</property>
+                        <property name="label" translatable="yes">Reset _Built-in Presets</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
@@ -1578,7 +1638,7 @@ This is often the feature title of a DVD.</property>
                     </child>
                     <child>
                       <object class="GtkLabel" id="preset_selection_modified_label">
-                        <property name="visible">True</property>
+                        <property name="visible">False</property>
                         <property name="can_focus">False</property>
                         <property name="width-chars">10</property>
                         <property name="label" translatable="yes"></property>
@@ -1594,7 +1654,7 @@ This is often the feature title of a DVD.</property>
                     <child>
                       <object class="GtkButton" id="preset_selection_reload">
                         <property name="label" translatable="yes">Reload</property>
-                        <property name="visible">True</property>
+                        <property name="visible">False</property>
                         <property name="can_focus">True</property>
                         <property name="tooltip_text" translatable="yes">Reload the encoding settings for the currently selected preset.
     Modifications will be discarded.</property>
@@ -1611,7 +1671,7 @@ This is often the feature title of a DVD.</property>
                     <child>
                       <object class="GtkButton" id="preset_save_new">
                         <property name="label" translatable="yes">Save New Preset</property>
-                        <property name="visible">True</property>
+                        <property name="visible">False</property>
                         <property name="can_focus">True</property>
                         <property name="tooltip_text" translatable="yes">Reload the encoding settings for the currently selected preset.
     Modifications will be discarded.</property>
@@ -1625,6 +1685,52 @@ This is often the feature title of a DVD.</property>
                         <property name="position">4</property>
                       </packing>
                     </child>
+                    <child>
+                      <object class="GtkMenuButton" id="preset_options_button">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="direction">down</property>
+                        <property name="menu-model">presets-mm</property>
+                        <child>
+                          <object class="GtkBox" id="presets_options_button_box">
+                            <property name="orientation">horizontal</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <child>
+                              <object class="GtkLabel" id="presets_options_button_label">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="xalign">0</property>
+                                <property name="label" translatable="yes">Options</property>
+                                <property name="use_markup">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">True</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkImage" id="presets_options_button_arrow">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="icon_name">pan-down-symbolic</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">True</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">5</property>
+                      </packing>
+                    </child>
                   </object>
                   <packing>
                     <property name="top_attach">2</property>
@@ -8405,6 +8511,118 @@ Uncheck this if you want to allow changing each title's settings independently.<
       <action-widget response="-5">preset_folder_ok</action-widget>
     </action-widgets>
   </object>
+  <object class="GtkDialog" id="preset_rename_dialog">
+    <property name="transient_for">hb_window</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="border_width">5</property>
+    <property name="modal">True</property>
+    <property name="window_position">center-on-parent</property>
+    <property name="type_hint">dialog</property>
+    <signal name="delete-event" handler="gtk_widget_hide_on_delete" swapped="no"/>
+    <child internal-child="vbox">
+      <object class="GtkBox" id="dialog-preset-rename-box">
+        <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="spacing">2</property>
+        <child internal-child="action_area">
+          <object class="GtkButtonBox" id="dialog-action_preset_rename_area">
+            <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="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="preset_rename_cancel">
+                <property name="label" translatable="yes">Cancel</property>
+                <property name="image">gtk-cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="preset_rename_ok">
+                <property name="label" translatable="yes">OK</property>
+                <property name="image">gtk-ok</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkBox" id="preset_rename_hbox">
+            <property name="orientation">horizontal</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="GtkLabel" id="preset_rename_label">
+                <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="halign">end</property>
+                <property name="label" translatable="yes">Preset Name:</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkEntry" id="PresetReName">
+                <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="max_length">40</property>
+                <property name="activates_default">True</property>
+                <property name="width-chars">30</property>
+                <property name="truncate_multiline">True</property>
+                <property name="primary_icon_activatable">False</property>
+                <property name="secondary_icon_activatable">False</property>
+                <signal name="changed" handler="preset_name_changed_cb" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="0">preset_rename_cancel</action-widget>
+      <action-widget response="-5">preset_rename_ok</action-widget>
+    </action-widgets>
+  </object>
   <object class="GtkDialog" id="preset_save_dialog">
     <property name="transient_for">hb_window</property>
     <property name="can_focus">False</property>
index 592a9802954c23e24c9513cc35ca9503c508a956..f347af03d504a18c7f596bfbde81ff1aa8964c73 100644 (file)
@@ -865,6 +865,8 @@ preset_save_action_cb(GSimpleAction *action, GVariant *param, gpointer ud);
 G_MODULE_EXPORT void
 preset_save_as_action_cb(GSimpleAction *action, GVariant *param, gpointer ud);
 G_MODULE_EXPORT void
+preset_rename_action_cb(GSimpleAction *action, GVariant *param, gpointer ud);
+G_MODULE_EXPORT void
 preset_remove_action_cb(GSimpleAction *action, GVariant *param, gpointer ud);
 G_MODULE_EXPORT void
 preset_default_action_cb(GSimpleAction *action, GVariant *param, gpointer ud);
@@ -909,6 +911,7 @@ static void map_actions(GApplication * app, signal_user_data_t * ud)
           NULL, "false",    show_activity_action_cb         },
         { "preset-save",    preset_save_action_cb           },
         { "preset-save-as", preset_save_as_action_cb        },
+        { "preset-rename",  preset_rename_action_cb         },
         { "preset-remove",  preset_remove_action_cb         },
         { "preset-default", preset_default_action_cb        },
         { "preset-export",  preset_export_action_cb         },
index 565de81e8789ef576254cbf08be31ffa49e7292e..8da10ce5d913f8255a0ae624862bc60574bf62ec 100644 (file)
@@ -542,7 +542,8 @@ set_preset_menu_button_label(signal_user_data_t *ud, hb_preset_index_t *path)
     type = ghb_dict_get_int(dict, "Type");
     fullname = preset_get_fullname(path, " <span alpha=\"70%\">></span> ");
     label = GTK_LABEL(GHB_WIDGET(ud->builder, "presets_menu_button_label"));
-    text = g_strdup_printf("%s%s", type ? "Custom" : "Official", fullname);
+    text = g_strdup_printf("%s%s", type == HB_PRESET_TYPE_CUSTOM ?
+                                   "Custom" : "Official", fullname);
     gtk_label_set_markup(label, text);
     free(fullname);
     free(text);
@@ -585,6 +586,16 @@ select_preset2(signal_user_data_t *ud, hb_preset_index_t *path)
         gtk_tree_path_free(treepath);
     }
     set_preset_menu_button_label(ud, path);
+
+    int type = preset_get_type(path);
+    GSimpleAction * action;
+
+    action = G_SIMPLE_ACTION(g_action_map_lookup_action(
+                             G_ACTION_MAP(ud->app), "preset-rename"));
+    g_simple_action_set_enabled(action, type == HB_PRESET_TYPE_CUSTOM);
+    action = G_SIMPLE_ACTION(g_action_map_lookup_action(
+                             G_ACTION_MAP(ud->app), "preset-save"));
+    g_simple_action_set_enabled(action, type == HB_PRESET_TYPE_CUSTOM);
 }
 
 void
@@ -1189,7 +1200,7 @@ ghb_presets_menu_init(signal_user_data_t *ud)
                 continue;
             }
 
-            if (type == 0)
+            if (type == HB_PRESET_TYPE_OFFICIAL)
             {
                 // Add folder name to list of official names
                 official_names[kk++] = g_strdup(folder_name);
@@ -1236,7 +1247,7 @@ ghb_presets_menu_init(signal_user_data_t *ud)
                     free(preset_path);
                     free(detail_action);
                 }
-                if (type == 1 &&
+                if (type == HB_PRESET_TYPE_CUSTOM &&
                     ghb_strv_contains((const char**)official_names, folder_name))
                 {
                     menu_item_name = g_strdup_printf("My %s", folder_name);
@@ -1251,7 +1262,9 @@ ghb_presets_menu_init(signal_user_data_t *ud)
             }
             g_string_free(folder_str, TRUE);
         }
-        g_menu_append_section(menu, type ? "Custom" : "Official",
+        g_menu_append_section(menu,
+                              type == HB_PRESET_TYPE_CUSTOM ?
+                              "Custom" : "Official",
                               G_MENU_MODEL(section));
     }
     g_free(path);
@@ -2066,6 +2079,56 @@ preset_export_action_cb(GSimpleAction *action, GVariant *param,
     hb_value_free(&dict);
 }
 
+G_MODULE_EXPORT void
+preset_rename_action_cb(GSimpleAction *action, GVariant *param,
+                        signal_user_data_t *ud)
+{
+    const gchar       * name;
+    const gchar       * fullname;
+    int                 type;
+    hb_preset_index_t * path;
+    GtkWidget         * dialog;
+    GtkEntry          * entry;
+    GhbValue          * dict;
+    GtkResponseType     response;
+
+    name      = ghb_dict_get_string(ud->settings, "PresetName");
+    type      = ghb_dict_get_int(ud->settings, "Type");
+    fullname  = ghb_dict_get_string(ud->settings, "PresetFullName");
+
+    if (type != HB_PRESET_TYPE_CUSTOM)
+    {
+        // Only allow renaming custom presets
+        return;
+    }
+    path = hb_preset_search_index(fullname, 0, type);
+
+    dialog   = GHB_WIDGET(ud->builder, "preset_rename_dialog");
+    entry    = GTK_ENTRY(GHB_WIDGET(ud->builder, "PresetReName"));
+    gtk_entry_set_text(entry, name);
+
+    response = gtk_dialog_run(GTK_DIALOG(dialog));
+    gtk_widget_hide(dialog);
+    if (response == GTK_RESPONSE_OK)
+    {
+        // save the new name
+        name = gtk_entry_get_text(entry);
+        dict = hb_preset_get(path);
+        if (dict != NULL)
+        {
+            ghb_dict_set_string(dict, "PresetName", name);
+            store_presets();
+        }
+
+        char * full = preset_get_fullname(path, "/");
+        ghb_dict_set_string(ud->settings, "PresetFullName", full);
+        ghb_dict_set_string(ud->settings, "PresetName", name);
+        free(full);
+        ghb_presets_menu_reinit(ud);
+        set_preset_menu_button_label(ud, path);
+    }
+}
+
 static void preset_save_action(signal_user_data_t *ud, gboolean as)
 {
     const char        * category = NULL;
@@ -2121,7 +2184,7 @@ static void preset_save_action(signal_user_data_t *ud, gboolean as)
             {
                 continue;
             }
-            if (ghb_dict_get_int(dict, "Type") == 1)
+            if (ghb_dict_get_int(dict, "Type") == HB_PRESET_TYPE_CUSTOM)
             {
                 category = ghb_dict_get_string(dict, "PresetName");
                 break;
@@ -2737,6 +2800,15 @@ presets_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_
             widget = GHB_WIDGET(ud->builder, "preset_save_new");
             gtk_widget_set_visible(widget, FALSE);
         }
+        int type = preset_get_type(path);
+        GSimpleAction * action;
+
+        action = G_SIMPLE_ACTION(g_action_map_lookup_action(
+                                 G_ACTION_MAP(ud->app), "preset-rename"));
+        g_simple_action_set_enabled(action, type == HB_PRESET_TYPE_CUSTOM);
+        action = G_SIMPLE_ACTION(g_action_map_lookup_action(
+                                 G_ACTION_MAP(ud->app), "preset-save"));
+        g_simple_action_set_enabled(action, type == HB_PRESET_TYPE_CUSTOM);
         free(path);
     }
 }