2 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <Elementary.h>
18 #include <app_debug.h>
26 #define ACTION_MENU_TITLE_RESET "Reset"
28 enum input_handler_type {
29 INPUT_HANDLER_TYPE_BTN,
30 INPUT_HANDLER_TYPE_ITEM,
31 INPUT_HANDLER_TYPE_RESET,
32 INPUT_HANDLER_TYPE_DISCARD,
33 INPUT_HANDLER_TYPE_CANCEL
46 static void _focused(int id, void *data, Evas_Object *obj,
47 Elm_Object_Item *item)
49 elm_object_signal_emit(obj, SIG_FOCUS, SRC_PROG);
52 static void _unfocused(int id, void *data, Evas_Object *obj,
53 Elm_Object_Item *item)
55 elm_object_signal_emit(obj, SIG_UNFOCUS, SRC_PROG);
58 static void _key_down(int id, void *data, Evas *e, Evas_Object *obj,
59 Evas_Event_Key_Down *ev);
61 static void _mouse_down(int id, void *data, Evas *e, Evas_Object *obj,
62 Evas_Event_Mouse_Down *ev);
64 static void _mouse_move(int id, void *data, Evas *e, Evas_Object *obj,
65 Evas_Event_Mouse_Move *ev)
67 if (!elm_object_focus_get(obj))
68 elm_object_focus_set(obj, EINA_TRUE);
71 static input_handler handler = {
73 .unfocused = _unfocused,
74 .key_down = _key_down,
75 .mouse_down = _mouse_down,
76 .mouse_move = _mouse_move
79 static void _add_popup(struct _priv *priv, char *title, char *message,
80 char *first_btn_message, int first_btn_id,
81 char *second_btn_message, int second_btn_id)
83 Evas_Object *popup, *first_btn, *second_btn;
85 popup = utils_add_popup(priv->base, title, message);
87 _ERR("failed to add popup");
91 first_btn = utils_add_button(popup, first_btn_message,
94 _ERR("failed to add delete btn");
95 evas_object_del(popup);
98 inputmgr_add_callback(first_btn, first_btn_id, &handler, priv);
100 second_btn = utils_add_button(popup, second_btn_message,
101 PART_POPUP_BUTTON_2);
103 _ERR("failed to add cancel btn");
104 evas_object_del(popup);
107 inputmgr_add_callback(second_btn, second_btn_id, &handler, priv);
108 elm_object_focus_set(second_btn, EINA_TRUE);
113 static void _delete_popup(struct _priv *priv, Evas_Object *obj)
115 inputmgr_remove_callback(obj, &handler);
116 evas_object_del(priv->popup);
120 static void _select(int id, void *data, Evas_Object *obj)
127 case INPUT_HANDLER_TYPE_BTN:
129 _add_popup(priv, MESSAGE_DISCARD,
130 MESSAGE_DISCARD_CONTENTS,
132 INPUT_HANDLER_TYPE_DISCARD,
134 INPUT_HANDLER_TYPE_CANCEL);
137 viewmgr_update_view(VIEW_USER_EDIT, UPDATE_TYPE_RESET, NULL);
138 viewmgr_hide_view(VIEW_ACTION_MENU);
140 case INPUT_HANDLER_TYPE_ITEM:
141 _add_popup(priv, MESSAGE_RESET, MESSAGE_RESET_CONTENTS,
142 MESSAGE_RESET, INPUT_HANDLER_TYPE_RESET,
143 MESSAGE_CANCEL, INPUT_HANDLER_TYPE_CANCEL);
145 case INPUT_HANDLER_TYPE_RESET:
146 case INPUT_HANDLER_TYPE_DISCARD:
147 viewmgr_update_view(VIEW_USER_EDIT, UPDATE_TYPE_RESET, NULL);
148 viewmgr_hide_view(VIEW_ACTION_MENU);
149 _delete_popup(priv, obj);
151 case INPUT_HANDLER_TYPE_CANCEL:
152 _delete_popup(priv, obj);
159 static void _key_down(int id, void *data, Evas *e, Evas_Object *obj,
160 Evas_Event_Key_Down *ev)
165 _ERR("Invalid argument");
170 if (!strcmp(ev->keyname, KEY_BACK) ||
171 !strcmp(ev->keyname, KEY_BACK_REMOTE)) {
173 case INPUT_HANDLER_TYPE_BTN:
174 case INPUT_HANDLER_TYPE_ITEM:
175 viewmgr_hide_view(VIEW_ACTION_MENU);
177 case INPUT_HANDLER_TYPE_RESET:
178 case INPUT_HANDLER_TYPE_DISCARD:
179 case INPUT_HANDLER_TYPE_CANCEL:
181 _delete_popup(priv, obj);
186 } else if (!strcmp(ev->keyname, KEY_ENTER) ||
187 !strcmp(ev->keyname, KEY_ENTER_REMOTE)) {
188 _select(id, data, obj);
192 static void _mouse_down(int id, void *data, Evas *e, Evas_Object *obj,
193 Evas_Event_Mouse_Down *ev)
196 _ERR("Invalid argument");
200 _select(id, data, obj);
203 static Evas_Object *_add_item(Evas_Object *box, struct _priv *priv)
205 Evas_Object *item, *ic, *focus_ic, *lbl, *focus_lbl, *bg;
207 item = utils_add_layout(box, GRP_ACTION_MENU_TABLE_ITEM, true, NULL);
209 _ERR("failed to add item");
210 evas_object_del(box);
214 ic = utils_add_icon(item, IMAGE_ACTION_MENU_ICON_RESET,
215 PART_ACTION_MENU_TABLE_ITEM_ICON);
219 focus_ic = utils_add_icon(item, IMAGE_ACTION_MENU_ICON_RESET_FOCUS,
220 PART_ACTION_MENU_TABLE_ITEM_ICON_FOCUS);
224 lbl = utils_add_label(item, ACTION_MENU_TITLE_RESET,
225 STYLE_LABEL_ACTION_MENU_TITLE,
226 PART_ACTION_MENU_TABLE_ITEM_TEXT);
230 focus_lbl = utils_add_label(item, ACTION_MENU_TITLE_RESET,
231 STYLE_LABEL_ACTION_MENU_TITLE_FOCUS,
232 PART_ACTION_MENU_TABLE_ITEM_TEXT_FOCUS);
236 bg = utils_add_bg(item, COLOR_DEFAULT_R, COLOR_DEFAULT_G,
237 COLOR_DEFAULT_B, COLOR_DEFAULT_A,
238 PART_ACTION_MENU_TABLE_ITEM_BG);
242 evas_object_show(item);
243 inputmgr_add_callback(item, INPUT_HANDLER_TYPE_ITEM, &handler, priv);
247 evas_object_del(item);
251 static bool _add_menu(struct _priv *priv)
253 Evas_Object *btn, *box, *item;
255 btn = utils_add_layout(priv->base, GRP_ACTION_MENU_LIVETV, true,
256 PART_ACTION_MENU_LIVETV);
258 _ERR("failed to add btn");
261 inputmgr_add_callback(btn, INPUT_HANDLER_TYPE_BTN, &handler, priv);
264 box = utils_add_box(priv->base, true);
266 _ERR("failed to add box");
269 elm_object_part_content_set(priv->base, PART_ACTION_MENU_TABLE, box);
270 elm_box_align_set(box, 0.0, 0.5);
272 item = _add_item(box, priv);
274 _ERR("failed to add item");
275 evas_object_del(box);
279 elm_box_pack_start(box, item);
285 static Evas_Object *_create(Evas_Object *win, void *data)
290 priv = calloc(1, sizeof(*priv));
292 _ERR("failed to calloc priv");
296 base = utils_add_layout(win, GRP_ACTION_MENU, false, NULL);
298 _ERR("failed to create base");
302 evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND,
304 elm_win_resize_object_add(win, base);
309 if (!_add_menu(priv)) {
310 _ERR("failed to add menu");
312 evas_object_del(base);
316 viewmgr_set_view_data(VIEW_ACTION_MENU, priv);
321 static void _show(void *data)
326 _ERR("Invalid argument");
332 evas_object_show(priv->base);
335 elm_object_focus_set(priv->btn, EINA_TRUE);
338 static void _hide(void *data)
343 _ERR("Invalid argument");
349 evas_object_hide(priv->base);
350 priv->edited = false;
353 static void _destroy(void *data)
358 _ERR("Invalid argument");
364 inputmgr_remove_callback(priv->btn, &handler);
365 inputmgr_remove_callback(priv->item, &handler);
367 evas_object_del(priv->base);
371 static void _update(void *view_data, int update_type, void *data)
376 _ERR("Invalid argument");
382 switch (update_type) {
383 case UPDATE_TYPE_EDIT:
384 priv->edited = *(bool *)data;
387 _ERR("Invalid type");
392 static view_class vclass = {
393 .view_id = VIEW_ACTION_MENU,
401 view_class *view_action_menu_get_vclass(void)