2 * Copyright (c) 2014 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>
20 #include <InputHandler.h>
25 #define MAX_CONTROL_BTNS 7
29 class CControlHandler :
31 public IMouseMoveListener,
32 public IMouseClickedListener {
38 CControlHandler(control_data *dt) :
39 IMouseMoveListener(this),
40 IMouseClickedListener(this) {
43 virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj,
44 Evas_Event_Mouse_Move *ev);
45 virtual void OnMouseClicked(int id, Evas_Object *obj);
46 int GetEventTypes(void);
50 void (*func)(void *data, const char *ev);
57 Evas_Object *btn[MAX_CONTROL_BTNS];
60 CControlHandler *handler;
63 static void _event_callback(void *dt, Evas_Object *obj,
64 const char *emission, const char *source)
66 struct control_data *data;
71 data = (control_data *)dt;
73 data->cb.func(data->cb.data, source);
76 static void _set_focus_directions(Evas_Object **btn, int count)
81 for (i = 0; i < count; i++) {
87 elm_object_focus_next_object_set(btn[i], obj, ELM_FOCUS_RIGHT);
94 elm_object_focus_next_object_set(btn[i], obj, ELM_FOCUS_LEFT);
98 static inline Evas_Object *_add_button(Evas_Object *base, const char *style)
102 btn = elm_button_add(base);
106 elm_object_style_set(btn, style);
107 evas_object_show(btn);
112 static int _add_controls(struct control_data *data,
113 const char **btns, int count)
117 CControlHandler *handler;
119 handler = data->handler;
121 for (i = 0; i < count; i++) {
122 snprintf(buf, sizeof(buf), "video_btn_%s", btns[i]);
123 data->btn[i] = _add_button(data->base, buf);
125 for (j = 0; j < i; j++)
130 snprintf(buf, sizeof(buf), "part_btn%d", i);
131 elm_object_part_content_set(data->base,
134 /* FIXME: disable setting button temporary */
135 if (i == count - 1) {
136 elm_object_focus_allow_set(data->btn[i], EINA_FALSE);
140 handler->Connect(data->btn[i], -1, handler->GetEventTypes());
142 elm_object_signal_callback_add(data->btn[i],
143 SIG_BTN_ANI_FIN, btns[i],
144 _event_callback, data);
146 elm_object_focus_next_object_set(data->btn[i],
147 data->btn[i], ELM_FOCUS_DOWN);
155 Eina_Bool control_add_bar(struct control_data *data,
156 Evas_Object *base, const char **btns, int count)
160 if (!data || !base || !btns)
166 r = _add_controls(data, btns, count);
170 _set_focus_directions(data->btn, data->btns);
175 void control_handler_init(struct control_data *data,
176 void (*func)(void *, const char *), void *param)
181 data->cb.func = func;
182 data->cb.data = param;
185 void control_focus_set(struct control_data *data, int id, Eina_Bool foc)
190 elm_object_focus_set(data->btn[id], foc);
193 void control_signal_emit(struct control_data *data, int id,
194 const char *emission, const char *source)
199 elm_object_signal_emit(data->btn[id], emission, source);
202 void control_hide(struct control_data *data)
206 for (i = 0; i < data->btns; i++) {
207 evas_object_freeze_events_set(data->btn[i], EINA_TRUE);
208 elm_object_focus_allow_set(data->btn[i], EINA_FALSE);
212 void control_show(struct control_data *data)
216 for (i = 0; i < data->btns; i++) {
217 evas_object_freeze_events_set(data->btn[i], EINA_FALSE);
218 elm_object_focus_allow_set(data->btn[i], EINA_TRUE);
222 void control_fini(struct control_data *data)
227 delete data->handler;
231 struct control_data *control_init(void)
233 struct control_data *data;
235 data = (control_data *)calloc(1, sizeof(*data));
237 _ERR("allocation fail");
241 data->handler = new CControlHandler(data);
246 void CControlHandler::OnMouseMove(int id, Evas *e, Evas_Object *obj,
247 Evas_Event_Mouse_Move *ev)
252 if (!elm_object_focus_get(obj))
253 elm_object_focus_set(obj, EINA_TRUE);
256 void CControlHandler::OnMouseClicked(int id, Evas_Object *obj)
258 elm_object_signal_emit(obj, SIG_BTN_ANI_START, "");
261 int CControlHandler::GetEventTypes(void)
263 return TYPE_MOUSE_MOVE | TYPE_CLICKED;