From d4988c222b406022515cbde20ca01c0cec3d2092 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Thu, 9 Apr 2015 15:00:45 +0900 Subject: [PATCH] maintain focused item in gengrid Change-Id: I692ee644b51b1172dc6c4c985a354208e3a26c7f Signed-off-by: Jehun Lim --- data/widget/gengrid.edc | 5 ++++ include/view/plugged_layout.h | 12 +++++++++- src/view/allsource_view.cpp | 4 ++++ src/view/plugged_layout.cpp | 55 ++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 72 insertions(+), 4 deletions(-) diff --git a/data/widget/gengrid.edc b/data/widget/gengrid.edc index e4a9774..66a7d2d 100644 --- a/data/widget/gengrid.edc +++ b/data/widget/gengrid.edc @@ -212,6 +212,11 @@ group { target: "item_bg"; target: "item_name"; target: "item_type"; + after: "item_focused"; + } + program { + name: "item_focused"; + action: SIGNAL_EMIT "item_focused" "edc"; } program { name: "go_passive"; diff --git a/include/view/plugged_layout.h b/include/view/plugged_layout.h index c7a8d75..8bf25d3 100644 --- a/include/view/plugged_layout.h +++ b/include/view/plugged_layout.h @@ -18,7 +18,8 @@ #define __PLUGGED_LAYOUT_H__ class CPluggedLayout : public CBaseLayout, CListenerMgr, - IKeyDownListener, IMouseMoveListener, IFocusedListener { + IKeyDownListener, IMouseMoveListener, + IRealizedListener, IUnrealizedListener, IFocusedListener { private: struct SPluggedLayout *m; @@ -31,6 +32,11 @@ private: static Eina_Bool sm_CbTimerDelItem(void *data); void m_TimerDelItem(void); + static void sm_CbGridItemFocused(void *cookie, Elm_Object_Item *it, + const char *emission, const char *source); + void m_OnGridItemFocused(Elm_Object_Item *it, + const char *emission, const char *source); + Evas_Object *m_DrawGengrid(Evas_Object *layout); void m_DrawNoContentArea(void); void m_DrawContentArea(void); @@ -38,6 +44,7 @@ private: public: CPluggedLayout(const char *pLayoutId) : CBaseLayout(pLayoutId), IKeyDownListener(this), IMouseMoveListener(this), + IRealizedListener(this), IUnrealizedListener(this), IFocusedListener(this), m(0) {} virtual ~CPluggedLayout() {} @@ -45,11 +52,14 @@ public: bool Create(CLayoutMgr *mgr, void *data); virtual void Destroy(void); + void Focus(void); void Update(void *data, enum update_ui type); public: void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev); + void OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item); + void OnUnrealized(int id, Evas_Object *obj, Elm_Object_Item *item); void OnFocused(int id, Evas_Object *obj, Elm_Object_Item *item); }; diff --git a/src/view/allsource_view.cpp b/src/view/allsource_view.cpp index da89fb7..1e6fa55 100644 --- a/src/view/allsource_view.cpp +++ b/src/view/allsource_view.cpp @@ -245,6 +245,10 @@ void CAllSourceView::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key if (!strcmp(ev->keyname, KEY_BACK) || !strcmp(ev->keyname, KEY_BACK_REMOTE)) app_efl_exit(); + else if (!strcmp(ev->keyname, KEY_ENTER) + || !strcmp(ev->keyname, KEY_ENTER_REMOTE)) + m->pPluggedLayout->Focus(); + break; default: break; } diff --git a/src/view/plugged_layout.cpp b/src/view/plugged_layout.cpp index 27777f4..2bc2fa3 100644 --- a/src/view/plugged_layout.cpp +++ b/src/view/plugged_layout.cpp @@ -63,7 +63,8 @@ Evas_Object *CPluggedLayout::m_DrawGengrid(Evas_Object *layout) if (!grid) return NULL; - Connect(grid, PLUGGED_GRID, TYPE_KEY_DOWN | TYPE_MOUSE_MOVE | TYPE_FOCUSED); + Connect(grid, PLUGGED_GRID, TYPE_KEY_DOWN | TYPE_MOUSE_MOVE + | TYPE_REALIZED | TYPE_UNREALIZED | TYPE_FOCUSED); return grid; } @@ -215,6 +216,32 @@ void CPluggedLayout::m_TimerDelItem(void) m->del_it = NULL; } +void CPluggedLayout::sm_CbGridItemFocused(void *cookie, Elm_Object_Item *it, + const char *emission, const char *source) +{ + CPluggedLayout *root = (CPluggedLayout *)cookie; + + if (root) + root->m_OnGridItemFocused(it, emission, source); +} + +void CPluggedLayout::m_OnGridItemFocused(Elm_Object_Item *it, + const char *emission, const char *source) +{ + if (!it) + return; + + m->focus_it = (Elm_Object_Item *)it; +} + +void CPluggedLayout::Focus(void) +{ + ASSERT(m); + + elm_object_focus_set(m->grid, EINA_TRUE); + elm_object_item_focus_set(m->focus_it, EINA_TRUE); +} + void CPluggedLayout::Update(void *data, enum update_ui type) { ASSERT(m); @@ -305,12 +332,34 @@ void CPluggedLayout::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_M } } -void CPluggedLayout::OnFocused(int id, Evas_Object *obj, Elm_Object_Item *item) +void CPluggedLayout::OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item) { switch (id) { case PLUGGED_GRID: - m->focus_it = (Elm_Object_Item *)item; + elm_object_item_signal_callback_add(item, "item_focused", + "edc", sm_CbGridItemFocused, this); + break; + default: + break; + } +} + +void CPluggedLayout::OnUnrealized(int id, Evas_Object *obj, Elm_Object_Item *item) +{ + switch (id) { + case PLUGGED_GRID: + elm_object_item_signal_callback_del(item, "item_focused", + "edc", sm_CbGridItemFocused); + break; + default: + break; + } +} +void CPluggedLayout::OnFocused(int id, Evas_Object *obj, Elm_Object_Item *item) +{ + switch (id) { + case PLUGGED_GRID: m->SigCb->cb(m->SigCb->cookie, E_HIGHLIGHT); break; -- 2.7.4