Reset race now activates the 'Select car view'
[apps/native/gear-racing-controller.git] / src / view / view_name_input.c
1 /*
2 * Copyright (c) 2018 Samsung Electronics Co., Ltd.
3 *
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/license/
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "view/view_base.h"
18 #include "view/view_name_input.h"
19 #include "view_manager/view_manager.h"
20 #include "controller/controller_name_input.h"
21 #include <assert.h>
22
23 #include "log.h"
24
25 #define ENTRY_STYLE "DEFAULT='align=center'"
26
27 typedef struct _ss_view_name_input {
28         s_view_base view_base;
29         const char *player_name;
30 } s_view_name_input;
31
32 static s_view_name_input s_info = { {0,}, };
33
34 static void _layout_back_cb(void *data, Evas_Object *obj, void *event_info)
35 {
36         elm_win_lower(view_manager_get_win());
37         controller_name_input_back();
38 }
39
40 static Eina_Bool _validate_player_name(const char * player_name)
41 {
42         if(player_name == NULL || *player_name == '\0')
43                 return false;
44         //TODO: extended validation
45         return true;
46 }
47
48 static void _text_entered(Evas_Object * entry)
49 {
50         elm_object_focus_set(entry, EINA_FALSE);
51         if (elm_entry_is_empty(entry)) {
52                 elm_object_signal_emit(s_info.view_base.view, "player,name,invalidated", "");
53                 return;
54         }
55         const char *player_name = elm_entry_entry_get(entry);
56         if (!_validate_player_name(player_name)) {
57                 //TODO: serve incorrect player_name
58                 elm_object_signal_emit(s_info.view_base.view, "player,name,invalidated", "");
59                 return;
60         }
61         s_info.player_name = player_name;
62         elm_object_signal_emit(s_info.view_base.view, "player,name,validated", "");
63 }
64
65 static void _text_set_cb(void *data, Evas_Object *obj, void *event_info)
66 {
67         _text_entered(obj);
68 }
69
70 static void _keyboard_showed_cb(void *data, Evas_Object *obj, void *event_info)
71 {
72         elm_layout_signal_emit(s_info.view_base.view, "player,name,invalidated", "");
73         elm_layout_signal_emit(s_info.view_base.view, "entry,active", "entry");
74 }
75
76 static void _keyboard_hidden_cb(void *data, Evas_Object *obj, void *event_info)
77 {
78         if (elm_entry_is_empty((Evas_Object*)data)) {
79                 elm_layout_signal_emit(s_info.view_base.view, "entry,inactive", "entry");
80         }
81         _text_entered((Evas_Object*)data);
82 }
83
84 static void _destroy_and_save()
85 {
86         controller_player_name_set(s_info.player_name);
87         evas_object_smart_callback_del(view_manager_get_conform(), "virtualkeypad,state,on", _keyboard_showed_cb);
88         evas_object_smart_callback_del(view_manager_get_conform(), "virtualkeypad,state,off", _keyboard_hidden_cb);
89 }
90
91 static void _ok_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
92 {
93         _destroy_and_save();
94         controller_name_input_next();
95 }
96
97 static void _view_name_input_create_gui(Evas_Object *parent)
98 {
99         s_info.view_base.view = view_base_create_layout(parent, "edje/view_name_input.edj", GRP_MAIN);
100         eext_object_event_callback_add(s_info.view_base.view, EEXT_CALLBACK_BACK, _layout_back_cb, NULL);
101
102         //Creating middle button
103         view_base_create_button(s_info.view_base.view, "button_middle", "Tap to enter text", NULL, "racing_middle", NULL, NULL);
104
105         //Creating entry for player's name
106         Evas_Object *entry = elm_entry_add(parent);
107         if (!entry) {
108                 assert(!"Failed to create entry");
109         }
110         static Elm_Entry_Filter_Limit_Size limit_size = { .max_char_count = PLAYER_NAME_MAX_LEN, .max_byte_count = 0};
111         elm_entry_markup_filter_append(entry, elm_entry_filter_limit_size, &limit_size);
112         elm_entry_single_line_set(entry, EINA_TRUE);
113         elm_entry_text_style_user_push(entry, ENTRY_STYLE);
114         evas_object_smart_callback_add(view_manager_get_conform(), "virtualkeypad,state,on", _keyboard_showed_cb, entry);
115         evas_object_smart_callback_add(view_manager_get_conform(), "virtualkeypad,state,off", _keyboard_hidden_cb, entry);
116         evas_object_smart_callback_add(entry, "activated", _text_set_cb, NULL);
117         elm_layout_content_set(s_info.view_base.view, "entry_placeholder", entry);
118
119         //Creating confirm button
120         view_base_create_button(s_info.view_base.view, "button_ok", "OK", NULL, "racing_bottom",_ok_button_clicked_cb, NULL);
121 }
122
123 static void _show_cb(void)
124 {
125         controller_name_input_init(NULL);
126 }
127
128 static void _hide_cb(void)
129 {
130         controller_name_input_destroy();
131 }
132
133 s_view_base *view_name_input_init(Evas_Object *parent)
134 {
135         s_info.view_base.show_cb = _show_cb;
136         s_info.view_base.hide_cb = _hide_cb;
137
138         _view_name_input_create_gui(parent);
139
140         return &s_info.view_base;
141 }