diff options
-rw-r--r-- | gtk/src/ghb.m4 | 256 | ||||
-rw-r--r-- | gtk/src/main.c | 3 | ||||
-rw-r--r-- | gtk/src/presets.c | 82 |
3 files changed, 317 insertions, 24 deletions
diff --git a/gtk/src/ghb.m4 b/gtk/src/ghb.m4 index d6cdd99db..7b8c3c74d 100644 --- a/gtk/src/ghb.m4 +++ b/gtk/src/ghb.m4 @@ -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"/> @@ -138,6 +180,15 @@ conjunction with the "Forced" option.</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> <property name="visible">True</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> @@ -950,6 +1001,15 @@ libx264 authors: </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> <property name="visible">True</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> diff --git a/gtk/src/main.c b/gtk/src/main.c index 592a98029..f347af03d 100644 --- a/gtk/src/main.c +++ b/gtk/src/main.c @@ -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 }, diff --git a/gtk/src/presets.c b/gtk/src/presets.c index 565de81e8..8da10ce5d 100644 --- a/gtk/src/presets.c +++ b/gtk/src/presets.c @@ -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); } } |