add photo previewbar in photoviewer view 54/37254/2
authorJehun Lim <jehun.lim@samsung.com>
Mon, 23 Mar 2015 10:51:51 +0000 (19:51 +0900)
committerJehun Lim <jehun.lim@samsung.com>
Mon, 23 Mar 2015 12:32:21 +0000 (21:32 +0900)
Change-Id: I5449c6781ef78a50f43630dcfdf6056718b26620
Signed-off-by: Jehun Lim <jehun.lim@samsung.com>
include/common/define.h
include/view/photo-viewer/photoviewer_view.h
res/edc/views/photoviewer_view.edc
src/main.cpp
src/view/photo-viewer/photoviewer_view.cpp

index 3638913..61556f1 100644 (file)
 #define PART_DATETEXT "date.text"
 #define PART_COUNTTEXT "count.text"
 #define PART_CURRENTTEXT "current.text"
+#define PART_PREVIEWBAR "previewbar"
+#define PART_PREVIEWBAR_BORDER "previewbar.border"
+#define PART_PREVIEWBAR_IMG "previewbar.image"
+#define PART_PREVIEWBAR_SCR "previewbar.scroller"
 #define PART_LEFTSWALLOW "left_swallow"
 #define PART_HOVERSELAREA1 "hoversel_area1"
 #define PART_HOVERSELAREA2 "hoversel_area2"
@@ -87,6 +91,8 @@
 #define GRP_LAYOUT_EVENTS "layout_events"
 #define GRP_ZOOM_VIEW "zoom_view"
 #define GRP_ZOOM_NAVI "zoom_navi"
+#define GRP_PREVIEWBAR "previewbar"
+#define GRP_PREVIEWBAR_ITEM "previewbar_item"
 
 /* Signal definitions */
 #define SIG_SELECTED "selected"
 #define SIG_ACTIVATED "activated"
 #define SIG_REALIZED "realized"
 #define SIG_UNREALIZED "unrealized"
-#define SIG_HIDE "hide"
 #define SIG_SHOW "show"
-#define SIG_SHOW_FINISH "show,finish"
+#define SIG_HIDE "hide"
+#define SIG_MENU_SHOW "menu,show"
+#define SIG_MENU_SHOW_FINISH "menu,show,finish"
+#define SIG_MENU_HIDE "menu,hide"
+#define SIG_PREVIEWBAR_SHOW "previewbar,show"
+#define SIG_PREVIEWBAR_SHOW_FINISH "previewbar,show,finish"
+#define SIG_PREVIEWBAR_HIDE "previewbar,hide"
 #define SIG_UPARROW_SHOW "uparrow,show"
 #define SIG_UPARROW_HIDE "uparrow,hide"
 #define SIG_DOWNARROW_SHOW "downarrow,show"
 #define SIZE_BTN_LABEL_WIDTH 103
 #define SIZE_CONTENT_LABEL_WIDTH 550
 
+#define SIZE_PREVIEWBAR_ITEM_W 140
+
 #define CTXT_MENU_GENGRID_ITEM_SIZE_W (238+14)
 #define CTXT_MENU_GENGRID_ITEM_SIZE_H (293+14)
 
 #define RGB_GALLERY 147 170 0
 #define RGBA_BLACK_BG 0 0 0 (255*0.9)
 #define RGBA_COLOR_BG RGB_GALLERY (255*0.25)
+#define PREVIEWBAR_BOX_ALPHA 100
 
 /* others */
 #define TIMEOUT_TOOLTIP 3.0
+#define TIMEOUT_PREVIEWBAR 2.0
 #define TIMEOUT_ZOOMNAVI 0.25
 /* TODO: Need to set timers as per specs */
 #define TIMEOUT_PHOTOVIEWER 3.0
index 9b904a6..6b6cc68 100644 (file)
@@ -73,13 +73,18 @@ private:
        static void sm_CbSetSlideshowSpeed(void *cookie, int speed);
        static void sm_CbSetZoomLevel(void *cookie, int zoom_level);
 
-       static Eina_Bool sm_CbTimerTooltip(void *dt);
+       static Eina_Bool sm_CbTimerTooltip(void *cookie);
        Eina_Bool m_OnTimerTooltip(void);
 
+       static Eina_Bool sm_CbTimerPreviewBar(void *cookie);
+       Eina_Bool m_OnTimerPreviewBar(void);
+
        static Eina_Bool sm_CbFocus(void *dt);
        Eina_Bool OnFocus(void);
 
