remove photo previewbar in photoviewer view
[profile/tv/apps/native/gallery.git] / src / view / photo-viewer / photoviewer_view.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 <AppCommon.h>
18 #include "util.h"
19 #include "menudef.h"
20 #include "timeout_handler.h"
21 #include "mediainfo.h"
22 #include "mediadata.h"
23 #include "viewdata.h"
24 #include "photoviewer_view.h"
25 #include "zoom_view.h"
26 #include "SettingCtxPopup.h"
27
28 #define MAX_PREVIEWBAR_IMG 7
29 #define PREVIEWBAR_CENTER_IDX 3
30 #define SLIDESHOW_BTN_IDX 2
31
32 #define BORDER_SIZE 5
33
34 #define IMAGE_PREVIEWBAR_BORDER IMAGEDIR"/zoom_navigator.png"
35
36 double slideshow_timeout[] = {
37         TIMEOUT_SLIDESHOW_NORMAL,
38         TIMEOUT_SLIDESHOW_SLOW,
39         TIMEOUT_SLIDESHOW_FAST
40 };
41
42 enum _slideshow_state {
43         STATE_PAUSE = 0,
44         STATE_PLAY
45 };
46
47 enum _slideshow_speed {
48         SETTING_SPEED_NORMAL = 0,
49         SETTING_SPEED_SLOW,
50         SETTING_SPEED_FAST
51 };
52
53 enum EObjectType {
54         PHOTOVIEWER_BTN = 0,
55         PHOTOVIEWER_CTXPOPUP
56 };
57
58 struct SPhotoViewerView {
59         Evas_Object *win;
60
61         Evas_Object *btn[MAX_PHOTO_ICONS];
62         Evas_Object *focusedbtn;
63
64         struct view_data *vd;
65
66         int totalcount;
67         int current_idx;
68
69         Evas_Object *photocam;
70         Evas_Object *loading;
71
72         Ecore_Timer *tooltip_timer;
73
74         CTimeoutHandler cTimeoutHandler;
75
76         Ecore_Timer *slideshow_timer;
77         int slideshow_state;
78         int slideshow_speed;
79
80         int zoom_level;
81
82         CContextPopup *pCtxPopup;
83
84         Ecore_Timer *focus_timer;
85
86         CViewMgr *pViewMgr;
87
88         SPhotoViewerView() {
89                 win = NULL;
90
91                 focusedbtn = NULL;
92                 vd = NULL;
93
94                 totalcount = 0;
95
96                 photocam = NULL;
97                 loading = NULL;
98                 tooltip_timer = NULL;
99
100                 slideshow_timer = NULL;
101                 slideshow_state = 0;
102                 slideshow_speed = 0;
103
104                 zoom_level = 0;
105
106                 pCtxPopup = NULL;
107
108                 focus_timer = NULL;
109         }
110
111         ~SPhotoViewerView() {}
112 };
113
114 void CPhotoViewerView::sm_CbPrevBtnClicked(void *dt, Evas_Object *obj,
115                 const char *emission, const char *source)
116 {
117         CPhotoViewerView* root = (CPhotoViewerView*)dt;
118
119         if (root)
120                 root->m_OnPrevBtnClicked(obj, emission, source);
121 }
122
123
124 void CPhotoViewerView::m_OnPrevBtnClicked(Evas_Object *obj,
125                 const char *emission, const char *source)
126 {
127         Eina_List *current_list, *prev_list;
128         CMediaInfo *minfo;
129
130         if (!m->vd)
131                 return;
132
133         current_list = eina_list_data_find_list(m->vd->media_list,
134                 m->vd->minfo);
135         if (!current_list)
136                 return;
137
138         /* if first photo, show last photo */
139         prev_list = eina_list_prev(current_list);
140         if (!prev_list)
141                 prev_list = eina_list_last(m->vd->media_list);
142
143         minfo = (CMediaInfo *)eina_list_data_get(prev_list);
144
145         if (!m_DrawContentArea(minfo))
146                 return;
147
148         if (!m_DrawTopArea(minfo))
149                 return;
150
151         m->vd->minfo = minfo;
152 }
153
154
155 void CPhotoViewerView::sm_CbNextBtnClicked(void *dt, Evas_Object *obj,
156                 const char *emission, const char *source)
157 {
158         CPhotoViewerView* root = (CPhotoViewerView*)dt;
159
160         if (root)
161                 root->m_OnNextBtnClicked(obj, emission, source);
162 }
163
164
165 void CPhotoViewerView::m_OnNextBtnClicked(Evas_Object *obj,
166                 const char *emission, const char *source)
167 {
168         Eina_List *current_list, *next_list;
169         CMediaInfo *minfo;
170
171         if (!m->vd)
172                 return;
173
174         current_list = eina_list_data_find_list(m->vd->media_list,
175                 m->vd->minfo);
176         if (!current_list)
177                 return;
178
179         /* if last photo, show first photo */
180         next_list = eina_list_next(current_list);
181         if (!next_list)
182                 next_list = m->vd->media_list;
183
184         minfo = (CMediaInfo *)eina_list_data_get(next_list);
185
186         if (!m_DrawContentArea(minfo))
187                 return;
188
189         if (!m_DrawTopArea(minfo))
190                 return;
191
192         m->vd->minfo = minfo;
193 }
194
195
196 void CPhotoViewerView::sm_CbSlideshowBtnClicked(void *dt, Evas_Object *obj,
197                 const char *emission, const char *source)
198 {
199         CPhotoViewerView* root = (CPhotoViewerView*)dt;
200
201         if (root)
202                 root->m_OnSlideshowBtnClicked(obj, emission, source);
203 }
204
205
206 void CPhotoViewerView::m_OnSlideshowBtnClicked(Evas_Object *obj,
207                 const char *emission, const char *source)
208 {
209         if (m->slideshow_state == STATE_PAUSE) {
210                 if (m->slideshow_timer)
211                         ecore_timer_reset(m->slideshow_timer);
212                 else {
213                         m->slideshow_timer = ecore_timer_add(
214                                 slideshow_timeout[m->slideshow_speed],
215                                 sm_CbTimerSlideshow, this);
216                 }
217                 m->slideshow_state = STATE_PLAY;
218         } else {
219
220                 if (m->slideshow_timer) {
221                         ecore_timer_del(m->slideshow_timer);
222                         m->slideshow_timer = NULL;
223                 }
224                 m->slideshow_state = STATE_PAUSE;
225         }
226 }
227
228
229 void CPhotoViewerView::sm_CbSettingBtnClicked(void *dt, Evas_Object *obj,
230                 const char *emission, const char *source)
231 {
232         CPhotoViewerView *root = (CPhotoViewerView*)dt;
233
234         if (root)
235                 root->m_OnSettingBtnClicked(obj, emission, source);
236 }
237
238
239 void CPhotoViewerView::m_OnSettingBtnClicked(Evas_Object *obj,
240                 const char *emission, const char *source)
241 {
242         if (m->pCtxPopup && m->pCtxPopup->FlagCreate())
243                 return;
244
245         elm_object_signal_emit(obj, "elm,action,highlight", "elm");
246
247         CSettingCtxPopup::SCallback cb;
248         cb.cookie = this;
249         cb.onSelected = sm_CbCtxPopupSelected;
250
251         CSettingCtxPopup *pCtxPopup = new CSettingCtxPopup;
252         m->pCtxPopup = pCtxPopup;
253         pCtxPopup->SetSlideshowSpeed(m->slideshow_speed);
254         pCtxPopup->Create(Base(), &cb);
255
256         m_OnTimerTooltip();
257 }
258
259
260 void CPhotoViewerView::sm_CbZoomBtnClicked(void *dt, Evas_Object *obj,
261                 const char *emission, const char *source)
262 {
263         CPhotoViewerView *root = (CPhotoViewerView*)dt;
264
265         if (root)
266                 root->m_OnZoomBtnClicked(obj, emission, source);
267 }
268
269
270 void CPhotoViewerView::m_OnZoomBtnClicked(Evas_Object *obj,
271                 const char *emission, const char *source)
272 {
273         if (m->tooltip_timer)
274                 m_OnTimerTooltip();
275
276         if (!CViewMgr::GetInstance()->PushView(VIEW_PHOTO_ZOOM, m->vd->minfo))
277                 _ERR("VIEW_PHOTO_ZOOM view create failed");
278 }
279
280
281 void CPhotoViewerView::sm_CbRotateBtnClicked(void *dt, Evas_Object *obj,
282                 const char *emission, const char *source)
283 {
284         CPhotoViewerView *root = (CPhotoViewerView*)dt;
285
286         if (root)
287                 root->m_OnRotateBtnClicked(obj, emission, source);
288 }
289
290
291 void CPhotoViewerView::m_OnRotateBtnClicked(Evas_Object *obj,
292                 const char *emission, const char *source)
293 {
294         Evas_Object *image;
295         Evas_Object *internalimage;
296         const char *file_path;
297         int w, h;
298         CMediaInfo *minfo;
299
300         if (!m->vd || !m->vd->minfo)
301                 return;
302
303         minfo = m->vd->minfo;
304
305         file_path = minfo->Path();
306         if (!file_path)
307                 return;
308
309         image = elm_image_add(Base());
310         if (!image)
311                 return;
312
313         elm_image_file_set(image, file_path, NULL);
314
315         elm_image_object_size_get(image, &w, &h);
316
317         /* return temporarily to prevent crash
318         texture size is 4096 */
319         if (w >= 4096 || h >= 4096) {
320                 _ERR("Rotation failed");
321                 return;
322         }
323
324         elm_image_orient_set(image, (Elm_Image_Orient)1);
325
326         internalimage = elm_image_object_get(image);
327         if (!internalimage)
328                 return;
329
330         evas_object_image_save(internalimage, file_path,
331                 NULL, "quality=100");
332
333         m_DrawContentArea(minfo);
334         m_DrawTopArea(minfo);
335
336         if (image)
337                 evas_object_del(image);
338 }
339
340 void CPhotoViewerView::sm_CbPhotocamLoaded(void *data, Evas_Object *obj, void *event_info)
341 {
342         CPhotoViewerView *root = (CPhotoViewerView *)data;
343
344         if (!root)
345                 return;
346
347         root->m_OnPhotocamLoaded(obj);
348 }
349
350 void CPhotoViewerView::sm_CbPhotocamLoadedDetail(void *data, Evas_Object *obj, void *event_info)
351 {
352         CPhotoViewerView *root = (CPhotoViewerView *)data;
353
354         if (!root)
355                 return;
356
357         root->m_OnPhotocamLoadedDetail(obj);
358 }
359
360 void CPhotoViewerView::m_OnPhotocamLoaded(Evas_Object *obj)
361 {
362         if (m->photocam != m->loading) {
363                 if (m->photocam) evas_object_del(m->photocam);
364                 m->photocam = obj;
365         }
366
367         elm_object_part_content_set(Base(), PART_CONTENTAREA, obj);
368
369 }
370
371 void CPhotoViewerView::m_OnPhotocamLoadedDetail(Evas_Object *obj)
372 {
373         m->loading = NULL;
374 }
375
376 Eina_Bool CPhotoViewerView::sm_CbTimerTooltip(void *cookie)
377 {
378         CPhotoViewerView *root = (CPhotoViewerView *)cookie;
379
380         Eina_Bool ret = ECORE_CALLBACK_CANCEL;
381
382         if (root)
383                 ret = root->m_OnTimerTooltip();
384
385         return ret;
386 }
387
388 Eina_Bool CPhotoViewerView::m_OnTimerTooltip(void)
389 {
390         ecore_timer_del(m->tooltip_timer);
391         m->tooltip_timer = NULL;
392
393         elm_object_tooltip_hide(m->focusedbtn);
394
395         return ECORE_CALLBACK_CANCEL;
396 }
397
398 void CPhotoViewerView::sm_CbCtxPopupSelected(void *cookie,
399                 CContextPopup *instance, const char *text)
400 {
401         CPhotoViewerView *root = (CPhotoViewerView *)cookie;
402         if (!root)
403                 return;
404
405         root->m_OnCtxPopupSelected(instance, text);
406 }
407
408 void CPhotoViewerView::m_OnCtxPopupSelected(CContextPopup *instance, const char *text)
409 {
410         int i;
411
412         for (i = 0; i < MAX_SPEED_BTNS; i++) {
413                 if (!strcmp(speed_text[i], text))
414                         break;
415         }
416
417         if (i == MAX_SPEED_BTNS || i == m->slideshow_speed)
418                 return;
419
420         m->slideshow_speed = i;
421
422         if (m->slideshow_timer) {
423                 ecore_timer_interval_set(m->slideshow_timer,
424                         slideshow_timeout[m->slideshow_speed]);
425                 ecore_timer_reset(m->slideshow_timer);
426         }
427 }
428
429 bool CPhotoViewerView::m_DrawContentArea(CMediaInfo *minfo)
430 {
431         const char *file_path;
432         int width, height;
433
434         if (!Base() || !minfo)
435                 return false;
436
437         file_path = minfo->Path();
438         if (!file_path)
439                 return false;
440
441         if (m->loading) {
442                 elm_photocam_file_set(m->loading, file_path);
443
444                 elm_photocam_image_size_get(m->loading, &width, &height);
445                 if (height > width)
446                         elm_photocam_zoom_mode_set(m->loading,
447                                         ELM_PHOTOCAM_ZOOM_MODE_AUTO_FIT);
448                 else
449                         elm_photocam_zoom_mode_set(m->loading,
450                                         ELM_PHOTOCAM_ZOOM_MODE_AUTO_FILL);
451         }
452         else {
453                 m->loading = elm_photocam_add(Base());
454                 if (!m->loading)
455                         return false;
456
457                 evas_object_smart_callback_add(m->loading, "loaded", sm_CbPhotocamLoaded, this);
458                 evas_object_smart_callback_add(m->loading, "loaded,detail", sm_CbPhotocamLoadedDetail, this);
459
460                 elm_photocam_file_set(m->loading, file_path);
461
462                 elm_photocam_image_size_get(m->loading, &width, &height);
463                 if (height > width)
464                         elm_photocam_zoom_mode_set(m->loading,
465                                         ELM_PHOTOCAM_ZOOM_MODE_AUTO_FIT);
466                 else
467                         elm_photocam_zoom_mode_set(m->loading,
468                                         ELM_PHOTOCAM_ZOOM_MODE_AUTO_FILL);
469
470                 elm_object_focus_allow_set(m->loading, EINA_FALSE);
471                 elm_scroller_policy_set(m->loading,
472                                 ELM_SCROLLER_POLICY_AUTO, ELM_SCROLLER_POLICY_AUTO);
473         }
474
475         return true;
476 }
477
478
479 bool CPhotoViewerView::m_DrawTopArea(CMediaInfo *minfo)
480 {
481         const char *display_name;
482         char buf[20];
483         time_t created_time;
484         int width, height;
485         int source;
486         struct tm tm;
487
488         if (!Base())
489                 return false;
490
491         display_name = minfo->Name();
492         if (!display_name)
493                 return false;
494
495         elm_object_part_text_set(Base(), PART_TITLETEXT, display_name);
496
497         created_time = minfo->CreatedTime();
498         if (created_time > 0) {
499                 localtime_r(&created_time, &tm);
500                 strftime(buf, sizeof(buf), "%Y.%m.%d", &tm);
501         } else
502                 snprintf(buf, sizeof(buf), "%s", _(TEXT_NODATE));
503
504         elm_object_part_text_set(Base(), PART_DATETEXT, buf);
505
506         elm_photocam_image_size_get(m->photocam, &width, &height);
507         snprintf(buf, sizeof(buf), "%d x %d", width, height);
508         elm_object_part_text_set(Base(), PART_RESOLUTIONTEXT, buf);
509
510         source = minfo->Source();
511         if (source == E_SOURCE_USB) {
512                 elm_object_part_text_set(Base(), PART_SOURCETEXT, _("USB"));
513         } else {
514                 elm_object_part_text_set(Base(), PART_SOURCETEXT, _("TV"));
515         }
516
517         snprintf(buf, sizeof(buf), "/%d", m->totalcount);
518         elm_object_part_text_set(Base(), PART_COUNTTEXT, buf);
519
520         m->current_idx = util_eina_list_get_index(m->vd->media_list, minfo);
521         snprintf(buf, sizeof(buf), "%d", m->current_idx + 1);
522         elm_object_part_text_set(Base(), PART_CURRENTTEXT, buf);
523
524         return true;
525 }
526
527
528 Eina_Bool CPhotoViewerView::sm_CbTimerSlideshow(void *dt)
529 {
530         sm_CbNextBtnClicked(dt, NULL, NULL, NULL);
531
532         return ECORE_CALLBACK_RENEW;
533 }
534
535 Evas_Object *CPhotoViewerView::m_AddTooltipBtn(Evas_Object *parent,
536                 const char *style_text, const char *tt_text)
537 {
538         Evas_Object *btn;
539         if (!parent)
540                 return NULL;
541
542         btn = elm_button_add(parent);
543         if (!btn)
544                 return NULL;
545
546         elm_object_style_set(btn, style_text);
547         elm_object_tooltip_text_set(btn, tt_text);
548         elm_object_tooltip_style_set(btn, STYLE_TOOLTIP);
549         elm_object_tooltip_orient_set(btn, ELM_TOOLTIP_ORIENT_TOP);
550
551         evas_object_show(btn);
552
553         return btn;
554 }
555
556 bool CPhotoViewerView::m_DrawBottomArea(void)
557 {
558         int i, j;
559         char buf[32];
560         Edje_Signal_Cb _edje_callback_function[] = {
561                 sm_CbPrevBtnClicked,
562                 sm_CbNextBtnClicked,
563                 sm_CbSlideshowBtnClicked,
564                 sm_CbSettingBtnClicked,
565                 sm_CbZoomBtnClicked,
566                 sm_CbRotateBtnClicked,
567         };
568         static const char * const _source_name[] = {
569                 "prev",
570                 "next",
571                 "slideshow",
572                 "setting",
573                 "zoom",
574                 "rotate"
575         };
576
577         if (!Base())
578                 return false;
579
580         for (i = 0; i < MAX_PHOTO_ICONS; i++) {
581                 m->btn[i] = m_AddTooltipBtn(Base(), photo_icon_style[i], _(tooltip_text[i]));
582                 if (!m->btn[i]) {
583                         for (j = 0; j < i; j++)
584                                 m->btn[j] = NULL;
585                         return false;
586                 }
587
588                 snprintf(buf, sizeof(buf), "part_btn%d", i);
589                 elm_object_part_content_set(Base(), buf, m->btn[i]);
590
591                 elm_object_signal_callback_add(m->btn[i], "btn,anim,finish",
592                                 _source_name[i], _edje_callback_function[i], this);
593
594                 Connect(m->btn[i], PHOTOVIEWER_BTN,
595                                 TYPE_KEY_DOWN | TYPE_CLICKED |
596                                 TYPE_MOUSE_MOVE | TYPE_FOCUSED);
597
598                 elm_object_focus_next_object_set(m->btn[i], m->btn[i], ELM_FOCUS_UP);
599                 elm_object_focus_next_object_set(m->btn[i], m->btn[i], ELM_FOCUS_DOWN);
600
601                 elm_object_focus_allow_set(m->btn[i], EINA_FALSE);
602         }
603
604         util_ui_set_focus_directions(m->btn,
605                         MAX_PHOTO_ICONS, EINA_TRUE);
606
607         m->slideshow_state = STATE_PAUSE;
608         m->slideshow_speed = SETTING_SPEED_NORMAL;
609
610         return true;
611 }
612
613 void CPhotoViewerView::sm_CbShowMenuViewFinish(void *dt, Evas_Object *obj,
614                 const char *emission, const char *source)
615 {
616         CPhotoViewerView *root = (CPhotoViewerView*)dt;
617
618         if (root)
619                 root->m_ShowMenuView();
620 }
621
622
623 void CPhotoViewerView::m_ShowMenuView(void)
624 {
625         int i;
626
627         for (i = 0; i < MAX_PHOTO_ICONS; i++) {
628                 evas_object_freeze_events_set(m->btn[i], EINA_FALSE);
629                 elm_object_focus_allow_set(m->btn[i], EINA_TRUE);
630         }
631 }
632
633 void CPhotoViewerView::m_HideMenuView(void)
634 {
635         int i;
636
637         for (i = 0; i < MAX_PHOTO_ICONS; i++) {
638                 evas_object_freeze_events_set(m->btn[i], EINA_TRUE);
639                 elm_object_focus_allow_set(m->btn[i], EINA_FALSE);
640         }
641 }
642
643 bool CPhotoViewerView::m_DrawItems(void)
644 {
645         if (!m->vd)
646                 return false;
647
648         if (!m_DrawContentArea(m->vd->minfo))
649                 return false;
650
651         if (!m_DrawTopArea(m->vd->minfo))
652                 return false;
653
654         if (!m_DrawBottomArea())
655                 return false;
656
657         if (!m->cTimeoutHandler.Create(TIMEOUT_PHOTOVIEWER, this))
658                 return false;
659
660         return true;
661 }
662
663
664 Eina_Bool CPhotoViewerView::sm_CbFocus(void *dt)
665 {
666         CPhotoViewerView *root = (CPhotoViewerView*)dt;
667
668         Eina_Bool ret = ECORE_CALLBACK_CANCEL;
669
670         if (root)
671                 ret = root->OnFocus();
672
673         return ret;
674 }
675
676 Eina_Bool CPhotoViewerView::OnFocus(void)
677 {
678         m_ShowMenuView();
679
680         /* set focus on Next button in photo viewer */
681         elm_object_focus_set(m->btn[1], EINA_TRUE);
682
683         return ECORE_CALLBACK_CANCEL;
684 }
685
686 bool CPhotoViewerView::Create(void *data, Evas_Object *eoBase)
687 {
688         ASSERT(!m);
689
690         Evas_Object *win;
691         Evas_Object *base;
692
693         win = CViewMgr::GetInstance()->Window();
694         ASSERT(win);
695
696         m = new SPhotoViewerView;
697         if (!m)
698                 return false;
699
700         base = elm_layout_add(win);
701         if (!base) {
702                 delete m;
703                 m = NULL;
704                 return false;
705         }
706
707         m->pViewMgr = CViewMgr::GetInstance();
708         if (!m->pViewMgr)
709                 goto error;
710
711         if (!elm_layout_file_set(base, EDJEFILE, GRP_PHOTO_VIEWER))
712                 goto error;
713
714         m->win = win;
715         m->vd = (struct view_data *)data;
716         m->totalcount = eina_list_count(m->vd->media_list);
717
718         CBaseView::Create(NULL, base);
719
720         if (!m_DrawItems())
721                 goto error;
722
723         elm_object_signal_callback_add(base, SIG_MENU_SHOW_FINISH, "",
724                                 sm_CbShowMenuViewFinish, this);
725
726         /* temp hot fix */
727         m->focus_timer = ecore_timer_add(0.25, sm_CbFocus, this);
728
729         return true;
730
731 error:
732         _ERR("error in creating layout");
733         evas_object_del(base);
734         delete m;
735         m = NULL;
736
737         return false;
738 }
739
740 void CPhotoViewerView::Destroy()
741 {
742         ASSERT(m);
743
744         int i;
745
746         for (i = 0; i < MAX_PHOTO_ICONS; i++)
747                 Disconnect(m->btn[i]);
748
749         evas_object_del(Base());
750
751         CBaseView::Destroy();
752
753         m->cTimeoutHandler.Destroy();
754
755         if (m->tooltip_timer)
756                 ecore_timer_del(m->tooltip_timer);
757
758         if (m->slideshow_timer)
759                 ecore_timer_del(m->slideshow_timer);
760
761         if (m->focus_timer)
762                 ecore_timer_del(m->focus_timer);
763
764         eina_list_free(m->vd->media_list);
765         free(m->vd);
766
767         delete m;
768         m = NULL;
769 }
770
771 void CPhotoViewerView::t_OnShow(void)
772 {
773         ASSERT(m);
774
775         evas_object_show(Base());
776
777         t_OnResume();
778 }
779
780 void CPhotoViewerView::t_OnHide(void)
781 {
782         ASSERT(m);
783
784         evas_object_hide(Base());
785
786         t_OnPause();
787 }
788
789
790 void CPhotoViewerView::t_OnUpdate(void *data)
791 {
792         ASSERT(m);
793
794         m->vd = (struct view_data *)data;
795         m->totalcount = eina_list_count(m->vd->media_list);
796
797         if (!m_DrawContentArea(m->vd->minfo))
798                 return;
799
800         if (!m_DrawTopArea(m->vd->minfo))
801                 return;
802 }
803
804 void CPhotoViewerView::t_OnPause(void)
805 {
806         ASSERT(m);
807
808         if (m->pCtxPopup && m->pCtxPopup->FlagCreate()) {
809                 m->pCtxPopup->Destroy();
810                 delete m->pCtxPopup;
811                 m->pCtxPopup = NULL;
812         }
813
814         if (m->tooltip_timer)
815                 ecore_timer_freeze(m->tooltip_timer);
816
817         elm_object_tooltip_hide(m->focusedbtn);
818
819         if (m->slideshow_timer)
820                 ecore_timer_freeze(m->slideshow_timer);
821
822         m->cTimeoutHandler.Pause();
823 }
824
825 void CPhotoViewerView::t_OnResume(void)
826 {
827         ASSERT(m);
828
829         if (m->tooltip_timer)
830                 ecore_timer_reset(m->tooltip_timer);
831         else {
832                 m->tooltip_timer = ecore_timer_add(TIMEOUT_TOOLTIP,
833                                         sm_CbTimerTooltip, this);
834         }
835
836         elm_object_tooltip_show(m->focusedbtn);
837
838         if (m->slideshow_timer)
839                 ecore_timer_thaw(m->slideshow_timer);
840
841         m->cTimeoutHandler.Resume();
842
843         elm_object_focus_set(m->focusedbtn, EINA_TRUE);
844 }
845
846
847 void CPhotoViewerView::OnTimeout(void)
848 {
849         if (m->tooltip_timer)
850                 m_OnTimerTooltip();
851
852         if (m->pCtxPopup && m->pCtxPopup->FlagCreate()) {
853                 m->pCtxPopup->Destroy();
854                 delete m->pCtxPopup;
855                 m->pCtxPopup = NULL;
856         }
857
858         elm_object_signal_emit(Base(), SIG_MENU_HIDE, "");
859
860         m_HideMenuView();
861 }
862
863
864 Eina_Bool CPhotoViewerView::OnEvent(int type, void *event_info)
865 {
866         Eina_Bool r;
867
868         if (!event_info)
869                 return EINA_FALSE;
870
871         r = EINA_FALSE;
872         if (type == ECORE_EVENT_KEY_UP) {
873                 Evas_Event_Key_Up *ev = (Evas_Event_Key_Up *)event_info;
874
875                 if (!strcmp(ev->keyname, KEY_LEFT))
876                         sm_CbPrevBtnClicked(this, NULL, NULL, NULL);
877                 else if (!strcmp(ev->keyname, KEY_RIGHT))
878                         sm_CbNextBtnClicked(this, NULL, NULL, NULL);
879                 else if (!strcmp(ev->keyname, KEY_UP)) {
880                         if (m->slideshow_state == STATE_PAUSE) {
881                                 elm_object_signal_emit(Base(), SIG_MENU_SHOW, "");
882                                 r = EINA_TRUE;
883                         }
884                 } else if (!strcmp(ev->keyname, KEY_ENTER) ||
885                         !strcmp(ev->keyname, KEY_ENTER_REMOTE)) {
886                         if (m->slideshow_state == STATE_PAUSE) {
887                                 elm_object_signal_emit(Base(), SIG_MENU_SHOW, "");
888                                 r = EINA_TRUE;
889                         }
890                 } else if (!strcmp(ev->keyname, KEY_BACK) ||
891                         !strcmp(ev->keyname, KEY_BACK_REMOTE)) {
892                         if (m->slideshow_state == STATE_PLAY)
893                                 OnMouseClicked(PHOTOVIEWER_BTN,
894                                                 m->btn[SLIDESHOW_BTN_IDX]);
895
896                         elm_object_signal_emit(Base(), SIG_MENU_SHOW, "");
897
898                         r = EINA_TRUE;
899                 } else if (!strcmp(ev->keyname, KEY_MENU) ||
900                         !strcmp(ev->keyname, KEY_MENU_REMOTE)) {
901                         m->pViewMgr->PushView(VIEW_CTXT_MENU, m->vd);
902                         t_OnPause();
903                 }
904         } else {
905                 if (m->slideshow_state == STATE_PLAY)
906                         OnMouseClicked(PHOTOVIEWER_BTN,
907                                                 m->btn[SLIDESHOW_BTN_IDX]);
908
909                 elm_object_signal_emit(Base(), SIG_MENU_SHOW, "");
910
911                 r = EINA_TRUE;
912         }
913
914         return r;
915 }
916
917 void CPhotoViewerView::OnSKeyDown(int id, Evas *e, Evas_Object *obj,
918                         Evas_Event_SKey_Down *ev)
919 {
920         switch (id) {
921         case PHOTOVIEWER_BTN:
922                 switch (ev->skey) {
923                 case SKEY_BACK:
924                         m->pViewMgr->PopView();
925                         if (CViewMgr::GetInstance()->CheckEmpty())
926                                 elm_exit();
927                         break;
928                 case SKEY_MENU:
929                         m->pViewMgr->PushView(VIEW_CTXT_MENU, m->vd);
930                         t_OnPause();
931                         break;
932                 case SKEY_DOWN:
933                         m->cTimeoutHandler.Timeout();
934                         break;
935                 default:
936                         break;
937                 }
938                 break;
939         default:
940                 break;
941         }
942 }
943
944 void CPhotoViewerView::OnMouseClicked(int id, Evas_Object *obj)
945 {
946         switch (id) {
947         case PHOTOVIEWER_BTN:
948                 elm_object_signal_emit(obj, "mouse,anim,start", "");
949                 break;
950         default:
951                 break;
952         }
953 }
954
955 void CPhotoViewerView::OnMouseMove(int id, Evas *e, Evas_Object *obj,
956                         Evas_Event_Mouse_Move *ev)
957 {
958         switch (id) {
959         case PHOTOVIEWER_BTN:
960                 if (!elm_object_focus_get(obj))
961                         elm_object_focus_set(obj, EINA_TRUE);
962                 break;
963         default:
964                 break;
965         }
966 }
967
968 void CPhotoViewerView::OnFocused(int id, Evas_Object *obj, Elm_Object_Item *item)
969 {
970         switch (id) {
971         case PHOTOVIEWER_BTN:
972                 if (m->focusedbtn != obj) {
973                         if (m->focusedbtn)
974                                 elm_object_tooltip_hide(m->focusedbtn);
975
976                         elm_object_tooltip_show(obj);
977
978                         m->focusedbtn = obj;
979                 }
980
981                 if (m->tooltip_timer)
982                         ecore_timer_reset(m->tooltip_timer);
983                 else {
984                         m->tooltip_timer = ecore_timer_add(TIMEOUT_TOOLTIP,
985                                                 sm_CbTimerTooltip, this);
986                 }
987
988                 break;
989         default:
990                 break;
991         }
992 }