From 895208b0dcd42ed4446ad892d8a07aca5c49425f Mon Sep 17 00:00:00 2001 From: Hyojung Jo Date: Wed, 8 Jul 2015 10:23:58 +0900 Subject: [PATCH] View: Draw the top menu area Change-Id: Ib83e8a50458ca37c12e2f3ef94e9cfba9708e106 Signed-off-by: Hyojung Jo --- include/define.h | 10 +++ include/utils.h | 6 +- res/favorite-theme.edc | 6 +- res/favorite.edc | 110 ++++++++++++++++++++++++++++- res/widgets/button.edc | 186 +++++++++++++++++++++++++++++++++++++++++++++++++ src/common/utils.c | 14 +++- src/view/view_base.c | 64 +++++++++++------ 7 files changed, 364 insertions(+), 32 deletions(-) create mode 100644 res/widgets/button.edc diff --git a/include/define.h b/include/define.h index 41713ba..24115a7 100644 --- a/include/define.h +++ b/include/define.h @@ -35,6 +35,12 @@ #define STYLE_MUSIC "style.music" #define STYLE_APPS "style.apps" #define STYLE_WEBS "style.webs" +#define STYLE_MENU_BTN "style.menu.button" + +/* Signal */ +#define SIG_FOCUSED "focused" +#define SIG_UNFOCUSED "unfocused" +#define SIG_SELECTED "selected" /* Text */ #define STR_FAVORITE "Favorite" @@ -45,4 +51,8 @@ #define STR_APPS "Apps" #define STR_WEBS "Web bookmark" +/* Font */ +#define FONT_TIZENSANS_REGULAR "TizenSans" +#define FONT_TIZENSANS_LIGHT "TizenSans:style=Light" + #endif /* __AIR_FAVORITE_DEFINE_H__ */ diff --git a/include/utils.h b/include/utils.h index 4a0907a..60a43b9 100644 --- a/include/utils.h +++ b/include/utils.h @@ -19,7 +19,9 @@ Evas_Object *add_window(const char *name); Evas_Object *add_layout(Evas_Object *parent, const char *group); -Evas_Object *add_box(Evas_Object *parent, const char *part); -Evas_Object *add_button(Evas_Object *parent, const char *part); +Evas_Object *add_box(Evas_Object *parent, const char *part, + Eina_Bool horizontal); +Evas_Object *add_button(Evas_Object *parent, const char *part, + const char *text, const char *style); #endif /* __AIR_FAVORITE_UTILS_H__ */ diff --git a/res/favorite-theme.edc b/res/favorite-theme.edc index 4e95756..7e037c3 100644 --- a/res/favorite-theme.edc +++ b/res/favorite-theme.edc @@ -17,8 +17,6 @@ #include "../include/define.h" collections { - -#include "widgets/gengrid.edc" -/* It should be implemented later. */ - + #include "widgets/gengrid.edc" + #include "widgets/button.edc" } diff --git a/res/favorite.edc b/res/favorite.edc index 9c2be25..eefdf41 100644 --- a/res/favorite.edc +++ b/res/favorite.edc @@ -21,19 +21,123 @@ collections { name, GRP_VIEW_BASE; parts { part { + name, "bg"; + type, RECT; + scale, 1; + description { + state, "default" 0.0; + color, 244 244 244 255; + } + } + + part { + name, "title.bg"; + type, RECT; + scale, 1; + description { + state, "default" 0.0; + color, 255 255 255 255; + min, 0 184; + rel2.relative, 1.0 0.0; + align, 0.5 0.0; + fixed, 0 1; + } + } + + part { + name, "padding.title"; + type, SPACER; + scale, 1; + description { + state, "default" 0.0; + min, 0 44; + rel2.relative, 1.0 0.0; + align, 0.5 0.0; + fixed, 0 1; + } + } + + part { name, PART_TOP_TITLE; type, TEXT; - /* It should be implemented later. */ + scale, 1; + description { + state, "default" 0.0; + color, 51 51 51 255; + min, 0 46; + rel1 { + to, "padding.title"; + relative, 0.0 1.0; + } + rel2.to, "padding.title"; + align, 0.5 0.0; + fixed, 0 1; + text { + font, FONT_TIZENSANS_REGULAR; + size, 46; + align, 0.5 0.5; + } + } } + + part { + name, "padding.menu"; + type, SPACER; + scale, 1; + description { + state, "default" 0.0; + min, 0 12; + rel1 { + to, PART_TOP_TITLE; + relative, 0.0 1.0; + } + rel2.to, PART_TOP_TITLE; + fixed, 0 1; + align, 0.5 0.0; + } + } + part { name, PART_TOP_MENU; type, SWALLOW; - /* It should be implemented later. */ + scale, 1; + description { + state, "default" 0.0; + min, 0 82; + rel1 { + to, "padding.menu"; + relative, 0.0 1.0; + } + rel2.to, "padding.menu"; + fixed, 0 1; + align, 0.5 0.0; + } } + + part { + name, "padding.grid"; + type, SPACER; + scale, 1; + description { + state, "default" 0.0; + min, 62 318; + rel2.relative, 0.0 0.0; + fixed, 1 1; + align, 0.0 0.0; + } + } + part { name, PART_GENGRID; type, SWALLOW; - /* It should be implemented later. */ + scale, 1; + description { + state, "default" 0.0; + rel1 { + to, "padding.grid"; + relative, 1.0 1.0; + } + } } } } diff --git a/res/widgets/button.edc b/res/widgets/button.edc new file mode 100644 index 0000000..762c828 --- /dev/null +++ b/res/widgets/button.edc @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define STATE_NORMAL 0 +#define STATE_SELECTED 1 + +group { + name, "elm/button/base/style.menu.button"; + data.item, "focus_highlight" "on"; + script { + public cur_state; + } + parts { + part { + name, "bg"; + type, RECT; + scale, 1; + description { + state, "default" 0.0; + min, 240 82; + } + description { + state, "selected" 0.0; + inherit, "default" 0.0; + } + description { + state, "focused" 0.0; + inherit, "default" 0.0; + color, 0 119 246 255; + } + } + + part { + name, "elm.text"; + type, TEXT; + scale, 1; + description { + state, "default" 0.0; + color, 104 104 104 255; + min, 0 82; + align, 0.5 0.0; + fixed, 0 1; + text { + font, FONT_TIZENSANS_LIGHT; + size, 32; + align, 0.5 0.5; + } + } + description { + state, "selected" 0.0; + inherit, "default" 0.0; + color, 64 136 211 255; + text.font, FONT_TIZENSANS_REGULAR; + } + description { + state, "focused" 0.0; + inherit, "default" 0.0; + color, 255 255 255 255; + text.font, FONT_TIZENSANS_REGULAR; + } + } + + part { + name, "padding.bottom.line"; + type, SPACER; + scale, 1; + description { + state, "default" 0.0; + min, 28 3; + rel1 { + to, "bg"; + relative, 0.0 1.0; + } + rel2 { + to, "bg"; + relative, 0.0 1.0; + } + align, 0.0 1.0; + fixed, 1 1; + } + } + + part { + name, "bottom.line"; + type, RECT; + scale, 1; + description { + state, "default" 0.0; + color, 64 136 211 255; + min, 184 3; + rel1 { + to, "padding.bottom.line"; + relative, 1.0 0.0; + } + rel2 { + to, "padding.bottom.line"; + relative, 1.0 0.0; + } + align, 0.0 0.0; + fixed, 1 1; + visible, 0; + } + description { + state, "selected" 0.0; + inherit, "default" 0.0; + visible, 1; + } + description { + state, "focused" 0.0; + inherit, "default" 0.0; + } + } + } + + programs{ + program { + name, SIG_FOCUSED; + signal, "elm,action,focus"; + source, "elm"; + script { + set_int(cur_state, STATE_NORMAL); + run_program(PROGRAM:"focused,anim"); + } + } + + program { + name, SIG_UNFOCUSED; + signal, "elm,action,unfocus"; + source, "elm"; + script { + new state; + state = get_int(cur_state); + if (state == STATE_SELECTED) { + set_state(PART:"bg", "selected", 0.0); + set_state(PART:"elm.text", "selected", 0.0); + set_state(PART:"bottom.line", "selected", 0.0); + } else { + run_program(PROGRAM:"unfocused,anim"); + } + } + } + + program { + name, "focused,anim"; + action, STATE_SET "focused" 0.0; + target, "bg"; + target, "elm.text"; + target, "bottom.line"; + transition, LINEAR 0.17; + } + + program { + name, "unfocused,anim"; + action, STATE_SET "default" 0.0; + target, "bg"; + target, "elm.text"; + target, "bottom.line"; + transition, LINEAR 0.17; + } + + program { + name, SIG_SELECTED; + signal, "selected"; + source, ""; + script { + set_int(cur_state, STATE_SELECTED); + set_state(PART:"bg", "selected", 0.0); + set_state(PART:"elm.text", "selected", 0.0); + set_state(PART:"bottom.line", "selected", 0.0); + } + } + } +} diff --git a/src/common/utils.c b/src/common/utils.c index 4506c28..ecb3c0b 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -63,7 +63,8 @@ Evas_Object *add_layout(Evas_Object *parent, const char *group) return layout; } -Evas_Object *add_box(Evas_Object *parent, const char *part) +Evas_Object *add_box(Evas_Object *parent, const char *part, + Eina_Bool horizontal) { Evas_Object *box; @@ -78,6 +79,10 @@ Evas_Object *add_box(Evas_Object *parent, const char *part) return NULL; } + elm_box_horizontal_set(box, horizontal); + + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); if (part) @@ -88,7 +93,8 @@ Evas_Object *add_box(Evas_Object *parent, const char *part) return box; } -Evas_Object *add_button(Evas_Object *parent, const char *part) +Evas_Object *add_button(Evas_Object *parent, const char *part, + const char *text, const char *style) { Evas_Object *btn; @@ -105,6 +111,10 @@ Evas_Object *add_button(Evas_Object *parent, const char *part) if (part) elm_object_part_content_set(parent, part, btn); + if (text) + elm_object_text_set(btn, text); + if (style) + elm_object_style_set(btn, style); evas_object_show(btn); diff --git a/src/view/view_base.c b/src/view/view_base.c index d432300..641fc02 100644 --- a/src/view/view_base.c +++ b/src/view/view_base.c @@ -14,6 +14,7 @@ * limitations under the License. */ +#include #include #include #include @@ -76,15 +77,6 @@ static struct grid_class *(*_get_grid_class[])(void) = { [MENU_WEBS] = get_webs_grid_class }; -static void _clicked_cb(int id, void *data, Evas_Object *obj); -static void _focused_cb(int id, void *data, Evas_Object *obj, Elm_Object_Item *item); - -static input_handler _input_handler = { - .clicked = _clicked_cb, - .focused = _focused_cb - /* It will be implemented later. */ -}; - static Eina_List *_get_contents_list(enum menu_type type) { switch (type) { @@ -115,18 +107,20 @@ static Eina_List *_get_contents_list(enum menu_type type) } } -static bool _load_current_contents(struct _priv *priv) +static bool _load_current_grid(struct _priv *priv, enum menu_type type) { struct _menu_data *mdata; Eina_List *list = NULL; - enum menu_type type; + Evas_Object *prev_grid; - if (!priv || !priv->gmgr || priv->cur_menu <= MENU_INVALID - || priv->cur_menu >= MENU_MAX) { + if (!priv || !priv->gmgr || !priv->base || + type <= MENU_INVALID || type >= MENU_MAX) { _ERR("Invalid argument."); return false; } - type = priv->cur_menu; + + prev_grid = elm_object_part_content_unset(priv->base, PART_GENGRID); + evas_object_hide(prev_grid); mdata = priv->mdata[type]; if (!mdata || !mdata->grid) @@ -148,16 +142,17 @@ static bool _load_current_contents(struct _priv *priv) } elm_object_part_content_set(priv->base, PART_GENGRID, mdata->grid); + evas_object_show(mdata->grid); return true; } -static void _clicked_cb(int id, void *data, Evas_Object *obj) +static void _menu_clicked_cb(int id, void *data, Evas_Object *obj) { /* It will be implemented later. */ } -static void _focused_cb(int id, void *data, Evas_Object *obj, +static void _menu_focused_cb(int id, void *data, Evas_Object *obj, Elm_Object_Item *item) { struct _priv *priv; @@ -173,10 +168,31 @@ static void _focused_cb(int id, void *data, Evas_Object *obj, priv->cur_menu = id; - if (!_load_current_contents(priv)) + if (!_load_current_grid(priv, id)) _ERR("Load current grid view failed."); } +static void _menu_key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, + Evas_Event_Key_Down *ev) +{ + if (!ev) { + _ERR("Invalid argument."); + return; + } + + if (!strcmp(ev->key, KEY_BACK)) + ui_app_exit(); + + /* It will be implemented later. */ +} + +static input_handler _menu_input_handler = { + .clicked = _menu_clicked_cb, + .focused = _menu_focused_cb, + .key_down = _menu_key_down_cb + /* It will be implemented later. */ +}; + static bool _draw_top_area(struct _priv *priv) { Evas_Object *btn; @@ -189,14 +205,14 @@ static bool _draw_top_area(struct _priv *priv) elm_object_part_text_set(priv->base, PART_TOP_TITLE, STR_FAVORITE); - priv->box = add_box(priv->base, PART_TOP_MENU); + priv->box = add_box(priv->base, PART_TOP_MENU, EINA_TRUE); if (!priv->box) { _ERR("Add box failed."); return false; } for (i = MENU_INVALID + 1; i < MENU_MAX; i++) { - btn = add_button(priv->box, NULL); + btn = add_button(priv->box, NULL, str_menu[i], STYLE_MENU_BTN); if (!btn) { _ERR("Add button failed."); evas_object_del(priv->box); @@ -204,12 +220,17 @@ static bool _draw_top_area(struct _priv *priv) } elm_box_pack_end(priv->box, btn); - inputmgr_add_callback(btn, i, &_input_handler, priv); + inputmgr_add_callback(btn, i, &_menu_input_handler, priv); priv->mdata[i]->btn = btn; } - /* It will be implemented more later. */ + elm_object_focus_next_object_set(priv->mdata[0]->btn, + priv->mdata[MENU_MAX - 1]->btn, ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(priv->mdata[MENU_MAX - 1]->btn, + priv->mdata[0]->btn, ELM_FOCUS_RIGHT); + + elm_object_focus_set(priv->mdata[0]->btn, EINA_TRUE); return true; } @@ -290,6 +311,7 @@ static Evas_Object *_create(Evas_Object *win, void *data) priv->win = win; priv->base = base; priv->gmgr = gmgr; + priv->cur_menu = MENU_INVALID; for (i = MENU_INVALID + 1; i < MENU_MAX; i++) { grid = _add_grid(priv, i); -- 2.7.4