diff options
author | Alexander Schwinn <alexxcons@xfce.org> | 2020-05-17 02:36:26 +0200 |
---|---|---|
committer | Alexander Schwinn <alexxcons@xfce.org> | 2020-06-08 09:49:17 +0200 |
commit | aba5d3baeac78a5bcc41bd871cb506e3b0a48b96 (patch) | |
tree | 269989357584ee60c2ac40abac259a10ddc67cfd /thunar/thunar-menu.c | |
parent | cbbe60bbb389ebd175a6a4908cabb7b5a89521af (diff) | |
download | thunar-aba5d3baeac78a5bcc41bd871cb506e3b0a48b96.tar.gz |
Introduced widget thunar-menu in order to unify the way menus are build
in thunar, and used it for the context menu (Issue #293)
Diffstat (limited to 'thunar/thunar-menu.c')
-rw-r--r-- | thunar/thunar-menu.c | 347 |
1 files changed, 347 insertions, 0 deletions
diff --git a/thunar/thunar-menu.c b/thunar/thunar-menu.c new file mode 100644 index 00000000..5271d049 --- /dev/null +++ b/thunar/thunar-menu.c @@ -0,0 +1,347 @@ +/*- + * Copyright (c) 2020 Alexander Schwinn <alexxcons@xfce.org> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 59 Temple + * Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <thunar/thunar-menu.h> + +#include <thunar/thunar-gtk-extensions.h> +#include <thunar/thunar-launcher.h> +#include <thunar/thunar-private.h> +#include <thunar/thunar-window.h> + +/* property identifiers */ +enum +{ + PROP_0, + PROP_MENU_TYPE, + PROP_LAUNCHER, + PROP_FORCE_SECTION_OPEN, + PROP_TAB_SUPPORT_DISABLED, + PROP_CHANGE_DIRECTORY_SUPPORT_DISABLED, +}; + +static void thunar_menu_finalize (GObject *object); +static void thunar_menu_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); +static void thunar_menu_set_property (GObject *object, + guint prop_uid, + const GValue *value, + GParamSpec *pspec); + +struct _ThunarMenuClass +{ + GtkMenuClass __parent__; +}; + +struct _ThunarMenu +{ + GtkMenu __parent__; + ThunarLauncher *launcher; + + /* true, if the 'open' section should be forced */ + gboolean force_section_open; + + /* true, if 'open as new tab' should not be shown */ + gboolean tab_support_disabled; + + /* true, if 'open' for folders, which would result in changing the directory, should not be shown */ + gboolean change_directory_support_disabled; + + /* detailed type of the thunar menu */ + ThunarMenuType type; +}; + + + +static GQuark thunar_menu_handler_quark; + +G_DEFINE_TYPE (ThunarMenu, thunar_menu, GTK_TYPE_MENU) + + + +static void +thunar_menu_class_init (ThunarMenuClass *klass) +{ + GObjectClass *gobject_class; + + /* determine the "thunar-menu-handler" quark */ + thunar_menu_handler_quark = g_quark_from_static_string ("thunar-menu-handler"); + + gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = thunar_menu_finalize; + gobject_class->get_property = thunar_menu_get_property; + gobject_class->set_property = thunar_menu_set_property; + + g_object_class_install_property (gobject_class, + PROP_MENU_TYPE, + g_param_spec_int ("menu-type", + "menu-type", + "menu-type", + 0, 1, 0, // min, max, default + G_PARAM_WRITABLE + | G_PARAM_CONSTRUCT_ONLY)); + + g_object_class_install_property (gobject_class, + PROP_LAUNCHER, + g_param_spec_object ("launcher", + "launcher", + "launcher", + THUNAR_TYPE_LAUNCHER, + G_PARAM_WRITABLE + | G_PARAM_CONSTRUCT_ONLY)); + + g_object_class_install_property (gobject_class, + PROP_FORCE_SECTION_OPEN, + g_param_spec_boolean ("force-section-open", + "force-section-open", + "force-section-open", + FALSE, + G_PARAM_WRITABLE + | G_PARAM_CONSTRUCT_ONLY)); + + g_object_class_install_property (gobject_class, + PROP_TAB_SUPPORT_DISABLED, + g_param_spec_boolean ("tab-support-disabled", + "tab-support-disabled", + "tab-support-disabled", + FALSE, + G_PARAM_WRITABLE + | G_PARAM_CONSTRUCT_ONLY)); + + g_object_class_install_property (gobject_class, + PROP_CHANGE_DIRECTORY_SUPPORT_DISABLED, + g_param_spec_boolean ("change_directory-support-disabled", + "change_directory-support-disabled", + "change_directory-support-disabled", + FALSE, + G_PARAM_WRITABLE + | G_PARAM_CONSTRUCT_ONLY)); +} + + + +static void +thunar_menu_init (ThunarMenu *menu) +{ + menu->force_section_open = FALSE; + menu->type = FALSE; + menu->tab_support_disabled = FALSE; + menu->change_directory_support_disabled = FALSE; +} + + + +static void +thunar_menu_finalize (GObject *object) +{ + ThunarMenu *menu = THUNAR_MENU (object); + + g_object_unref (menu->launcher); + + (*G_OBJECT_CLASS (thunar_menu_parent_class)->finalize) (object); +} + + + +static void +thunar_menu_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + switch (prop_id) + { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + + + +static void +thunar_menu_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + ThunarMenu *menu = THUNAR_MENU (object); + + switch (prop_id) + { + case PROP_MENU_TYPE: + menu->type = g_value_get_int (value); + break; + + case PROP_LAUNCHER: + menu->launcher = g_value_dup_object (value); + g_object_ref (G_OBJECT (menu->launcher)); + break; + + case PROP_FORCE_SECTION_OPEN: + menu->force_section_open = g_value_get_boolean (value); + break; + + case PROP_TAB_SUPPORT_DISABLED: + menu->tab_support_disabled = g_value_get_boolean (value); + break; + + case PROP_CHANGE_DIRECTORY_SUPPORT_DISABLED: + menu->change_directory_support_disabled = g_value_get_boolean (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + + + +/** + * thunar_menu_add_sections: + * @menu : a #ThunarMenu instance + * @menu_sections : bit enumeration of #ThunarMenuSections which should be added to the #ThunarMenu + * + * Method to add different sections of #GtkMenuItems to the #ThunarMenu, + * according to the selected #ThunarMenuSections + * + * Return value: TRUE if any #GtkMenuItem was added + **/ +gboolean +thunar_menu_add_sections (ThunarMenu *menu, + ThunarMenuSections menu_sections) +{ + GtkWidget *window; + gboolean item_added; + gboolean is_window_menu = menu->type == THUNAR_MENU_TYPE_WINDOW; + + _thunar_return_val_if_fail (THUNAR_IS_MENU (menu), FALSE); + + if (menu_sections & THUNAR_MENU_SECTION_OPEN) + { + if (thunar_launcher_append_open_section (menu->launcher, GTK_MENU_SHELL (menu), !menu->tab_support_disabled, !menu->change_directory_support_disabled, menu->force_section_open)) + xfce_gtk_menu_append_seperator (GTK_MENU_SHELL (menu)); + } + + if (menu_sections & THUNAR_MENU_SECTION_SENDTO) + { + item_added = thunar_launcher_append_menu_item (menu->launcher, GTK_MENU_SHELL (menu), THUNAR_LAUNCHER_ACTION_SENDTO_MENU, FALSE) != NULL; + if (item_added) + xfce_gtk_menu_append_seperator (GTK_MENU_SHELL (menu)); + } + if (menu_sections & THUNAR_MENU_SECTION_CREATE_NEW_FILES) + { + item_added = FALSE; + item_added |= (thunar_launcher_append_menu_item (menu->launcher, GTK_MENU_SHELL (menu), THUNAR_LAUNCHER_ACTION_CREATE_FOLDER, is_window_menu) != NULL); + // TODO: Create Document + if (item_added) + xfce_gtk_menu_append_seperator (GTK_MENU_SHELL (menu)); + } + item_added = FALSE; + if (menu_sections & THUNAR_MENU_SECTION_CUT) + item_added |= (thunar_launcher_append_menu_item (menu->launcher, GTK_MENU_SHELL (menu), THUNAR_LAUNCHER_ACTION_CUT, is_window_menu) != NULL); + if (menu_sections & THUNAR_MENU_SECTION_COPY_PASTE) + { + item_added |= (thunar_launcher_append_menu_item (menu->launcher, GTK_MENU_SHELL (menu), THUNAR_LAUNCHER_ACTION_COPY, is_window_menu) != NULL); + item_added |= (thunar_launcher_append_menu_item (menu->launcher, GTK_MENU_SHELL (menu), THUNAR_LAUNCHER_ACTION_PASTE, is_window_menu) != NULL); + } + if (item_added) + xfce_gtk_menu_append_seperator (GTK_MENU_SHELL (menu)); + + if (menu_sections & THUNAR_MENU_SECTION_TRASH_DELETE) + { + item_added = FALSE; + item_added |= (thunar_launcher_append_menu_item (menu->launcher, GTK_MENU_SHELL (menu), THUNAR_LAUNCHER_ACTION_MOVE_TO_TRASH, is_window_menu) != NULL); + item_added |= (thunar_launcher_append_menu_item (menu->launcher, GTK_MENU_SHELL (menu), THUNAR_LAUNCHER_ACTION_DELETE, is_window_menu) != NULL); + if (item_added) + xfce_gtk_menu_append_seperator (GTK_MENU_SHELL (menu)); + } + if (menu_sections & THUNAR_MENU_SECTION_EMPTY_TRASH) + { + if (thunar_launcher_append_menu_item (menu->launcher, GTK_MENU_SHELL (menu), THUNAR_LAUNCHER_ACTION_EMPTY_TRASH, FALSE) != NULL ) + xfce_gtk_menu_append_seperator (GTK_MENU_SHELL (menu)); + } + if (menu_sections & THUNAR_MENU_SECTION_RESTORE) + { + if (thunar_launcher_append_menu_item (menu->launcher, GTK_MENU_SHELL (menu), THUNAR_LAUNCHER_ACTION_RESTORE, FALSE) != NULL) + xfce_gtk_menu_append_seperator (GTK_MENU_SHELL (menu)); + } + + item_added = FALSE; + if (menu_sections & THUNAR_MENU_SECTION_DUPLICATE) + item_added |= (thunar_launcher_append_menu_item (menu->launcher, GTK_MENU_SHELL (menu), THUNAR_LAUNCHER_ACTION_DUPLICATE, is_window_menu) != NULL); + if (menu_sections & THUNAR_MENU_SECTION_MAKELINK) + item_added |= (thunar_launcher_append_menu_item (menu->launcher, GTK_MENU_SHELL (menu), THUNAR_LAUNCHER_ACTION_MAKE_LINK, is_window_menu) != NULL); + if (menu_sections & THUNAR_MENU_SECTION_RENAME) + item_added |= (thunar_launcher_append_menu_item (menu->launcher, GTK_MENU_SHELL (menu), THUNAR_LAUNCHER_ACTION_RENAME, is_window_menu) != NULL); + if (item_added) + xfce_gtk_menu_append_seperator (GTK_MENU_SHELL (menu)); + + if (menu_sections & THUNAR_MENU_SECTION_CUSTOM_ACTIONS) + { + // TODO + } + + if (menu_sections & THUNAR_MENU_SECTION_ZOOM) + { + // TODO + } + + if (menu_sections & THUNAR_MENU_SECTION_PROPERTIES) + thunar_launcher_append_menu_item (menu->launcher, GTK_MENU_SHELL (menu), THUNAR_LAUNCHER_ACTION_PROPERTIES, FALSE); + + return TRUE; +} + + + +/** + * thunar_menu_get_launcher: + * @menu : a #ThunarMenu instance + * + * Return value: (transfer none): The launcher of this #ThunarMenu instance + **/ +GtkWidget* +thunar_menu_get_launcher (ThunarMenu *menu) +{ + _thunar_return_val_if_fail (THUNAR_IS_MENU (menu), NULL); + return GTK_WIDGET (menu->launcher); +} + + + +/** + * thunar_menu_hide_accel_labels: + * @menu : a #ThunarMenu instance + * + * Will hide the accel_labels of all menu items of this menu + **/ +void +thunar_menu_hide_accel_labels (ThunarMenu *menu) +{ + _thunar_return_if_fail (THUNAR_IS_MENU (menu)); + + for (GList* lp = gtk_container_get_children (GTK_CONTAINER (menu)); lp != NULL; lp = lp->next) + xfce_gtk_menu_item_set_accel_label (lp->data, NULL); +} |