hermet pushed a commit to branch master. http://git.enlightenment.org/games/etypers.git/commit/?id=e62d37c033899b2da0241c27964a19edf4eb5857
commit e62d37c033899b2da0241c27964a19edf4eb5857 Author: Hermet Park <her...@hermet.pe.kr> Date: Fri Feb 12 02:06:21 2016 +0900 remove popup and use notify. popup is ugly and has a lot of issues. contruct menus by using notify to avoid this. --- src/bin/etypers.c | 270 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 138 insertions(+), 132 deletions(-) diff --git a/src/bin/etypers.c b/src/bin/etypers.c index 2ac5d91..9df2c1c 100644 --- a/src/bin/etypers.c +++ b/src/bin/etypers.c @@ -1,23 +1,3 @@ -/* - * EFL Typers. - * - * Copyright 2012 Hermet Park - * - * This application is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This application is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - #include <Elementary.h> #define DEFAULT_WIN_W 400 @@ -38,14 +18,13 @@ static void _resume(AppData *appdata); static void _popup(AppData *appdata); static void _reset_defense_wall(AppData *appdata); -static char EDJE_PATH[PATH_MAX]; - enum _GameState { - Ready, + Ready = 0, Playing, Paused, SubPopup, + SubPopup2, GameOver }; @@ -71,7 +50,6 @@ struct _AppData Evas_Object *table; Evas_Object *popup; GameState state; - GameState prev_state; Ecore_Animator *animator; }; @@ -355,8 +333,6 @@ _app_release(AppData *appdata) eina_list_free(appdata->defense_wall); - free(appdata); - elm_exit(); } @@ -366,21 +342,15 @@ _win_del(void *data, Evas_Object *obj, void *event_info) _app_release(data); } -static void -_win_resize(void *data, Evas *e, Evas_Object *obj, void *event_info) -{ - AppData *appdata = data; - Evas_Coord w, h; - evas_object_geometry_get(obj, NULL, NULL, &w, &h); - appdata->bound_w = w; - appdata->bound_h = h; -} - static Evas_Object * -_layout_create(Evas_Object *win, const char *filepath, const char *group) +_layout_create(Evas_Object *win) { Evas_Object *ly = elm_layout_add(win); - elm_layout_file_set(ly, filepath, group); + + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "%s/theme/etypers.edj", PACKAGE_DATA_DIR); + + elm_layout_file_set(ly, buf, "gui"); evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, ly); evas_object_show(ly); @@ -518,7 +488,8 @@ static void _game_level_cb(void *data, Evas_Object *obj, void *event_info) { AppData *appdata = evas_object_data_get(obj, "appdata"); - evas_object_del(obj); + evas_object_del(appdata->popup); + appdata->popup = NULL; appdata->level = (int)(uintptr_t) data; _game_reset(appdata); @@ -527,47 +498,67 @@ _game_level_cb(void *data, Evas_Object *obj, void *event_info) } static void -_level_back_btn_cb(void *data, Evas_Object *obj, void *event_info) -{ - Evas_Object *popup = data; - AppData *appdata = evas_object_data_get(popup, "appdata"); - appdata->state = appdata->prev_state; - evas_object_del(popup); - _pause(appdata); - _popup(appdata); -} - -static void _game_start_cb(void *data, Evas_Object *obj, void *event_info) { AppData *appdata = data; evas_object_del(appdata->popup); - appdata->popup = NULL; - appdata->prev_state = appdata->state; - appdata->state = SubPopup; - Evas_Object *popup = elm_popup_add(appdata->win); - evas_object_data_set(popup, "appdata", data); - elm_object_part_text_set(popup, "title,text", "Start Level"); - //FIXME: Content height is not fit to the actual total item height - elm_popup_item_append(popup, "Level 1", NULL, _game_level_cb, (void *) 1); - elm_popup_item_append(popup, "Level 2", NULL, _game_level_cb, (void *) 2); - elm_popup_item_append(popup, "Level 3", NULL, _game_level_cb, (void *) 3); - elm_popup_item_append(popup, "Level 4", NULL, _game_level_cb, (void *) 4); - elm_popup_item_append(popup, "Level 5", NULL, _game_level_cb, (void *) 5); - elm_popup_item_append(popup, "Level 6", NULL, _game_level_cb, (void *) 6); - elm_popup_item_append(popup, "Level 7", NULL, _game_level_cb, (void *) 7); - elm_popup_item_append(popup, "Level 8", NULL, _game_level_cb, (void *) 8); - elm_popup_item_append(popup, "Level 9", NULL, _game_level_cb, (void *) 9); - - //FIXME: It doesn't work - elm_object_scroll_hold_push(popup); - evas_object_show(popup); - Evas_Object *btn = elm_button_add(popup); - if (!btn) return; - elm_object_text_set(btn, "Back"); - elm_object_part_content_set(popup, "button1", btn); - evas_object_smart_callback_add(btn, "clicked", _level_back_btn_cb, popup); + appdata->popup = NULL; + if (appdata->state == Paused) appdata->state = SubPopup2; + else appdata->state = SubPopup; + + Evas_Object *notify = elm_notify_add(appdata->win); + elm_notify_align_set(notify, 0.5, 0.5); + evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(notify, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_data_set(notify, "appdata", appdata); + + Evas_Object *box = elm_box_add(notify); + elm_box_padding_set(box, ELM_SCALE_SIZE(10), ELM_SCALE_SIZE(10)); + 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); + evas_object_show(box); + + Evas_Object *label = elm_label_add(box); + elm_object_text_set(label, "Start Level"); + evas_object_show(label); + elm_box_pack_end(box, label); + + Evas_Object *list = elm_list_add(box); + elm_list_mode_set(list, ELM_LIST_EXPAND); + elm_scroller_policy_set(list, ELM_SCROLLER_POLICY_OFF, + ELM_SCROLLER_POLICY_OFF); + evas_object_data_set(list, "appdata", appdata); + evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_list_item_append(list, "Level 1", NULL, NULL, _game_level_cb, + (void *) 1); + elm_list_item_append(list, "Level 2", NULL, NULL, _game_level_cb, + (void *) 2); + elm_list_item_append(list, "Level 3", NULL, NULL, _game_level_cb, + (void *) 3); + elm_list_item_append(list, "Level 4", NULL, NULL, _game_level_cb, + (void *) 4); + elm_list_item_append(list, "Level 5", NULL, NULL, _game_level_cb, + (void *) 5); + elm_list_item_append(list, "Level 6", NULL, NULL, _game_level_cb, + (void *) 6); + elm_list_item_append(list, "Level 7", NULL, NULL, _game_level_cb, + (void *) 7); + elm_list_item_append(list, "Level 8", NULL, NULL, _game_level_cb, + (void *) 8); + elm_list_item_append(list, "Level 9", NULL, NULL, _game_level_cb, + (void *) 9); + + elm_list_go(list); + evas_object_show(list); + + elm_box_pack_end(box, list); + + elm_object_content_set(notify, box); + evas_object_show(notify); + + appdata->popup = notify; } #if 0 @@ -585,41 +576,24 @@ _game_exit_cb(void *data, Evas_Object *obj, void *event_info) } static void -_credit_back_btn_cb(void *data, Evas_Object *obj, void *event_info) -{ - Evas_Object *popup = data; - AppData *appdata = evas_object_data_get(popup, "appdata"); - appdata->state = appdata->prev_state; - evas_object_show(appdata->popup); - evas_object_del(popup); -} - -static void -_credit_cb(void *data, Evas_Object *obj, void *event_info) +_about_cb(void *data, Evas_Object *obj, void *event_info) { AppData *appdata = data; Evas_Object *popup = elm_popup_add(appdata->win); if (!popup) return; - appdata->state = SubPopup; - elm_object_part_text_set(popup, "title,text", "Game Credits"); - elm_object_text_set(popup, - "EFL Typers v1.0<br>Designed by Hermet"); - evas_object_data_set(popup, "appdata", appdata); - Evas_Object *btn = elm_button_add(popup); - if (!btn) - { - evas_object_del(popup); - return; - } + if (appdata->state == Ready) appdata->state = SubPopup; + else appdata->state = SubPopup2; + + elm_object_part_text_set(popup, "title,text", "EFL Typers v1.0"); + elm_object_text_set(popup, "Copyright © 2016 Hermet Park<br> and various contributors (see AUTHORS)"); + evas_object_data_set(popup, "appdata", appdata); - elm_object_text_set(btn, "Back"); - elm_object_part_content_set(popup, "button1", btn); - evas_object_smart_callback_add(btn, "clicked", _credit_back_btn_cb, popup); evas_object_show(popup); evas_object_hide(appdata->popup); + appdata->popup = popup; } #if 0 @@ -633,22 +607,44 @@ _option_cb(void *data, Evas_Object *obj, void *event_info) static Evas_Object * _popup_create(Evas_Object *parent, AppData *appdata) { - Evas_Object *popup = elm_popup_add(parent); - elm_object_part_text_set(popup, "title,text", "EFL Typers Menu"); - elm_popup_item_append(popup, "Start", NULL, _game_start_cb, + Evas_Object *notify = elm_notify_add(parent); + elm_notify_align_set(notify, 0.5, 0.5); + evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(notify, EVAS_HINT_FILL, EVAS_HINT_FILL); + + Evas_Object *box = elm_box_add(notify); + elm_box_padding_set(box, ELM_SCALE_SIZE(10), ELM_SCALE_SIZE(10)); + 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); + evas_object_show(box); + + Evas_Object *label = elm_label_add(box); + elm_object_text_set(label, "EFL Typers Menu"); + evas_object_show(label); + elm_box_pack_end(box, label); + + Evas_Object *list = elm_list_add(box); + elm_list_mode_set(list, ELM_LIST_EXPAND); + elm_scroller_policy_set(list, ELM_SCROLLER_POLICY_OFF, + ELM_SCROLLER_POLICY_OFF); + evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_list_item_append(list, "Start", NULL, NULL, _game_start_cb, appdata); -// Elm_Object_Item *it; -// it = elm_popup_item_append(popup, "Option", NULL, _option_cb, NULL); -// elm_object_item_disabled_set(it, EINA_TRUE); -// it = elm_popup_item_append(popup, "Ranking", NULL, _top_ranking_cb, NULL); -// elm_object_item_disabled_set(it, EINA_TRUE); - elm_popup_item_append(popup, "Credits", NULL, _credit_cb, appdata); - - elm_popup_item_append(popup, "Exit", NULL, _game_exit_cb, appdata); - //FIXME: It doesn't work - elm_object_scroll_hold_push(popup); - evas_object_show(popup); - return popup; + elm_list_item_append(list, "About", NULL, NULL, _about_cb, appdata); + + elm_list_item_append(list, "Exit", NULL, NULL, _game_exit_cb, appdata); + + elm_list_go(list); + evas_object_show(list); + + elm_box_pack_end(box, list); + + elm_object_content_set(notify, box); + + evas_object_show(notify); + + return notify; } static void @@ -695,6 +691,18 @@ _pause_or_resume(AppData *appdata) appdata->state = Paused; _pause(appdata); } + else if (appdata->state == SubPopup) + { + evas_object_del(appdata->popup); + appdata->popup = NULL; + } + else if (appdata->state == SubPopup2) + { + evas_object_del(appdata->popup); + appdata->popup = NULL; + appdata->state = Paused; + } + _popup(appdata); } @@ -704,8 +712,7 @@ _key_down_cb(void *data, int type, void *event_info) Ecore_Event_Key *event = event_info; AppData *appdata = data; - if ((appdata->state == Ready) || (appdata->state == SubPopup)) - return ECORE_CALLBACK_PASS_ON; + if (appdata->state == Ready) return ECORE_CALLBACK_PASS_ON; //When input is "return" as well as "space" then it tries to kill the enemies //also. @@ -724,7 +731,9 @@ _key_down_cb(void *data, int type, void *event_info) else if (!strcmp(event->keyname, "Escape")) { if (appdata->state == GameOver) - _game_reset(appdata); + { + _game_reset(appdata); + } _pause_or_resume(appdata); return ECORE_CALLBACK_DONE; } @@ -750,18 +759,15 @@ _win_create(AppData *appdata) { //Create a window Evas_Object *win = elm_win_add(NULL, "EFL Typers", ELM_WIN_BASIC); - elm_win_title_set(win, "EFL Typers"); + elm_win_title_set(win, "EFL Typers v1.0"); elm_win_autodel_set(win, EINA_TRUE); elm_win_focus_highlight_enabled_set(win, EINA_FALSE); evas_object_smart_callback_add(win, "delete,request", _win_del, appdata); - evas_object_resize(win, DEFAULT_WIN_W, DEFAULT_WIN_H); - evas_object_show(win); - evas_object_event_callback_add(win, EVAS_CALLBACK_RESIZE, - _win_resize, appdata); //Fix the window size Evas_Object *rect = evas_object_rectangle_add(evas_object_evas_get(win)); evas_object_size_hint_min_set(rect, DEFAULT_WIN_W, DEFAULT_WIN_H); + evas_object_size_hint_max_set(rect, DEFAULT_WIN_W, DEFAULT_WIN_H); elm_win_resize_object_add(win, rect); return win; @@ -856,14 +862,11 @@ _reset_defense_wall(AppData *appdata) static void _app_init(AppData *appdata) { - snprintf(EDJE_PATH, sizeof(EDJE_PATH), "%s/theme/etypers.edj", - PACKAGE_DATA_DIR); - ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _key_down_cb, appdata); appdata->words_array = _words_create(); appdata->win = _win_create(appdata); - appdata->ly = _layout_create(appdata->win, EDJE_PATH, "gui"); + appdata->ly = _layout_create(appdata->win); appdata->bx = _box_create(appdata->ly, "enemies"); appdata->entry = _entry_create(appdata->ly, "entry", appdata); appdata->table = _table_create(appdata->ly, "table", appdata); @@ -873,6 +876,12 @@ _app_init(AppData *appdata) appdata->bound_w = DEFAULT_WIN_W; appdata->bound_h = DEFAULT_WIN_H; appdata->animator = ecore_animator_add(_animator_cb, appdata); + + _pause(appdata); + _popup(appdata); + + evas_object_resize(appdata->win, DEFAULT_WIN_W, DEFAULT_WIN_H); + evas_object_show(appdata->win); } static void @@ -894,14 +903,11 @@ int elm_main(int argc, char **argv) _elm_setup(); _app_init(appdata); - _pause(appdata); - _popup(appdata); - - //FIXME: Sometimes window is 0x0 because of popup. Resize window forcely. - evas_object_resize(appdata->win, DEFAULT_WIN_W, DEFAULT_WIN_H); elm_run(); + free(appdata); + return 0; } ELM_MAIN() --