summaryrefslogtreecommitdiff
path: root/src/view/base.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/view/base.c')
-rw-r--r--src/view/base.c211
1 files changed, 174 insertions, 37 deletions
diff --git a/src/view/base.c b/src/view/base.c
index 4db00f3..7c928a3 100644
--- a/src/view/base.c
+++ b/src/view/base.c
@@ -28,6 +28,7 @@
#include "define.h"
#include "layout.h"
#include "view.h"
+#include "util/ctxpopup.h"
#include "util/util.h"
#define TITLE_TEXT "Media Hub"
@@ -41,6 +42,13 @@
#define TIME_TOAST_FAVORITE 5.0
+#define ARRAY_SIZE(arr) (sizeof(arr)) / (sizeof((arr)[0]))
+
+enum _object_type {
+ BASE_MENU_BTN = 0,
+ BASE_VIEW_BTN
+};
+
enum _layout_type {
E_LAYOUT_MOVIE = 0,
E_LAYOUT_GALLERY,
@@ -51,40 +59,76 @@ enum _layout_type {
struct _priv {
Evas_Object *win;
Evas_Object *base;
- Evas_Object *btn[E_LAYOUT_MAX];
- Evas_Object *notify;
+ Evas_Object *menu_btn[E_LAYOUT_MAX];
+ Evas_Object *view_btn;
Evas_Object *focused_btn;
+ Evas_Object *notify;
+
+ struct ctxpopup *cpopup;
+
layoutmgr *lmgr;
Eina_List *favorite_list;
app_media *recent_item;
int current_layout;
+ int view_mode;
+};
+
+const char *view_mode_movie[] = {
+ "Name",
+ "Genre",
+ "Date",
+ "Folder"
+};
+
+const char *view_mode_gallery[] = {
+ "Event",
+ "Place",
+ "Video",
+ "Folder"
+};
+
+const char *view_mode_music[] = {
+ "Song",
+ "Album",
+ "Artist",
+ "Genre",
+ "Folder"
};
struct _menu_item {
const char *name;
const char *layout_id;
layout_class *(*func_get_lclass)(void);
+
+ const char **text_view_mode;
+ int text_size;
};
static struct _menu_item g_menu_item[E_LAYOUT_MAX] = {
[E_LAYOUT_MOVIE] = {
"Movie",
LAYOUT_MOVIE,
- layout_movie_get_lclass
+ layout_movie_get_lclass,
+ view_mode_movie,
+ ARRAY_SIZE(view_mode_movie)
},
[E_LAYOUT_GALLERY] = {
"Gallery",
LAYOUT_GALLERY,
- layout_gallery_get_lclass
+ layout_gallery_get_lclass,
+ view_mode_gallery,
+ ARRAY_SIZE(view_mode_gallery)
},
[E_LAYOUT_MUSIC] = {
"Music",
LAYOUT_MUSIC,
- layout_music_get_lclass
+ layout_music_get_lclass,
+ view_mode_music,
+ ARRAY_SIZE(view_mode_music)
}
};
@@ -94,31 +138,74 @@ static void _set_current_layout(struct _priv *priv, int layout)
g_menu_item[priv->current_layout].layout_id);
layoutmgr_show_layout(priv->lmgr, g_menu_item[layout].layout_id);
+ elm_object_text_set(priv->view_btn,
+ g_menu_item[layout].text_view_mode[priv->view_mode]);
+
if (priv->focused_btn)
elm_object_signal_emit(priv->focused_btn,
SIG_BTN_UNSELECTED, SIG_SOURCE_SRC);
- priv->focused_btn = priv->btn[layout];
+ priv->focused_btn = priv->menu_btn[layout];
priv->current_layout = layout;
}
+static void _update_layout(struct _priv *priv, Evas_Object *obj)
+{
+ int i;
+
+ for (i = 0; i < E_LAYOUT_MAX; i++) {
+ if (priv->menu_btn[i] == obj)
+ break;
+ }
+
+ if (i == E_LAYOUT_MAX)
+ return;
+
+ layoutmgr_update_layout(priv->lmgr, g_menu_item[i].layout_id,
+ UPDATE_FOCUS_STATE, NULL);
+
+ if (priv->focused_btn == obj)
+ return;
+
+ _set_current_layout(priv, i);
+
+ layoutmgr_update_layout(priv->lmgr, g_menu_item[i].layout_id,
+ UPDATE_CONTENT, NULL);
+}
+
static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj,
Evas_Event_Key_Down *ev)
{
if (!obj || !ev)
return;
- if (!strcmp(ev->keyname, KEY_ENTER) ||
- !strcmp(ev->keyname, KEY_ENTER_REMOTE))
- elm_object_focus_next(obj, ELM_FOCUS_DOWN);
- else if (!strcmp(ev->keyname, KEY_BACK) ||
- !strcmp(ev->keyname, KEY_BACK_REMOTE))
- ui_app_exit();
+ switch (id) {
+ case BASE_MENU_BTN:
+ if (!strcmp(ev->keyname, KEY_ENTER) ||
+ !strcmp(ev->keyname, KEY_ENTER_REMOTE))
+ elm_object_focus_next(obj, ELM_FOCUS_DOWN);
+ else if (!strcmp(ev->keyname, KEY_BACK) ||
+ !strcmp(ev->keyname, KEY_BACK_REMOTE))
+ ui_app_exit();
+
+ break;
+ case BASE_VIEW_BTN:
+ if (!strcmp(ev->keyname, KEY_BACK) ||
+ !strcmp(ev->keyname, KEY_BACK_REMOTE))
+ ui_app_exit();
+
+ break;
+ default:
+ break;
+ }
}
static void _mouse_move_cb(int id, void *data, Evas *e,
Evas_Object *obj, Evas_Event_Mouse_Move *ev)
{
+ if (!obj)
+ return;
+
if (!elm_object_focus_get(obj))
elm_object_focus_set(obj, EINA_TRUE);
}
@@ -127,7 +214,6 @@ static void _focused_cb(int id, void *data, Evas_Object *obj,
Elm_Object_Item *it)
{
struct _priv *priv;
- int i;
if (!data) {
_ERR("failed to get data");
@@ -136,29 +222,59 @@ static void _focused_cb(int id, void *data, Evas_Object *obj,
priv = data;
- for (i = 0; i < E_LAYOUT_MAX; i++) {
- if (priv->btn[i] == obj)
- break;
+ switch (id) {
+ case BASE_MENU_BTN:
+ _update_layout(priv, obj);
+ break;
+ default:
+ break;
}
+}
- if (i == E_LAYOUT_MAX)
+static void _view_btn_clicked(struct _priv *priv)
+{
+ struct ctxpopup *cpopup;
+ int x, y, w, h;
+
+ cpopup = ctxpopup_create(priv->base, STYLE_CTXPOPUP_VIEW_MODE,
+ STYLE_BTN_VIEW_OPTION,
+ g_menu_item[priv->current_layout].text_view_mode,
+ g_menu_item[priv->current_layout].text_size);
+ if (!cpopup) {
+ _ERR("failed to create ctxpopup");
return;
+ }
- layoutmgr_update_layout(priv->lmgr, g_menu_item[i].layout_id,
- UPDATE_FOCUS_STATE, NULL);
+ evas_object_geometry_get(priv->view_btn, &x, &y, &w, &h);
+ ctxpopup_show(cpopup, x + (w / 2), y);
- if (priv->focused_btn == obj)
+ priv->cpopup = cpopup;
+}
+
+static void _clicked_cb(int id, void *data, Evas_Object *obj)
+{
+ struct _priv *priv;
+
+ if (!data) {
+ _ERR("failed to get data");
return;
+ }
- _set_current_layout(priv, i);
+ priv = data;
- layoutmgr_update_layout(priv->lmgr, g_menu_item[i].layout_id,
- UPDATE_CONTENT, NULL);
+ switch (id) {
+ case BASE_VIEW_BTN:
+ _view_btn_clicked(priv);
+ break;
+ default:
+ break;
+ }
}
static input_handler handler = {
.key_down = _key_down_cb,
.mouse_move = _mouse_move_cb,
+ .clicked = _clicked_cb,
.focused = _focused_cb
};
@@ -437,32 +553,50 @@ static bool _draw_menu_btn(struct _priv *priv)
evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
for (i = 0; i < E_LAYOUT_MAX; i++) {
- btn = elm_button_add(box);
+ btn = util_add_button(box, STYLE_BTN_MENU, g_menu_item[i].name);
if (!btn) {
- _ERR("failed to create button object");
+ _ERR("failed to add button object");
+ evas_object_del(box);
return false;
}
- elm_object_style_set(btn, STYLE_BTN_MENU);
- elm_object_text_set(btn, g_menu_item[i].name);
-
elm_box_pack_end(box, btn);
evas_object_show(btn);
- inputmgr_add_callback(btn, 0, &handler, priv);
+ inputmgr_add_callback(btn, BASE_MENU_BTN, &handler, priv);
- priv->btn[i] = btn;
+ priv->menu_btn[i] = btn;
}
evas_object_show(box);
elm_object_part_content_set(priv->base, PART_MENU_AREA, box);
- elm_object_focus_next_object_set(priv->btn[E_LAYOUT_MAX - 1],
- priv->btn[0], ELM_FOCUS_RIGHT);
- elm_object_focus_next_object_set(priv->btn[0],
- priv->btn[E_LAYOUT_MAX - 1], ELM_FOCUS_LEFT);
+ elm_object_focus_next_object_set(priv->menu_btn[E_LAYOUT_MAX - 1],
+ priv->menu_btn[0], ELM_FOCUS_RIGHT);
+ elm_object_focus_next_object_set(priv->menu_btn[0],
+ priv->menu_btn[E_LAYOUT_MAX - 1],
+ ELM_FOCUS_LEFT);
+
+ return true;
+}
+
+static bool _draw_view_mode_btn(struct _priv *priv)
+{
+ Evas_Object *btn;
+
+ btn = util_add_button(priv->base, STYLE_BTN_VIEW_MODE, NULL);
+ if (!btn) {
+ _ERR("failed to add button object");
+ return false;
+ }
+
+ inputmgr_add_callback(btn, BASE_VIEW_BTN, &handler, priv);
+
+ elm_object_part_content_set(priv->base, PART_VIEW_MODE, btn);
+
+ priv->view_btn = btn;
return true;
}
@@ -478,6 +612,9 @@ static bool _draw_items(struct _priv *priv)
if (!_draw_menu_btn(priv))
return false;
+ if (!_draw_view_mode_btn(priv))
+ return false;
+
return true;
}
@@ -559,13 +696,13 @@ static Evas_Object *_create(Evas_Object *win, void *data)
lmgr = layoutmgr_create(base);
for (i = 0; i < E_LAYOUT_MAX; i++)
layoutmgr_add_layout(lmgr, g_menu_item[i].func_get_lclass(),
- priv->btn[i]);
+ priv->menu_btn[i]);
priv->lmgr = lmgr;
viewmgr_set_view_data(VIEW_BASE, priv);
- elm_object_focus_set(priv->btn[0], EINA_TRUE);
+ elm_object_focus_set(priv->menu_btn[0], EINA_TRUE);
return base;
}
@@ -694,7 +831,7 @@ static void _destroy(void *view_data)
priv = view_data;
for (i = 0; i < E_LAYOUT_MAX; i++)
- inputmgr_remove_callback(priv->btn[i], &handler);
+ inputmgr_remove_callback(priv->menu_btn[i], &handler);
layoutmgr_remove_layout(priv->lmgr, LAYOUT_MOVIE);
layoutmgr_remove_layout(priv->lmgr, LAYOUT_GALLERY);