-       static void sm_CbShowViewFinish(void *dt, Evas_Object *obj,
+       static void sm_CbShowMenuViewFinish(void *dt, Evas_Object *obj,
+                       const char *emission, const char *source);
+       static void sm_CbShowPreviewBarFinish(void *dt, Evas_Object *obj,
                        const char *emission, const char *source);
 
        static Eina_Bool sm_CbTimerSlideshow(void *dt);
@@ -87,6 +92,12 @@ private:
 private:
        bool m_DrawContentArea(CMediaInfo *minfo);
        bool m_DrawTopArea(CMediaInfo *minfo);
+       bool m_DrawPreviewBar(void);
+       bool m_DrawPreviewBarItem(void);
+       bool m_DrawPreviewBarBorder(void);
+       bool m_UpdatePreviewBar(void);
+       Evas_Object *m_MovePreviewBar(int new_x,
+                       int unpack_item_idx, int new_item_idx);
        bool m_DrawBottomArea(void);
        bool m_DrawItems(void);
        void m_HandleZoomFunction(const char *btn_id);
index 8b9b9c6..4c12266 100644 (file)
@@ -317,6 +317,68 @@ group {
                                align: 1.0 0.0;
                        }
                }
+               part {
+                       name: "padding_previewbar";
+                       type: SPACER;
+                       scale: 1;
+                       description {
+                               state: "default" 0.0;
+                               min: 614 274;
+                               rel1.relative: 0.0 1.0;
+                               rel2.relative: 0.0 1.0;
+                               fixed: 1 1;
+                               align: 0.0 1.0;
+                       }
+                       description {
+                               state: "bottom" 0.0;
+                               inherit: "default" 0.0;
+                               min: 614 150;
+                       }
+                       description {
+                               state: "hide" 0.0;
+                               inherit: "default" 0.0;
+                               min: 614 0;
+                       }
+               }
+               part {
+                       name: PART_PREVIEWBAR;
+                       type: SWALLOW;
+                       scale: 1;
+                       description {
+                               state: "default" 0.0;
+                               min: 700 120;
+                               rel1 {
+                                       to: "padding_previewbar";
+                                       relative: 1.0 0.0;
+                               }
+                               rel2 {
+                                       to: "padding_previewbar";
+                                       relative: 1.0 0.0;
+                               }
+                               fixed: 1 1;
+                               align: 0.0 0.0;
+                       }
+               }
+               part {
+                       name: PART_PREVIEWBAR_BORDER;
+                       type: SWALLOW;
+                       scale: 1;
+                       description {
+                               state: "default" 0.0;
+                               min: 140 120;
+                               rel1 {
+                                       to: PART_PREVIEWBAR;
+                                       relative: 0.5 0.5;
+                               }
+                               rel2 {
+                                       to: PART_PREVIEWBAR;
+                                       relative: 0.5 0.5;
+                               }
+                               fixed: 1 1;
+                               align: 0.5 0.5;
+                       }
+               }
+
 /* bottom area drawing */
                part {
                        name: "bottomarea";
@@ -434,8 +496,8 @@ group {
 
        programs {
                program {
-                       name : "hide";
-                       signal: SIG_HIDE;
+                       name: "menu_hide";
+                       signal: SIG_MENU_HIDE;
                        source: "";
                        action: STATE_SET "hide" 0.0;
                        target: "toparea";
@@ -443,18 +505,121 @@ group {
                        transition: LINEAR 0.2;
                }
                program {
-                       name : "show";
-                       signal: SIG_SHOW;
+                       name: "previewbar_bottom";
+                       signal: SIG_MENU_HIDE;
+                       source: "";
+                       action: STATE_SET "bottom" 0.0;
+                       target: "padding_previewbar";
+                       transition: LINEAR 0.2;
+               }
+               program {
+                       name: "menu_show";
+                       signal: SIG_MENU_SHOW;
                        source: "";
                        action: STATE_SET "default" 0.0;
                        target: "toparea";
                        target: "bottomarea";
+                       target: "padding_previewbar";
+                       transition: LINEAR 0.2;
+                       after: "emit,menu_signal";
+               }
+               program {
+                       name: "emit,menu_signal";
+                       action: SIGNAL_EMIT SIG_MENU_SHOW_FINISH "";
+               }
+               program {
+                       name: "previewbar_hide";
+                       signal: SIG_PREVIEWBAR_HIDE;
+                       source: "";
+                       action: STATE_SET "hide" 0.0;
+                       target: "padding_previewbar";
                        transition: LINEAR 0.2;
-                       after: "emit,signal";
                }
                program {
-                       name: "emit,signal";
-                       action: SIGNAL_EMIT SIG_SHOW_FINISH "";
+                       name: "previewbar_show";
+                       signal: SIG_PREVIEWBAR_SHOW;
+                       source: "";
+                       action: STATE_SET "bottom" 0.0;
+                       target: "padding_previewbar";
+                       transition: LINEAR 0.2;
+                       after: "emit,previewbar_signal";
+               }
+               program {
+                       name: "emit,previewbar_signal";
+                       action: SIGNAL_EMIT SIG_PREVIEWBAR_SHOW_FINISH "";
+               }
+       }
+}
+
+group {
+       name: GRP_PREVIEWBAR;
+       parts {
+               part {
+                       name: "area";
+                       type: RECT;
+                       scale: 1;
+                       description {
+                               state: "default" 0.0;
+                               min: 700 120;
+                               visible, 0;
+                       }
+               }
+               part {
+                       name: PART_PREVIEWBAR_SCR;
+                       type: SWALLOW;
+                       scale: 1;
+                       description {
+                               state: "default" 0.0;
+                               rel1.relative: 0.5 0.0;
+                               rel2.relative: 0.5 0.0;
+                               min: 700 120;
+                               fixed: 1 1;
+                               align: 0.5 0.0;
+                       }
+               }
+       }
+}
+
+group {
+       name: GRP_PREVIEWBAR_ITEM;
+       parts {
+               part {
+                       name: "area";
+                       type: RECT;
+                       scale: 1;
+                       description {
+                               state: "default" 0.0;
+                               min: 140 120;
+                               visible, 0;
+                       }
+               }
+               part {
+                       name: "img_bg";
+                       type: RECT;
+                       scale: 1;
+                       description {
+                               state, "default" 0.0;
+                               rel1.relative: 0.5 0.0;
+                               rel2.relative: 0.5 0.0;
+                               min: 140 120;
+                               fixed: 1 1;
+                               align: 0.5 0.0;
+                               color: 0 0 0 255;
+                       }
+               }
+               part {
+                       name: PART_PREVIEWBAR_IMG;
+                       type: SWALLOW;
+                       scale: 1;
+                       description {
+                               state: "default" 0.0;
+                               rel1.relative: 0.5 0.0;
+                               rel2.relative: 0.5 0.0;
+                               min: 140 120;
+                               fixed: 1 1;
+                               align: 0.5 0.0;
+                               color: 255 255 255 30;
+                       }
                }
        }
 }
index 2980490..513bc5a 100644 (file)
@@ -74,7 +74,6 @@ struct SGalleryApp {
        int media_type;
        char *id;
 
-       
        CGalleryView     *pGalleryView;
        CPhotoViewerView *pPhotoViewerView;
        CPhotoZoomView   *pPhotoZoomView;
index 47bba8a..31856bb 100644 (file)
 #include "SettingCtxPopup.h"
 #include "ZoomCtxPopup.h"
 
+#define MAX_PREVIEWBAR_IMG 7
+#define PREVIEWBAR_CENTER_IDX 3
 #define SLIDESHOW_BTN_IDX 2
 
+#define BORDER_SIZE 5
+
+#define IMAGE_PREVIEWBAR_BORDER IMAGEDIR"/zoom_navigator.png"
 
 double slideshow_timeout[] = {
        TIMEOUT_SLIDESHOW_NORMAL,
@@ -55,6 +60,11 @@ enum _slideshow_speed {
        SETTING_SPEED_FAST
 };
 
+enum PreviewBarDir {
+       PREVIEWBAR_TO_NEXT = 0,
+       PREVIEWBAR_TO_PREV
+};
+
 enum EObjectType {
        PHOTOVIEWER_BTN = 0,
        PHOTOVIEWER_CTXPOPUP
@@ -70,11 +80,19 @@ struct SPhotoViewerView {
        struct view_data *vd;
 
        int totalcount;
+       int current_idx;
 
        Evas_Object *photocam;
+
+       Evas_Object *pvbar_box;
+       Evas_Object *pvbar_scr;
+       int pvbar_dir;
+
        Ecore_Timer *tooltip_timer;
+       Ecore_Timer *pvbar_timer;
 
        CTimeoutHandler cTimeoutHandler;
+       bool menu_show;
 
        Ecore_Timer *slideshow_timer;
        int slideshow_state;
@@ -114,7 +132,8 @@ struct SPhotoViewerView {
        ~SPhotoViewerView() {}
 };
 
-void CPhotoViewerView::sm_CbPrevBtnClicked(void *dt, Evas_Object *obj, const char *emission, const char *source)
+void CPhotoViewerView::sm_CbPrevBtnClicked(void *dt, Evas_Object *obj,
+               const char *emission, const char *source)
 {
        CPhotoViewerView* root = (CPhotoViewerView*)dt;
 
@@ -123,7 +142,8 @@ void CPhotoViewerView::sm_CbPrevBtnClicked(void *dt, Evas_Object *obj, const cha
 }
 
 
-void CPhotoViewerView::m_OnPrevBtnClicked(Evas_Object *obj, const char *emission, const char *source)
+void CPhotoViewerView::m_OnPrevBtnClicked(Evas_Object *obj,
+               const char *emission, const char *source)
 {
        Eina_List *current_list, *prev_list;
        CMediaInfo *minfo;
@@ -149,11 +169,25 @@ void CPhotoViewerView::m_OnPrevBtnClicked(Evas_Object *obj, const char *emission
        if (!m_DrawTopArea(minfo))
                return;
 
+       m->pvbar_dir = PREVIEWBAR_TO_PREV;
+       if (!m->menu_show) {
+               if (m->pvbar_timer) {
+                       ecore_timer_reset(m->pvbar_timer);
+                       m_UpdatePreviewBar();
+               } else {
+                       m->pvbar_timer = ecore_timer_add(TIMEOUT_PREVIEWBAR,
+                                               sm_CbTimerPreviewBar, this);
+                       elm_object_signal_emit(m->base, SIG_PREVIEWBAR_SHOW, "");
+               }
+       } else
+               m_UpdatePreviewBar();
+
        m->vd->minfo = minfo;
 }
 
 
-void CPhotoViewerView::sm_CbNextBtnClicked(void *dt, Evas_Object *obj, const char *emission, const char *source)
+void CPhotoViewerView::sm_CbNextBtnClicked(void *dt, Evas_Object *obj,
+               const char *emission, const char *source)
 {
        CPhotoViewerView* root = (CPhotoViewerView*)dt;
 
@@ -162,7 +196,8 @@ void CPhotoViewerView::sm_CbNextBtnClicked(void *dt, Evas_Object *obj, const cha
 }
 
 
-void CPhotoViewerView::m_OnNextBtnClicked(Evas_Object *obj, const char *emission, const char *source)
+void CPhotoViewerView::m_OnNextBtnClicked(Evas_Object *obj,
+               const char *emission, const char *source)
 {
        Eina_List *current_list, *next_list;
        CMediaInfo *minfo;
@@ -188,12 +223,25 @@ void CPhotoViewerView::m_OnNextBtnClicked(Evas_Object *obj, const char *emission
        if (!m_DrawTopArea(minfo))
                return;
 
+       m->pvbar_dir = PREVIEWBAR_TO_NEXT;
+       if (!m->menu_show) {
+               if (m->pvbar_timer) {
+                       ecore_timer_reset(m->pvbar_timer);
+                       m_UpdatePreviewBar();
+               } else {
+                       m->pvbar_timer = ecore_timer_add(TIMEOUT_PREVIEWBAR,
+                                               sm_CbTimerPreviewBar, this);
+                       elm_object_signal_emit(m->base, SIG_PREVIEWBAR_SHOW, "");
+               }
+       } else
+               m_UpdatePreviewBar();
+
        m->vd->minfo = minfo;
 }
 
 
-
-void CPhotoViewerView::sm_CbSlideshowBtnClicked(void *dt, Evas_Object *obj, const char *emission, const char *source)
+void CPhotoViewerView::sm_CbSlideshowBtnClicked(void *dt, Evas_Object *obj,
+               const char *emission, const char *source)
 {
        CPhotoViewerView* root = (CPhotoViewerView*)dt;
 
@@ -202,13 +250,16 @@ void CPhotoViewerView::sm_CbSlideshowBtnClicked(void *dt, Evas_Object *obj, cons
 }
 
 
-void CPhotoViewerView::m_OnSlideshowBtnClicked(Evas_Object *obj, const char *emission, const char *source)
+void CPhotoViewerView::m_OnSlideshowBtnClicked(Evas_Object *obj,
+               const char *emission, const char *source)
 {
        if (m->slideshow_state == STATE_PAUSE) {
                if (m->slideshow_timer)
                        ecore_timer_reset(m->slideshow_timer);
                else {
-                       m->slideshow_timer = ecore_timer_add(slideshow_timeout[m->slideshow_speed], sm_CbTimerSlideshow, this);
+                       m->slideshow_timer = ecore_timer_add(
+                               slideshow_timeout[m->slideshow_speed],
+                               sm_CbTimerSlideshow, this);
                }
                m->slideshow_state = STATE_PLAY;
        } else {
@@ -222,7 +273,8 @@ void CPhotoViewerView::m_OnSlideshowBtnClicked(Evas_Object *obj, const char *emi
 }
 
 
-void CPhotoViewerView::sm_CbSettingBtnClicked(void *dt, Evas_Object *obj, const char *emission, const char *source)
+void CPhotoViewerView::sm_CbSettingBtnClicked(void *dt, Evas_Object *obj,
+               const char *emission, const char *source)
 {
        CPhotoViewerView *root = (CPhotoViewerView*)dt;
 
@@ -231,7 +283,8 @@ void CPhotoViewerView::sm_CbSettingBtnClicked(void *dt, Evas_Object *obj, const
 }
 
 
-void CPhotoViewerView::m_OnSettingBtnClicked(Evas_Object *obj, const char *emission, const char *source)
+void CPhotoViewerView::m_OnSettingBtnClicked(Evas_Object *obj,
+               const char *emission, const char *source)
 {
        if (m->pCtxPopup && m->pCtxPopup->FlagCreate())
                return;
@@ -253,7 +306,8 @@ void CPhotoViewerView::m_OnSettingBtnClicked(Evas_Object *obj, const char *emiss
 }
 
 
-void CPhotoViewerView::sm_CbZoomBtnClicked(void *dt, Evas_Object *obj, const char *emission, const char *source)
+void CPhotoViewerView::sm_CbZoomBtnClicked(void *dt, Evas_Object *obj,
+               const char *emission, const char *source)
 {
        CPhotoViewerView *root = (CPhotoViewerView*)dt;
 
@@ -262,7 +316,8 @@ void CPhotoViewerView::sm_CbZoomBtnClicked(void *dt, Evas_Object *obj, const cha
 }
 
 
-void CPhotoViewerView::m_OnZoomBtnClicked(Evas_Object *obj, const char *emission, const char *source)
+void CPhotoViewerView::m_OnZoomBtnClicked(Evas_Object *obj,
+               const char *emission, const char *source)
 {
        if (m->pCtxPopup && m->pCtxPopup->FlagCreate())
                return;
@@ -283,7 +338,8 @@ void CPhotoViewerView::m_OnZoomBtnClicked(Evas_Object *obj, const char *emission
 }
 
 
-void CPhotoViewerView::sm_CbRotateBtnClicked(void *dt, Evas_Object *obj, const char *emission, const char *source)
+void CPhotoViewerView::sm_CbRotateBtnClicked(void *dt, Evas_Object *obj,
+               const char *emission, const char *source)
 {
        CPhotoViewerView *root = (CPhotoViewerView*)dt;
 
@@ -292,7 +348,8 @@ void CPhotoViewerView::sm_CbRotateBtnClicked(void *dt, Evas_Object *obj, const c
 }
 
 
-void CPhotoViewerView::m_OnRotateBtnClicked(Evas_Object *obj, const char *emission, const char *source)
+void CPhotoViewerView::m_OnRotateBtnClicked(Evas_Object *obj,
+               const char *emission, const char *source)
 {
        Evas_Object *image;
        Evas_Object *internalimage;
@@ -340,24 +397,48 @@ void CPhotoViewerView::m_OnRotateBtnClicked(Evas_Object *obj, const char *emissi
                evas_object_del(image);
 }
 
-Eina_Bool CPhotoViewerView::sm_CbTimerTooltip(void *dt) {
-       CPhotoViewerView *m = (CPhotoViewerView *)dt;
+Eina_Bool CPhotoViewerView::sm_CbTimerTooltip(void *cookie)
+{
+       CPhotoViewerView *root = (CPhotoViewerView *)cookie;
 
        Eina_Bool ret = ECORE_CALLBACK_CANCEL;
 
-       ret = m->m_OnTimerTooltip();
+       if (root)
+               ret = root->m_OnTimerTooltip();
 
        return ret;
 }
 
-Eina_Bool CPhotoViewerView::m_OnTimerTooltip(void)  {
+Eina_Bool CPhotoViewerView::m_OnTimerTooltip(void)
+{
        m->tooltip_timer = NULL;
        elm_object_tooltip_hide(m->focusedbtn);
 
        return ECORE_CALLBACK_CANCEL;
 }
 
-void CPhotoViewerView::sm_CbZoomCtxPopupSelected(void *cookie, CCtxPopup *instance, const char *text)
+Eina_Bool CPhotoViewerView::sm_CbTimerPreviewBar(void *cookie)
+{
+       CPhotoViewerView *root = (CPhotoViewerView *)cookie;
+
+       Eina_Bool ret = ECORE_CALLBACK_CANCEL;
+
+       if (root)
+               ret = root->m_OnTimerPreviewBar();
+
+       return ret;
+}
+
+Eina_Bool CPhotoViewerView::m_OnTimerPreviewBar(void)
+{
+       m->pvbar_timer = NULL;
+       elm_object_signal_emit(m->base, SIG_PREVIEWBAR_HIDE, "");
+
+       return ECORE_CALLBACK_CANCEL;
+}
+
+void CPhotoViewerView::sm_CbZoomCtxPopupSelected(void *cookie,
+               CCtxPopup *instance, const char *text)
 {
        struct zoom_data *zd;
 
@@ -388,7 +469,8 @@ void CPhotoViewerView::sm_CbZoomCtxPopupSelected(void *cookie, CCtxPopup *instan
        }
 }
 
-void CPhotoViewerView::sm_CbSettingCtxPopupSelected(void *cookie, CCtxPopup *instance, const char *text)
+void CPhotoViewerView::sm_CbSettingCtxPopupSelected(void *cookie,
+               CCtxPopup *instance, const char *text)
 {
        SPhotoViewerView *m = (SPhotoViewerView *)cookie;
        if (!m)
@@ -478,7 +560,8 @@ bool CPhotoViewerView::m_DrawTopArea(CMediaInfo *minfo)
        snprintf(buf, sizeof(buf), "/%d", m->totalcount);
        elm_object_part_text_set(m->base, PART_COUNTTEXT, buf);
 
-       snprintf(buf, sizeof(buf), "%d", util_eina_list_get_index( m->vd->media_list, minfo) + 1);
+       m->current_idx = util_eina_list_get_index(m->vd->media_list, minfo);
+       snprintf(buf, sizeof(buf), "%d", m->current_idx + 1);
        elm_object_part_text_set(m->base, PART_CURRENTTEXT, buf);
 
        return true;
@@ -494,7 +577,8 @@ Eina_Bool CPhotoViewerView::sm_CbTimerSlideshow(void *dt)
 
 
 
-Evas_Object *CPhotoViewerView::m_AddTooltipBtn(Evas_Object *parent, const char *style_text, const char *tt_text)
+Evas_Object *CPhotoViewerView::m_AddTooltipBtn(Evas_Object *parent,
+               const char *style_text, const char *tt_text)
 {
        Evas_Object *btn;
        if (!parent)
@@ -514,6 +598,205 @@ Evas_Object *CPhotoViewerView::m_AddTooltipBtn(Evas_Object *parent, const char *
        return btn;
 }
 
+bool CPhotoViewerView::m_DrawPreviewBar(void)
+{
+       Evas_Object *ly, *scr, *box;
+       int x, y, w, h;
+
+       ly = elm_layout_add(m->base);
+       if (!ly)
+               return false;
+
+       elm_layout_file_set(ly, EDJEFILE, GRP_PREVIEWBAR);
+
+       scr = elm_scroller_add(ly);
+       if (!scr)
+               return false;
+
+       elm_scroller_policy_set(scr, ELM_SCROLLER_POLICY_OFF,
+                       ELM_SCROLLER_POLICY_OFF);
+
+       box = elm_box_add(scr);
+       if (!box)
+               return false;
+
+       evas_object_size_hint_weight_set(box,
+                       EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+       elm_box_horizontal_set(box, EINA_TRUE);
+       evas_object_color_set(box, 255, 255, 255, PREVIEWBAR_BOX_ALPHA);
+
+       elm_object_part_content_set(ly, PART_PREVIEWBAR_SCR, scr);
+       elm_object_content_set(scr, box);
+
+       elm_object_part_content_set(m->base, PART_PREVIEWBAR, ly);
+
+       m->pvbar_scr = scr;
+       m->pvbar_box = box;
+
+       if (!m_DrawPreviewBarItem()) {
+               evas_object_del(ly);
+               return false;
+       }
+
+       if (!m_DrawPreviewBarBorder()) {
+               evas_object_del(ly);
+               return false;
+       }
+
+       elm_scroller_region_get(scr, &x, &y, &w, &h);
+       elm_scroller_region_show(scr, x + SIZE_PREVIEWBAR_ITEM_W, y, w, h);
+
+       return true;
+}
+
+bool CPhotoViewerView::m_DrawPreviewBarItem(void)
+{
+       Evas_Object *ly, *img;
+       CMediaInfo *minfo;
+       int i, img_idx;
+
+       img_idx = m->current_idx - PREVIEWBAR_CENTER_IDX;
+       if (img_idx < 0)
+               img_idx += m->totalcount;
+
+       for (i = 0; i < MAX_PREVIEWBAR_IMG; i++) {
+               ly = elm_layout_add(m->pvbar_box);
+               if (!ly)
+                       return false;
+
+               elm_layout_file_set(ly, EDJEFILE, GRP_PREVIEWBAR_ITEM);
+
+               img = elm_image_add(ly);
+               if (!img)
+                       return false;
+
+               elm_object_part_content_set(ly, PART_PREVIEWBAR_IMG, img);
+
+               if (img_idx + i > m->totalcount - 1)
+                       img_idx -= m->totalcount;
+
+               minfo = (CMediaInfo *)eina_list_nth(m->vd->media_list,
+                                       img_idx + i);
+               if (!minfo) {
+                       _ERR("Get mediainfo failed");
+                       return false;
+               }
+
+               elm_image_file_set(img, minfo->ThumbnailPath(), NULL);
+               elm_image_aspect_fixed_set(img, EINA_FALSE);
+
+               evas_object_size_hint_align_set(ly, 0.0, 0.5);
+               elm_box_pack_end(m->pvbar_box, ly);
+
+               evas_object_show(ly);
+       }
+
+       evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+       return true;
+}
+
+bool CPhotoViewerView::m_DrawPreviewBarBorder(void)
+{
+       Evas *evas;
+       Evas_Object *img;
+
+       evas = evas_object_evas_get(m->base);
+       if (!evas)
+               return false;
+
+       img = evas_object_image_add(evas);
+       if (!img)
+               return false;
+
+       evas_object_image_file_set(img, IMAGE_PREVIEWBAR_BORDER, NULL);
+       evas_object_image_filled_set(img, EINA_TRUE);
+       evas_object_image_border_set(img, BORDER_SIZE, BORDER_SIZE,
+                                       BORDER_SIZE, BORDER_SIZE);
+       evas_object_image_border_center_fill_set(img, EVAS_BORDER_FILL_NONE);
+
+       evas_object_color_set(img, 255, 255, 255, 100);
+
+       elm_object_part_content_set(m->base, PART_PREVIEWBAR_BORDER, img);
+
+       return true;
+}
+
+bool CPhotoViewerView::m_UpdatePreviewBar(void)
+{
+       Evas_Object *ly;
+       int new_item_idx;
+       int x, y, w, h;
+
+       elm_scroller_region_get(m->pvbar_scr, &x, &y, &w, &h);
+
+       if (m->pvbar_dir == PREVIEWBAR_TO_PREV) {
+               new_item_idx = m->current_idx - PREVIEWBAR_CENTER_IDX;
+               if (new_item_idx < 0)
+                       new_item_idx += m->totalcount;
+
+               ly = m_MovePreviewBar(x + SIZE_PREVIEWBAR_ITEM_W,
+                               MAX_PREVIEWBAR_IMG - 1, new_item_idx);
+               if (!ly)
+                       return false;
+
+               elm_box_pack_start(m->pvbar_box, ly);
+               evas_object_show(ly);
+       } else if (m->pvbar_dir == PREVIEWBAR_TO_NEXT) {
+               new_item_idx = m->current_idx + PREVIEWBAR_CENTER_IDX;
+               if (new_item_idx > m->totalcount - 1)
+                       new_item_idx -= m->totalcount;
+
+               ly = m_MovePreviewBar(x - SIZE_PREVIEWBAR_ITEM_W,
+                               0, new_item_idx);
+               if (!ly)
+                       return false;
+
+               elm_box_pack_end(m->pvbar_box, ly);
+               evas_object_show(ly);
+       }
+
+       elm_scroller_region_bring_in(m->pvbar_scr,
+                               SIZE_PREVIEWBAR_ITEM_W, y, w, h);
+
+       return true;
+}
+
+Evas_Object *CPhotoViewerView::m_MovePreviewBar(int new_x,
+               int unpack_item_idx, int new_item_idx)
+{
+       Eina_List *pvbar_item;
+       Evas_Object *ly;
+       Evas_Object *img;
+       CMediaInfo *minfo;
+       int y, w, h;
+
+       elm_scroller_region_get(m->pvbar_scr, NULL, &y, &w, &h);
+       elm_scroller_region_show(m->pvbar_scr, new_x, y, w, h);
+
+       pvbar_item = elm_box_children_get(m->pvbar_box);
+
+       ly = (Evas_Object *)eina_list_nth(pvbar_item, unpack_item_idx);
+       elm_box_unpack(m->pvbar_box, ly);
+       evas_object_hide(ly);
+
+       img = elm_object_part_content_get(ly, PART_PREVIEWBAR_IMG);
+       if (!img) {
+               _ERR("Get image object failed");
+               return NULL;
+       }
+
+       minfo = (CMediaInfo *)eina_list_nth(m->vd->media_list, new_item_idx);
+       if (!minfo) {
+               _ERR("Get mediainfo failed");
+               return NULL;
+       }
+
+       elm_image_file_set(img, minfo->ThumbnailPath(), NULL);
+       elm_image_aspect_fixed_set(img, EINA_FALSE);
+
+       return ly;
+}
 
 bool CPhotoViewerView::m_DrawBottomArea(void)
 {
@@ -569,10 +852,13 @@ bool CPhotoViewerView::m_DrawBottomArea(void)
        m->slideshow_state = STATE_PAUSE;
        m->slideshow_speed = SETTING_SPEED_NORMAL;
 
+       m->menu_show = true;
+
        return true;
 }
 
-void CPhotoViewerView::sm_CbShowViewFinish(void *dt, Evas_Object *obj, const char *emission, const char *source)
+void CPhotoViewerView::sm_CbShowMenuViewFinish(void *dt, Evas_Object *obj,
+               const char *emission, const char *source)
 {
        CPhotoViewerView *root = (CPhotoViewerView*)dt;
 
@@ -589,6 +875,13 @@ void CPhotoViewerView::m_ShowMenuView(void)
                evas_object_freeze_events_set(m->btn[i], EINA_FALSE);
                elm_object_focus_allow_set(m->btn[i], EINA_TRUE);
        }
+
+       if (m->pvbar_timer) {
+               ecore_timer_del(m->pvbar_timer);
+               m->pvbar_timer = NULL;
+       }
+
+       m->menu_show = true;
 }
 
 void CPhotoViewerView::m_HideMenuView(void)
@@ -601,6 +894,14 @@ void CPhotoViewerView::m_HideMenuView(void)
        }
 }
 
+void CPhotoViewerView::sm_CbShowPreviewBarFinish(void *dt, Evas_Object *obj,
+               const char *emission, const char *source)
+{
+       CPhotoViewerView *root = (CPhotoViewerView *)dt;
+
+       if (root)
+               root->m_UpdatePreviewBar();
+}
 
 bool CPhotoViewerView::m_DrawItems(void)
 {
@@ -613,6 +914,9 @@ bool CPhotoViewerView::m_DrawItems(void)
        if (!m_DrawTopArea(m->vd->minfo))
                return false;
 
+       if (!m_DrawPreviewBar())
+               return false;
+
        if (!m_DrawBottomArea())
                return false;
 
@@ -705,7 +1009,10 @@ bool CPhotoViewerView::Create(void *data)
        if (!m_DrawItems())
                goto error;
 
-       elm_object_signal_callback_add(m->base, SIG_SHOW_FINISH, "", sm_CbShowViewFinish, this);
+       elm_object_signal_callback_add(m->base, SIG_MENU_SHOW_FINISH, "",
+                               sm_CbShowMenuViewFinish, this);
+       elm_object_signal_callback_add(m->base, SIG_PREVIEWBAR_SHOW_FINISH, "",
+                               sm_CbShowPreviewBarFinish, this);
 
        /* temp hot fix */
        m->focus_timer = ecore_timer_add(0.25, sm_CbFocus, this);
@@ -734,6 +1041,9 @@ void CPhotoViewerView::Destroy()
        if (m->tooltip_timer)
                ecore_timer_del(m->tooltip_timer);
 
+       if (m->pvbar_timer)
+               ecore_timer_del(m->pvbar_timer);
+
        if (m->slideshow_timer)
                ecore_timer_del(m->slideshow_timer);
 
@@ -743,6 +1053,8 @@ void CPhotoViewerView::Destroy()
        eina_list_free(m->vd->media_list);
        free(m->vd);
 
+       elm_box_clear(m->pvbar_box);
+
        evas_object_del(m->base);
 
        delete m;
@@ -836,9 +1148,14 @@ void CPhotoViewerView::OnTimeout(void)
                m->pCtxPopup = NULL;
        }
 
-       elm_object_signal_emit(m->base, SIG_HIDE, "");
+       elm_object_signal_emit(m->base, SIG_MENU_HIDE, "");
 
        m_HideMenuView();
+
+       m->pvbar_timer = ecore_timer_add(TIMEOUT_PREVIEWBAR,
+                                       sm_CbTimerPreviewBar, this);
+
+       m->menu_show = false;
 }
 
 
@@ -861,14 +1178,14 @@ Eina_Bool CPhotoViewerView::OnEvent(int type, void *event_info)
                        if (m->slideshow_state == STATE_PLAY)
                                return EINA_FALSE;
 
-                       elm_object_signal_emit(m->base, SIG_SHOW, "");
+                       elm_object_signal_emit(m->base, SIG_MENU_SHOW, "");
                } else if (!strcmp(ev->keyname, KEY_BACK) ||
                        !strcmp(ev->keyname, KEY_BACK_REMOTE)) {
                        if (m->slideshow_state == STATE_PLAY)
-                               OnMouseClicked(PHOTOVIEWER_BTN, m->btn[SLIDESHOW_BTN_IDX]);
-
-                       elm_object_signal_emit(m->base, SIG_SHOW, "");
+                               OnMouseClicked(PHOTOVIEWER_BTN,
+                                               m->btn[SLIDESHOW_BTN_IDX]);
 
+                       elm_object_signal_emit(m->base, SIG_MENU_SHOW, "");
                } else if (!strcmp(ev->keyname, KEY_MENU) ||
                        !strcmp(ev->keyname, KEY_MENU_REMOTE)) {
                        m->pViewMgr->PushView(VIEW_CTXT_MENU, m->vd);
@@ -878,15 +1195,17 @@ Eina_Bool CPhotoViewerView::OnEvent(int type, void *event_info)
                        return EINA_FALSE;
        } else {
                if (m->slideshow_state == STATE_PLAY)
-                       OnMouseClicked(PHOTOVIEWER_BTN, m->btn[SLIDESHOW_BTN_IDX]);
+                       OnMouseClicked(PHOTOVIEWER_BTN,
+                                               m->btn[SLIDESHOW_BTN_IDX]);
 
-               elm_object_signal_emit(m->base, SIG_SHOW, "");
+               elm_object_signal_emit(m->base, SIG_MENU_SHOW, "");
        }
 
        return EINA_TRUE;
 }
 
-void CPhotoViewerView::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev)
+void CPhotoViewerView::OnKeyDown(int id, Evas *e, Evas_Object *obj,
+                       Evas_Event_Key_Down *ev)
 {
        switch (id) {
        case PHOTOVIEWER_BTN:
@@ -918,7 +1237,8 @@ void CPhotoViewerView::OnMouseClicked(int id, Evas_Object *obj)
        }
 }
 
-void CPhotoViewerView::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev)
+void CPhotoViewerView::OnMouseMove(int id, Evas *e, Evas_Object *obj,
+                       Evas_Event_Mouse_Move *ev)
 {
        switch (id) {
        case PHOTOVIEWER_BTN: