1 /*
2 * popup-menu-item-button: A button pop-up menu item
3 *
4 * Copyright 2012-2020 Stephan Haller <nomad@froevel.de>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19 * MA 02110-1301, USA.
20 *
21 *
22 */
23
24 #ifdef HAVE_CONFIG_H
25 #include "config.h"
26 #endif
27
28 #include <libxfdashboard/popup-menu-item-button.h>
29
30 #include <glib/gi18n-lib.h>
31
32 #include <libxfdashboard/popup-menu-item.h>
33 #include <libxfdashboard/click-action.h>
34 #include <libxfdashboard/compat.h>
35
36
37 /* Define this class in GObject system */
38 static void _xfdashboard_popup_menu_item_button_popup_menu_item_iface_init(XfdashboardPopupMenuItemInterface *iface);
39
40 struct _XfdashboardPopupMenuItemButtonPrivate
41 {
42 /* Instance related */
43 ClutterAction *clickAction;
44 gboolean enabled;
45 };
46
G_DEFINE_TYPE_WITH_CODE(XfdashboardPopupMenuItemButton,xfdashboard_popup_menu_item_button,XFDASHBOARD_TYPE_LABEL,G_ADD_PRIVATE (XfdashboardPopupMenuItemButton)G_IMPLEMENT_INTERFACE (XFDASHBOARD_TYPE_POPUP_MENU_ITEM,_xfdashboard_popup_menu_item_button_popup_menu_item_iface_init))47 G_DEFINE_TYPE_WITH_CODE(XfdashboardPopupMenuItemButton,
48 xfdashboard_popup_menu_item_button,
49 XFDASHBOARD_TYPE_LABEL,
50 G_ADD_PRIVATE(XfdashboardPopupMenuItemButton)
51 G_IMPLEMENT_INTERFACE(XFDASHBOARD_TYPE_POPUP_MENU_ITEM, _xfdashboard_popup_menu_item_button_popup_menu_item_iface_init))
52
53 /* IMPLEMENTATION: Private variables and methods */
54
55 /* Pop-up menu item button was clicked so activate this item */
56 static void _xfdashboard_popup_menu_item_button_clicked(XfdashboardClickAction *inAction,
57 ClutterActor *self,
58 gpointer inUserData)
59 {
60 g_return_if_fail(XFDASHBOARD_IS_CLICK_ACTION(inAction));
61 g_return_if_fail(XFDASHBOARD_IS_POPUP_MENU_ITEM_BUTTON(self));
62
63 /* Only emit any of these signals if click was perform with left button
64 * or is a short touchscreen touch event.
65 */
66 if(xfdashboard_click_action_is_left_button_or_tap(inAction))
67 {
68 xfdashboard_popup_menu_item_activate(XFDASHBOARD_POPUP_MENU_ITEM(self));
69 }
70 }
71
72 /* IMPLEMENTATION: Interface XfdashboardPopupMenuItem */
73
74 /* Get enable state of this pop-up menu item */
_xfdashboard_popup_menu_item_button_popup_menu_item_get_enabled(XfdashboardPopupMenuItem * inMenuItem)75 static gboolean _xfdashboard_popup_menu_item_button_popup_menu_item_get_enabled(XfdashboardPopupMenuItem *inMenuItem)
76 {
77 XfdashboardPopupMenuItemButton *self;
78 XfdashboardPopupMenuItemButtonPrivate *priv;
79
80 g_return_val_if_fail(XFDASHBOARD_IS_POPUP_MENU_ITEM_BUTTON(inMenuItem), FALSE);
81
82 self=XFDASHBOARD_POPUP_MENU_ITEM_BUTTON(inMenuItem);
83 priv=self->priv;
84
85 /* Return enabled state */
86 return(priv->enabled);
87 }
88
89 /* Set enable state of this pop-up menu item */
_xfdashboard_popup_menu_item_button_popup_menu_item_set_enabled(XfdashboardPopupMenuItem * inMenuItem,gboolean inEnabled)90 static void _xfdashboard_popup_menu_item_button_popup_menu_item_set_enabled(XfdashboardPopupMenuItem *inMenuItem, gboolean inEnabled)
91 {
92 XfdashboardPopupMenuItemButton *self;
93 XfdashboardPopupMenuItemButtonPrivate *priv;
94
95 g_return_if_fail(XFDASHBOARD_IS_POPUP_MENU_ITEM_BUTTON(inMenuItem));
96
97 self=XFDASHBOARD_POPUP_MENU_ITEM_BUTTON(inMenuItem);
98 priv=self->priv;
99
100 /* Set enabled state */
101 priv->enabled=inEnabled;
102 }
103
104 /* Interface initialization
105 * Set up default functions
106 */
_xfdashboard_popup_menu_item_button_popup_menu_item_iface_init(XfdashboardPopupMenuItemInterface * iface)107 void _xfdashboard_popup_menu_item_button_popup_menu_item_iface_init(XfdashboardPopupMenuItemInterface *iface)
108 {
109 iface->get_enabled=_xfdashboard_popup_menu_item_button_popup_menu_item_get_enabled;
110 iface->set_enabled=_xfdashboard_popup_menu_item_button_popup_menu_item_set_enabled;
111 }
112
113 /* IMPLEMENTATION: GObject */
114
115 /* Class initialization
116 * Override functions in parent classes and define properties
117 * and signals
118 */
xfdashboard_popup_menu_item_button_class_init(XfdashboardPopupMenuItemButtonClass * klass)119 static void xfdashboard_popup_menu_item_button_class_init(XfdashboardPopupMenuItemButtonClass *klass)
120 {
121 }
122
123 /* Object initialization
124 * Create private structure and set up default values
125 */
xfdashboard_popup_menu_item_button_init(XfdashboardPopupMenuItemButton * self)126 static void xfdashboard_popup_menu_item_button_init(XfdashboardPopupMenuItemButton *self)
127 {
128 XfdashboardPopupMenuItemButtonPrivate *priv;
129
130 priv=self->priv=xfdashboard_popup_menu_item_button_get_instance_private(self);
131
132 /* Set up default values */
133 priv->enabled=TRUE;
134
135 /* This actor reacts on events */
136 clutter_actor_set_reactive(CLUTTER_ACTOR(self), TRUE);
137
138 /* Connect signals */
139 priv->clickAction=xfdashboard_click_action_new();
140 clutter_actor_add_action(CLUTTER_ACTOR(self), priv->clickAction);
141 g_signal_connect(priv->clickAction, "clicked", G_CALLBACK(_xfdashboard_popup_menu_item_button_clicked), NULL);
142 }
143
144 /* IMPLEMENTATION: Public API */
145
146 /* Create new actor */
xfdashboard_popup_menu_item_button_new(void)147 ClutterActor* xfdashboard_popup_menu_item_button_new(void)
148 {
149 return(g_object_new(XFDASHBOARD_TYPE_POPUP_MENU_ITEM_BUTTON,
150 "text", N_(""),
151 "label-style", XFDASHBOARD_LABEL_STYLE_TEXT,
152 NULL));
153 }
154
xfdashboard_popup_menu_item_button_new_with_text(const gchar * inText)155 ClutterActor* xfdashboard_popup_menu_item_button_new_with_text(const gchar *inText)
156 {
157 return(g_object_new(XFDASHBOARD_TYPE_POPUP_MENU_ITEM_BUTTON,
158 "text", inText,
159 "label-style", XFDASHBOARD_LABEL_STYLE_TEXT,
160 NULL));
161 }
162