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