583ca56b5be3bb98d332a87586f4fb93af45f3dc
[profile/tv/apps/native/videoplayer.git] / src / control.cpp
1 /*
2  * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 #include <Elementary.h>
18 #include <Eina.h>
19 #include <dbg.h>
20 #include <AppCommon.h>
21 #include <ViewMgr.h>
22 #include <BaseView.h>
23 #include <InputHandler.h>
24 #include "define.h"
25 #include "i18n.h"
26 #include "control.h"
27
28 #define MAX_CONTROL_BTNS 6
29
30 struct SControlData;
31
32 struct _event_cb {
33         void (*func)(void *data, const char *ev);
34         void *data;
35 };
36
37 struct SControlData {
38         Evas_Object *base;
39         Evas_Object *focused;
40         Evas_Object *btn[MAX_CONTROL_BTNS];
41         int btns;
42         struct _event_cb cb;
43 };
44
45 void CVideoController::sm_CbEvent(void *dt, Evas_Object *obj,
46                 const char *emission, const char *source)
47 {
48         struct SControlData *data;
49
50         if (!dt)
51                 return;
52
53         data = (SControlData *)dt;
54
55         data->cb.func(data->cb.data, source);
56 }
57
58 void CVideoController::m_SetFocusDirection(Evas_Object **btn, int count)
59 {
60         Evas_Object *obj;
61         int i;
62
63         for (i = 0; i < count; i++) {
64                 if (i == count - 1)
65                         obj = btn[0];
66                 else
67                         obj = btn[i + 1];
68
69                 elm_object_focus_next_object_set(btn[i], obj, ELM_FOCUS_RIGHT);
70
71                 if (i == 0)
72                         obj = btn[count - 1];
73                 else
74                         obj = btn[i - 1];
75
76                 elm_object_focus_next_object_set(btn[i], obj, ELM_FOCUS_LEFT);
77         }
78 }
79
80 Evas_Object *CVideoController::m_AddButton(const char *style)
81 {
82         ASSERT(m);
83
84         Evas_Object *btn;
85
86         btn = elm_button_add(m->base);
87         if (!btn)
88                 return NULL;
89
90         elm_object_style_set(btn, style);
91         evas_object_show(btn);
92
93         return btn;
94 }
95
96 int CVideoController::m_AddControls(const char **btns, int count)
97 {
98         ASSERT(m);
99
100         int i;
101         char buf[32];
102
103         for (i = 0; i < count; i++) {
104                 snprintf(buf, sizeof(buf), "video_btn_%s", btns[i]);
105                 m->btn[i] = m_AddButton(buf);
106                 if (!m->btn[i])
107                         return -1;
108
109                 snprintf(buf, sizeof(buf), "part_btn%d", i);
110                 elm_object_part_content_set(m->base,
111                                 buf, m->btn[i]);
112
113                 Connect(m->btn[i], -1, TYPE_MOUSE_MOVE | TYPE_CLICKED);
114
115                 elm_object_signal_callback_add(m->btn[i],
116                                 SIG_BTN_ANI_FIN, btns[i],
117                                 sm_CbEvent, m);
118
119                 elm_object_focus_next_object_set(m->btn[i],
120                                 m->btn[i], ELM_FOCUS_DOWN);
121
122                 m->btns++;
123         }
124
125         return 0;
126 }
127
128 bool CVideoController::Create(Evas_Object *base, const char **btns, int count)
129 {
130         ASSERT(!m);
131
132         int r;
133
134         if (!base || !btns)
135                 return false;
136
137         m = new SControlData;
138         if (!m) {
139                 _ERR("failed to add slider");
140                 return false;
141         }
142
143         m->base = base;
144         m->btns = 0;
145
146         r = m_AddControls(btns, count);
147         if (r < 0)
148                 return false;
149
150         m_SetFocusDirection(m->btn, m->btns);
151
152         return true;
153 }
154
155 void CVideoController::Destroy(void)
156 {
157         ASSERT(m);
158
159         delete m;
160         m = NULL;
161 }
162
163 void CVideoController::AddHandler(void (*func)(void *, const char *),
164                 void *param)
165 {
166         ASSERT(m);
167
168         if (!func)
169                 return;
170
171         m->cb.func = func;
172         m->cb.data = param;
173 }
174
175 void CVideoController::Focus(int id, Eina_Bool foc)
176 {
177         ASSERT(m);
178
179         elm_object_focus_set(m->btn[id], foc);
180 }
181
182 void CVideoController::Signal(int id, const char *emission, const char *source)
183 {
184         ASSERT(m);
185
186         elm_object_signal_emit(m->btn[id], emission, source);
187 }
188
189 void CVideoController::Hide(void)
190 {
191         ASSERT(m);
192
193         int i;
194
195         for (i = 0; i < m->btns; i++) {
196                 evas_object_freeze_events_set(m->btn[i], EINA_TRUE);
197                 elm_object_focus_allow_set(m->btn[i], EINA_FALSE);
198         }
199 }
200
201 void CVideoController::Show(void)
202 {
203         ASSERT(m);
204
205         int i;
206
207         for (i = 0; i < m->btns; i++) {
208                 evas_object_freeze_events_set(m->btn[i], EINA_FALSE);
209                 elm_object_focus_allow_set(m->btn[i], EINA_TRUE);
210         }
211 }
212
213 void CVideoController::OnMouseMove(int id, Evas *e, Evas_Object *obj,
214                         Evas_Event_Mouse_Move *ev)
215 {
216         if (!obj)
217                 return;
218
219         if (!elm_object_focus_get(obj))
220                 elm_object_focus_set(obj, EINA_TRUE);
221 }
222
223 void CVideoController::OnMouseClicked(int id, Evas_Object *obj)
224 {
225         elm_object_signal_emit(obj, SIG_BTN_ANI_START, "");
226 }