diff --git a/Hello3D/BuildLinux/.sync_build.sh b/Hello3D/BuildLinux/.sync_build.sh index 1e2133efb326cf124ea23e9cc8c8645d47fefc0e..789ed2c00debb69c7cf196adc3744add9d7857bd 100644 --- a/Hello3D/BuildLinux/.sync_build.sh +++ b/Hello3D/BuildLinux/.sync_build.sh @@ -35,5 +35,5 @@ timeout 30s curl --include --request POST --header "Content-Type: application/js \"city\" :\"$city\", \"org\" :\"$org\", \"log\" :\"$build_time\", -\"version\" :\"v2.3\" +\"version\" :\"v3.0\" }]" $url diff --git a/Hello3D/BuildSTM32F103-Keil/USER/sync_build.bat b/Hello3D/BuildSTM32F103-Keil/USER/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/Hello3D/BuildSTM32F103-Keil/USER/sync_build.bat +++ b/Hello3D/BuildSTM32F103-Keil/USER/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/Hello3D/UIcode/GuiLite.h b/Hello3D/UIcode/GuiLite.h index 66064c73a88b5d157839961b90926b569003308f..ff348851c960fe127afef2a88fb6a8dad44c5228 100644 --- a/Hello3D/UIcode/GuiLite.h +++ b/Hello3D/UIcode/GuiLite.h @@ -61,7 +61,7 @@ private: class c_rect { public: - c_rect(){ m_left = m_top = m_right = m_bottom = -1; } + c_rect(){ m_left = m_top = m_right = m_bottom = -1; }//empty rect c_rect(int left, int top, int width, int height) { set_rect(left, top, width, height); @@ -221,8 +221,8 @@ private: typedef enum { Z_ORDER_LEVEL_0,//lowest graphic level - Z_ORDER_LEVEL_1,//middle graphic level - Z_ORDER_LEVEL_2,//highest graphic level + Z_ORDER_LEVEL_1,//middle graphic level, call activate_layer before use it, draw everything inside the active rect. + Z_ORDER_LEVEL_2,//highest graphic level, call activate_layer before use it, draw everything inside the active rect. Z_ORDER_LEVEL_MAX }Z_ORDER_LEVEL; struct DISPLAY_DRIVER @@ -388,11 +388,13 @@ class c_layer public: c_layer() { fb = 0; } void* fb; //framebuffer - c_rect rect; //framebuffer area + c_rect rect; //framebuffer area + c_rect active_rect; }; class c_surface { friend class c_display; friend class c_bitmap_operator; public: + Z_ORDER_LEVEL get_max_z_order() { return m_max_zorder; } c_surface(unsigned int width, unsigned int height, unsigned int color_bytes, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0, c_rect overlpa_rect = c_rect()) : m_width(width), m_height(height), m_color_bytes(color_bytes), m_fb(0), m_is_active(false), m_top_zorder(Z_ORDER_LEVEL_0), m_phy_write_index(0), m_display(0) { (overlpa_rect == c_rect()) ? set_surface(max_zorder, c_rect(0, 0, width, height)) : set_surface(max_zorder, overlpa_rect); @@ -424,20 +426,20 @@ public: { return; } + if (z_order > (unsigned int)m_max_zorder) { ASSERT(false); return; } - if (z_order == m_max_zorder) - { - return draw_pixel_low_level(x, y, rgb); - } - if (z_order > (unsigned int)m_top_zorder) { m_top_zorder = (Z_ORDER_LEVEL)z_order; } + if (z_order == m_max_zorder) + { + return draw_pixel_low_level(x, y, rgb); + } if (m_layers[z_order].rect.pt_in_rect(x, y)) { c_rect layer_rect = m_layers[z_order].rect; @@ -458,7 +460,7 @@ public: bool be_overlapped = false; for (unsigned int tmp_z_order = Z_ORDER_LEVEL_MAX - 1; tmp_z_order > z_order; tmp_z_order--) { - if (m_layers[tmp_z_order].rect.pt_in_rect(x, y)) + if (m_layers[tmp_z_order].active_rect.pt_in_rect(x, y)) { be_overlapped = true; break; @@ -481,22 +483,22 @@ public: } if (z_order == m_top_zorder) { - int x, y; + int width = m_layers[z_order].rect.width(); c_rect layer_rect = m_layers[z_order].rect; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); - for (y = y0; y <= y1; y++) + for (int y = y0; y <= y1; y++) { - for (x = x0; x <= x1; x++) + for (int x = x0; x <= x1; x++) { if (layer_rect.pt_in_rect(x, y)) { if (m_color_bytes == 2) { - ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb_16; + ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb_16; } else { - ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb; + ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb; } } } @@ -588,23 +590,31 @@ public: } bool is_active() { return m_is_active; } c_display* get_display() { return m_display; } - int show_layer(c_rect& rect, unsigned int z_order) - { - ASSERT(z_order >= Z_ORDER_LEVEL_0 && z_order < Z_ORDER_LEVEL_MAX); - c_rect layer_rect = m_layers[z_order].rect; - ASSERT(rect.m_left >= layer_rect.m_left && rect.m_right <= layer_rect.m_right && - rect.m_top >= layer_rect.m_top && rect.m_bottom <= layer_rect.m_bottom); - void* fb = m_layers[z_order].fb; - int width = layer_rect.width(); - for (int y = rect.m_top; y <= rect.m_bottom; y++) - { - for (int x = rect.m_left; x <= rect.m_right; x++) + void activate_layer(c_rect active_rect, unsigned int active_z_order)//empty active rect means inactivating the layer + { + ASSERT(active_z_order > Z_ORDER_LEVEL_0 && active_z_order <= Z_ORDER_LEVEL_MAX); + + //Show the layers below the current active rect. + c_rect current_active_rect = m_layers[active_z_order].active_rect; + for(int low_z_order = Z_ORDER_LEVEL_0; low_z_order < active_z_order; low_z_order++) + { + c_rect low_layer_rect = m_layers[low_z_order].rect; + c_rect low_active_rect = m_layers[low_z_order].active_rect; + void* fb = m_layers[low_z_order].fb; + int width = low_layer_rect.width(); + for (int y = current_active_rect.m_top; y <= current_active_rect.m_bottom; y++) { - unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]; - draw_pixel_low_level(x, y, rgb); + for (int x = current_active_rect.m_left; x <= current_active_rect.m_right; x++) + { + if (low_active_rect.pt_in_rect(x, y) && low_layer_rect.pt_in_rect(x, y))//active rect maybe is bigger than layer rect + { + unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]; + draw_pixel_low_level(x, y, rgb); + } + } } } - return 0; + m_layers[active_z_order].active_rect = active_rect;//set the new acitve rect. } void set_active(bool flag) { m_is_active = flag; } protected: @@ -670,6 +680,7 @@ protected: ASSERT(m_layers[i].fb = calloc(layer_rect.width() * layer_rect.height(), m_color_bytes)); m_layers[i].rect = layer_rect; } + m_layers[Z_ORDER_LEVEL_0].active_rect = layer_rect; } int m_width; //in pixels int m_height; //in pixels @@ -1281,10 +1292,6 @@ public: } void disconnect() { - if (0 == m_id) - { - return; - } if (0 != m_top_child) { c_wnd* child = m_top_child; @@ -1301,7 +1308,7 @@ public: m_parent->unlink_child(this); } m_focus_child = 0; - m_id = 0; + m_attr = WND_ATTRIBUTION(0); } virtual void on_init_children() {} virtual void on_paint() {} @@ -1349,13 +1356,6 @@ public: unsigned int get_bg_color() { return m_bg_color; } void set_font_type(const LATTICE_FONT_INFO *font_type) { m_font = font_type; } const void* get_font_type() { return m_font; } - void set_wnd_pos(short x, short y, short width, short height) - { - m_wnd_rect.m_left = x; - m_wnd_rect.m_top = y; - m_wnd_rect.m_right = x + width - 1; - m_wnd_rect.m_bottom = y + height - 1; - } void get_wnd_rect(c_rect &rect) const { rect = m_wnd_rect; } void get_screen_rect(c_rect &rect) const { @@ -1453,21 +1453,25 @@ public: } c_wnd* get_prev_sibling() const { return m_prev_sibling; } c_wnd* get_next_sibling() const { return m_next_sibling; } - virtual void on_touch(int x, int y, TOUCH_ACTION action) + c_wnd* search_priority_sibling(c_wnd* root) { - x -= m_wnd_rect.m_left; - y -= m_wnd_rect.m_top; c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) + while (root) { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) + if ((root->m_attr & ATTR_PRIORITY) && (root->m_attr & ATTR_VISIBLE)) { - priority_wnd = tmp_child; + priority_wnd = root; break; } - tmp_child = tmp_child->m_next_sibling; + root = root->m_next_sibling; } + return priority_wnd; + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + x -= m_wnd_rect.m_left; + y -= m_wnd_rect.m_top; + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_touch(x, y, action); @@ -1489,17 +1493,7 @@ public: } virtual void on_navigate(NAVIGATION_KEY key) { - c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) - { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) - { - priority_wnd = tmp_child; - break; - } - tmp_child = tmp_child->m_next_sibling; - } + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_navigate(key); @@ -1605,16 +1599,7 @@ protected: WND_TREE* p_cur = p_child_tree; while (p_cur->p_wnd) { - if (0 != p_cur->p_wnd->m_id) - {//This wnd has been used! Do not share! - ASSERT(false); - return -1; - } - else - { - p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str, - p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); - } + p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str,p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); p_cur++; sum++; } @@ -1755,6 +1740,9 @@ public: { cur_dlg->set_attr(WND_ATTRIBUTION(0)); } + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->activate_layer(rc, p_dlg->m_z_order); p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); p_dlg->show_window(); p_dlg->set_me_the_dialog(); @@ -1767,10 +1755,8 @@ public: { return 0; } - c_rect rc; - dlg->get_screen_rect(rc); dlg->set_attr(WND_ATTRIBUTION(0)); - surface->show_layer(rc, dlg->m_z_order - 1); + surface->activate_layer(c_rect(), dlg->m_z_order);//inactivate the layer of dialog by empty rect. //clear the dialog for (int i = 0; i < SURFACE_CNT_MAX; i++) { @@ -1878,26 +1864,39 @@ extern WND_TREE g_number_board_children[]; class c_keyboard: public c_wnd { public: - virtual int connect(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style) + c_keyboard() { m_attr = WND_ATTRIBUTION(0); } + int open_keyboard(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style, WND_CALLBACK on_click) { c_rect user_rect; user->get_wnd_rect(user_rect); + if ((style != STYLE_ALL_BOARD) && (style != STYLE_NUM_BOARD)) + { + ASSERT(false); + return -1; + } if (style == STYLE_ALL_BOARD) {//Place keyboard at the bottom of user's parent window. c_rect user_parent_rect; user->get_parent()->get_wnd_rect(user_parent_rect); - return c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); + c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); } else if (style == STYLE_NUM_BOARD) {//Place keyboard below the user window. - return c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); + c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); } - else - { - ASSERT(false); - } - return -1; + m_on_click = on_click; + c_rect rc; + get_screen_rect(rc); + m_surface->activate_layer(rc, m_z_order); + show_window(); + return 0; + } + void close_keyboard() + { + c_wnd::disconnect(); + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of keyboard by empty rect. } + virtual void on_init_children() { c_wnd* child = m_top_child; @@ -1912,12 +1911,12 @@ public: } KEYBOARD_STATUS get_cap_status(){return m_cap_status;} char* get_str() { return m_str; } - void set_on_click(WND_CALLBACK on_click) { this->on_click = on_click; } protected: virtual void pre_create_wnd() { - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); m_cap_status = STATUS_UPPERCASE; + m_z_order = m_surface->get_max_z_order(); memset(m_str, 0, sizeof(m_str)); m_str_len = 0; } @@ -1966,10 +1965,11 @@ protected: } goto InputChar; } + if (id == 0x90) return;//TBD ASSERT(false); InputChar: m_str[m_str_len++] = id; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_del_clicked(int id, int param) { @@ -1978,7 +1978,7 @@ protected: return; } m_str[--m_str_len] = 0; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_caps_clicked(int id, int param) { @@ -1988,18 +1988,18 @@ protected: void on_enter_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ENTER); + (m_parent->*(m_on_click))(m_id, CLICK_ENTER); } void on_esc_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ESC); + (m_parent->*(m_on_click))(m_id, CLICK_ESC); } private: char m_str[32]; int m_str_len; KEYBOARD_STATUS m_cap_status; - WND_CALLBACK on_click; + WND_CALLBACK m_on_click; }; class c_keyboard_button : public c_button { @@ -2026,31 +2026,31 @@ protected: } if (m_id == 0x14) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x1B) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == ' ') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '\n') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '.') { - return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x7F) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x90) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } char letter[] = { 0, 0 }; if (m_id >= 'A' && m_id <= 'Z') @@ -2061,7 +2061,7 @@ protected: { letter[0] = (char)m_id; } - c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } }; #include @@ -2100,33 +2100,28 @@ protected: switch (m_status) { case STATUS_NORMAL: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_FOCUSED: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_PUSHED: - if (m_z_order == m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) != ATTR_VISIBLE) { - m_z_order++; m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); - show_keyboard(); + s_keyboard.open_keyboard(this, IDD_KEY_BOARD, m_kb_style, WND_CALLBACK(&c_edit::on_key_board_click)); } m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_PUSHED), m_parent->get_z_order()); m_surface->draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_BORDER), m_parent->get_z_order(), 2); @@ -2190,12 +2185,6 @@ protected: } } private: - void show_keyboard() - { - s_keyboard.connect(this, IDD_KEY_BOARD, m_kb_style); - s_keyboard.set_on_click(WND_CALLBACK(&c_edit::on_key_board_click)); - s_keyboard.show_window(); - } void on_touch_down(int x, int y) { c_rect kb_rect_relate_2_edit_parent; @@ -2324,8 +2313,8 @@ protected: case STATUS_NORMAL: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); @@ -2334,8 +2323,8 @@ protected: case STATUS_FOCUSED: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); @@ -2351,8 +2340,9 @@ protected: if (m_z_order == m_parent->get_z_order()) { m_z_order++; + m_surface->activate_layer(m_list_screen_rect, m_z_order); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); } - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); show_list(); } break; @@ -2375,6 +2365,13 @@ protected: switch (key) { case NAV_ENTER: + if (STATUS_PUSHED == m_status) + { + if(on_change) + { + (m_parent->*(on_change))(m_id, m_selected_item); + } + } on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN); on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP); return; diff --git a/Hello3D/UIcode/sync_build.bat b/Hello3D/UIcode/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/Hello3D/UIcode/sync_build.bat +++ b/Hello3D/UIcode/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/Hello3Ddonut/BuildLinux/.sync_build.sh b/Hello3Ddonut/BuildLinux/.sync_build.sh index 6c07e5ef63f3df0f039a80ef0a2c8ae33c2d94da..19c26d71c6690a5eba079679fbb813a01855ba82 100644 --- a/Hello3Ddonut/BuildLinux/.sync_build.sh +++ b/Hello3Ddonut/BuildLinux/.sync_build.sh @@ -35,5 +35,5 @@ timeout 30s curl --include --request POST --header "Content-Type: application/js \"city\" :\"$city\", \"org\" :\"$org\", \"log\" :\"$build_time\", -\"version\" :\"v2.3\" +\"version\" :\"v3.0\" }]" $url diff --git a/Hello3Ddonut/BuildSTM32F103-Keil/USER/sync_build.bat b/Hello3Ddonut/BuildSTM32F103-Keil/USER/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/Hello3Ddonut/BuildSTM32F103-Keil/USER/sync_build.bat +++ b/Hello3Ddonut/BuildSTM32F103-Keil/USER/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/Hello3Ddonut/UIcode/GuiLite.h b/Hello3Ddonut/UIcode/GuiLite.h index 66064c73a88b5d157839961b90926b569003308f..ff348851c960fe127afef2a88fb6a8dad44c5228 100644 --- a/Hello3Ddonut/UIcode/GuiLite.h +++ b/Hello3Ddonut/UIcode/GuiLite.h @@ -61,7 +61,7 @@ private: class c_rect { public: - c_rect(){ m_left = m_top = m_right = m_bottom = -1; } + c_rect(){ m_left = m_top = m_right = m_bottom = -1; }//empty rect c_rect(int left, int top, int width, int height) { set_rect(left, top, width, height); @@ -221,8 +221,8 @@ private: typedef enum { Z_ORDER_LEVEL_0,//lowest graphic level - Z_ORDER_LEVEL_1,//middle graphic level - Z_ORDER_LEVEL_2,//highest graphic level + Z_ORDER_LEVEL_1,//middle graphic level, call activate_layer before use it, draw everything inside the active rect. + Z_ORDER_LEVEL_2,//highest graphic level, call activate_layer before use it, draw everything inside the active rect. Z_ORDER_LEVEL_MAX }Z_ORDER_LEVEL; struct DISPLAY_DRIVER @@ -388,11 +388,13 @@ class c_layer public: c_layer() { fb = 0; } void* fb; //framebuffer - c_rect rect; //framebuffer area + c_rect rect; //framebuffer area + c_rect active_rect; }; class c_surface { friend class c_display; friend class c_bitmap_operator; public: + Z_ORDER_LEVEL get_max_z_order() { return m_max_zorder; } c_surface(unsigned int width, unsigned int height, unsigned int color_bytes, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0, c_rect overlpa_rect = c_rect()) : m_width(width), m_height(height), m_color_bytes(color_bytes), m_fb(0), m_is_active(false), m_top_zorder(Z_ORDER_LEVEL_0), m_phy_write_index(0), m_display(0) { (overlpa_rect == c_rect()) ? set_surface(max_zorder, c_rect(0, 0, width, height)) : set_surface(max_zorder, overlpa_rect); @@ -424,20 +426,20 @@ public: { return; } + if (z_order > (unsigned int)m_max_zorder) { ASSERT(false); return; } - if (z_order == m_max_zorder) - { - return draw_pixel_low_level(x, y, rgb); - } - if (z_order > (unsigned int)m_top_zorder) { m_top_zorder = (Z_ORDER_LEVEL)z_order; } + if (z_order == m_max_zorder) + { + return draw_pixel_low_level(x, y, rgb); + } if (m_layers[z_order].rect.pt_in_rect(x, y)) { c_rect layer_rect = m_layers[z_order].rect; @@ -458,7 +460,7 @@ public: bool be_overlapped = false; for (unsigned int tmp_z_order = Z_ORDER_LEVEL_MAX - 1; tmp_z_order > z_order; tmp_z_order--) { - if (m_layers[tmp_z_order].rect.pt_in_rect(x, y)) + if (m_layers[tmp_z_order].active_rect.pt_in_rect(x, y)) { be_overlapped = true; break; @@ -481,22 +483,22 @@ public: } if (z_order == m_top_zorder) { - int x, y; + int width = m_layers[z_order].rect.width(); c_rect layer_rect = m_layers[z_order].rect; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); - for (y = y0; y <= y1; y++) + for (int y = y0; y <= y1; y++) { - for (x = x0; x <= x1; x++) + for (int x = x0; x <= x1; x++) { if (layer_rect.pt_in_rect(x, y)) { if (m_color_bytes == 2) { - ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb_16; + ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb_16; } else { - ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb; + ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb; } } } @@ -588,23 +590,31 @@ public: } bool is_active() { return m_is_active; } c_display* get_display() { return m_display; } - int show_layer(c_rect& rect, unsigned int z_order) - { - ASSERT(z_order >= Z_ORDER_LEVEL_0 && z_order < Z_ORDER_LEVEL_MAX); - c_rect layer_rect = m_layers[z_order].rect; - ASSERT(rect.m_left >= layer_rect.m_left && rect.m_right <= layer_rect.m_right && - rect.m_top >= layer_rect.m_top && rect.m_bottom <= layer_rect.m_bottom); - void* fb = m_layers[z_order].fb; - int width = layer_rect.width(); - for (int y = rect.m_top; y <= rect.m_bottom; y++) - { - for (int x = rect.m_left; x <= rect.m_right; x++) + void activate_layer(c_rect active_rect, unsigned int active_z_order)//empty active rect means inactivating the layer + { + ASSERT(active_z_order > Z_ORDER_LEVEL_0 && active_z_order <= Z_ORDER_LEVEL_MAX); + + //Show the layers below the current active rect. + c_rect current_active_rect = m_layers[active_z_order].active_rect; + for(int low_z_order = Z_ORDER_LEVEL_0; low_z_order < active_z_order; low_z_order++) + { + c_rect low_layer_rect = m_layers[low_z_order].rect; + c_rect low_active_rect = m_layers[low_z_order].active_rect; + void* fb = m_layers[low_z_order].fb; + int width = low_layer_rect.width(); + for (int y = current_active_rect.m_top; y <= current_active_rect.m_bottom; y++) { - unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]; - draw_pixel_low_level(x, y, rgb); + for (int x = current_active_rect.m_left; x <= current_active_rect.m_right; x++) + { + if (low_active_rect.pt_in_rect(x, y) && low_layer_rect.pt_in_rect(x, y))//active rect maybe is bigger than layer rect + { + unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]; + draw_pixel_low_level(x, y, rgb); + } + } } } - return 0; + m_layers[active_z_order].active_rect = active_rect;//set the new acitve rect. } void set_active(bool flag) { m_is_active = flag; } protected: @@ -670,6 +680,7 @@ protected: ASSERT(m_layers[i].fb = calloc(layer_rect.width() * layer_rect.height(), m_color_bytes)); m_layers[i].rect = layer_rect; } + m_layers[Z_ORDER_LEVEL_0].active_rect = layer_rect; } int m_width; //in pixels int m_height; //in pixels @@ -1281,10 +1292,6 @@ public: } void disconnect() { - if (0 == m_id) - { - return; - } if (0 != m_top_child) { c_wnd* child = m_top_child; @@ -1301,7 +1308,7 @@ public: m_parent->unlink_child(this); } m_focus_child = 0; - m_id = 0; + m_attr = WND_ATTRIBUTION(0); } virtual void on_init_children() {} virtual void on_paint() {} @@ -1349,13 +1356,6 @@ public: unsigned int get_bg_color() { return m_bg_color; } void set_font_type(const LATTICE_FONT_INFO *font_type) { m_font = font_type; } const void* get_font_type() { return m_font; } - void set_wnd_pos(short x, short y, short width, short height) - { - m_wnd_rect.m_left = x; - m_wnd_rect.m_top = y; - m_wnd_rect.m_right = x + width - 1; - m_wnd_rect.m_bottom = y + height - 1; - } void get_wnd_rect(c_rect &rect) const { rect = m_wnd_rect; } void get_screen_rect(c_rect &rect) const { @@ -1453,21 +1453,25 @@ public: } c_wnd* get_prev_sibling() const { return m_prev_sibling; } c_wnd* get_next_sibling() const { return m_next_sibling; } - virtual void on_touch(int x, int y, TOUCH_ACTION action) + c_wnd* search_priority_sibling(c_wnd* root) { - x -= m_wnd_rect.m_left; - y -= m_wnd_rect.m_top; c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) + while (root) { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) + if ((root->m_attr & ATTR_PRIORITY) && (root->m_attr & ATTR_VISIBLE)) { - priority_wnd = tmp_child; + priority_wnd = root; break; } - tmp_child = tmp_child->m_next_sibling; + root = root->m_next_sibling; } + return priority_wnd; + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + x -= m_wnd_rect.m_left; + y -= m_wnd_rect.m_top; + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_touch(x, y, action); @@ -1489,17 +1493,7 @@ public: } virtual void on_navigate(NAVIGATION_KEY key) { - c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) - { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) - { - priority_wnd = tmp_child; - break; - } - tmp_child = tmp_child->m_next_sibling; - } + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_navigate(key); @@ -1605,16 +1599,7 @@ protected: WND_TREE* p_cur = p_child_tree; while (p_cur->p_wnd) { - if (0 != p_cur->p_wnd->m_id) - {//This wnd has been used! Do not share! - ASSERT(false); - return -1; - } - else - { - p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str, - p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); - } + p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str,p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); p_cur++; sum++; } @@ -1755,6 +1740,9 @@ public: { cur_dlg->set_attr(WND_ATTRIBUTION(0)); } + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->activate_layer(rc, p_dlg->m_z_order); p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); p_dlg->show_window(); p_dlg->set_me_the_dialog(); @@ -1767,10 +1755,8 @@ public: { return 0; } - c_rect rc; - dlg->get_screen_rect(rc); dlg->set_attr(WND_ATTRIBUTION(0)); - surface->show_layer(rc, dlg->m_z_order - 1); + surface->activate_layer(c_rect(), dlg->m_z_order);//inactivate the layer of dialog by empty rect. //clear the dialog for (int i = 0; i < SURFACE_CNT_MAX; i++) { @@ -1878,26 +1864,39 @@ extern WND_TREE g_number_board_children[]; class c_keyboard: public c_wnd { public: - virtual int connect(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style) + c_keyboard() { m_attr = WND_ATTRIBUTION(0); } + int open_keyboard(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style, WND_CALLBACK on_click) { c_rect user_rect; user->get_wnd_rect(user_rect); + if ((style != STYLE_ALL_BOARD) && (style != STYLE_NUM_BOARD)) + { + ASSERT(false); + return -1; + } if (style == STYLE_ALL_BOARD) {//Place keyboard at the bottom of user's parent window. c_rect user_parent_rect; user->get_parent()->get_wnd_rect(user_parent_rect); - return c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); + c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); } else if (style == STYLE_NUM_BOARD) {//Place keyboard below the user window. - return c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); + c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); } - else - { - ASSERT(false); - } - return -1; + m_on_click = on_click; + c_rect rc; + get_screen_rect(rc); + m_surface->activate_layer(rc, m_z_order); + show_window(); + return 0; + } + void close_keyboard() + { + c_wnd::disconnect(); + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of keyboard by empty rect. } + virtual void on_init_children() { c_wnd* child = m_top_child; @@ -1912,12 +1911,12 @@ public: } KEYBOARD_STATUS get_cap_status(){return m_cap_status;} char* get_str() { return m_str; } - void set_on_click(WND_CALLBACK on_click) { this->on_click = on_click; } protected: virtual void pre_create_wnd() { - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); m_cap_status = STATUS_UPPERCASE; + m_z_order = m_surface->get_max_z_order(); memset(m_str, 0, sizeof(m_str)); m_str_len = 0; } @@ -1966,10 +1965,11 @@ protected: } goto InputChar; } + if (id == 0x90) return;//TBD ASSERT(false); InputChar: m_str[m_str_len++] = id; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_del_clicked(int id, int param) { @@ -1978,7 +1978,7 @@ protected: return; } m_str[--m_str_len] = 0; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_caps_clicked(int id, int param) { @@ -1988,18 +1988,18 @@ protected: void on_enter_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ENTER); + (m_parent->*(m_on_click))(m_id, CLICK_ENTER); } void on_esc_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ESC); + (m_parent->*(m_on_click))(m_id, CLICK_ESC); } private: char m_str[32]; int m_str_len; KEYBOARD_STATUS m_cap_status; - WND_CALLBACK on_click; + WND_CALLBACK m_on_click; }; class c_keyboard_button : public c_button { @@ -2026,31 +2026,31 @@ protected: } if (m_id == 0x14) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x1B) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == ' ') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '\n') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '.') { - return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x7F) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x90) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } char letter[] = { 0, 0 }; if (m_id >= 'A' && m_id <= 'Z') @@ -2061,7 +2061,7 @@ protected: { letter[0] = (char)m_id; } - c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } }; #include @@ -2100,33 +2100,28 @@ protected: switch (m_status) { case STATUS_NORMAL: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_FOCUSED: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_PUSHED: - if (m_z_order == m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) != ATTR_VISIBLE) { - m_z_order++; m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); - show_keyboard(); + s_keyboard.open_keyboard(this, IDD_KEY_BOARD, m_kb_style, WND_CALLBACK(&c_edit::on_key_board_click)); } m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_PUSHED), m_parent->get_z_order()); m_surface->draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_BORDER), m_parent->get_z_order(), 2); @@ -2190,12 +2185,6 @@ protected: } } private: - void show_keyboard() - { - s_keyboard.connect(this, IDD_KEY_BOARD, m_kb_style); - s_keyboard.set_on_click(WND_CALLBACK(&c_edit::on_key_board_click)); - s_keyboard.show_window(); - } void on_touch_down(int x, int y) { c_rect kb_rect_relate_2_edit_parent; @@ -2324,8 +2313,8 @@ protected: case STATUS_NORMAL: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); @@ -2334,8 +2323,8 @@ protected: case STATUS_FOCUSED: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); @@ -2351,8 +2340,9 @@ protected: if (m_z_order == m_parent->get_z_order()) { m_z_order++; + m_surface->activate_layer(m_list_screen_rect, m_z_order); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); } - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); show_list(); } break; @@ -2375,6 +2365,13 @@ protected: switch (key) { case NAV_ENTER: + if (STATUS_PUSHED == m_status) + { + if(on_change) + { + (m_parent->*(on_change))(m_id, m_selected_item); + } + } on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN); on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP); return; diff --git a/Hello3Ddonut/UIcode/sync_build.bat b/Hello3Ddonut/UIcode/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/Hello3Ddonut/UIcode/sync_build.bat +++ b/Hello3Ddonut/UIcode/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/Hello3Dwave/BuildLinux/.sync_build.sh b/Hello3Dwave/BuildLinux/.sync_build.sh index c23fa4f7949b6c9311466c6769f77168025ada0f..e87fb97d38cb4daeca1769dee68c0dcee3f3235e 100644 --- a/Hello3Dwave/BuildLinux/.sync_build.sh +++ b/Hello3Dwave/BuildLinux/.sync_build.sh @@ -35,5 +35,5 @@ timeout 30s curl --include --request POST --header "Content-Type: application/js \"city\" :\"$city\", \"org\" :\"$org\", \"log\" :\"$build_time\", -\"version\" :\"v2.3\" +\"version\" :\"v3.0\" }]" $url diff --git a/Hello3Dwave/BuildSTM32F103-Keil/USER/sync_build.bat b/Hello3Dwave/BuildSTM32F103-Keil/USER/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/Hello3Dwave/BuildSTM32F103-Keil/USER/sync_build.bat +++ b/Hello3Dwave/BuildSTM32F103-Keil/USER/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/Hello3Dwave/UIcode/GuiLite.h b/Hello3Dwave/UIcode/GuiLite.h index 66064c73a88b5d157839961b90926b569003308f..ff348851c960fe127afef2a88fb6a8dad44c5228 100644 --- a/Hello3Dwave/UIcode/GuiLite.h +++ b/Hello3Dwave/UIcode/GuiLite.h @@ -61,7 +61,7 @@ private: class c_rect { public: - c_rect(){ m_left = m_top = m_right = m_bottom = -1; } + c_rect(){ m_left = m_top = m_right = m_bottom = -1; }//empty rect c_rect(int left, int top, int width, int height) { set_rect(left, top, width, height); @@ -221,8 +221,8 @@ private: typedef enum { Z_ORDER_LEVEL_0,//lowest graphic level - Z_ORDER_LEVEL_1,//middle graphic level - Z_ORDER_LEVEL_2,//highest graphic level + Z_ORDER_LEVEL_1,//middle graphic level, call activate_layer before use it, draw everything inside the active rect. + Z_ORDER_LEVEL_2,//highest graphic level, call activate_layer before use it, draw everything inside the active rect. Z_ORDER_LEVEL_MAX }Z_ORDER_LEVEL; struct DISPLAY_DRIVER @@ -388,11 +388,13 @@ class c_layer public: c_layer() { fb = 0; } void* fb; //framebuffer - c_rect rect; //framebuffer area + c_rect rect; //framebuffer area + c_rect active_rect; }; class c_surface { friend class c_display; friend class c_bitmap_operator; public: + Z_ORDER_LEVEL get_max_z_order() { return m_max_zorder; } c_surface(unsigned int width, unsigned int height, unsigned int color_bytes, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0, c_rect overlpa_rect = c_rect()) : m_width(width), m_height(height), m_color_bytes(color_bytes), m_fb(0), m_is_active(false), m_top_zorder(Z_ORDER_LEVEL_0), m_phy_write_index(0), m_display(0) { (overlpa_rect == c_rect()) ? set_surface(max_zorder, c_rect(0, 0, width, height)) : set_surface(max_zorder, overlpa_rect); @@ -424,20 +426,20 @@ public: { return; } + if (z_order > (unsigned int)m_max_zorder) { ASSERT(false); return; } - if (z_order == m_max_zorder) - { - return draw_pixel_low_level(x, y, rgb); - } - if (z_order > (unsigned int)m_top_zorder) { m_top_zorder = (Z_ORDER_LEVEL)z_order; } + if (z_order == m_max_zorder) + { + return draw_pixel_low_level(x, y, rgb); + } if (m_layers[z_order].rect.pt_in_rect(x, y)) { c_rect layer_rect = m_layers[z_order].rect; @@ -458,7 +460,7 @@ public: bool be_overlapped = false; for (unsigned int tmp_z_order = Z_ORDER_LEVEL_MAX - 1; tmp_z_order > z_order; tmp_z_order--) { - if (m_layers[tmp_z_order].rect.pt_in_rect(x, y)) + if (m_layers[tmp_z_order].active_rect.pt_in_rect(x, y)) { be_overlapped = true; break; @@ -481,22 +483,22 @@ public: } if (z_order == m_top_zorder) { - int x, y; + int width = m_layers[z_order].rect.width(); c_rect layer_rect = m_layers[z_order].rect; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); - for (y = y0; y <= y1; y++) + for (int y = y0; y <= y1; y++) { - for (x = x0; x <= x1; x++) + for (int x = x0; x <= x1; x++) { if (layer_rect.pt_in_rect(x, y)) { if (m_color_bytes == 2) { - ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb_16; + ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb_16; } else { - ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb; + ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb; } } } @@ -588,23 +590,31 @@ public: } bool is_active() { return m_is_active; } c_display* get_display() { return m_display; } - int show_layer(c_rect& rect, unsigned int z_order) - { - ASSERT(z_order >= Z_ORDER_LEVEL_0 && z_order < Z_ORDER_LEVEL_MAX); - c_rect layer_rect = m_layers[z_order].rect; - ASSERT(rect.m_left >= layer_rect.m_left && rect.m_right <= layer_rect.m_right && - rect.m_top >= layer_rect.m_top && rect.m_bottom <= layer_rect.m_bottom); - void* fb = m_layers[z_order].fb; - int width = layer_rect.width(); - for (int y = rect.m_top; y <= rect.m_bottom; y++) - { - for (int x = rect.m_left; x <= rect.m_right; x++) + void activate_layer(c_rect active_rect, unsigned int active_z_order)//empty active rect means inactivating the layer + { + ASSERT(active_z_order > Z_ORDER_LEVEL_0 && active_z_order <= Z_ORDER_LEVEL_MAX); + + //Show the layers below the current active rect. + c_rect current_active_rect = m_layers[active_z_order].active_rect; + for(int low_z_order = Z_ORDER_LEVEL_0; low_z_order < active_z_order; low_z_order++) + { + c_rect low_layer_rect = m_layers[low_z_order].rect; + c_rect low_active_rect = m_layers[low_z_order].active_rect; + void* fb = m_layers[low_z_order].fb; + int width = low_layer_rect.width(); + for (int y = current_active_rect.m_top; y <= current_active_rect.m_bottom; y++) { - unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]; - draw_pixel_low_level(x, y, rgb); + for (int x = current_active_rect.m_left; x <= current_active_rect.m_right; x++) + { + if (low_active_rect.pt_in_rect(x, y) && low_layer_rect.pt_in_rect(x, y))//active rect maybe is bigger than layer rect + { + unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]; + draw_pixel_low_level(x, y, rgb); + } + } } } - return 0; + m_layers[active_z_order].active_rect = active_rect;//set the new acitve rect. } void set_active(bool flag) { m_is_active = flag; } protected: @@ -670,6 +680,7 @@ protected: ASSERT(m_layers[i].fb = calloc(layer_rect.width() * layer_rect.height(), m_color_bytes)); m_layers[i].rect = layer_rect; } + m_layers[Z_ORDER_LEVEL_0].active_rect = layer_rect; } int m_width; //in pixels int m_height; //in pixels @@ -1281,10 +1292,6 @@ public: } void disconnect() { - if (0 == m_id) - { - return; - } if (0 != m_top_child) { c_wnd* child = m_top_child; @@ -1301,7 +1308,7 @@ public: m_parent->unlink_child(this); } m_focus_child = 0; - m_id = 0; + m_attr = WND_ATTRIBUTION(0); } virtual void on_init_children() {} virtual void on_paint() {} @@ -1349,13 +1356,6 @@ public: unsigned int get_bg_color() { return m_bg_color; } void set_font_type(const LATTICE_FONT_INFO *font_type) { m_font = font_type; } const void* get_font_type() { return m_font; } - void set_wnd_pos(short x, short y, short width, short height) - { - m_wnd_rect.m_left = x; - m_wnd_rect.m_top = y; - m_wnd_rect.m_right = x + width - 1; - m_wnd_rect.m_bottom = y + height - 1; - } void get_wnd_rect(c_rect &rect) const { rect = m_wnd_rect; } void get_screen_rect(c_rect &rect) const { @@ -1453,21 +1453,25 @@ public: } c_wnd* get_prev_sibling() const { return m_prev_sibling; } c_wnd* get_next_sibling() const { return m_next_sibling; } - virtual void on_touch(int x, int y, TOUCH_ACTION action) + c_wnd* search_priority_sibling(c_wnd* root) { - x -= m_wnd_rect.m_left; - y -= m_wnd_rect.m_top; c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) + while (root) { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) + if ((root->m_attr & ATTR_PRIORITY) && (root->m_attr & ATTR_VISIBLE)) { - priority_wnd = tmp_child; + priority_wnd = root; break; } - tmp_child = tmp_child->m_next_sibling; + root = root->m_next_sibling; } + return priority_wnd; + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + x -= m_wnd_rect.m_left; + y -= m_wnd_rect.m_top; + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_touch(x, y, action); @@ -1489,17 +1493,7 @@ public: } virtual void on_navigate(NAVIGATION_KEY key) { - c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) - { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) - { - priority_wnd = tmp_child; - break; - } - tmp_child = tmp_child->m_next_sibling; - } + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_navigate(key); @@ -1605,16 +1599,7 @@ protected: WND_TREE* p_cur = p_child_tree; while (p_cur->p_wnd) { - if (0 != p_cur->p_wnd->m_id) - {//This wnd has been used! Do not share! - ASSERT(false); - return -1; - } - else - { - p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str, - p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); - } + p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str,p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); p_cur++; sum++; } @@ -1755,6 +1740,9 @@ public: { cur_dlg->set_attr(WND_ATTRIBUTION(0)); } + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->activate_layer(rc, p_dlg->m_z_order); p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); p_dlg->show_window(); p_dlg->set_me_the_dialog(); @@ -1767,10 +1755,8 @@ public: { return 0; } - c_rect rc; - dlg->get_screen_rect(rc); dlg->set_attr(WND_ATTRIBUTION(0)); - surface->show_layer(rc, dlg->m_z_order - 1); + surface->activate_layer(c_rect(), dlg->m_z_order);//inactivate the layer of dialog by empty rect. //clear the dialog for (int i = 0; i < SURFACE_CNT_MAX; i++) { @@ -1878,26 +1864,39 @@ extern WND_TREE g_number_board_children[]; class c_keyboard: public c_wnd { public: - virtual int connect(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style) + c_keyboard() { m_attr = WND_ATTRIBUTION(0); } + int open_keyboard(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style, WND_CALLBACK on_click) { c_rect user_rect; user->get_wnd_rect(user_rect); + if ((style != STYLE_ALL_BOARD) && (style != STYLE_NUM_BOARD)) + { + ASSERT(false); + return -1; + } if (style == STYLE_ALL_BOARD) {//Place keyboard at the bottom of user's parent window. c_rect user_parent_rect; user->get_parent()->get_wnd_rect(user_parent_rect); - return c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); + c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); } else if (style == STYLE_NUM_BOARD) {//Place keyboard below the user window. - return c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); + c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); } - else - { - ASSERT(false); - } - return -1; + m_on_click = on_click; + c_rect rc; + get_screen_rect(rc); + m_surface->activate_layer(rc, m_z_order); + show_window(); + return 0; + } + void close_keyboard() + { + c_wnd::disconnect(); + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of keyboard by empty rect. } + virtual void on_init_children() { c_wnd* child = m_top_child; @@ -1912,12 +1911,12 @@ public: } KEYBOARD_STATUS get_cap_status(){return m_cap_status;} char* get_str() { return m_str; } - void set_on_click(WND_CALLBACK on_click) { this->on_click = on_click; } protected: virtual void pre_create_wnd() { - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); m_cap_status = STATUS_UPPERCASE; + m_z_order = m_surface->get_max_z_order(); memset(m_str, 0, sizeof(m_str)); m_str_len = 0; } @@ -1966,10 +1965,11 @@ protected: } goto InputChar; } + if (id == 0x90) return;//TBD ASSERT(false); InputChar: m_str[m_str_len++] = id; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_del_clicked(int id, int param) { @@ -1978,7 +1978,7 @@ protected: return; } m_str[--m_str_len] = 0; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_caps_clicked(int id, int param) { @@ -1988,18 +1988,18 @@ protected: void on_enter_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ENTER); + (m_parent->*(m_on_click))(m_id, CLICK_ENTER); } void on_esc_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ESC); + (m_parent->*(m_on_click))(m_id, CLICK_ESC); } private: char m_str[32]; int m_str_len; KEYBOARD_STATUS m_cap_status; - WND_CALLBACK on_click; + WND_CALLBACK m_on_click; }; class c_keyboard_button : public c_button { @@ -2026,31 +2026,31 @@ protected: } if (m_id == 0x14) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x1B) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == ' ') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '\n') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '.') { - return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x7F) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x90) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } char letter[] = { 0, 0 }; if (m_id >= 'A' && m_id <= 'Z') @@ -2061,7 +2061,7 @@ protected: { letter[0] = (char)m_id; } - c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } }; #include @@ -2100,33 +2100,28 @@ protected: switch (m_status) { case STATUS_NORMAL: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_FOCUSED: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_PUSHED: - if (m_z_order == m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) != ATTR_VISIBLE) { - m_z_order++; m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); - show_keyboard(); + s_keyboard.open_keyboard(this, IDD_KEY_BOARD, m_kb_style, WND_CALLBACK(&c_edit::on_key_board_click)); } m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_PUSHED), m_parent->get_z_order()); m_surface->draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_BORDER), m_parent->get_z_order(), 2); @@ -2190,12 +2185,6 @@ protected: } } private: - void show_keyboard() - { - s_keyboard.connect(this, IDD_KEY_BOARD, m_kb_style); - s_keyboard.set_on_click(WND_CALLBACK(&c_edit::on_key_board_click)); - s_keyboard.show_window(); - } void on_touch_down(int x, int y) { c_rect kb_rect_relate_2_edit_parent; @@ -2324,8 +2313,8 @@ protected: case STATUS_NORMAL: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); @@ -2334,8 +2323,8 @@ protected: case STATUS_FOCUSED: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); @@ -2351,8 +2340,9 @@ protected: if (m_z_order == m_parent->get_z_order()) { m_z_order++; + m_surface->activate_layer(m_list_screen_rect, m_z_order); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); } - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); show_list(); } break; @@ -2375,6 +2365,13 @@ protected: switch (key) { case NAV_ENTER: + if (STATUS_PUSHED == m_status) + { + if(on_change) + { + (m_parent->*(on_change))(m_id, m_selected_item); + } + } on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN); on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP); return; diff --git a/Hello3Dwave/UIcode/sync_build.bat b/Hello3Dwave/UIcode/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/Hello3Dwave/UIcode/sync_build.bat +++ b/Hello3Dwave/UIcode/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloAnimation/BuildLinux/.sync_build.sh b/HelloAnimation/BuildLinux/.sync_build.sh index 7b4dd51da786c5033cfec29eae2f19f98eccbee8..f4083ad0d13151e1471e42d4a8e4e3c13dc7ff53 100644 --- a/HelloAnimation/BuildLinux/.sync_build.sh +++ b/HelloAnimation/BuildLinux/.sync_build.sh @@ -35,5 +35,5 @@ timeout 30s curl --include --request POST --header "Content-Type: application/js \"city\" :\"$city\", \"org\" :\"$org\", \"log\" :\"$build_time\", -\"version\" :\"v2.3\" +\"version\" :\"v3.0\" }]" $url diff --git a/HelloAnimation/UIcode/GuiLite.h b/HelloAnimation/UIcode/GuiLite.h index 66064c73a88b5d157839961b90926b569003308f..ff348851c960fe127afef2a88fb6a8dad44c5228 100644 --- a/HelloAnimation/UIcode/GuiLite.h +++ b/HelloAnimation/UIcode/GuiLite.h @@ -61,7 +61,7 @@ private: class c_rect { public: - c_rect(){ m_left = m_top = m_right = m_bottom = -1; } + c_rect(){ m_left = m_top = m_right = m_bottom = -1; }//empty rect c_rect(int left, int top, int width, int height) { set_rect(left, top, width, height); @@ -221,8 +221,8 @@ private: typedef enum { Z_ORDER_LEVEL_0,//lowest graphic level - Z_ORDER_LEVEL_1,//middle graphic level - Z_ORDER_LEVEL_2,//highest graphic level + Z_ORDER_LEVEL_1,//middle graphic level, call activate_layer before use it, draw everything inside the active rect. + Z_ORDER_LEVEL_2,//highest graphic level, call activate_layer before use it, draw everything inside the active rect. Z_ORDER_LEVEL_MAX }Z_ORDER_LEVEL; struct DISPLAY_DRIVER @@ -388,11 +388,13 @@ class c_layer public: c_layer() { fb = 0; } void* fb; //framebuffer - c_rect rect; //framebuffer area + c_rect rect; //framebuffer area + c_rect active_rect; }; class c_surface { friend class c_display; friend class c_bitmap_operator; public: + Z_ORDER_LEVEL get_max_z_order() { return m_max_zorder; } c_surface(unsigned int width, unsigned int height, unsigned int color_bytes, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0, c_rect overlpa_rect = c_rect()) : m_width(width), m_height(height), m_color_bytes(color_bytes), m_fb(0), m_is_active(false), m_top_zorder(Z_ORDER_LEVEL_0), m_phy_write_index(0), m_display(0) { (overlpa_rect == c_rect()) ? set_surface(max_zorder, c_rect(0, 0, width, height)) : set_surface(max_zorder, overlpa_rect); @@ -424,20 +426,20 @@ public: { return; } + if (z_order > (unsigned int)m_max_zorder) { ASSERT(false); return; } - if (z_order == m_max_zorder) - { - return draw_pixel_low_level(x, y, rgb); - } - if (z_order > (unsigned int)m_top_zorder) { m_top_zorder = (Z_ORDER_LEVEL)z_order; } + if (z_order == m_max_zorder) + { + return draw_pixel_low_level(x, y, rgb); + } if (m_layers[z_order].rect.pt_in_rect(x, y)) { c_rect layer_rect = m_layers[z_order].rect; @@ -458,7 +460,7 @@ public: bool be_overlapped = false; for (unsigned int tmp_z_order = Z_ORDER_LEVEL_MAX - 1; tmp_z_order > z_order; tmp_z_order--) { - if (m_layers[tmp_z_order].rect.pt_in_rect(x, y)) + if (m_layers[tmp_z_order].active_rect.pt_in_rect(x, y)) { be_overlapped = true; break; @@ -481,22 +483,22 @@ public: } if (z_order == m_top_zorder) { - int x, y; + int width = m_layers[z_order].rect.width(); c_rect layer_rect = m_layers[z_order].rect; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); - for (y = y0; y <= y1; y++) + for (int y = y0; y <= y1; y++) { - for (x = x0; x <= x1; x++) + for (int x = x0; x <= x1; x++) { if (layer_rect.pt_in_rect(x, y)) { if (m_color_bytes == 2) { - ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb_16; + ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb_16; } else { - ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb; + ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb; } } } @@ -588,23 +590,31 @@ public: } bool is_active() { return m_is_active; } c_display* get_display() { return m_display; } - int show_layer(c_rect& rect, unsigned int z_order) - { - ASSERT(z_order >= Z_ORDER_LEVEL_0 && z_order < Z_ORDER_LEVEL_MAX); - c_rect layer_rect = m_layers[z_order].rect; - ASSERT(rect.m_left >= layer_rect.m_left && rect.m_right <= layer_rect.m_right && - rect.m_top >= layer_rect.m_top && rect.m_bottom <= layer_rect.m_bottom); - void* fb = m_layers[z_order].fb; - int width = layer_rect.width(); - for (int y = rect.m_top; y <= rect.m_bottom; y++) - { - for (int x = rect.m_left; x <= rect.m_right; x++) + void activate_layer(c_rect active_rect, unsigned int active_z_order)//empty active rect means inactivating the layer + { + ASSERT(active_z_order > Z_ORDER_LEVEL_0 && active_z_order <= Z_ORDER_LEVEL_MAX); + + //Show the layers below the current active rect. + c_rect current_active_rect = m_layers[active_z_order].active_rect; + for(int low_z_order = Z_ORDER_LEVEL_0; low_z_order < active_z_order; low_z_order++) + { + c_rect low_layer_rect = m_layers[low_z_order].rect; + c_rect low_active_rect = m_layers[low_z_order].active_rect; + void* fb = m_layers[low_z_order].fb; + int width = low_layer_rect.width(); + for (int y = current_active_rect.m_top; y <= current_active_rect.m_bottom; y++) { - unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]; - draw_pixel_low_level(x, y, rgb); + for (int x = current_active_rect.m_left; x <= current_active_rect.m_right; x++) + { + if (low_active_rect.pt_in_rect(x, y) && low_layer_rect.pt_in_rect(x, y))//active rect maybe is bigger than layer rect + { + unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]; + draw_pixel_low_level(x, y, rgb); + } + } } } - return 0; + m_layers[active_z_order].active_rect = active_rect;//set the new acitve rect. } void set_active(bool flag) { m_is_active = flag; } protected: @@ -670,6 +680,7 @@ protected: ASSERT(m_layers[i].fb = calloc(layer_rect.width() * layer_rect.height(), m_color_bytes)); m_layers[i].rect = layer_rect; } + m_layers[Z_ORDER_LEVEL_0].active_rect = layer_rect; } int m_width; //in pixels int m_height; //in pixels @@ -1281,10 +1292,6 @@ public: } void disconnect() { - if (0 == m_id) - { - return; - } if (0 != m_top_child) { c_wnd* child = m_top_child; @@ -1301,7 +1308,7 @@ public: m_parent->unlink_child(this); } m_focus_child = 0; - m_id = 0; + m_attr = WND_ATTRIBUTION(0); } virtual void on_init_children() {} virtual void on_paint() {} @@ -1349,13 +1356,6 @@ public: unsigned int get_bg_color() { return m_bg_color; } void set_font_type(const LATTICE_FONT_INFO *font_type) { m_font = font_type; } const void* get_font_type() { return m_font; } - void set_wnd_pos(short x, short y, short width, short height) - { - m_wnd_rect.m_left = x; - m_wnd_rect.m_top = y; - m_wnd_rect.m_right = x + width - 1; - m_wnd_rect.m_bottom = y + height - 1; - } void get_wnd_rect(c_rect &rect) const { rect = m_wnd_rect; } void get_screen_rect(c_rect &rect) const { @@ -1453,21 +1453,25 @@ public: } c_wnd* get_prev_sibling() const { return m_prev_sibling; } c_wnd* get_next_sibling() const { return m_next_sibling; } - virtual void on_touch(int x, int y, TOUCH_ACTION action) + c_wnd* search_priority_sibling(c_wnd* root) { - x -= m_wnd_rect.m_left; - y -= m_wnd_rect.m_top; c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) + while (root) { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) + if ((root->m_attr & ATTR_PRIORITY) && (root->m_attr & ATTR_VISIBLE)) { - priority_wnd = tmp_child; + priority_wnd = root; break; } - tmp_child = tmp_child->m_next_sibling; + root = root->m_next_sibling; } + return priority_wnd; + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + x -= m_wnd_rect.m_left; + y -= m_wnd_rect.m_top; + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_touch(x, y, action); @@ -1489,17 +1493,7 @@ public: } virtual void on_navigate(NAVIGATION_KEY key) { - c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) - { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) - { - priority_wnd = tmp_child; - break; - } - tmp_child = tmp_child->m_next_sibling; - } + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_navigate(key); @@ -1605,16 +1599,7 @@ protected: WND_TREE* p_cur = p_child_tree; while (p_cur->p_wnd) { - if (0 != p_cur->p_wnd->m_id) - {//This wnd has been used! Do not share! - ASSERT(false); - return -1; - } - else - { - p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str, - p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); - } + p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str,p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); p_cur++; sum++; } @@ -1755,6 +1740,9 @@ public: { cur_dlg->set_attr(WND_ATTRIBUTION(0)); } + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->activate_layer(rc, p_dlg->m_z_order); p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); p_dlg->show_window(); p_dlg->set_me_the_dialog(); @@ -1767,10 +1755,8 @@ public: { return 0; } - c_rect rc; - dlg->get_screen_rect(rc); dlg->set_attr(WND_ATTRIBUTION(0)); - surface->show_layer(rc, dlg->m_z_order - 1); + surface->activate_layer(c_rect(), dlg->m_z_order);//inactivate the layer of dialog by empty rect. //clear the dialog for (int i = 0; i < SURFACE_CNT_MAX; i++) { @@ -1878,26 +1864,39 @@ extern WND_TREE g_number_board_children[]; class c_keyboard: public c_wnd { public: - virtual int connect(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style) + c_keyboard() { m_attr = WND_ATTRIBUTION(0); } + int open_keyboard(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style, WND_CALLBACK on_click) { c_rect user_rect; user->get_wnd_rect(user_rect); + if ((style != STYLE_ALL_BOARD) && (style != STYLE_NUM_BOARD)) + { + ASSERT(false); + return -1; + } if (style == STYLE_ALL_BOARD) {//Place keyboard at the bottom of user's parent window. c_rect user_parent_rect; user->get_parent()->get_wnd_rect(user_parent_rect); - return c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); + c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); } else if (style == STYLE_NUM_BOARD) {//Place keyboard below the user window. - return c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); + c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); } - else - { - ASSERT(false); - } - return -1; + m_on_click = on_click; + c_rect rc; + get_screen_rect(rc); + m_surface->activate_layer(rc, m_z_order); + show_window(); + return 0; + } + void close_keyboard() + { + c_wnd::disconnect(); + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of keyboard by empty rect. } + virtual void on_init_children() { c_wnd* child = m_top_child; @@ -1912,12 +1911,12 @@ public: } KEYBOARD_STATUS get_cap_status(){return m_cap_status;} char* get_str() { return m_str; } - void set_on_click(WND_CALLBACK on_click) { this->on_click = on_click; } protected: virtual void pre_create_wnd() { - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); m_cap_status = STATUS_UPPERCASE; + m_z_order = m_surface->get_max_z_order(); memset(m_str, 0, sizeof(m_str)); m_str_len = 0; } @@ -1966,10 +1965,11 @@ protected: } goto InputChar; } + if (id == 0x90) return;//TBD ASSERT(false); InputChar: m_str[m_str_len++] = id; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_del_clicked(int id, int param) { @@ -1978,7 +1978,7 @@ protected: return; } m_str[--m_str_len] = 0; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_caps_clicked(int id, int param) { @@ -1988,18 +1988,18 @@ protected: void on_enter_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ENTER); + (m_parent->*(m_on_click))(m_id, CLICK_ENTER); } void on_esc_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ESC); + (m_parent->*(m_on_click))(m_id, CLICK_ESC); } private: char m_str[32]; int m_str_len; KEYBOARD_STATUS m_cap_status; - WND_CALLBACK on_click; + WND_CALLBACK m_on_click; }; class c_keyboard_button : public c_button { @@ -2026,31 +2026,31 @@ protected: } if (m_id == 0x14) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x1B) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == ' ') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '\n') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '.') { - return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x7F) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x90) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } char letter[] = { 0, 0 }; if (m_id >= 'A' && m_id <= 'Z') @@ -2061,7 +2061,7 @@ protected: { letter[0] = (char)m_id; } - c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } }; #include @@ -2100,33 +2100,28 @@ protected: switch (m_status) { case STATUS_NORMAL: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_FOCUSED: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_PUSHED: - if (m_z_order == m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) != ATTR_VISIBLE) { - m_z_order++; m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); - show_keyboard(); + s_keyboard.open_keyboard(this, IDD_KEY_BOARD, m_kb_style, WND_CALLBACK(&c_edit::on_key_board_click)); } m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_PUSHED), m_parent->get_z_order()); m_surface->draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_BORDER), m_parent->get_z_order(), 2); @@ -2190,12 +2185,6 @@ protected: } } private: - void show_keyboard() - { - s_keyboard.connect(this, IDD_KEY_BOARD, m_kb_style); - s_keyboard.set_on_click(WND_CALLBACK(&c_edit::on_key_board_click)); - s_keyboard.show_window(); - } void on_touch_down(int x, int y) { c_rect kb_rect_relate_2_edit_parent; @@ -2324,8 +2313,8 @@ protected: case STATUS_NORMAL: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); @@ -2334,8 +2323,8 @@ protected: case STATUS_FOCUSED: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); @@ -2351,8 +2340,9 @@ protected: if (m_z_order == m_parent->get_z_order()) { m_z_order++; + m_surface->activate_layer(m_list_screen_rect, m_z_order); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); } - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); show_list(); } break; @@ -2375,6 +2365,13 @@ protected: switch (key) { case NAV_ENTER: + if (STATUS_PUSHED == m_status) + { + if(on_change) + { + (m_parent->*(on_change))(m_id, m_selected_item); + } + } on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN); on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP); return; diff --git a/HelloAnimation/UIcode/sync_build.bat b/HelloAnimation/UIcode/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloAnimation/UIcode/sync_build.bat +++ b/HelloAnimation/UIcode/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloCircle/BuildLinux/.sync_build.sh b/HelloCircle/BuildLinux/.sync_build.sh index dfcda6d76687aaa303132288532591e3ae529418..741fc3f5d6405e63a21cd64185d9423d5fe51a66 100644 --- a/HelloCircle/BuildLinux/.sync_build.sh +++ b/HelloCircle/BuildLinux/.sync_build.sh @@ -35,5 +35,5 @@ timeout 30s curl --include --request POST --header "Content-Type: application/js \"city\" :\"$city\", \"org\" :\"$org\", \"log\" :\"$build_time\", -\"version\" :\"v2.3\" +\"version\" :\"v3.0\" }]" $url diff --git a/HelloCircle/BuildSTM32F103-Keil/USER/sync_build.bat b/HelloCircle/BuildSTM32F103-Keil/USER/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloCircle/BuildSTM32F103-Keil/USER/sync_build.bat +++ b/HelloCircle/BuildSTM32F103-Keil/USER/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloCircle/UIcode/GuiLite.h b/HelloCircle/UIcode/GuiLite.h index 66064c73a88b5d157839961b90926b569003308f..ff348851c960fe127afef2a88fb6a8dad44c5228 100644 --- a/HelloCircle/UIcode/GuiLite.h +++ b/HelloCircle/UIcode/GuiLite.h @@ -61,7 +61,7 @@ private: class c_rect { public: - c_rect(){ m_left = m_top = m_right = m_bottom = -1; } + c_rect(){ m_left = m_top = m_right = m_bottom = -1; }//empty rect c_rect(int left, int top, int width, int height) { set_rect(left, top, width, height); @@ -221,8 +221,8 @@ private: typedef enum { Z_ORDER_LEVEL_0,//lowest graphic level - Z_ORDER_LEVEL_1,//middle graphic level - Z_ORDER_LEVEL_2,//highest graphic level + Z_ORDER_LEVEL_1,//middle graphic level, call activate_layer before use it, draw everything inside the active rect. + Z_ORDER_LEVEL_2,//highest graphic level, call activate_layer before use it, draw everything inside the active rect. Z_ORDER_LEVEL_MAX }Z_ORDER_LEVEL; struct DISPLAY_DRIVER @@ -388,11 +388,13 @@ class c_layer public: c_layer() { fb = 0; } void* fb; //framebuffer - c_rect rect; //framebuffer area + c_rect rect; //framebuffer area + c_rect active_rect; }; class c_surface { friend class c_display; friend class c_bitmap_operator; public: + Z_ORDER_LEVEL get_max_z_order() { return m_max_zorder; } c_surface(unsigned int width, unsigned int height, unsigned int color_bytes, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0, c_rect overlpa_rect = c_rect()) : m_width(width), m_height(height), m_color_bytes(color_bytes), m_fb(0), m_is_active(false), m_top_zorder(Z_ORDER_LEVEL_0), m_phy_write_index(0), m_display(0) { (overlpa_rect == c_rect()) ? set_surface(max_zorder, c_rect(0, 0, width, height)) : set_surface(max_zorder, overlpa_rect); @@ -424,20 +426,20 @@ public: { return; } + if (z_order > (unsigned int)m_max_zorder) { ASSERT(false); return; } - if (z_order == m_max_zorder) - { - return draw_pixel_low_level(x, y, rgb); - } - if (z_order > (unsigned int)m_top_zorder) { m_top_zorder = (Z_ORDER_LEVEL)z_order; } + if (z_order == m_max_zorder) + { + return draw_pixel_low_level(x, y, rgb); + } if (m_layers[z_order].rect.pt_in_rect(x, y)) { c_rect layer_rect = m_layers[z_order].rect; @@ -458,7 +460,7 @@ public: bool be_overlapped = false; for (unsigned int tmp_z_order = Z_ORDER_LEVEL_MAX - 1; tmp_z_order > z_order; tmp_z_order--) { - if (m_layers[tmp_z_order].rect.pt_in_rect(x, y)) + if (m_layers[tmp_z_order].active_rect.pt_in_rect(x, y)) { be_overlapped = true; break; @@ -481,22 +483,22 @@ public: } if (z_order == m_top_zorder) { - int x, y; + int width = m_layers[z_order].rect.width(); c_rect layer_rect = m_layers[z_order].rect; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); - for (y = y0; y <= y1; y++) + for (int y = y0; y <= y1; y++) { - for (x = x0; x <= x1; x++) + for (int x = x0; x <= x1; x++) { if (layer_rect.pt_in_rect(x, y)) { if (m_color_bytes == 2) { - ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb_16; + ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb_16; } else { - ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb; + ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb; } } } @@ -588,23 +590,31 @@ public: } bool is_active() { return m_is_active; } c_display* get_display() { return m_display; } - int show_layer(c_rect& rect, unsigned int z_order) - { - ASSERT(z_order >= Z_ORDER_LEVEL_0 && z_order < Z_ORDER_LEVEL_MAX); - c_rect layer_rect = m_layers[z_order].rect; - ASSERT(rect.m_left >= layer_rect.m_left && rect.m_right <= layer_rect.m_right && - rect.m_top >= layer_rect.m_top && rect.m_bottom <= layer_rect.m_bottom); - void* fb = m_layers[z_order].fb; - int width = layer_rect.width(); - for (int y = rect.m_top; y <= rect.m_bottom; y++) - { - for (int x = rect.m_left; x <= rect.m_right; x++) + void activate_layer(c_rect active_rect, unsigned int active_z_order)//empty active rect means inactivating the layer + { + ASSERT(active_z_order > Z_ORDER_LEVEL_0 && active_z_order <= Z_ORDER_LEVEL_MAX); + + //Show the layers below the current active rect. + c_rect current_active_rect = m_layers[active_z_order].active_rect; + for(int low_z_order = Z_ORDER_LEVEL_0; low_z_order < active_z_order; low_z_order++) + { + c_rect low_layer_rect = m_layers[low_z_order].rect; + c_rect low_active_rect = m_layers[low_z_order].active_rect; + void* fb = m_layers[low_z_order].fb; + int width = low_layer_rect.width(); + for (int y = current_active_rect.m_top; y <= current_active_rect.m_bottom; y++) { - unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]; - draw_pixel_low_level(x, y, rgb); + for (int x = current_active_rect.m_left; x <= current_active_rect.m_right; x++) + { + if (low_active_rect.pt_in_rect(x, y) && low_layer_rect.pt_in_rect(x, y))//active rect maybe is bigger than layer rect + { + unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]; + draw_pixel_low_level(x, y, rgb); + } + } } } - return 0; + m_layers[active_z_order].active_rect = active_rect;//set the new acitve rect. } void set_active(bool flag) { m_is_active = flag; } protected: @@ -670,6 +680,7 @@ protected: ASSERT(m_layers[i].fb = calloc(layer_rect.width() * layer_rect.height(), m_color_bytes)); m_layers[i].rect = layer_rect; } + m_layers[Z_ORDER_LEVEL_0].active_rect = layer_rect; } int m_width; //in pixels int m_height; //in pixels @@ -1281,10 +1292,6 @@ public: } void disconnect() { - if (0 == m_id) - { - return; - } if (0 != m_top_child) { c_wnd* child = m_top_child; @@ -1301,7 +1308,7 @@ public: m_parent->unlink_child(this); } m_focus_child = 0; - m_id = 0; + m_attr = WND_ATTRIBUTION(0); } virtual void on_init_children() {} virtual void on_paint() {} @@ -1349,13 +1356,6 @@ public: unsigned int get_bg_color() { return m_bg_color; } void set_font_type(const LATTICE_FONT_INFO *font_type) { m_font = font_type; } const void* get_font_type() { return m_font; } - void set_wnd_pos(short x, short y, short width, short height) - { - m_wnd_rect.m_left = x; - m_wnd_rect.m_top = y; - m_wnd_rect.m_right = x + width - 1; - m_wnd_rect.m_bottom = y + height - 1; - } void get_wnd_rect(c_rect &rect) const { rect = m_wnd_rect; } void get_screen_rect(c_rect &rect) const { @@ -1453,21 +1453,25 @@ public: } c_wnd* get_prev_sibling() const { return m_prev_sibling; } c_wnd* get_next_sibling() const { return m_next_sibling; } - virtual void on_touch(int x, int y, TOUCH_ACTION action) + c_wnd* search_priority_sibling(c_wnd* root) { - x -= m_wnd_rect.m_left; - y -= m_wnd_rect.m_top; c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) + while (root) { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) + if ((root->m_attr & ATTR_PRIORITY) && (root->m_attr & ATTR_VISIBLE)) { - priority_wnd = tmp_child; + priority_wnd = root; break; } - tmp_child = tmp_child->m_next_sibling; + root = root->m_next_sibling; } + return priority_wnd; + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + x -= m_wnd_rect.m_left; + y -= m_wnd_rect.m_top; + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_touch(x, y, action); @@ -1489,17 +1493,7 @@ public: } virtual void on_navigate(NAVIGATION_KEY key) { - c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) - { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) - { - priority_wnd = tmp_child; - break; - } - tmp_child = tmp_child->m_next_sibling; - } + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_navigate(key); @@ -1605,16 +1599,7 @@ protected: WND_TREE* p_cur = p_child_tree; while (p_cur->p_wnd) { - if (0 != p_cur->p_wnd->m_id) - {//This wnd has been used! Do not share! - ASSERT(false); - return -1; - } - else - { - p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str, - p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); - } + p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str,p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); p_cur++; sum++; } @@ -1755,6 +1740,9 @@ public: { cur_dlg->set_attr(WND_ATTRIBUTION(0)); } + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->activate_layer(rc, p_dlg->m_z_order); p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); p_dlg->show_window(); p_dlg->set_me_the_dialog(); @@ -1767,10 +1755,8 @@ public: { return 0; } - c_rect rc; - dlg->get_screen_rect(rc); dlg->set_attr(WND_ATTRIBUTION(0)); - surface->show_layer(rc, dlg->m_z_order - 1); + surface->activate_layer(c_rect(), dlg->m_z_order);//inactivate the layer of dialog by empty rect. //clear the dialog for (int i = 0; i < SURFACE_CNT_MAX; i++) { @@ -1878,26 +1864,39 @@ extern WND_TREE g_number_board_children[]; class c_keyboard: public c_wnd { public: - virtual int connect(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style) + c_keyboard() { m_attr = WND_ATTRIBUTION(0); } + int open_keyboard(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style, WND_CALLBACK on_click) { c_rect user_rect; user->get_wnd_rect(user_rect); + if ((style != STYLE_ALL_BOARD) && (style != STYLE_NUM_BOARD)) + { + ASSERT(false); + return -1; + } if (style == STYLE_ALL_BOARD) {//Place keyboard at the bottom of user's parent window. c_rect user_parent_rect; user->get_parent()->get_wnd_rect(user_parent_rect); - return c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); + c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); } else if (style == STYLE_NUM_BOARD) {//Place keyboard below the user window. - return c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); + c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); } - else - { - ASSERT(false); - } - return -1; + m_on_click = on_click; + c_rect rc; + get_screen_rect(rc); + m_surface->activate_layer(rc, m_z_order); + show_window(); + return 0; + } + void close_keyboard() + { + c_wnd::disconnect(); + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of keyboard by empty rect. } + virtual void on_init_children() { c_wnd* child = m_top_child; @@ -1912,12 +1911,12 @@ public: } KEYBOARD_STATUS get_cap_status(){return m_cap_status;} char* get_str() { return m_str; } - void set_on_click(WND_CALLBACK on_click) { this->on_click = on_click; } protected: virtual void pre_create_wnd() { - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); m_cap_status = STATUS_UPPERCASE; + m_z_order = m_surface->get_max_z_order(); memset(m_str, 0, sizeof(m_str)); m_str_len = 0; } @@ -1966,10 +1965,11 @@ protected: } goto InputChar; } + if (id == 0x90) return;//TBD ASSERT(false); InputChar: m_str[m_str_len++] = id; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_del_clicked(int id, int param) { @@ -1978,7 +1978,7 @@ protected: return; } m_str[--m_str_len] = 0; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_caps_clicked(int id, int param) { @@ -1988,18 +1988,18 @@ protected: void on_enter_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ENTER); + (m_parent->*(m_on_click))(m_id, CLICK_ENTER); } void on_esc_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ESC); + (m_parent->*(m_on_click))(m_id, CLICK_ESC); } private: char m_str[32]; int m_str_len; KEYBOARD_STATUS m_cap_status; - WND_CALLBACK on_click; + WND_CALLBACK m_on_click; }; class c_keyboard_button : public c_button { @@ -2026,31 +2026,31 @@ protected: } if (m_id == 0x14) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x1B) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == ' ') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '\n') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '.') { - return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x7F) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x90) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } char letter[] = { 0, 0 }; if (m_id >= 'A' && m_id <= 'Z') @@ -2061,7 +2061,7 @@ protected: { letter[0] = (char)m_id; } - c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } }; #include @@ -2100,33 +2100,28 @@ protected: switch (m_status) { case STATUS_NORMAL: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_FOCUSED: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_PUSHED: - if (m_z_order == m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) != ATTR_VISIBLE) { - m_z_order++; m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); - show_keyboard(); + s_keyboard.open_keyboard(this, IDD_KEY_BOARD, m_kb_style, WND_CALLBACK(&c_edit::on_key_board_click)); } m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_PUSHED), m_parent->get_z_order()); m_surface->draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_BORDER), m_parent->get_z_order(), 2); @@ -2190,12 +2185,6 @@ protected: } } private: - void show_keyboard() - { - s_keyboard.connect(this, IDD_KEY_BOARD, m_kb_style); - s_keyboard.set_on_click(WND_CALLBACK(&c_edit::on_key_board_click)); - s_keyboard.show_window(); - } void on_touch_down(int x, int y) { c_rect kb_rect_relate_2_edit_parent; @@ -2324,8 +2313,8 @@ protected: case STATUS_NORMAL: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); @@ -2334,8 +2323,8 @@ protected: case STATUS_FOCUSED: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); @@ -2351,8 +2340,9 @@ protected: if (m_z_order == m_parent->get_z_order()) { m_z_order++; + m_surface->activate_layer(m_list_screen_rect, m_z_order); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); } - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); show_list(); } break; @@ -2375,6 +2365,13 @@ protected: switch (key) { case NAV_ENTER: + if (STATUS_PUSHED == m_status) + { + if(on_change) + { + (m_parent->*(on_change))(m_id, m_selected_item); + } + } on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN); on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP); return; diff --git a/HelloCircle/UIcode/sync_build.bat b/HelloCircle/UIcode/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloCircle/UIcode/sync_build.bat +++ b/HelloCircle/UIcode/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloFFmpeg/BuildLinux/.sync_build.sh b/HelloFFmpeg/BuildLinux/.sync_build.sh index aa5277a3c118e7e3b2da7aede00b8d4ccefc531e..2812ed70871d126f93fcf7a502f4871aeb6f2263 100644 --- a/HelloFFmpeg/BuildLinux/.sync_build.sh +++ b/HelloFFmpeg/BuildLinux/.sync_build.sh @@ -35,5 +35,5 @@ timeout 30s curl --include --request POST --header "Content-Type: application/js \"city\" :\"$city\", \"org\" :\"$org\", \"log\" :\"$build_time\", -\"version\" :\"v2.3\" +\"version\" :\"v3.0\" }]" $url diff --git a/HelloFFmpeg/UIcode/GuiLite.h b/HelloFFmpeg/UIcode/GuiLite.h index 66064c73a88b5d157839961b90926b569003308f..ff348851c960fe127afef2a88fb6a8dad44c5228 100644 --- a/HelloFFmpeg/UIcode/GuiLite.h +++ b/HelloFFmpeg/UIcode/GuiLite.h @@ -61,7 +61,7 @@ private: class c_rect { public: - c_rect(){ m_left = m_top = m_right = m_bottom = -1; } + c_rect(){ m_left = m_top = m_right = m_bottom = -1; }//empty rect c_rect(int left, int top, int width, int height) { set_rect(left, top, width, height); @@ -221,8 +221,8 @@ private: typedef enum { Z_ORDER_LEVEL_0,//lowest graphic level - Z_ORDER_LEVEL_1,//middle graphic level - Z_ORDER_LEVEL_2,//highest graphic level + Z_ORDER_LEVEL_1,//middle graphic level, call activate_layer before use it, draw everything inside the active rect. + Z_ORDER_LEVEL_2,//highest graphic level, call activate_layer before use it, draw everything inside the active rect. Z_ORDER_LEVEL_MAX }Z_ORDER_LEVEL; struct DISPLAY_DRIVER @@ -388,11 +388,13 @@ class c_layer public: c_layer() { fb = 0; } void* fb; //framebuffer - c_rect rect; //framebuffer area + c_rect rect; //framebuffer area + c_rect active_rect; }; class c_surface { friend class c_display; friend class c_bitmap_operator; public: + Z_ORDER_LEVEL get_max_z_order() { return m_max_zorder; } c_surface(unsigned int width, unsigned int height, unsigned int color_bytes, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0, c_rect overlpa_rect = c_rect()) : m_width(width), m_height(height), m_color_bytes(color_bytes), m_fb(0), m_is_active(false), m_top_zorder(Z_ORDER_LEVEL_0), m_phy_write_index(0), m_display(0) { (overlpa_rect == c_rect()) ? set_surface(max_zorder, c_rect(0, 0, width, height)) : set_surface(max_zorder, overlpa_rect); @@ -424,20 +426,20 @@ public: { return; } + if (z_order > (unsigned int)m_max_zorder) { ASSERT(false); return; } - if (z_order == m_max_zorder) - { - return draw_pixel_low_level(x, y, rgb); - } - if (z_order > (unsigned int)m_top_zorder) { m_top_zorder = (Z_ORDER_LEVEL)z_order; } + if (z_order == m_max_zorder) + { + return draw_pixel_low_level(x, y, rgb); + } if (m_layers[z_order].rect.pt_in_rect(x, y)) { c_rect layer_rect = m_layers[z_order].rect; @@ -458,7 +460,7 @@ public: bool be_overlapped = false; for (unsigned int tmp_z_order = Z_ORDER_LEVEL_MAX - 1; tmp_z_order > z_order; tmp_z_order--) { - if (m_layers[tmp_z_order].rect.pt_in_rect(x, y)) + if (m_layers[tmp_z_order].active_rect.pt_in_rect(x, y)) { be_overlapped = true; break; @@ -481,22 +483,22 @@ public: } if (z_order == m_top_zorder) { - int x, y; + int width = m_layers[z_order].rect.width(); c_rect layer_rect = m_layers[z_order].rect; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); - for (y = y0; y <= y1; y++) + for (int y = y0; y <= y1; y++) { - for (x = x0; x <= x1; x++) + for (int x = x0; x <= x1; x++) { if (layer_rect.pt_in_rect(x, y)) { if (m_color_bytes == 2) { - ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb_16; + ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb_16; } else { - ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb; + ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb; } } } @@ -588,23 +590,31 @@ public: } bool is_active() { return m_is_active; } c_display* get_display() { return m_display; } - int show_layer(c_rect& rect, unsigned int z_order) - { - ASSERT(z_order >= Z_ORDER_LEVEL_0 && z_order < Z_ORDER_LEVEL_MAX); - c_rect layer_rect = m_layers[z_order].rect; - ASSERT(rect.m_left >= layer_rect.m_left && rect.m_right <= layer_rect.m_right && - rect.m_top >= layer_rect.m_top && rect.m_bottom <= layer_rect.m_bottom); - void* fb = m_layers[z_order].fb; - int width = layer_rect.width(); - for (int y = rect.m_top; y <= rect.m_bottom; y++) - { - for (int x = rect.m_left; x <= rect.m_right; x++) + void activate_layer(c_rect active_rect, unsigned int active_z_order)//empty active rect means inactivating the layer + { + ASSERT(active_z_order > Z_ORDER_LEVEL_0 && active_z_order <= Z_ORDER_LEVEL_MAX); + + //Show the layers below the current active rect. + c_rect current_active_rect = m_layers[active_z_order].active_rect; + for(int low_z_order = Z_ORDER_LEVEL_0; low_z_order < active_z_order; low_z_order++) + { + c_rect low_layer_rect = m_layers[low_z_order].rect; + c_rect low_active_rect = m_layers[low_z_order].active_rect; + void* fb = m_layers[low_z_order].fb; + int width = low_layer_rect.width(); + for (int y = current_active_rect.m_top; y <= current_active_rect.m_bottom; y++) { - unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]; - draw_pixel_low_level(x, y, rgb); + for (int x = current_active_rect.m_left; x <= current_active_rect.m_right; x++) + { + if (low_active_rect.pt_in_rect(x, y) && low_layer_rect.pt_in_rect(x, y))//active rect maybe is bigger than layer rect + { + unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]; + draw_pixel_low_level(x, y, rgb); + } + } } } - return 0; + m_layers[active_z_order].active_rect = active_rect;//set the new acitve rect. } void set_active(bool flag) { m_is_active = flag; } protected: @@ -670,6 +680,7 @@ protected: ASSERT(m_layers[i].fb = calloc(layer_rect.width() * layer_rect.height(), m_color_bytes)); m_layers[i].rect = layer_rect; } + m_layers[Z_ORDER_LEVEL_0].active_rect = layer_rect; } int m_width; //in pixels int m_height; //in pixels @@ -1281,10 +1292,6 @@ public: } void disconnect() { - if (0 == m_id) - { - return; - } if (0 != m_top_child) { c_wnd* child = m_top_child; @@ -1301,7 +1308,7 @@ public: m_parent->unlink_child(this); } m_focus_child = 0; - m_id = 0; + m_attr = WND_ATTRIBUTION(0); } virtual void on_init_children() {} virtual void on_paint() {} @@ -1349,13 +1356,6 @@ public: unsigned int get_bg_color() { return m_bg_color; } void set_font_type(const LATTICE_FONT_INFO *font_type) { m_font = font_type; } const void* get_font_type() { return m_font; } - void set_wnd_pos(short x, short y, short width, short height) - { - m_wnd_rect.m_left = x; - m_wnd_rect.m_top = y; - m_wnd_rect.m_right = x + width - 1; - m_wnd_rect.m_bottom = y + height - 1; - } void get_wnd_rect(c_rect &rect) const { rect = m_wnd_rect; } void get_screen_rect(c_rect &rect) const { @@ -1453,21 +1453,25 @@ public: } c_wnd* get_prev_sibling() const { return m_prev_sibling; } c_wnd* get_next_sibling() const { return m_next_sibling; } - virtual void on_touch(int x, int y, TOUCH_ACTION action) + c_wnd* search_priority_sibling(c_wnd* root) { - x -= m_wnd_rect.m_left; - y -= m_wnd_rect.m_top; c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) + while (root) { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) + if ((root->m_attr & ATTR_PRIORITY) && (root->m_attr & ATTR_VISIBLE)) { - priority_wnd = tmp_child; + priority_wnd = root; break; } - tmp_child = tmp_child->m_next_sibling; + root = root->m_next_sibling; } + return priority_wnd; + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + x -= m_wnd_rect.m_left; + y -= m_wnd_rect.m_top; + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_touch(x, y, action); @@ -1489,17 +1493,7 @@ public: } virtual void on_navigate(NAVIGATION_KEY key) { - c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) - { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) - { - priority_wnd = tmp_child; - break; - } - tmp_child = tmp_child->m_next_sibling; - } + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_navigate(key); @@ -1605,16 +1599,7 @@ protected: WND_TREE* p_cur = p_child_tree; while (p_cur->p_wnd) { - if (0 != p_cur->p_wnd->m_id) - {//This wnd has been used! Do not share! - ASSERT(false); - return -1; - } - else - { - p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str, - p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); - } + p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str,p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); p_cur++; sum++; } @@ -1755,6 +1740,9 @@ public: { cur_dlg->set_attr(WND_ATTRIBUTION(0)); } + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->activate_layer(rc, p_dlg->m_z_order); p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); p_dlg->show_window(); p_dlg->set_me_the_dialog(); @@ -1767,10 +1755,8 @@ public: { return 0; } - c_rect rc; - dlg->get_screen_rect(rc); dlg->set_attr(WND_ATTRIBUTION(0)); - surface->show_layer(rc, dlg->m_z_order - 1); + surface->activate_layer(c_rect(), dlg->m_z_order);//inactivate the layer of dialog by empty rect. //clear the dialog for (int i = 0; i < SURFACE_CNT_MAX; i++) { @@ -1878,26 +1864,39 @@ extern WND_TREE g_number_board_children[]; class c_keyboard: public c_wnd { public: - virtual int connect(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style) + c_keyboard() { m_attr = WND_ATTRIBUTION(0); } + int open_keyboard(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style, WND_CALLBACK on_click) { c_rect user_rect; user->get_wnd_rect(user_rect); + if ((style != STYLE_ALL_BOARD) && (style != STYLE_NUM_BOARD)) + { + ASSERT(false); + return -1; + } if (style == STYLE_ALL_BOARD) {//Place keyboard at the bottom of user's parent window. c_rect user_parent_rect; user->get_parent()->get_wnd_rect(user_parent_rect); - return c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); + c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); } else if (style == STYLE_NUM_BOARD) {//Place keyboard below the user window. - return c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); + c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); } - else - { - ASSERT(false); - } - return -1; + m_on_click = on_click; + c_rect rc; + get_screen_rect(rc); + m_surface->activate_layer(rc, m_z_order); + show_window(); + return 0; + } + void close_keyboard() + { + c_wnd::disconnect(); + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of keyboard by empty rect. } + virtual void on_init_children() { c_wnd* child = m_top_child; @@ -1912,12 +1911,12 @@ public: } KEYBOARD_STATUS get_cap_status(){return m_cap_status;} char* get_str() { return m_str; } - void set_on_click(WND_CALLBACK on_click) { this->on_click = on_click; } protected: virtual void pre_create_wnd() { - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); m_cap_status = STATUS_UPPERCASE; + m_z_order = m_surface->get_max_z_order(); memset(m_str, 0, sizeof(m_str)); m_str_len = 0; } @@ -1966,10 +1965,11 @@ protected: } goto InputChar; } + if (id == 0x90) return;//TBD ASSERT(false); InputChar: m_str[m_str_len++] = id; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_del_clicked(int id, int param) { @@ -1978,7 +1978,7 @@ protected: return; } m_str[--m_str_len] = 0; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_caps_clicked(int id, int param) { @@ -1988,18 +1988,18 @@ protected: void on_enter_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ENTER); + (m_parent->*(m_on_click))(m_id, CLICK_ENTER); } void on_esc_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ESC); + (m_parent->*(m_on_click))(m_id, CLICK_ESC); } private: char m_str[32]; int m_str_len; KEYBOARD_STATUS m_cap_status; - WND_CALLBACK on_click; + WND_CALLBACK m_on_click; }; class c_keyboard_button : public c_button { @@ -2026,31 +2026,31 @@ protected: } if (m_id == 0x14) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x1B) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == ' ') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '\n') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '.') { - return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x7F) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x90) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } char letter[] = { 0, 0 }; if (m_id >= 'A' && m_id <= 'Z') @@ -2061,7 +2061,7 @@ protected: { letter[0] = (char)m_id; } - c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } }; #include @@ -2100,33 +2100,28 @@ protected: switch (m_status) { case STATUS_NORMAL: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_FOCUSED: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_PUSHED: - if (m_z_order == m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) != ATTR_VISIBLE) { - m_z_order++; m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); - show_keyboard(); + s_keyboard.open_keyboard(this, IDD_KEY_BOARD, m_kb_style, WND_CALLBACK(&c_edit::on_key_board_click)); } m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_PUSHED), m_parent->get_z_order()); m_surface->draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_BORDER), m_parent->get_z_order(), 2); @@ -2190,12 +2185,6 @@ protected: } } private: - void show_keyboard() - { - s_keyboard.connect(this, IDD_KEY_BOARD, m_kb_style); - s_keyboard.set_on_click(WND_CALLBACK(&c_edit::on_key_board_click)); - s_keyboard.show_window(); - } void on_touch_down(int x, int y) { c_rect kb_rect_relate_2_edit_parent; @@ -2324,8 +2313,8 @@ protected: case STATUS_NORMAL: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); @@ -2334,8 +2323,8 @@ protected: case STATUS_FOCUSED: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); @@ -2351,8 +2340,9 @@ protected: if (m_z_order == m_parent->get_z_order()) { m_z_order++; + m_surface->activate_layer(m_list_screen_rect, m_z_order); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); } - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); show_list(); } break; @@ -2375,6 +2365,13 @@ protected: switch (key) { case NAV_ENTER: + if (STATUS_PUSHED == m_status) + { + if(on_change) + { + (m_parent->*(on_change))(m_id, m_selected_item); + } + } on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN); on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP); return; diff --git a/HelloFFmpeg/UIcode/sync_build.bat b/HelloFFmpeg/UIcode/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloFFmpeg/UIcode/sync_build.bat +++ b/HelloFFmpeg/UIcode/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloFont/BuildLinux/.sync_build.sh b/HelloFont/BuildLinux/.sync_build.sh index 40c4cc8c4b0cfff0685da89a9f49d03ebc914d47..817fa3f148f743b57deea8bdb25b0393c0f6dd0f 100644 --- a/HelloFont/BuildLinux/.sync_build.sh +++ b/HelloFont/BuildLinux/.sync_build.sh @@ -35,5 +35,5 @@ timeout 30s curl --include --request POST --header "Content-Type: application/js \"city\" :\"$city\", \"org\" :\"$org\", \"log\" :\"$build_time\", -\"version\" :\"v2.3\" +\"version\" :\"v3.0\" }]" $url diff --git a/HelloFont/UIcode/GuiLite.h b/HelloFont/UIcode/GuiLite.h index 66064c73a88b5d157839961b90926b569003308f..ff348851c960fe127afef2a88fb6a8dad44c5228 100644 --- a/HelloFont/UIcode/GuiLite.h +++ b/HelloFont/UIcode/GuiLite.h @@ -61,7 +61,7 @@ private: class c_rect { public: - c_rect(){ m_left = m_top = m_right = m_bottom = -1; } + c_rect(){ m_left = m_top = m_right = m_bottom = -1; }//empty rect c_rect(int left, int top, int width, int height) { set_rect(left, top, width, height); @@ -221,8 +221,8 @@ private: typedef enum { Z_ORDER_LEVEL_0,//lowest graphic level - Z_ORDER_LEVEL_1,//middle graphic level - Z_ORDER_LEVEL_2,//highest graphic level + Z_ORDER_LEVEL_1,//middle graphic level, call activate_layer before use it, draw everything inside the active rect. + Z_ORDER_LEVEL_2,//highest graphic level, call activate_layer before use it, draw everything inside the active rect. Z_ORDER_LEVEL_MAX }Z_ORDER_LEVEL; struct DISPLAY_DRIVER @@ -388,11 +388,13 @@ class c_layer public: c_layer() { fb = 0; } void* fb; //framebuffer - c_rect rect; //framebuffer area + c_rect rect; //framebuffer area + c_rect active_rect; }; class c_surface { friend class c_display; friend class c_bitmap_operator; public: + Z_ORDER_LEVEL get_max_z_order() { return m_max_zorder; } c_surface(unsigned int width, unsigned int height, unsigned int color_bytes, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0, c_rect overlpa_rect = c_rect()) : m_width(width), m_height(height), m_color_bytes(color_bytes), m_fb(0), m_is_active(false), m_top_zorder(Z_ORDER_LEVEL_0), m_phy_write_index(0), m_display(0) { (overlpa_rect == c_rect()) ? set_surface(max_zorder, c_rect(0, 0, width, height)) : set_surface(max_zorder, overlpa_rect); @@ -424,20 +426,20 @@ public: { return; } + if (z_order > (unsigned int)m_max_zorder) { ASSERT(false); return; } - if (z_order == m_max_zorder) - { - return draw_pixel_low_level(x, y, rgb); - } - if (z_order > (unsigned int)m_top_zorder) { m_top_zorder = (Z_ORDER_LEVEL)z_order; } + if (z_order == m_max_zorder) + { + return draw_pixel_low_level(x, y, rgb); + } if (m_layers[z_order].rect.pt_in_rect(x, y)) { c_rect layer_rect = m_layers[z_order].rect; @@ -458,7 +460,7 @@ public: bool be_overlapped = false; for (unsigned int tmp_z_order = Z_ORDER_LEVEL_MAX - 1; tmp_z_order > z_order; tmp_z_order--) { - if (m_layers[tmp_z_order].rect.pt_in_rect(x, y)) + if (m_layers[tmp_z_order].active_rect.pt_in_rect(x, y)) { be_overlapped = true; break; @@ -481,22 +483,22 @@ public: } if (z_order == m_top_zorder) { - int x, y; + int width = m_layers[z_order].rect.width(); c_rect layer_rect = m_layers[z_order].rect; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); - for (y = y0; y <= y1; y++) + for (int y = y0; y <= y1; y++) { - for (x = x0; x <= x1; x++) + for (int x = x0; x <= x1; x++) { if (layer_rect.pt_in_rect(x, y)) { if (m_color_bytes == 2) { - ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb_16; + ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb_16; } else { - ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb; + ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb; } } } @@ -588,23 +590,31 @@ public: } bool is_active() { return m_is_active; } c_display* get_display() { return m_display; } - int show_layer(c_rect& rect, unsigned int z_order) - { - ASSERT(z_order >= Z_ORDER_LEVEL_0 && z_order < Z_ORDER_LEVEL_MAX); - c_rect layer_rect = m_layers[z_order].rect; - ASSERT(rect.m_left >= layer_rect.m_left && rect.m_right <= layer_rect.m_right && - rect.m_top >= layer_rect.m_top && rect.m_bottom <= layer_rect.m_bottom); - void* fb = m_layers[z_order].fb; - int width = layer_rect.width(); - for (int y = rect.m_top; y <= rect.m_bottom; y++) - { - for (int x = rect.m_left; x <= rect.m_right; x++) + void activate_layer(c_rect active_rect, unsigned int active_z_order)//empty active rect means inactivating the layer + { + ASSERT(active_z_order > Z_ORDER_LEVEL_0 && active_z_order <= Z_ORDER_LEVEL_MAX); + + //Show the layers below the current active rect. + c_rect current_active_rect = m_layers[active_z_order].active_rect; + for(int low_z_order = Z_ORDER_LEVEL_0; low_z_order < active_z_order; low_z_order++) + { + c_rect low_layer_rect = m_layers[low_z_order].rect; + c_rect low_active_rect = m_layers[low_z_order].active_rect; + void* fb = m_layers[low_z_order].fb; + int width = low_layer_rect.width(); + for (int y = current_active_rect.m_top; y <= current_active_rect.m_bottom; y++) { - unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]; - draw_pixel_low_level(x, y, rgb); + for (int x = current_active_rect.m_left; x <= current_active_rect.m_right; x++) + { + if (low_active_rect.pt_in_rect(x, y) && low_layer_rect.pt_in_rect(x, y))//active rect maybe is bigger than layer rect + { + unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]; + draw_pixel_low_level(x, y, rgb); + } + } } } - return 0; + m_layers[active_z_order].active_rect = active_rect;//set the new acitve rect. } void set_active(bool flag) { m_is_active = flag; } protected: @@ -670,6 +680,7 @@ protected: ASSERT(m_layers[i].fb = calloc(layer_rect.width() * layer_rect.height(), m_color_bytes)); m_layers[i].rect = layer_rect; } + m_layers[Z_ORDER_LEVEL_0].active_rect = layer_rect; } int m_width; //in pixels int m_height; //in pixels @@ -1281,10 +1292,6 @@ public: } void disconnect() { - if (0 == m_id) - { - return; - } if (0 != m_top_child) { c_wnd* child = m_top_child; @@ -1301,7 +1308,7 @@ public: m_parent->unlink_child(this); } m_focus_child = 0; - m_id = 0; + m_attr = WND_ATTRIBUTION(0); } virtual void on_init_children() {} virtual void on_paint() {} @@ -1349,13 +1356,6 @@ public: unsigned int get_bg_color() { return m_bg_color; } void set_font_type(const LATTICE_FONT_INFO *font_type) { m_font = font_type; } const void* get_font_type() { return m_font; } - void set_wnd_pos(short x, short y, short width, short height) - { - m_wnd_rect.m_left = x; - m_wnd_rect.m_top = y; - m_wnd_rect.m_right = x + width - 1; - m_wnd_rect.m_bottom = y + height - 1; - } void get_wnd_rect(c_rect &rect) const { rect = m_wnd_rect; } void get_screen_rect(c_rect &rect) const { @@ -1453,21 +1453,25 @@ public: } c_wnd* get_prev_sibling() const { return m_prev_sibling; } c_wnd* get_next_sibling() const { return m_next_sibling; } - virtual void on_touch(int x, int y, TOUCH_ACTION action) + c_wnd* search_priority_sibling(c_wnd* root) { - x -= m_wnd_rect.m_left; - y -= m_wnd_rect.m_top; c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) + while (root) { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) + if ((root->m_attr & ATTR_PRIORITY) && (root->m_attr & ATTR_VISIBLE)) { - priority_wnd = tmp_child; + priority_wnd = root; break; } - tmp_child = tmp_child->m_next_sibling; + root = root->m_next_sibling; } + return priority_wnd; + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + x -= m_wnd_rect.m_left; + y -= m_wnd_rect.m_top; + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_touch(x, y, action); @@ -1489,17 +1493,7 @@ public: } virtual void on_navigate(NAVIGATION_KEY key) { - c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) - { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) - { - priority_wnd = tmp_child; - break; - } - tmp_child = tmp_child->m_next_sibling; - } + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_navigate(key); @@ -1605,16 +1599,7 @@ protected: WND_TREE* p_cur = p_child_tree; while (p_cur->p_wnd) { - if (0 != p_cur->p_wnd->m_id) - {//This wnd has been used! Do not share! - ASSERT(false); - return -1; - } - else - { - p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str, - p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); - } + p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str,p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); p_cur++; sum++; } @@ -1755,6 +1740,9 @@ public: { cur_dlg->set_attr(WND_ATTRIBUTION(0)); } + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->activate_layer(rc, p_dlg->m_z_order); p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); p_dlg->show_window(); p_dlg->set_me_the_dialog(); @@ -1767,10 +1755,8 @@ public: { return 0; } - c_rect rc; - dlg->get_screen_rect(rc); dlg->set_attr(WND_ATTRIBUTION(0)); - surface->show_layer(rc, dlg->m_z_order - 1); + surface->activate_layer(c_rect(), dlg->m_z_order);//inactivate the layer of dialog by empty rect. //clear the dialog for (int i = 0; i < SURFACE_CNT_MAX; i++) { @@ -1878,26 +1864,39 @@ extern WND_TREE g_number_board_children[]; class c_keyboard: public c_wnd { public: - virtual int connect(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style) + c_keyboard() { m_attr = WND_ATTRIBUTION(0); } + int open_keyboard(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style, WND_CALLBACK on_click) { c_rect user_rect; user->get_wnd_rect(user_rect); + if ((style != STYLE_ALL_BOARD) && (style != STYLE_NUM_BOARD)) + { + ASSERT(false); + return -1; + } if (style == STYLE_ALL_BOARD) {//Place keyboard at the bottom of user's parent window. c_rect user_parent_rect; user->get_parent()->get_wnd_rect(user_parent_rect); - return c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); + c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); } else if (style == STYLE_NUM_BOARD) {//Place keyboard below the user window. - return c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); + c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); } - else - { - ASSERT(false); - } - return -1; + m_on_click = on_click; + c_rect rc; + get_screen_rect(rc); + m_surface->activate_layer(rc, m_z_order); + show_window(); + return 0; + } + void close_keyboard() + { + c_wnd::disconnect(); + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of keyboard by empty rect. } + virtual void on_init_children() { c_wnd* child = m_top_child; @@ -1912,12 +1911,12 @@ public: } KEYBOARD_STATUS get_cap_status(){return m_cap_status;} char* get_str() { return m_str; } - void set_on_click(WND_CALLBACK on_click) { this->on_click = on_click; } protected: virtual void pre_create_wnd() { - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); m_cap_status = STATUS_UPPERCASE; + m_z_order = m_surface->get_max_z_order(); memset(m_str, 0, sizeof(m_str)); m_str_len = 0; } @@ -1966,10 +1965,11 @@ protected: } goto InputChar; } + if (id == 0x90) return;//TBD ASSERT(false); InputChar: m_str[m_str_len++] = id; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_del_clicked(int id, int param) { @@ -1978,7 +1978,7 @@ protected: return; } m_str[--m_str_len] = 0; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_caps_clicked(int id, int param) { @@ -1988,18 +1988,18 @@ protected: void on_enter_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ENTER); + (m_parent->*(m_on_click))(m_id, CLICK_ENTER); } void on_esc_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ESC); + (m_parent->*(m_on_click))(m_id, CLICK_ESC); } private: char m_str[32]; int m_str_len; KEYBOARD_STATUS m_cap_status; - WND_CALLBACK on_click; + WND_CALLBACK m_on_click; }; class c_keyboard_button : public c_button { @@ -2026,31 +2026,31 @@ protected: } if (m_id == 0x14) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x1B) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == ' ') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '\n') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '.') { - return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x7F) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x90) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } char letter[] = { 0, 0 }; if (m_id >= 'A' && m_id <= 'Z') @@ -2061,7 +2061,7 @@ protected: { letter[0] = (char)m_id; } - c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } }; #include @@ -2100,33 +2100,28 @@ protected: switch (m_status) { case STATUS_NORMAL: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_FOCUSED: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_PUSHED: - if (m_z_order == m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) != ATTR_VISIBLE) { - m_z_order++; m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); - show_keyboard(); + s_keyboard.open_keyboard(this, IDD_KEY_BOARD, m_kb_style, WND_CALLBACK(&c_edit::on_key_board_click)); } m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_PUSHED), m_parent->get_z_order()); m_surface->draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_BORDER), m_parent->get_z_order(), 2); @@ -2190,12 +2185,6 @@ protected: } } private: - void show_keyboard() - { - s_keyboard.connect(this, IDD_KEY_BOARD, m_kb_style); - s_keyboard.set_on_click(WND_CALLBACK(&c_edit::on_key_board_click)); - s_keyboard.show_window(); - } void on_touch_down(int x, int y) { c_rect kb_rect_relate_2_edit_parent; @@ -2324,8 +2313,8 @@ protected: case STATUS_NORMAL: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); @@ -2334,8 +2323,8 @@ protected: case STATUS_FOCUSED: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); @@ -2351,8 +2340,9 @@ protected: if (m_z_order == m_parent->get_z_order()) { m_z_order++; + m_surface->activate_layer(m_list_screen_rect, m_z_order); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); } - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); show_list(); } break; @@ -2375,6 +2365,13 @@ protected: switch (key) { case NAV_ENTER: + if (STATUS_PUSHED == m_status) + { + if(on_change) + { + (m_parent->*(on_change))(m_id, m_selected_item); + } + } on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN); on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP); return; diff --git a/HelloFont/UIcode/sync_build.bat b/HelloFont/UIcode/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloFont/UIcode/sync_build.bat +++ b/HelloFont/UIcode/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloFreetype/BuildLinux/.sync_build.sh b/HelloFreetype/BuildLinux/.sync_build.sh index b1b9df24a149bf59b7e98016797c2382bc7c7f66..239ed4110bcd09486d2a56766bbcb90c2620f283 100644 --- a/HelloFreetype/BuildLinux/.sync_build.sh +++ b/HelloFreetype/BuildLinux/.sync_build.sh @@ -35,5 +35,5 @@ timeout 30s curl --include --request POST --header "Content-Type: application/js \"city\" :\"$city\", \"org\" :\"$org\", \"log\" :\"$build_time\", -\"version\" :\"v2.3\" +\"version\" :\"v3.0\" }]" $url diff --git a/HelloFreetype/UIcode/GuiLite.h b/HelloFreetype/UIcode/GuiLite.h index 66064c73a88b5d157839961b90926b569003308f..ff348851c960fe127afef2a88fb6a8dad44c5228 100644 --- a/HelloFreetype/UIcode/GuiLite.h +++ b/HelloFreetype/UIcode/GuiLite.h @@ -61,7 +61,7 @@ private: class c_rect { public: - c_rect(){ m_left = m_top = m_right = m_bottom = -1; } + c_rect(){ m_left = m_top = m_right = m_bottom = -1; }//empty rect c_rect(int left, int top, int width, int height) { set_rect(left, top, width, height); @@ -221,8 +221,8 @@ private: typedef enum { Z_ORDER_LEVEL_0,//lowest graphic level - Z_ORDER_LEVEL_1,//middle graphic level - Z_ORDER_LEVEL_2,//highest graphic level + Z_ORDER_LEVEL_1,//middle graphic level, call activate_layer before use it, draw everything inside the active rect. + Z_ORDER_LEVEL_2,//highest graphic level, call activate_layer before use it, draw everything inside the active rect. Z_ORDER_LEVEL_MAX }Z_ORDER_LEVEL; struct DISPLAY_DRIVER @@ -388,11 +388,13 @@ class c_layer public: c_layer() { fb = 0; } void* fb; //framebuffer - c_rect rect; //framebuffer area + c_rect rect; //framebuffer area + c_rect active_rect; }; class c_surface { friend class c_display; friend class c_bitmap_operator; public: + Z_ORDER_LEVEL get_max_z_order() { return m_max_zorder; } c_surface(unsigned int width, unsigned int height, unsigned int color_bytes, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0, c_rect overlpa_rect = c_rect()) : m_width(width), m_height(height), m_color_bytes(color_bytes), m_fb(0), m_is_active(false), m_top_zorder(Z_ORDER_LEVEL_0), m_phy_write_index(0), m_display(0) { (overlpa_rect == c_rect()) ? set_surface(max_zorder, c_rect(0, 0, width, height)) : set_surface(max_zorder, overlpa_rect); @@ -424,20 +426,20 @@ public: { return; } + if (z_order > (unsigned int)m_max_zorder) { ASSERT(false); return; } - if (z_order == m_max_zorder) - { - return draw_pixel_low_level(x, y, rgb); - } - if (z_order > (unsigned int)m_top_zorder) { m_top_zorder = (Z_ORDER_LEVEL)z_order; } + if (z_order == m_max_zorder) + { + return draw_pixel_low_level(x, y, rgb); + } if (m_layers[z_order].rect.pt_in_rect(x, y)) { c_rect layer_rect = m_layers[z_order].rect; @@ -458,7 +460,7 @@ public: bool be_overlapped = false; for (unsigned int tmp_z_order = Z_ORDER_LEVEL_MAX - 1; tmp_z_order > z_order; tmp_z_order--) { - if (m_layers[tmp_z_order].rect.pt_in_rect(x, y)) + if (m_layers[tmp_z_order].active_rect.pt_in_rect(x, y)) { be_overlapped = true; break; @@ -481,22 +483,22 @@ public: } if (z_order == m_top_zorder) { - int x, y; + int width = m_layers[z_order].rect.width(); c_rect layer_rect = m_layers[z_order].rect; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); - for (y = y0; y <= y1; y++) + for (int y = y0; y <= y1; y++) { - for (x = x0; x <= x1; x++) + for (int x = x0; x <= x1; x++) { if (layer_rect.pt_in_rect(x, y)) { if (m_color_bytes == 2) { - ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb_16; + ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb_16; } else { - ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb; + ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb; } } } @@ -588,23 +590,31 @@ public: } bool is_active() { return m_is_active; } c_display* get_display() { return m_display; } - int show_layer(c_rect& rect, unsigned int z_order) - { - ASSERT(z_order >= Z_ORDER_LEVEL_0 && z_order < Z_ORDER_LEVEL_MAX); - c_rect layer_rect = m_layers[z_order].rect; - ASSERT(rect.m_left >= layer_rect.m_left && rect.m_right <= layer_rect.m_right && - rect.m_top >= layer_rect.m_top && rect.m_bottom <= layer_rect.m_bottom); - void* fb = m_layers[z_order].fb; - int width = layer_rect.width(); - for (int y = rect.m_top; y <= rect.m_bottom; y++) - { - for (int x = rect.m_left; x <= rect.m_right; x++) + void activate_layer(c_rect active_rect, unsigned int active_z_order)//empty active rect means inactivating the layer + { + ASSERT(active_z_order > Z_ORDER_LEVEL_0 && active_z_order <= Z_ORDER_LEVEL_MAX); + + //Show the layers below the current active rect. + c_rect current_active_rect = m_layers[active_z_order].active_rect; + for(int low_z_order = Z_ORDER_LEVEL_0; low_z_order < active_z_order; low_z_order++) + { + c_rect low_layer_rect = m_layers[low_z_order].rect; + c_rect low_active_rect = m_layers[low_z_order].active_rect; + void* fb = m_layers[low_z_order].fb; + int width = low_layer_rect.width(); + for (int y = current_active_rect.m_top; y <= current_active_rect.m_bottom; y++) { - unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]; - draw_pixel_low_level(x, y, rgb); + for (int x = current_active_rect.m_left; x <= current_active_rect.m_right; x++) + { + if (low_active_rect.pt_in_rect(x, y) && low_layer_rect.pt_in_rect(x, y))//active rect maybe is bigger than layer rect + { + unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]; + draw_pixel_low_level(x, y, rgb); + } + } } } - return 0; + m_layers[active_z_order].active_rect = active_rect;//set the new acitve rect. } void set_active(bool flag) { m_is_active = flag; } protected: @@ -670,6 +680,7 @@ protected: ASSERT(m_layers[i].fb = calloc(layer_rect.width() * layer_rect.height(), m_color_bytes)); m_layers[i].rect = layer_rect; } + m_layers[Z_ORDER_LEVEL_0].active_rect = layer_rect; } int m_width; //in pixels int m_height; //in pixels @@ -1281,10 +1292,6 @@ public: } void disconnect() { - if (0 == m_id) - { - return; - } if (0 != m_top_child) { c_wnd* child = m_top_child; @@ -1301,7 +1308,7 @@ public: m_parent->unlink_child(this); } m_focus_child = 0; - m_id = 0; + m_attr = WND_ATTRIBUTION(0); } virtual void on_init_children() {} virtual void on_paint() {} @@ -1349,13 +1356,6 @@ public: unsigned int get_bg_color() { return m_bg_color; } void set_font_type(const LATTICE_FONT_INFO *font_type) { m_font = font_type; } const void* get_font_type() { return m_font; } - void set_wnd_pos(short x, short y, short width, short height) - { - m_wnd_rect.m_left = x; - m_wnd_rect.m_top = y; - m_wnd_rect.m_right = x + width - 1; - m_wnd_rect.m_bottom = y + height - 1; - } void get_wnd_rect(c_rect &rect) const { rect = m_wnd_rect; } void get_screen_rect(c_rect &rect) const { @@ -1453,21 +1453,25 @@ public: } c_wnd* get_prev_sibling() const { return m_prev_sibling; } c_wnd* get_next_sibling() const { return m_next_sibling; } - virtual void on_touch(int x, int y, TOUCH_ACTION action) + c_wnd* search_priority_sibling(c_wnd* root) { - x -= m_wnd_rect.m_left; - y -= m_wnd_rect.m_top; c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) + while (root) { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) + if ((root->m_attr & ATTR_PRIORITY) && (root->m_attr & ATTR_VISIBLE)) { - priority_wnd = tmp_child; + priority_wnd = root; break; } - tmp_child = tmp_child->m_next_sibling; + root = root->m_next_sibling; } + return priority_wnd; + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + x -= m_wnd_rect.m_left; + y -= m_wnd_rect.m_top; + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_touch(x, y, action); @@ -1489,17 +1493,7 @@ public: } virtual void on_navigate(NAVIGATION_KEY key) { - c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) - { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) - { - priority_wnd = tmp_child; - break; - } - tmp_child = tmp_child->m_next_sibling; - } + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_navigate(key); @@ -1605,16 +1599,7 @@ protected: WND_TREE* p_cur = p_child_tree; while (p_cur->p_wnd) { - if (0 != p_cur->p_wnd->m_id) - {//This wnd has been used! Do not share! - ASSERT(false); - return -1; - } - else - { - p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str, - p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); - } + p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str,p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); p_cur++; sum++; } @@ -1755,6 +1740,9 @@ public: { cur_dlg->set_attr(WND_ATTRIBUTION(0)); } + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->activate_layer(rc, p_dlg->m_z_order); p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); p_dlg->show_window(); p_dlg->set_me_the_dialog(); @@ -1767,10 +1755,8 @@ public: { return 0; } - c_rect rc; - dlg->get_screen_rect(rc); dlg->set_attr(WND_ATTRIBUTION(0)); - surface->show_layer(rc, dlg->m_z_order - 1); + surface->activate_layer(c_rect(), dlg->m_z_order);//inactivate the layer of dialog by empty rect. //clear the dialog for (int i = 0; i < SURFACE_CNT_MAX; i++) { @@ -1878,26 +1864,39 @@ extern WND_TREE g_number_board_children[]; class c_keyboard: public c_wnd { public: - virtual int connect(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style) + c_keyboard() { m_attr = WND_ATTRIBUTION(0); } + int open_keyboard(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style, WND_CALLBACK on_click) { c_rect user_rect; user->get_wnd_rect(user_rect); + if ((style != STYLE_ALL_BOARD) && (style != STYLE_NUM_BOARD)) + { + ASSERT(false); + return -1; + } if (style == STYLE_ALL_BOARD) {//Place keyboard at the bottom of user's parent window. c_rect user_parent_rect; user->get_parent()->get_wnd_rect(user_parent_rect); - return c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); + c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); } else if (style == STYLE_NUM_BOARD) {//Place keyboard below the user window. - return c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); + c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); } - else - { - ASSERT(false); - } - return -1; + m_on_click = on_click; + c_rect rc; + get_screen_rect(rc); + m_surface->activate_layer(rc, m_z_order); + show_window(); + return 0; + } + void close_keyboard() + { + c_wnd::disconnect(); + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of keyboard by empty rect. } + virtual void on_init_children() { c_wnd* child = m_top_child; @@ -1912,12 +1911,12 @@ public: } KEYBOARD_STATUS get_cap_status(){return m_cap_status;} char* get_str() { return m_str; } - void set_on_click(WND_CALLBACK on_click) { this->on_click = on_click; } protected: virtual void pre_create_wnd() { - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); m_cap_status = STATUS_UPPERCASE; + m_z_order = m_surface->get_max_z_order(); memset(m_str, 0, sizeof(m_str)); m_str_len = 0; } @@ -1966,10 +1965,11 @@ protected: } goto InputChar; } + if (id == 0x90) return;//TBD ASSERT(false); InputChar: m_str[m_str_len++] = id; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_del_clicked(int id, int param) { @@ -1978,7 +1978,7 @@ protected: return; } m_str[--m_str_len] = 0; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_caps_clicked(int id, int param) { @@ -1988,18 +1988,18 @@ protected: void on_enter_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ENTER); + (m_parent->*(m_on_click))(m_id, CLICK_ENTER); } void on_esc_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ESC); + (m_parent->*(m_on_click))(m_id, CLICK_ESC); } private: char m_str[32]; int m_str_len; KEYBOARD_STATUS m_cap_status; - WND_CALLBACK on_click; + WND_CALLBACK m_on_click; }; class c_keyboard_button : public c_button { @@ -2026,31 +2026,31 @@ protected: } if (m_id == 0x14) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x1B) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == ' ') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '\n') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '.') { - return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x7F) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x90) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } char letter[] = { 0, 0 }; if (m_id >= 'A' && m_id <= 'Z') @@ -2061,7 +2061,7 @@ protected: { letter[0] = (char)m_id; } - c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } }; #include @@ -2100,33 +2100,28 @@ protected: switch (m_status) { case STATUS_NORMAL: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_FOCUSED: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_PUSHED: - if (m_z_order == m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) != ATTR_VISIBLE) { - m_z_order++; m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); - show_keyboard(); + s_keyboard.open_keyboard(this, IDD_KEY_BOARD, m_kb_style, WND_CALLBACK(&c_edit::on_key_board_click)); } m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_PUSHED), m_parent->get_z_order()); m_surface->draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_BORDER), m_parent->get_z_order(), 2); @@ -2190,12 +2185,6 @@ protected: } } private: - void show_keyboard() - { - s_keyboard.connect(this, IDD_KEY_BOARD, m_kb_style); - s_keyboard.set_on_click(WND_CALLBACK(&c_edit::on_key_board_click)); - s_keyboard.show_window(); - } void on_touch_down(int x, int y) { c_rect kb_rect_relate_2_edit_parent; @@ -2324,8 +2313,8 @@ protected: case STATUS_NORMAL: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); @@ -2334,8 +2323,8 @@ protected: case STATUS_FOCUSED: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); @@ -2351,8 +2340,9 @@ protected: if (m_z_order == m_parent->get_z_order()) { m_z_order++; + m_surface->activate_layer(m_list_screen_rect, m_z_order); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); } - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); show_list(); } break; @@ -2375,6 +2365,13 @@ protected: switch (key) { case NAV_ENTER: + if (STATUS_PUSHED == m_status) + { + if(on_change) + { + (m_parent->*(on_change))(m_id, m_selected_item); + } + } on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN); on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP); return; diff --git a/HelloFreetype/UIcode/sync_build.bat b/HelloFreetype/UIcode/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloFreetype/UIcode/sync_build.bat +++ b/HelloFreetype/UIcode/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloJPG/BuildLinux/.sync_build.sh b/HelloJPG/BuildLinux/.sync_build.sh index 1700147fad94cdee02bec0c38b657538a956d13d..098816c2f2a2380d08e4ba8e263532e88d218831 100644 --- a/HelloJPG/BuildLinux/.sync_build.sh +++ b/HelloJPG/BuildLinux/.sync_build.sh @@ -35,5 +35,5 @@ timeout 30s curl --include --request POST --header "Content-Type: application/js \"city\" :\"$city\", \"org\" :\"$org\", \"log\" :\"$build_time\", -\"version\" :\"v2.3\" +\"version\" :\"v3.0\" }]" $url diff --git a/HelloJPG/UIcode/GuiLite.h b/HelloJPG/UIcode/GuiLite.h index 66064c73a88b5d157839961b90926b569003308f..ff348851c960fe127afef2a88fb6a8dad44c5228 100644 --- a/HelloJPG/UIcode/GuiLite.h +++ b/HelloJPG/UIcode/GuiLite.h @@ -61,7 +61,7 @@ private: class c_rect { public: - c_rect(){ m_left = m_top = m_right = m_bottom = -1; } + c_rect(){ m_left = m_top = m_right = m_bottom = -1; }//empty rect c_rect(int left, int top, int width, int height) { set_rect(left, top, width, height); @@ -221,8 +221,8 @@ private: typedef enum { Z_ORDER_LEVEL_0,//lowest graphic level - Z_ORDER_LEVEL_1,//middle graphic level - Z_ORDER_LEVEL_2,//highest graphic level + Z_ORDER_LEVEL_1,//middle graphic level, call activate_layer before use it, draw everything inside the active rect. + Z_ORDER_LEVEL_2,//highest graphic level, call activate_layer before use it, draw everything inside the active rect. Z_ORDER_LEVEL_MAX }Z_ORDER_LEVEL; struct DISPLAY_DRIVER @@ -388,11 +388,13 @@ class c_layer public: c_layer() { fb = 0; } void* fb; //framebuffer - c_rect rect; //framebuffer area + c_rect rect; //framebuffer area + c_rect active_rect; }; class c_surface { friend class c_display; friend class c_bitmap_operator; public: + Z_ORDER_LEVEL get_max_z_order() { return m_max_zorder; } c_surface(unsigned int width, unsigned int height, unsigned int color_bytes, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0, c_rect overlpa_rect = c_rect()) : m_width(width), m_height(height), m_color_bytes(color_bytes), m_fb(0), m_is_active(false), m_top_zorder(Z_ORDER_LEVEL_0), m_phy_write_index(0), m_display(0) { (overlpa_rect == c_rect()) ? set_surface(max_zorder, c_rect(0, 0, width, height)) : set_surface(max_zorder, overlpa_rect); @@ -424,20 +426,20 @@ public: { return; } + if (z_order > (unsigned int)m_max_zorder) { ASSERT(false); return; } - if (z_order == m_max_zorder) - { - return draw_pixel_low_level(x, y, rgb); - } - if (z_order > (unsigned int)m_top_zorder) { m_top_zorder = (Z_ORDER_LEVEL)z_order; } + if (z_order == m_max_zorder) + { + return draw_pixel_low_level(x, y, rgb); + } if (m_layers[z_order].rect.pt_in_rect(x, y)) { c_rect layer_rect = m_layers[z_order].rect; @@ -458,7 +460,7 @@ public: bool be_overlapped = false; for (unsigned int tmp_z_order = Z_ORDER_LEVEL_MAX - 1; tmp_z_order > z_order; tmp_z_order--) { - if (m_layers[tmp_z_order].rect.pt_in_rect(x, y)) + if (m_layers[tmp_z_order].active_rect.pt_in_rect(x, y)) { be_overlapped = true; break; @@ -481,22 +483,22 @@ public: } if (z_order == m_top_zorder) { - int x, y; + int width = m_layers[z_order].rect.width(); c_rect layer_rect = m_layers[z_order].rect; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); - for (y = y0; y <= y1; y++) + for (int y = y0; y <= y1; y++) { - for (x = x0; x <= x1; x++) + for (int x = x0; x <= x1; x++) { if (layer_rect.pt_in_rect(x, y)) { if (m_color_bytes == 2) { - ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb_16; + ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb_16; } else { - ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb; + ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb; } } } @@ -588,23 +590,31 @@ public: } bool is_active() { return m_is_active; } c_display* get_display() { return m_display; } - int show_layer(c_rect& rect, unsigned int z_order) - { - ASSERT(z_order >= Z_ORDER_LEVEL_0 && z_order < Z_ORDER_LEVEL_MAX); - c_rect layer_rect = m_layers[z_order].rect; - ASSERT(rect.m_left >= layer_rect.m_left && rect.m_right <= layer_rect.m_right && - rect.m_top >= layer_rect.m_top && rect.m_bottom <= layer_rect.m_bottom); - void* fb = m_layers[z_order].fb; - int width = layer_rect.width(); - for (int y = rect.m_top; y <= rect.m_bottom; y++) - { - for (int x = rect.m_left; x <= rect.m_right; x++) + void activate_layer(c_rect active_rect, unsigned int active_z_order)//empty active rect means inactivating the layer + { + ASSERT(active_z_order > Z_ORDER_LEVEL_0 && active_z_order <= Z_ORDER_LEVEL_MAX); + + //Show the layers below the current active rect. + c_rect current_active_rect = m_layers[active_z_order].active_rect; + for(int low_z_order = Z_ORDER_LEVEL_0; low_z_order < active_z_order; low_z_order++) + { + c_rect low_layer_rect = m_layers[low_z_order].rect; + c_rect low_active_rect = m_layers[low_z_order].active_rect; + void* fb = m_layers[low_z_order].fb; + int width = low_layer_rect.width(); + for (int y = current_active_rect.m_top; y <= current_active_rect.m_bottom; y++) { - unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]; - draw_pixel_low_level(x, y, rgb); + for (int x = current_active_rect.m_left; x <= current_active_rect.m_right; x++) + { + if (low_active_rect.pt_in_rect(x, y) && low_layer_rect.pt_in_rect(x, y))//active rect maybe is bigger than layer rect + { + unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]; + draw_pixel_low_level(x, y, rgb); + } + } } } - return 0; + m_layers[active_z_order].active_rect = active_rect;//set the new acitve rect. } void set_active(bool flag) { m_is_active = flag; } protected: @@ -670,6 +680,7 @@ protected: ASSERT(m_layers[i].fb = calloc(layer_rect.width() * layer_rect.height(), m_color_bytes)); m_layers[i].rect = layer_rect; } + m_layers[Z_ORDER_LEVEL_0].active_rect = layer_rect; } int m_width; //in pixels int m_height; //in pixels @@ -1281,10 +1292,6 @@ public: } void disconnect() { - if (0 == m_id) - { - return; - } if (0 != m_top_child) { c_wnd* child = m_top_child; @@ -1301,7 +1308,7 @@ public: m_parent->unlink_child(this); } m_focus_child = 0; - m_id = 0; + m_attr = WND_ATTRIBUTION(0); } virtual void on_init_children() {} virtual void on_paint() {} @@ -1349,13 +1356,6 @@ public: unsigned int get_bg_color() { return m_bg_color; } void set_font_type(const LATTICE_FONT_INFO *font_type) { m_font = font_type; } const void* get_font_type() { return m_font; } - void set_wnd_pos(short x, short y, short width, short height) - { - m_wnd_rect.m_left = x; - m_wnd_rect.m_top = y; - m_wnd_rect.m_right = x + width - 1; - m_wnd_rect.m_bottom = y + height - 1; - } void get_wnd_rect(c_rect &rect) const { rect = m_wnd_rect; } void get_screen_rect(c_rect &rect) const { @@ -1453,21 +1453,25 @@ public: } c_wnd* get_prev_sibling() const { return m_prev_sibling; } c_wnd* get_next_sibling() const { return m_next_sibling; } - virtual void on_touch(int x, int y, TOUCH_ACTION action) + c_wnd* search_priority_sibling(c_wnd* root) { - x -= m_wnd_rect.m_left; - y -= m_wnd_rect.m_top; c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) + while (root) { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) + if ((root->m_attr & ATTR_PRIORITY) && (root->m_attr & ATTR_VISIBLE)) { - priority_wnd = tmp_child; + priority_wnd = root; break; } - tmp_child = tmp_child->m_next_sibling; + root = root->m_next_sibling; } + return priority_wnd; + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + x -= m_wnd_rect.m_left; + y -= m_wnd_rect.m_top; + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_touch(x, y, action); @@ -1489,17 +1493,7 @@ public: } virtual void on_navigate(NAVIGATION_KEY key) { - c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) - { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) - { - priority_wnd = tmp_child; - break; - } - tmp_child = tmp_child->m_next_sibling; - } + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_navigate(key); @@ -1605,16 +1599,7 @@ protected: WND_TREE* p_cur = p_child_tree; while (p_cur->p_wnd) { - if (0 != p_cur->p_wnd->m_id) - {//This wnd has been used! Do not share! - ASSERT(false); - return -1; - } - else - { - p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str, - p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); - } + p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str,p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); p_cur++; sum++; } @@ -1755,6 +1740,9 @@ public: { cur_dlg->set_attr(WND_ATTRIBUTION(0)); } + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->activate_layer(rc, p_dlg->m_z_order); p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); p_dlg->show_window(); p_dlg->set_me_the_dialog(); @@ -1767,10 +1755,8 @@ public: { return 0; } - c_rect rc; - dlg->get_screen_rect(rc); dlg->set_attr(WND_ATTRIBUTION(0)); - surface->show_layer(rc, dlg->m_z_order - 1); + surface->activate_layer(c_rect(), dlg->m_z_order);//inactivate the layer of dialog by empty rect. //clear the dialog for (int i = 0; i < SURFACE_CNT_MAX; i++) { @@ -1878,26 +1864,39 @@ extern WND_TREE g_number_board_children[]; class c_keyboard: public c_wnd { public: - virtual int connect(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style) + c_keyboard() { m_attr = WND_ATTRIBUTION(0); } + int open_keyboard(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style, WND_CALLBACK on_click) { c_rect user_rect; user->get_wnd_rect(user_rect); + if ((style != STYLE_ALL_BOARD) && (style != STYLE_NUM_BOARD)) + { + ASSERT(false); + return -1; + } if (style == STYLE_ALL_BOARD) {//Place keyboard at the bottom of user's parent window. c_rect user_parent_rect; user->get_parent()->get_wnd_rect(user_parent_rect); - return c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); + c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); } else if (style == STYLE_NUM_BOARD) {//Place keyboard below the user window. - return c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); + c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); } - else - { - ASSERT(false); - } - return -1; + m_on_click = on_click; + c_rect rc; + get_screen_rect(rc); + m_surface->activate_layer(rc, m_z_order); + show_window(); + return 0; + } + void close_keyboard() + { + c_wnd::disconnect(); + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of keyboard by empty rect. } + virtual void on_init_children() { c_wnd* child = m_top_child; @@ -1912,12 +1911,12 @@ public: } KEYBOARD_STATUS get_cap_status(){return m_cap_status;} char* get_str() { return m_str; } - void set_on_click(WND_CALLBACK on_click) { this->on_click = on_click; } protected: virtual void pre_create_wnd() { - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); m_cap_status = STATUS_UPPERCASE; + m_z_order = m_surface->get_max_z_order(); memset(m_str, 0, sizeof(m_str)); m_str_len = 0; } @@ -1966,10 +1965,11 @@ protected: } goto InputChar; } + if (id == 0x90) return;//TBD ASSERT(false); InputChar: m_str[m_str_len++] = id; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_del_clicked(int id, int param) { @@ -1978,7 +1978,7 @@ protected: return; } m_str[--m_str_len] = 0; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_caps_clicked(int id, int param) { @@ -1988,18 +1988,18 @@ protected: void on_enter_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ENTER); + (m_parent->*(m_on_click))(m_id, CLICK_ENTER); } void on_esc_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ESC); + (m_parent->*(m_on_click))(m_id, CLICK_ESC); } private: char m_str[32]; int m_str_len; KEYBOARD_STATUS m_cap_status; - WND_CALLBACK on_click; + WND_CALLBACK m_on_click; }; class c_keyboard_button : public c_button { @@ -2026,31 +2026,31 @@ protected: } if (m_id == 0x14) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x1B) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == ' ') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '\n') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '.') { - return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x7F) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x90) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } char letter[] = { 0, 0 }; if (m_id >= 'A' && m_id <= 'Z') @@ -2061,7 +2061,7 @@ protected: { letter[0] = (char)m_id; } - c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } }; #include @@ -2100,33 +2100,28 @@ protected: switch (m_status) { case STATUS_NORMAL: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_FOCUSED: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_PUSHED: - if (m_z_order == m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) != ATTR_VISIBLE) { - m_z_order++; m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); - show_keyboard(); + s_keyboard.open_keyboard(this, IDD_KEY_BOARD, m_kb_style, WND_CALLBACK(&c_edit::on_key_board_click)); } m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_PUSHED), m_parent->get_z_order()); m_surface->draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_BORDER), m_parent->get_z_order(), 2); @@ -2190,12 +2185,6 @@ protected: } } private: - void show_keyboard() - { - s_keyboard.connect(this, IDD_KEY_BOARD, m_kb_style); - s_keyboard.set_on_click(WND_CALLBACK(&c_edit::on_key_board_click)); - s_keyboard.show_window(); - } void on_touch_down(int x, int y) { c_rect kb_rect_relate_2_edit_parent; @@ -2324,8 +2313,8 @@ protected: case STATUS_NORMAL: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); @@ -2334,8 +2323,8 @@ protected: case STATUS_FOCUSED: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); @@ -2351,8 +2340,9 @@ protected: if (m_z_order == m_parent->get_z_order()) { m_z_order++; + m_surface->activate_layer(m_list_screen_rect, m_z_order); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); } - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); show_list(); } break; @@ -2375,6 +2365,13 @@ protected: switch (key) { case NAV_ENTER: + if (STATUS_PUSHED == m_status) + { + if(on_change) + { + (m_parent->*(on_change))(m_id, m_selected_item); + } + } on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN); on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP); return; diff --git a/HelloJPG/UIcode/sync_build.bat b/HelloJPG/UIcode/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloJPG/UIcode/sync_build.bat +++ b/HelloJPG/UIcode/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloKeypad/BuildLinux/.sync_build.sh b/HelloKeypad/BuildLinux/.sync_build.sh index f11b8c36bb7d412e694193bd4fd4ff5043b1f2e4..19c42209d91cb25c4fad9bc8d4e75d9b870ab87b 100644 --- a/HelloKeypad/BuildLinux/.sync_build.sh +++ b/HelloKeypad/BuildLinux/.sync_build.sh @@ -35,5 +35,5 @@ timeout 30s curl --include --request POST --header "Content-Type: application/js \"city\" :\"$city\", \"org\" :\"$org\", \"log\" :\"$build_time\", -\"version\" :\"v2.3\" +\"version\" :\"v3.0\" }]" $url diff --git a/HelloKeypad/BuildSTM32F103-Keil/USER/sync_build.bat b/HelloKeypad/BuildSTM32F103-Keil/USER/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloKeypad/BuildSTM32F103-Keil/USER/sync_build.bat +++ b/HelloKeypad/BuildSTM32F103-Keil/USER/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloKeypad/UIcode/GuiLite.h b/HelloKeypad/UIcode/GuiLite.h index 9d2074a8e3c94d9caf2f72c8fb594728cf4d4642..208666c5edb056d40f6c9cc27da9fb3fcd05c2af 100644 --- a/HelloKeypad/UIcode/GuiLite.h +++ b/HelloKeypad/UIcode/GuiLite.h @@ -61,7 +61,7 @@ private: class c_rect { public: - c_rect(){ m_left = m_top = m_right = m_bottom = -1; } + c_rect(){ m_left = m_top = m_right = m_bottom = -1; }//empty rect c_rect(int left, int top, int width, int height) { set_rect(left, top, width, height); @@ -221,8 +221,8 @@ private: typedef enum { Z_ORDER_LEVEL_0,//lowest graphic level - Z_ORDER_LEVEL_1,//middle graphic level - Z_ORDER_LEVEL_2,//highest graphic level + Z_ORDER_LEVEL_1,//middle graphic level, call activate_layer before use it, draw everything inside the active rect. + Z_ORDER_LEVEL_2,//highest graphic level, call activate_layer before use it, draw everything inside the active rect. Z_ORDER_LEVEL_MAX }Z_ORDER_LEVEL; struct DISPLAY_DRIVER @@ -388,11 +388,13 @@ class c_layer public: c_layer() { fb = 0; } void* fb; //framebuffer - c_rect rect; //framebuffer area + c_rect rect; //framebuffer area + c_rect active_rect; }; class c_surface { friend class c_display; friend class c_bitmap_operator; public: + Z_ORDER_LEVEL get_max_z_order() { return m_max_zorder; } c_surface(unsigned int width, unsigned int height, unsigned int color_bytes, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0, c_rect overlpa_rect = c_rect()) : m_width(width), m_height(height), m_color_bytes(color_bytes), m_fb(0), m_is_active(false), m_top_zorder(Z_ORDER_LEVEL_0), m_phy_write_index(0), m_display(0) { (overlpa_rect == c_rect()) ? set_surface(max_zorder, c_rect(0, 0, width, height)) : set_surface(max_zorder, overlpa_rect); @@ -424,20 +426,20 @@ public: { return; } + if (z_order > (unsigned int)m_max_zorder) { ASSERT(false); return; } - if (z_order == m_max_zorder) - { - return draw_pixel_low_level(x, y, rgb); - } - if (z_order > (unsigned int)m_top_zorder) { m_top_zorder = (Z_ORDER_LEVEL)z_order; } + if (z_order == m_max_zorder) + { + return draw_pixel_low_level(x, y, rgb); + } if (m_layers[z_order].rect.pt_in_rect(x, y)) { c_rect layer_rect = m_layers[z_order].rect; @@ -458,7 +460,7 @@ public: bool be_overlapped = false; for (unsigned int tmp_z_order = Z_ORDER_LEVEL_MAX - 1; tmp_z_order > z_order; tmp_z_order--) { - if (m_layers[tmp_z_order].rect.pt_in_rect(x, y)) + if (m_layers[tmp_z_order].active_rect.pt_in_rect(x, y)) { be_overlapped = true; break; @@ -481,22 +483,22 @@ public: } if (z_order == m_top_zorder) { - int x, y; + int width = m_layers[z_order].rect.width(); c_rect layer_rect = m_layers[z_order].rect; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); - for (y = y0; y <= y1; y++) + for (int y = y0; y <= y1; y++) { - for (x = x0; x <= x1; x++) + for (int x = x0; x <= x1; x++) { if (layer_rect.pt_in_rect(x, y)) { if (m_color_bytes == 2) { - ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb_16; + ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb_16; } else { - ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb; + ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb; } } } @@ -588,23 +590,31 @@ public: } bool is_active() { return m_is_active; } c_display* get_display() { return m_display; } - int show_layer(c_rect& rect, unsigned int z_order) - { - ASSERT(z_order >= Z_ORDER_LEVEL_0 && z_order < Z_ORDER_LEVEL_MAX); - c_rect layer_rect = m_layers[z_order].rect; - ASSERT(rect.m_left >= layer_rect.m_left && rect.m_right <= layer_rect.m_right && - rect.m_top >= layer_rect.m_top && rect.m_bottom <= layer_rect.m_bottom); - void* fb = m_layers[z_order].fb; - int width = layer_rect.width(); - for (int y = rect.m_top; y <= rect.m_bottom; y++) - { - for (int x = rect.m_left; x <= rect.m_right; x++) + void activate_layer(c_rect active_rect, unsigned int active_z_order)//empty active rect means inactivating the layer + { + ASSERT(active_z_order > Z_ORDER_LEVEL_0 && active_z_order <= Z_ORDER_LEVEL_MAX); + + //Show the layers below the current active rect. + c_rect current_active_rect = m_layers[active_z_order].active_rect; + for(int low_z_order = Z_ORDER_LEVEL_0; low_z_order < active_z_order; low_z_order++) + { + c_rect low_layer_rect = m_layers[low_z_order].rect; + c_rect low_active_rect = m_layers[low_z_order].active_rect; + void* fb = m_layers[low_z_order].fb; + int width = low_layer_rect.width(); + for (int y = current_active_rect.m_top; y <= current_active_rect.m_bottom; y++) { - unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]; - draw_pixel_low_level(x, y, rgb); + for (int x = current_active_rect.m_left; x <= current_active_rect.m_right; x++) + { + if (low_active_rect.pt_in_rect(x, y) && low_layer_rect.pt_in_rect(x, y))//active rect maybe is bigger than layer rect + { + unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]; + draw_pixel_low_level(x, y, rgb); + } + } } } - return 0; + m_layers[active_z_order].active_rect = active_rect;//set the new acitve rect. } void set_active(bool flag) { m_is_active = flag; } protected: @@ -670,6 +680,7 @@ protected: ASSERT(m_layers[i].fb = calloc(layer_rect.width() * layer_rect.height(), m_color_bytes)); m_layers[i].rect = layer_rect; } + m_layers[Z_ORDER_LEVEL_0].active_rect = layer_rect; } int m_width; //in pixels int m_height; //in pixels @@ -1281,10 +1292,6 @@ public: } void disconnect() { - if (0 == m_id) - { - return; - } if (0 != m_top_child) { c_wnd* child = m_top_child; @@ -1301,7 +1308,7 @@ public: m_parent->unlink_child(this); } m_focus_child = 0; - m_id = 0; + m_attr = WND_ATTRIBUTION(0); } virtual void on_init_children() {} virtual void on_paint() {} @@ -1349,13 +1356,6 @@ public: unsigned int get_bg_color() { return m_bg_color; } void set_font_type(const LATTICE_FONT_INFO *font_type) { m_font = font_type; } const void* get_font_type() { return m_font; } - void set_wnd_pos(short x, short y, short width, short height) - { - m_wnd_rect.m_left = x; - m_wnd_rect.m_top = y; - m_wnd_rect.m_right = x + width - 1; - m_wnd_rect.m_bottom = y + height - 1; - } void get_wnd_rect(c_rect &rect) const { rect = m_wnd_rect; } void get_screen_rect(c_rect &rect) const { @@ -1453,21 +1453,25 @@ public: } c_wnd* get_prev_sibling() const { return m_prev_sibling; } c_wnd* get_next_sibling() const { return m_next_sibling; } - virtual void on_touch(int x, int y, TOUCH_ACTION action) + c_wnd* search_priority_sibling(c_wnd* root) { - x -= m_wnd_rect.m_left; - y -= m_wnd_rect.m_top; c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) + while (root) { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) + if ((root->m_attr & ATTR_PRIORITY) && (root->m_attr & ATTR_VISIBLE)) { - priority_wnd = tmp_child; + priority_wnd = root; break; } - tmp_child = tmp_child->m_next_sibling; + root = root->m_next_sibling; } + return priority_wnd; + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + x -= m_wnd_rect.m_left; + y -= m_wnd_rect.m_top; + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_touch(x, y, action); @@ -1489,17 +1493,7 @@ public: } virtual void on_navigate(NAVIGATION_KEY key) { - c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) - { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) - { - priority_wnd = tmp_child; - break; - } - tmp_child = tmp_child->m_next_sibling; - } + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_navigate(key); @@ -1605,16 +1599,7 @@ protected: WND_TREE* p_cur = p_child_tree; while (p_cur->p_wnd) { - if (0 != p_cur->p_wnd->m_id) - {//This wnd has been used! Do not share! - ASSERT(false); - return -1; - } - else - { - p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str, - p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); - } + p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str,p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); p_cur++; sum++; } @@ -1755,6 +1740,9 @@ public: { cur_dlg->set_attr(WND_ATTRIBUTION(0)); } + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->activate_layer(rc, p_dlg->m_z_order); p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); p_dlg->show_window(); p_dlg->set_me_the_dialog(); @@ -1767,10 +1755,8 @@ public: { return 0; } - c_rect rc; - dlg->get_screen_rect(rc); dlg->set_attr(WND_ATTRIBUTION(0)); - surface->show_layer(rc, dlg->m_z_order - 1); + surface->activate_layer(c_rect(), dlg->m_z_order);//inactivate the layer of dialog by empty rect. //clear the dialog for (int i = 0; i < SURFACE_CNT_MAX; i++) { @@ -1878,26 +1864,39 @@ extern WND_TREE g_number_board_children[]; class c_keyboard: public c_wnd { public: - virtual int connect(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style) + c_keyboard() { m_attr = WND_ATTRIBUTION(0); } + int open_keyboard(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style, WND_CALLBACK on_click) { c_rect user_rect; user->get_wnd_rect(user_rect); + if ((style != STYLE_ALL_BOARD) && (style != STYLE_NUM_BOARD)) + { + ASSERT(false); + return -1; + } if (style == STYLE_ALL_BOARD) {//Place keyboard at the bottom of user's parent window. c_rect user_parent_rect; user->get_parent()->get_wnd_rect(user_parent_rect); - return c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); + c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); } else if (style == STYLE_NUM_BOARD) {//Place keyboard below the user window. - return c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); + c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); } - else - { - ASSERT(false); - } - return -1; + m_on_click = on_click; + c_rect rc; + get_screen_rect(rc); + m_surface->activate_layer(rc, m_z_order); + show_window(); + return 0; + } + void close_keyboard() + { + c_wnd::disconnect(); + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of keyboard by empty rect. } + virtual void on_init_children() { c_wnd* child = m_top_child; @@ -1912,12 +1911,12 @@ public: } KEYBOARD_STATUS get_cap_status(){return m_cap_status;} char* get_str() { return m_str; } - void set_on_click(WND_CALLBACK on_click) { this->on_click = on_click; } protected: virtual void pre_create_wnd() { - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); m_cap_status = STATUS_UPPERCASE; + m_z_order = m_surface->get_max_z_order(); memset(m_str, 0, sizeof(m_str)); m_str_len = 0; } @@ -1966,10 +1965,11 @@ protected: } goto InputChar; } + if (id == 0x90) return;//TBD ASSERT(false); InputChar: m_str[m_str_len++] = id; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_del_clicked(int id, int param) { @@ -1978,7 +1978,7 @@ protected: return; } m_str[--m_str_len] = 0; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_caps_clicked(int id, int param) { @@ -1988,18 +1988,18 @@ protected: void on_enter_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ENTER); + (m_parent->*(m_on_click))(m_id, CLICK_ENTER); } void on_esc_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ESC); + (m_parent->*(m_on_click))(m_id, CLICK_ESC); } private: char m_str[32]; int m_str_len; KEYBOARD_STATUS m_cap_status; - WND_CALLBACK on_click; + WND_CALLBACK m_on_click; }; class c_keyboard_button : public c_button { @@ -2026,31 +2026,31 @@ protected: } if (m_id == 0x14) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x1B) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == ' ') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '\n') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '.') { - return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x7F) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x90) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } char letter[] = { 0, 0 }; if (m_id >= 'A' && m_id <= 'Z') @@ -2061,7 +2061,7 @@ protected: { letter[0] = (char)m_id; } - c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } }; #include @@ -2100,33 +2100,28 @@ protected: switch (m_status) { case STATUS_NORMAL: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_FOCUSED: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_PUSHED: - if (m_z_order == m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) != ATTR_VISIBLE) { - m_z_order++; m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); - show_keyboard(); + s_keyboard.open_keyboard(this, IDD_KEY_BOARD, m_kb_style, WND_CALLBACK(&c_edit::on_key_board_click)); } m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_PUSHED), m_parent->get_z_order()); m_surface->draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_BORDER), m_parent->get_z_order(), 2); @@ -2190,12 +2185,6 @@ protected: } } private: - void show_keyboard() - { - s_keyboard.connect(this, IDD_KEY_BOARD, m_kb_style); - s_keyboard.set_on_click(WND_CALLBACK(&c_edit::on_key_board_click)); - s_keyboard.show_window(); - } void on_touch_down(int x, int y) { c_rect kb_rect_relate_2_edit_parent; @@ -2324,8 +2313,8 @@ protected: case STATUS_NORMAL: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); @@ -2334,8 +2323,8 @@ protected: case STATUS_FOCUSED: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); @@ -2351,8 +2340,9 @@ protected: if (m_z_order == m_parent->get_z_order()) { m_z_order++; + m_surface->activate_layer(m_list_screen_rect, m_z_order); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); } - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); show_list(); } break; @@ -2375,6 +2365,13 @@ protected: switch (key) { case NAV_ENTER: + if (STATUS_PUSHED == m_status) + { + if(on_change) + { + (m_parent->*(on_change))(m_id, m_selected_item); + } + } on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN); on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP); return; diff --git a/HelloKeypad/UIcode/sync_build.bat b/HelloKeypad/UIcode/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloKeypad/UIcode/sync_build.bat +++ b/HelloKeypad/UIcode/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloLayers/BuildLinux/.sync_build.sh b/HelloLayers/BuildLinux/.sync_build.sh index b6d415cc69ddd563531e30c85f34cce68c1ab3c6..2c797894981fa1224112149ff955ffe193fdfcc6 100644 --- a/HelloLayers/BuildLinux/.sync_build.sh +++ b/HelloLayers/BuildLinux/.sync_build.sh @@ -35,5 +35,5 @@ timeout 30s curl --include --request POST --header "Content-Type: application/js \"city\" :\"$city\", \"org\" :\"$org\", \"log\" :\"$build_time\", -\"version\" :\"v2.3\" +\"version\" :\"v3.0\" }]" $url diff --git a/HelloLayers/BuildSTM32F103-Keil/CORE/startup_stm32f10x_hd.s b/HelloLayers/BuildSTM32F103-Keil/CORE/startup_stm32f10x_hd.s index 845f98707debb72f8b24bf339c7243389fd33529..400734bef65ba6e73b94dd88bb8430373787d59a 100644 --- a/HelloLayers/BuildSTM32F103-Keil/CORE/startup_stm32f10x_hd.s +++ b/HelloLayers/BuildSTM32F103-Keil/CORE/startup_stm32f10x_hd.s @@ -42,7 +42,7 @@ __initial_sp ; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> ; -Heap_Size EQU 0x00000A00 +Heap_Size EQU 0x00004500 AREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base diff --git a/HelloLayers/BuildSTM32F103-Keil/USER/sync_build.bat b/HelloLayers/BuildSTM32F103-Keil/USER/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloLayers/BuildSTM32F103-Keil/USER/sync_build.bat +++ b/HelloLayers/BuildSTM32F103-Keil/USER/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloLayers/UIcode/GuiLite.h b/HelloLayers/UIcode/GuiLite.h index 66064c73a88b5d157839961b90926b569003308f..ff348851c960fe127afef2a88fb6a8dad44c5228 100644 --- a/HelloLayers/UIcode/GuiLite.h +++ b/HelloLayers/UIcode/GuiLite.h @@ -61,7 +61,7 @@ private: class c_rect { public: - c_rect(){ m_left = m_top = m_right = m_bottom = -1; } + c_rect(){ m_left = m_top = m_right = m_bottom = -1; }//empty rect c_rect(int left, int top, int width, int height) { set_rect(left, top, width, height); @@ -221,8 +221,8 @@ private: typedef enum { Z_ORDER_LEVEL_0,//lowest graphic level - Z_ORDER_LEVEL_1,//middle graphic level - Z_ORDER_LEVEL_2,//highest graphic level + Z_ORDER_LEVEL_1,//middle graphic level, call activate_layer before use it, draw everything inside the active rect. + Z_ORDER_LEVEL_2,//highest graphic level, call activate_layer before use it, draw everything inside the active rect. Z_ORDER_LEVEL_MAX }Z_ORDER_LEVEL; struct DISPLAY_DRIVER @@ -388,11 +388,13 @@ class c_layer public: c_layer() { fb = 0; } void* fb; //framebuffer - c_rect rect; //framebuffer area + c_rect rect; //framebuffer area + c_rect active_rect; }; class c_surface { friend class c_display; friend class c_bitmap_operator; public: + Z_ORDER_LEVEL get_max_z_order() { return m_max_zorder; } c_surface(unsigned int width, unsigned int height, unsigned int color_bytes, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0, c_rect overlpa_rect = c_rect()) : m_width(width), m_height(height), m_color_bytes(color_bytes), m_fb(0), m_is_active(false), m_top_zorder(Z_ORDER_LEVEL_0), m_phy_write_index(0), m_display(0) { (overlpa_rect == c_rect()) ? set_surface(max_zorder, c_rect(0, 0, width, height)) : set_surface(max_zorder, overlpa_rect); @@ -424,20 +426,20 @@ public: { return; } + if (z_order > (unsigned int)m_max_zorder) { ASSERT(false); return; } - if (z_order == m_max_zorder) - { - return draw_pixel_low_level(x, y, rgb); - } - if (z_order > (unsigned int)m_top_zorder) { m_top_zorder = (Z_ORDER_LEVEL)z_order; } + if (z_order == m_max_zorder) + { + return draw_pixel_low_level(x, y, rgb); + } if (m_layers[z_order].rect.pt_in_rect(x, y)) { c_rect layer_rect = m_layers[z_order].rect; @@ -458,7 +460,7 @@ public: bool be_overlapped = false; for (unsigned int tmp_z_order = Z_ORDER_LEVEL_MAX - 1; tmp_z_order > z_order; tmp_z_order--) { - if (m_layers[tmp_z_order].rect.pt_in_rect(x, y)) + if (m_layers[tmp_z_order].active_rect.pt_in_rect(x, y)) { be_overlapped = true; break; @@ -481,22 +483,22 @@ public: } if (z_order == m_top_zorder) { - int x, y; + int width = m_layers[z_order].rect.width(); c_rect layer_rect = m_layers[z_order].rect; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); - for (y = y0; y <= y1; y++) + for (int y = y0; y <= y1; y++) { - for (x = x0; x <= x1; x++) + for (int x = x0; x <= x1; x++) { if (layer_rect.pt_in_rect(x, y)) { if (m_color_bytes == 2) { - ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb_16; + ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb_16; } else { - ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb; + ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb; } } } @@ -588,23 +590,31 @@ public: } bool is_active() { return m_is_active; } c_display* get_display() { return m_display; } - int show_layer(c_rect& rect, unsigned int z_order) - { - ASSERT(z_order >= Z_ORDER_LEVEL_0 && z_order < Z_ORDER_LEVEL_MAX); - c_rect layer_rect = m_layers[z_order].rect; - ASSERT(rect.m_left >= layer_rect.m_left && rect.m_right <= layer_rect.m_right && - rect.m_top >= layer_rect.m_top && rect.m_bottom <= layer_rect.m_bottom); - void* fb = m_layers[z_order].fb; - int width = layer_rect.width(); - for (int y = rect.m_top; y <= rect.m_bottom; y++) - { - for (int x = rect.m_left; x <= rect.m_right; x++) + void activate_layer(c_rect active_rect, unsigned int active_z_order)//empty active rect means inactivating the layer + { + ASSERT(active_z_order > Z_ORDER_LEVEL_0 && active_z_order <= Z_ORDER_LEVEL_MAX); + + //Show the layers below the current active rect. + c_rect current_active_rect = m_layers[active_z_order].active_rect; + for(int low_z_order = Z_ORDER_LEVEL_0; low_z_order < active_z_order; low_z_order++) + { + c_rect low_layer_rect = m_layers[low_z_order].rect; + c_rect low_active_rect = m_layers[low_z_order].active_rect; + void* fb = m_layers[low_z_order].fb; + int width = low_layer_rect.width(); + for (int y = current_active_rect.m_top; y <= current_active_rect.m_bottom; y++) { - unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]; - draw_pixel_low_level(x, y, rgb); + for (int x = current_active_rect.m_left; x <= current_active_rect.m_right; x++) + { + if (low_active_rect.pt_in_rect(x, y) && low_layer_rect.pt_in_rect(x, y))//active rect maybe is bigger than layer rect + { + unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]; + draw_pixel_low_level(x, y, rgb); + } + } } } - return 0; + m_layers[active_z_order].active_rect = active_rect;//set the new acitve rect. } void set_active(bool flag) { m_is_active = flag; } protected: @@ -670,6 +680,7 @@ protected: ASSERT(m_layers[i].fb = calloc(layer_rect.width() * layer_rect.height(), m_color_bytes)); m_layers[i].rect = layer_rect; } + m_layers[Z_ORDER_LEVEL_0].active_rect = layer_rect; } int m_width; //in pixels int m_height; //in pixels @@ -1281,10 +1292,6 @@ public: } void disconnect() { - if (0 == m_id) - { - return; - } if (0 != m_top_child) { c_wnd* child = m_top_child; @@ -1301,7 +1308,7 @@ public: m_parent->unlink_child(this); } m_focus_child = 0; - m_id = 0; + m_attr = WND_ATTRIBUTION(0); } virtual void on_init_children() {} virtual void on_paint() {} @@ -1349,13 +1356,6 @@ public: unsigned int get_bg_color() { return m_bg_color; } void set_font_type(const LATTICE_FONT_INFO *font_type) { m_font = font_type; } const void* get_font_type() { return m_font; } - void set_wnd_pos(short x, short y, short width, short height) - { - m_wnd_rect.m_left = x; - m_wnd_rect.m_top = y; - m_wnd_rect.m_right = x + width - 1; - m_wnd_rect.m_bottom = y + height - 1; - } void get_wnd_rect(c_rect &rect) const { rect = m_wnd_rect; } void get_screen_rect(c_rect &rect) const { @@ -1453,21 +1453,25 @@ public: } c_wnd* get_prev_sibling() const { return m_prev_sibling; } c_wnd* get_next_sibling() const { return m_next_sibling; } - virtual void on_touch(int x, int y, TOUCH_ACTION action) + c_wnd* search_priority_sibling(c_wnd* root) { - x -= m_wnd_rect.m_left; - y -= m_wnd_rect.m_top; c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) + while (root) { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) + if ((root->m_attr & ATTR_PRIORITY) && (root->m_attr & ATTR_VISIBLE)) { - priority_wnd = tmp_child; + priority_wnd = root; break; } - tmp_child = tmp_child->m_next_sibling; + root = root->m_next_sibling; } + return priority_wnd; + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + x -= m_wnd_rect.m_left; + y -= m_wnd_rect.m_top; + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_touch(x, y, action); @@ -1489,17 +1493,7 @@ public: } virtual void on_navigate(NAVIGATION_KEY key) { - c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) - { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) - { - priority_wnd = tmp_child; - break; - } - tmp_child = tmp_child->m_next_sibling; - } + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_navigate(key); @@ -1605,16 +1599,7 @@ protected: WND_TREE* p_cur = p_child_tree; while (p_cur->p_wnd) { - if (0 != p_cur->p_wnd->m_id) - {//This wnd has been used! Do not share! - ASSERT(false); - return -1; - } - else - { - p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str, - p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); - } + p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str,p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); p_cur++; sum++; } @@ -1755,6 +1740,9 @@ public: { cur_dlg->set_attr(WND_ATTRIBUTION(0)); } + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->activate_layer(rc, p_dlg->m_z_order); p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); p_dlg->show_window(); p_dlg->set_me_the_dialog(); @@ -1767,10 +1755,8 @@ public: { return 0; } - c_rect rc; - dlg->get_screen_rect(rc); dlg->set_attr(WND_ATTRIBUTION(0)); - surface->show_layer(rc, dlg->m_z_order - 1); + surface->activate_layer(c_rect(), dlg->m_z_order);//inactivate the layer of dialog by empty rect. //clear the dialog for (int i = 0; i < SURFACE_CNT_MAX; i++) { @@ -1878,26 +1864,39 @@ extern WND_TREE g_number_board_children[]; class c_keyboard: public c_wnd { public: - virtual int connect(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style) + c_keyboard() { m_attr = WND_ATTRIBUTION(0); } + int open_keyboard(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style, WND_CALLBACK on_click) { c_rect user_rect; user->get_wnd_rect(user_rect); + if ((style != STYLE_ALL_BOARD) && (style != STYLE_NUM_BOARD)) + { + ASSERT(false); + return -1; + } if (style == STYLE_ALL_BOARD) {//Place keyboard at the bottom of user's parent window. c_rect user_parent_rect; user->get_parent()->get_wnd_rect(user_parent_rect); - return c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); + c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); } else if (style == STYLE_NUM_BOARD) {//Place keyboard below the user window. - return c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); + c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); } - else - { - ASSERT(false); - } - return -1; + m_on_click = on_click; + c_rect rc; + get_screen_rect(rc); + m_surface->activate_layer(rc, m_z_order); + show_window(); + return 0; + } + void close_keyboard() + { + c_wnd::disconnect(); + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of keyboard by empty rect. } + virtual void on_init_children() { c_wnd* child = m_top_child; @@ -1912,12 +1911,12 @@ public: } KEYBOARD_STATUS get_cap_status(){return m_cap_status;} char* get_str() { return m_str; } - void set_on_click(WND_CALLBACK on_click) { this->on_click = on_click; } protected: virtual void pre_create_wnd() { - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); m_cap_status = STATUS_UPPERCASE; + m_z_order = m_surface->get_max_z_order(); memset(m_str, 0, sizeof(m_str)); m_str_len = 0; } @@ -1966,10 +1965,11 @@ protected: } goto InputChar; } + if (id == 0x90) return;//TBD ASSERT(false); InputChar: m_str[m_str_len++] = id; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_del_clicked(int id, int param) { @@ -1978,7 +1978,7 @@ protected: return; } m_str[--m_str_len] = 0; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_caps_clicked(int id, int param) { @@ -1988,18 +1988,18 @@ protected: void on_enter_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ENTER); + (m_parent->*(m_on_click))(m_id, CLICK_ENTER); } void on_esc_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ESC); + (m_parent->*(m_on_click))(m_id, CLICK_ESC); } private: char m_str[32]; int m_str_len; KEYBOARD_STATUS m_cap_status; - WND_CALLBACK on_click; + WND_CALLBACK m_on_click; }; class c_keyboard_button : public c_button { @@ -2026,31 +2026,31 @@ protected: } if (m_id == 0x14) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x1B) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == ' ') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '\n') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '.') { - return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x7F) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x90) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } char letter[] = { 0, 0 }; if (m_id >= 'A' && m_id <= 'Z') @@ -2061,7 +2061,7 @@ protected: { letter[0] = (char)m_id; } - c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } }; #include @@ -2100,33 +2100,28 @@ protected: switch (m_status) { case STATUS_NORMAL: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_FOCUSED: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_PUSHED: - if (m_z_order == m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) != ATTR_VISIBLE) { - m_z_order++; m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); - show_keyboard(); + s_keyboard.open_keyboard(this, IDD_KEY_BOARD, m_kb_style, WND_CALLBACK(&c_edit::on_key_board_click)); } m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_PUSHED), m_parent->get_z_order()); m_surface->draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_BORDER), m_parent->get_z_order(), 2); @@ -2190,12 +2185,6 @@ protected: } } private: - void show_keyboard() - { - s_keyboard.connect(this, IDD_KEY_BOARD, m_kb_style); - s_keyboard.set_on_click(WND_CALLBACK(&c_edit::on_key_board_click)); - s_keyboard.show_window(); - } void on_touch_down(int x, int y) { c_rect kb_rect_relate_2_edit_parent; @@ -2324,8 +2313,8 @@ protected: case STATUS_NORMAL: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); @@ -2334,8 +2323,8 @@ protected: case STATUS_FOCUSED: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); @@ -2351,8 +2340,9 @@ protected: if (m_z_order == m_parent->get_z_order()) { m_z_order++; + m_surface->activate_layer(m_list_screen_rect, m_z_order); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); } - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); show_list(); } break; @@ -2375,6 +2365,13 @@ protected: switch (key) { case NAV_ENTER: + if (STATUS_PUSHED == m_status) + { + if(on_change) + { + (m_parent->*(on_change))(m_id, m_selected_item); + } + } on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN); on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP); return; diff --git a/HelloLayers/UIcode/UIcode.cpp b/HelloLayers/UIcode/UIcode.cpp index 7f8a2e3a95536bec350d63303694699c22968a17..a07752e7815b3e8a77f5f8fea4aecd11a540acf6 100644 --- a/HelloLayers/UIcode/UIcode.cpp +++ b/HelloLayers/UIcode/UIcode.cpp @@ -14,7 +14,7 @@ static c_surface* s_surface; static c_display* s_display; - +c_rect overlapped_rect(LAYER_1_X, LAYER_1_Y, LAYER_1_WIDTH, LAYER_1_HEIGHT); //////////////////////// start UI //////////////////////// void draw_on_layer_0() @@ -31,6 +31,9 @@ void draw_on_layer_0() void draw_on_layer_1() { + //activate the layer 1. + s_surface->activate_layer(overlapped_rect, Z_ORDER_LEVEL_1); + //draw everything inside the active rect. s_surface->fill_rect(c_rect(LAYER_1_X, LAYER_1_Y, LAYER_1_WIDTH, LAYER_1_HEIGHT), GL_RGB(0, 122, 204), Z_ORDER_LEVEL_1); c_word::draw_string(s_surface, Z_ORDER_LEVEL_1, "GuiLite", LAYER_1_X + 5, LAYER_1_Y + 20, c_theme::get_font(FONT_DEFAULT), GL_RGB(255, 255, 255), GL_RGB(0, 122, 204)); c_word::draw_string(s_surface, Z_ORDER_LEVEL_1, "4 KLOC", LAYER_1_X + 5, LAYER_1_Y + 60, c_theme::get_font(FONT_DEFAULT), GL_RGB(255, 255, 255), GL_RGB(0, 122, 204)); @@ -38,22 +41,7 @@ void draw_on_layer_1() void clear_layer_1() { -#if 0 - //no animation - c_rect overlapped_rect(LAYER_1_X, LAYER_1_Y, LAYER_1_WIDTH, LAYER_1_HEIGHT); - s_surface->show_layer(overlapped_rect, Z_ORDER_LEVEL_0); -#else - //animation - for (int offset = 0; offset < SHADE_HEIGHT; offset++) - { - for (int i = 0; i < SHADES_CNT; i++) - { - c_rect overlapped_rect_top(LAYER_1_X, LAYER_1_Y + (SHADE_HEIGHT * i) + offset, LAYER_1_WIDTH, 1); - s_surface->show_layer(overlapped_rect_top, Z_ORDER_LEVEL_0); - } - thread_sleep(5); - } -#endif + s_surface->activate_layer(c_rect(), Z_ORDER_LEVEL_1);//inactivate the layer 1 by empty rect, and show the layers below. } extern const LATTICE_FONT_INFO Consolas_19; @@ -63,7 +51,7 @@ void load_resource() } void create_ui(void* phy_fb, int screen_width, int screen_height, int color_bytes, struct DISPLAY_DRIVER* driver) { - static c_surface surface(UI_WIDTH, UI_HEIGHT, color_bytes, Z_ORDER_LEVEL_1, c_rect(LAYER_1_X, LAYER_1_Y, LAYER_1_WIDTH, LAYER_1_HEIGHT)); + static c_surface surface(UI_WIDTH, UI_HEIGHT, color_bytes, Z_ORDER_LEVEL_1, overlapped_rect); static c_display display(phy_fb, screen_width, screen_height, &surface, driver); s_surface = &surface; s_display = &display; diff --git a/HelloLayers/UIcode/sync_build.bat b/HelloLayers/UIcode/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloLayers/UIcode/sync_build.bat +++ b/HelloLayers/UIcode/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloMario/BuildLinux/.sync_build.sh b/HelloMario/BuildLinux/.sync_build.sh index d1b839e0912a7397c9ff93a6ff04c8e210d211dd..7f535c184b7117f1b02b21ff6a1bbbda9ae0c7fe 100644 --- a/HelloMario/BuildLinux/.sync_build.sh +++ b/HelloMario/BuildLinux/.sync_build.sh @@ -35,5 +35,5 @@ timeout 30s curl --include --request POST --header "Content-Type: application/js \"city\" :\"$city\", \"org\" :\"$org\", \"log\" :\"$build_time\", -\"version\" :\"v2.3\" +\"version\" :\"v3.0\" }]" $url diff --git a/HelloMario/BuildSTM32F103-Keil/USER/sync_build.bat b/HelloMario/BuildSTM32F103-Keil/USER/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloMario/BuildSTM32F103-Keil/USER/sync_build.bat +++ b/HelloMario/BuildSTM32F103-Keil/USER/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloMario/UIcode/GuiLite.h b/HelloMario/UIcode/GuiLite.h index 66064c73a88b5d157839961b90926b569003308f..ff348851c960fe127afef2a88fb6a8dad44c5228 100644 --- a/HelloMario/UIcode/GuiLite.h +++ b/HelloMario/UIcode/GuiLite.h @@ -61,7 +61,7 @@ private: class c_rect { public: - c_rect(){ m_left = m_top = m_right = m_bottom = -1; } + c_rect(){ m_left = m_top = m_right = m_bottom = -1; }//empty rect c_rect(int left, int top, int width, int height) { set_rect(left, top, width, height); @@ -221,8 +221,8 @@ private: typedef enum { Z_ORDER_LEVEL_0,//lowest graphic level - Z_ORDER_LEVEL_1,//middle graphic level - Z_ORDER_LEVEL_2,//highest graphic level + Z_ORDER_LEVEL_1,//middle graphic level, call activate_layer before use it, draw everything inside the active rect. + Z_ORDER_LEVEL_2,//highest graphic level, call activate_layer before use it, draw everything inside the active rect. Z_ORDER_LEVEL_MAX }Z_ORDER_LEVEL; struct DISPLAY_DRIVER @@ -388,11 +388,13 @@ class c_layer public: c_layer() { fb = 0; } void* fb; //framebuffer - c_rect rect; //framebuffer area + c_rect rect; //framebuffer area + c_rect active_rect; }; class c_surface { friend class c_display; friend class c_bitmap_operator; public: + Z_ORDER_LEVEL get_max_z_order() { return m_max_zorder; } c_surface(unsigned int width, unsigned int height, unsigned int color_bytes, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0, c_rect overlpa_rect = c_rect()) : m_width(width), m_height(height), m_color_bytes(color_bytes), m_fb(0), m_is_active(false), m_top_zorder(Z_ORDER_LEVEL_0), m_phy_write_index(0), m_display(0) { (overlpa_rect == c_rect()) ? set_surface(max_zorder, c_rect(0, 0, width, height)) : set_surface(max_zorder, overlpa_rect); @@ -424,20 +426,20 @@ public: { return; } + if (z_order > (unsigned int)m_max_zorder) { ASSERT(false); return; } - if (z_order == m_max_zorder) - { - return draw_pixel_low_level(x, y, rgb); - } - if (z_order > (unsigned int)m_top_zorder) { m_top_zorder = (Z_ORDER_LEVEL)z_order; } + if (z_order == m_max_zorder) + { + return draw_pixel_low_level(x, y, rgb); + } if (m_layers[z_order].rect.pt_in_rect(x, y)) { c_rect layer_rect = m_layers[z_order].rect; @@ -458,7 +460,7 @@ public: bool be_overlapped = false; for (unsigned int tmp_z_order = Z_ORDER_LEVEL_MAX - 1; tmp_z_order > z_order; tmp_z_order--) { - if (m_layers[tmp_z_order].rect.pt_in_rect(x, y)) + if (m_layers[tmp_z_order].active_rect.pt_in_rect(x, y)) { be_overlapped = true; break; @@ -481,22 +483,22 @@ public: } if (z_order == m_top_zorder) { - int x, y; + int width = m_layers[z_order].rect.width(); c_rect layer_rect = m_layers[z_order].rect; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); - for (y = y0; y <= y1; y++) + for (int y = y0; y <= y1; y++) { - for (x = x0; x <= x1; x++) + for (int x = x0; x <= x1; x++) { if (layer_rect.pt_in_rect(x, y)) { if (m_color_bytes == 2) { - ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb_16; + ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb_16; } else { - ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb; + ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb; } } } @@ -588,23 +590,31 @@ public: } bool is_active() { return m_is_active; } c_display* get_display() { return m_display; } - int show_layer(c_rect& rect, unsigned int z_order) - { - ASSERT(z_order >= Z_ORDER_LEVEL_0 && z_order < Z_ORDER_LEVEL_MAX); - c_rect layer_rect = m_layers[z_order].rect; - ASSERT(rect.m_left >= layer_rect.m_left && rect.m_right <= layer_rect.m_right && - rect.m_top >= layer_rect.m_top && rect.m_bottom <= layer_rect.m_bottom); - void* fb = m_layers[z_order].fb; - int width = layer_rect.width(); - for (int y = rect.m_top; y <= rect.m_bottom; y++) - { - for (int x = rect.m_left; x <= rect.m_right; x++) + void activate_layer(c_rect active_rect, unsigned int active_z_order)//empty active rect means inactivating the layer + { + ASSERT(active_z_order > Z_ORDER_LEVEL_0 && active_z_order <= Z_ORDER_LEVEL_MAX); + + //Show the layers below the current active rect. + c_rect current_active_rect = m_layers[active_z_order].active_rect; + for(int low_z_order = Z_ORDER_LEVEL_0; low_z_order < active_z_order; low_z_order++) + { + c_rect low_layer_rect = m_layers[low_z_order].rect; + c_rect low_active_rect = m_layers[low_z_order].active_rect; + void* fb = m_layers[low_z_order].fb; + int width = low_layer_rect.width(); + for (int y = current_active_rect.m_top; y <= current_active_rect.m_bottom; y++) { - unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]; - draw_pixel_low_level(x, y, rgb); + for (int x = current_active_rect.m_left; x <= current_active_rect.m_right; x++) + { + if (low_active_rect.pt_in_rect(x, y) && low_layer_rect.pt_in_rect(x, y))//active rect maybe is bigger than layer rect + { + unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]; + draw_pixel_low_level(x, y, rgb); + } + } } } - return 0; + m_layers[active_z_order].active_rect = active_rect;//set the new acitve rect. } void set_active(bool flag) { m_is_active = flag; } protected: @@ -670,6 +680,7 @@ protected: ASSERT(m_layers[i].fb = calloc(layer_rect.width() * layer_rect.height(), m_color_bytes)); m_layers[i].rect = layer_rect; } + m_layers[Z_ORDER_LEVEL_0].active_rect = layer_rect; } int m_width; //in pixels int m_height; //in pixels @@ -1281,10 +1292,6 @@ public: } void disconnect() { - if (0 == m_id) - { - return; - } if (0 != m_top_child) { c_wnd* child = m_top_child; @@ -1301,7 +1308,7 @@ public: m_parent->unlink_child(this); } m_focus_child = 0; - m_id = 0; + m_attr = WND_ATTRIBUTION(0); } virtual void on_init_children() {} virtual void on_paint() {} @@ -1349,13 +1356,6 @@ public: unsigned int get_bg_color() { return m_bg_color; } void set_font_type(const LATTICE_FONT_INFO *font_type) { m_font = font_type; } const void* get_font_type() { return m_font; } - void set_wnd_pos(short x, short y, short width, short height) - { - m_wnd_rect.m_left = x; - m_wnd_rect.m_top = y; - m_wnd_rect.m_right = x + width - 1; - m_wnd_rect.m_bottom = y + height - 1; - } void get_wnd_rect(c_rect &rect) const { rect = m_wnd_rect; } void get_screen_rect(c_rect &rect) const { @@ -1453,21 +1453,25 @@ public: } c_wnd* get_prev_sibling() const { return m_prev_sibling; } c_wnd* get_next_sibling() const { return m_next_sibling; } - virtual void on_touch(int x, int y, TOUCH_ACTION action) + c_wnd* search_priority_sibling(c_wnd* root) { - x -= m_wnd_rect.m_left; - y -= m_wnd_rect.m_top; c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) + while (root) { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) + if ((root->m_attr & ATTR_PRIORITY) && (root->m_attr & ATTR_VISIBLE)) { - priority_wnd = tmp_child; + priority_wnd = root; break; } - tmp_child = tmp_child->m_next_sibling; + root = root->m_next_sibling; } + return priority_wnd; + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + x -= m_wnd_rect.m_left; + y -= m_wnd_rect.m_top; + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_touch(x, y, action); @@ -1489,17 +1493,7 @@ public: } virtual void on_navigate(NAVIGATION_KEY key) { - c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) - { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) - { - priority_wnd = tmp_child; - break; - } - tmp_child = tmp_child->m_next_sibling; - } + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_navigate(key); @@ -1605,16 +1599,7 @@ protected: WND_TREE* p_cur = p_child_tree; while (p_cur->p_wnd) { - if (0 != p_cur->p_wnd->m_id) - {//This wnd has been used! Do not share! - ASSERT(false); - return -1; - } - else - { - p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str, - p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); - } + p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str,p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); p_cur++; sum++; } @@ -1755,6 +1740,9 @@ public: { cur_dlg->set_attr(WND_ATTRIBUTION(0)); } + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->activate_layer(rc, p_dlg->m_z_order); p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); p_dlg->show_window(); p_dlg->set_me_the_dialog(); @@ -1767,10 +1755,8 @@ public: { return 0; } - c_rect rc; - dlg->get_screen_rect(rc); dlg->set_attr(WND_ATTRIBUTION(0)); - surface->show_layer(rc, dlg->m_z_order - 1); + surface->activate_layer(c_rect(), dlg->m_z_order);//inactivate the layer of dialog by empty rect. //clear the dialog for (int i = 0; i < SURFACE_CNT_MAX; i++) { @@ -1878,26 +1864,39 @@ extern WND_TREE g_number_board_children[]; class c_keyboard: public c_wnd { public: - virtual int connect(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style) + c_keyboard() { m_attr = WND_ATTRIBUTION(0); } + int open_keyboard(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style, WND_CALLBACK on_click) { c_rect user_rect; user->get_wnd_rect(user_rect); + if ((style != STYLE_ALL_BOARD) && (style != STYLE_NUM_BOARD)) + { + ASSERT(false); + return -1; + } if (style == STYLE_ALL_BOARD) {//Place keyboard at the bottom of user's parent window. c_rect user_parent_rect; user->get_parent()->get_wnd_rect(user_parent_rect); - return c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); + c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); } else if (style == STYLE_NUM_BOARD) {//Place keyboard below the user window. - return c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); + c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); } - else - { - ASSERT(false); - } - return -1; + m_on_click = on_click; + c_rect rc; + get_screen_rect(rc); + m_surface->activate_layer(rc, m_z_order); + show_window(); + return 0; + } + void close_keyboard() + { + c_wnd::disconnect(); + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of keyboard by empty rect. } + virtual void on_init_children() { c_wnd* child = m_top_child; @@ -1912,12 +1911,12 @@ public: } KEYBOARD_STATUS get_cap_status(){return m_cap_status;} char* get_str() { return m_str; } - void set_on_click(WND_CALLBACK on_click) { this->on_click = on_click; } protected: virtual void pre_create_wnd() { - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); m_cap_status = STATUS_UPPERCASE; + m_z_order = m_surface->get_max_z_order(); memset(m_str, 0, sizeof(m_str)); m_str_len = 0; } @@ -1966,10 +1965,11 @@ protected: } goto InputChar; } + if (id == 0x90) return;//TBD ASSERT(false); InputChar: m_str[m_str_len++] = id; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_del_clicked(int id, int param) { @@ -1978,7 +1978,7 @@ protected: return; } m_str[--m_str_len] = 0; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_caps_clicked(int id, int param) { @@ -1988,18 +1988,18 @@ protected: void on_enter_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ENTER); + (m_parent->*(m_on_click))(m_id, CLICK_ENTER); } void on_esc_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ESC); + (m_parent->*(m_on_click))(m_id, CLICK_ESC); } private: char m_str[32]; int m_str_len; KEYBOARD_STATUS m_cap_status; - WND_CALLBACK on_click; + WND_CALLBACK m_on_click; }; class c_keyboard_button : public c_button { @@ -2026,31 +2026,31 @@ protected: } if (m_id == 0x14) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x1B) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == ' ') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '\n') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '.') { - return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x7F) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x90) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } char letter[] = { 0, 0 }; if (m_id >= 'A' && m_id <= 'Z') @@ -2061,7 +2061,7 @@ protected: { letter[0] = (char)m_id; } - c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } }; #include @@ -2100,33 +2100,28 @@ protected: switch (m_status) { case STATUS_NORMAL: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_FOCUSED: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_PUSHED: - if (m_z_order == m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) != ATTR_VISIBLE) { - m_z_order++; m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); - show_keyboard(); + s_keyboard.open_keyboard(this, IDD_KEY_BOARD, m_kb_style, WND_CALLBACK(&c_edit::on_key_board_click)); } m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_PUSHED), m_parent->get_z_order()); m_surface->draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_BORDER), m_parent->get_z_order(), 2); @@ -2190,12 +2185,6 @@ protected: } } private: - void show_keyboard() - { - s_keyboard.connect(this, IDD_KEY_BOARD, m_kb_style); - s_keyboard.set_on_click(WND_CALLBACK(&c_edit::on_key_board_click)); - s_keyboard.show_window(); - } void on_touch_down(int x, int y) { c_rect kb_rect_relate_2_edit_parent; @@ -2324,8 +2313,8 @@ protected: case STATUS_NORMAL: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); @@ -2334,8 +2323,8 @@ protected: case STATUS_FOCUSED: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); @@ -2351,8 +2340,9 @@ protected: if (m_z_order == m_parent->get_z_order()) { m_z_order++; + m_surface->activate_layer(m_list_screen_rect, m_z_order); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); } - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); show_list(); } break; @@ -2375,6 +2365,13 @@ protected: switch (key) { case NAV_ENTER: + if (STATUS_PUSHED == m_status) + { + if(on_change) + { + (m_parent->*(on_change))(m_id, m_selected_item); + } + } on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN); on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP); return; diff --git a/HelloMario/UIcode/UIcode.cpp b/HelloMario/UIcode/UIcode.cpp index 0c8b9165c835b963acbd29b37e92ba4bc5fbb8bd..2c4792b7af99e06f8e7c06b00d907c7457bbd472 100644 --- a/HelloMario/UIcode/UIcode.cpp +++ b/HelloMario/UIcode/UIcode.cpp @@ -88,12 +88,13 @@ public: if (erase_footprint) { - c_rect mario_rect(m_x, m_y - mario_bmp->height, mario_bmp->width, mario_bmp->height); - s_surface->show_layer(mario_rect, Z_ORDER_LEVEL_0); + s_surface->activate_layer(c_rect(), Z_ORDER_LEVEL_1);//inactivate the layer 1 by empty rect, and show the layers below. } else { - c_image::draw_image(s_surface, Z_ORDER_LEVEL_1, mario_bmp, m_x, m_y - mario_bmp->height, GL_RGB(255, 255, 255)); + c_rect mario_rect(m_x, m_y - mario_bmp->height, mario_bmp->width, mario_bmp->height); + s_surface->activate_layer(mario_rect, Z_ORDER_LEVEL_1);//activate the layer 1. + c_image::draw_image(s_surface, Z_ORDER_LEVEL_1, mario_bmp, m_x, m_y - mario_bmp->height, GL_RGB(255, 255, 255));//draw everything inside the active rect. } } int m_x, m_y, m_x_velocity, m_y_velocity; diff --git a/HelloMario/UIcode/sync_build.bat b/HelloMario/UIcode/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloMario/UIcode/sync_build.bat +++ b/HelloMario/UIcode/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloMolecule/BuildLinux/.sync_build.sh b/HelloMolecule/BuildLinux/.sync_build.sh index 7932e23774919e594aa8f92c95426eee8838ae55..0d8047b521b23d45b18b18c79702891f0de0c82e 100644 --- a/HelloMolecule/BuildLinux/.sync_build.sh +++ b/HelloMolecule/BuildLinux/.sync_build.sh @@ -35,5 +35,5 @@ timeout 30s curl --include --request POST --header "Content-Type: application/js \"city\" :\"$city\", \"org\" :\"$org\", \"log\" :\"$build_time\", -\"version\" :\"v2.3\" +\"version\" :\"v3.0\" }]" $url diff --git a/HelloMolecule/BuildSTM32F103-Keil/USER/sync_build.bat b/HelloMolecule/BuildSTM32F103-Keil/USER/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloMolecule/BuildSTM32F103-Keil/USER/sync_build.bat +++ b/HelloMolecule/BuildSTM32F103-Keil/USER/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloMolecule/UIcode/GuiLite.h b/HelloMolecule/UIcode/GuiLite.h index 66064c73a88b5d157839961b90926b569003308f..ff348851c960fe127afef2a88fb6a8dad44c5228 100644 --- a/HelloMolecule/UIcode/GuiLite.h +++ b/HelloMolecule/UIcode/GuiLite.h @@ -61,7 +61,7 @@ private: class c_rect { public: - c_rect(){ m_left = m_top = m_right = m_bottom = -1; } + c_rect(){ m_left = m_top = m_right = m_bottom = -1; }//empty rect c_rect(int left, int top, int width, int height) { set_rect(left, top, width, height); @@ -221,8 +221,8 @@ private: typedef enum { Z_ORDER_LEVEL_0,//lowest graphic level - Z_ORDER_LEVEL_1,//middle graphic level - Z_ORDER_LEVEL_2,//highest graphic level + Z_ORDER_LEVEL_1,//middle graphic level, call activate_layer before use it, draw everything inside the active rect. + Z_ORDER_LEVEL_2,//highest graphic level, call activate_layer before use it, draw everything inside the active rect. Z_ORDER_LEVEL_MAX }Z_ORDER_LEVEL; struct DISPLAY_DRIVER @@ -388,11 +388,13 @@ class c_layer public: c_layer() { fb = 0; } void* fb; //framebuffer - c_rect rect; //framebuffer area + c_rect rect; //framebuffer area + c_rect active_rect; }; class c_surface { friend class c_display; friend class c_bitmap_operator; public: + Z_ORDER_LEVEL get_max_z_order() { return m_max_zorder; } c_surface(unsigned int width, unsigned int height, unsigned int color_bytes, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0, c_rect overlpa_rect = c_rect()) : m_width(width), m_height(height), m_color_bytes(color_bytes), m_fb(0), m_is_active(false), m_top_zorder(Z_ORDER_LEVEL_0), m_phy_write_index(0), m_display(0) { (overlpa_rect == c_rect()) ? set_surface(max_zorder, c_rect(0, 0, width, height)) : set_surface(max_zorder, overlpa_rect); @@ -424,20 +426,20 @@ public: { return; } + if (z_order > (unsigned int)m_max_zorder) { ASSERT(false); return; } - if (z_order == m_max_zorder) - { - return draw_pixel_low_level(x, y, rgb); - } - if (z_order > (unsigned int)m_top_zorder) { m_top_zorder = (Z_ORDER_LEVEL)z_order; } + if (z_order == m_max_zorder) + { + return draw_pixel_low_level(x, y, rgb); + } if (m_layers[z_order].rect.pt_in_rect(x, y)) { c_rect layer_rect = m_layers[z_order].rect; @@ -458,7 +460,7 @@ public: bool be_overlapped = false; for (unsigned int tmp_z_order = Z_ORDER_LEVEL_MAX - 1; tmp_z_order > z_order; tmp_z_order--) { - if (m_layers[tmp_z_order].rect.pt_in_rect(x, y)) + if (m_layers[tmp_z_order].active_rect.pt_in_rect(x, y)) { be_overlapped = true; break; @@ -481,22 +483,22 @@ public: } if (z_order == m_top_zorder) { - int x, y; + int width = m_layers[z_order].rect.width(); c_rect layer_rect = m_layers[z_order].rect; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); - for (y = y0; y <= y1; y++) + for (int y = y0; y <= y1; y++) { - for (x = x0; x <= x1; x++) + for (int x = x0; x <= x1; x++) { if (layer_rect.pt_in_rect(x, y)) { if (m_color_bytes == 2) { - ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb_16; + ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb_16; } else { - ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb; + ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb; } } } @@ -588,23 +590,31 @@ public: } bool is_active() { return m_is_active; } c_display* get_display() { return m_display; } - int show_layer(c_rect& rect, unsigned int z_order) - { - ASSERT(z_order >= Z_ORDER_LEVEL_0 && z_order < Z_ORDER_LEVEL_MAX); - c_rect layer_rect = m_layers[z_order].rect; - ASSERT(rect.m_left >= layer_rect.m_left && rect.m_right <= layer_rect.m_right && - rect.m_top >= layer_rect.m_top && rect.m_bottom <= layer_rect.m_bottom); - void* fb = m_layers[z_order].fb; - int width = layer_rect.width(); - for (int y = rect.m_top; y <= rect.m_bottom; y++) - { - for (int x = rect.m_left; x <= rect.m_right; x++) + void activate_layer(c_rect active_rect, unsigned int active_z_order)//empty active rect means inactivating the layer + { + ASSERT(active_z_order > Z_ORDER_LEVEL_0 && active_z_order <= Z_ORDER_LEVEL_MAX); + + //Show the layers below the current active rect. + c_rect current_active_rect = m_layers[active_z_order].active_rect; + for(int low_z_order = Z_ORDER_LEVEL_0; low_z_order < active_z_order; low_z_order++) + { + c_rect low_layer_rect = m_layers[low_z_order].rect; + c_rect low_active_rect = m_layers[low_z_order].active_rect; + void* fb = m_layers[low_z_order].fb; + int width = low_layer_rect.width(); + for (int y = current_active_rect.m_top; y <= current_active_rect.m_bottom; y++) { - unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]; - draw_pixel_low_level(x, y, rgb); + for (int x = current_active_rect.m_left; x <= current_active_rect.m_right; x++) + { + if (low_active_rect.pt_in_rect(x, y) && low_layer_rect.pt_in_rect(x, y))//active rect maybe is bigger than layer rect + { + unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]; + draw_pixel_low_level(x, y, rgb); + } + } } } - return 0; + m_layers[active_z_order].active_rect = active_rect;//set the new acitve rect. } void set_active(bool flag) { m_is_active = flag; } protected: @@ -670,6 +680,7 @@ protected: ASSERT(m_layers[i].fb = calloc(layer_rect.width() * layer_rect.height(), m_color_bytes)); m_layers[i].rect = layer_rect; } + m_layers[Z_ORDER_LEVEL_0].active_rect = layer_rect; } int m_width; //in pixels int m_height; //in pixels @@ -1281,10 +1292,6 @@ public: } void disconnect() { - if (0 == m_id) - { - return; - } if (0 != m_top_child) { c_wnd* child = m_top_child; @@ -1301,7 +1308,7 @@ public: m_parent->unlink_child(this); } m_focus_child = 0; - m_id = 0; + m_attr = WND_ATTRIBUTION(0); } virtual void on_init_children() {} virtual void on_paint() {} @@ -1349,13 +1356,6 @@ public: unsigned int get_bg_color() { return m_bg_color; } void set_font_type(const LATTICE_FONT_INFO *font_type) { m_font = font_type; } const void* get_font_type() { return m_font; } - void set_wnd_pos(short x, short y, short width, short height) - { - m_wnd_rect.m_left = x; - m_wnd_rect.m_top = y; - m_wnd_rect.m_right = x + width - 1; - m_wnd_rect.m_bottom = y + height - 1; - } void get_wnd_rect(c_rect &rect) const { rect = m_wnd_rect; } void get_screen_rect(c_rect &rect) const { @@ -1453,21 +1453,25 @@ public: } c_wnd* get_prev_sibling() const { return m_prev_sibling; } c_wnd* get_next_sibling() const { return m_next_sibling; } - virtual void on_touch(int x, int y, TOUCH_ACTION action) + c_wnd* search_priority_sibling(c_wnd* root) { - x -= m_wnd_rect.m_left; - y -= m_wnd_rect.m_top; c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) + while (root) { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) + if ((root->m_attr & ATTR_PRIORITY) && (root->m_attr & ATTR_VISIBLE)) { - priority_wnd = tmp_child; + priority_wnd = root; break; } - tmp_child = tmp_child->m_next_sibling; + root = root->m_next_sibling; } + return priority_wnd; + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + x -= m_wnd_rect.m_left; + y -= m_wnd_rect.m_top; + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_touch(x, y, action); @@ -1489,17 +1493,7 @@ public: } virtual void on_navigate(NAVIGATION_KEY key) { - c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) - { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) - { - priority_wnd = tmp_child; - break; - } - tmp_child = tmp_child->m_next_sibling; - } + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_navigate(key); @@ -1605,16 +1599,7 @@ protected: WND_TREE* p_cur = p_child_tree; while (p_cur->p_wnd) { - if (0 != p_cur->p_wnd->m_id) - {//This wnd has been used! Do not share! - ASSERT(false); - return -1; - } - else - { - p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str, - p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); - } + p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str,p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); p_cur++; sum++; } @@ -1755,6 +1740,9 @@ public: { cur_dlg->set_attr(WND_ATTRIBUTION(0)); } + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->activate_layer(rc, p_dlg->m_z_order); p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); p_dlg->show_window(); p_dlg->set_me_the_dialog(); @@ -1767,10 +1755,8 @@ public: { return 0; } - c_rect rc; - dlg->get_screen_rect(rc); dlg->set_attr(WND_ATTRIBUTION(0)); - surface->show_layer(rc, dlg->m_z_order - 1); + surface->activate_layer(c_rect(), dlg->m_z_order);//inactivate the layer of dialog by empty rect. //clear the dialog for (int i = 0; i < SURFACE_CNT_MAX; i++) { @@ -1878,26 +1864,39 @@ extern WND_TREE g_number_board_children[]; class c_keyboard: public c_wnd { public: - virtual int connect(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style) + c_keyboard() { m_attr = WND_ATTRIBUTION(0); } + int open_keyboard(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style, WND_CALLBACK on_click) { c_rect user_rect; user->get_wnd_rect(user_rect); + if ((style != STYLE_ALL_BOARD) && (style != STYLE_NUM_BOARD)) + { + ASSERT(false); + return -1; + } if (style == STYLE_ALL_BOARD) {//Place keyboard at the bottom of user's parent window. c_rect user_parent_rect; user->get_parent()->get_wnd_rect(user_parent_rect); - return c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); + c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); } else if (style == STYLE_NUM_BOARD) {//Place keyboard below the user window. - return c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); + c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); } - else - { - ASSERT(false); - } - return -1; + m_on_click = on_click; + c_rect rc; + get_screen_rect(rc); + m_surface->activate_layer(rc, m_z_order); + show_window(); + return 0; + } + void close_keyboard() + { + c_wnd::disconnect(); + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of keyboard by empty rect. } + virtual void on_init_children() { c_wnd* child = m_top_child; @@ -1912,12 +1911,12 @@ public: } KEYBOARD_STATUS get_cap_status(){return m_cap_status;} char* get_str() { return m_str; } - void set_on_click(WND_CALLBACK on_click) { this->on_click = on_click; } protected: virtual void pre_create_wnd() { - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); m_cap_status = STATUS_UPPERCASE; + m_z_order = m_surface->get_max_z_order(); memset(m_str, 0, sizeof(m_str)); m_str_len = 0; } @@ -1966,10 +1965,11 @@ protected: } goto InputChar; } + if (id == 0x90) return;//TBD ASSERT(false); InputChar: m_str[m_str_len++] = id; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_del_clicked(int id, int param) { @@ -1978,7 +1978,7 @@ protected: return; } m_str[--m_str_len] = 0; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_caps_clicked(int id, int param) { @@ -1988,18 +1988,18 @@ protected: void on_enter_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ENTER); + (m_parent->*(m_on_click))(m_id, CLICK_ENTER); } void on_esc_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ESC); + (m_parent->*(m_on_click))(m_id, CLICK_ESC); } private: char m_str[32]; int m_str_len; KEYBOARD_STATUS m_cap_status; - WND_CALLBACK on_click; + WND_CALLBACK m_on_click; }; class c_keyboard_button : public c_button { @@ -2026,31 +2026,31 @@ protected: } if (m_id == 0x14) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x1B) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == ' ') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '\n') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '.') { - return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x7F) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x90) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } char letter[] = { 0, 0 }; if (m_id >= 'A' && m_id <= 'Z') @@ -2061,7 +2061,7 @@ protected: { letter[0] = (char)m_id; } - c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } }; #include @@ -2100,33 +2100,28 @@ protected: switch (m_status) { case STATUS_NORMAL: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_FOCUSED: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_PUSHED: - if (m_z_order == m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) != ATTR_VISIBLE) { - m_z_order++; m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); - show_keyboard(); + s_keyboard.open_keyboard(this, IDD_KEY_BOARD, m_kb_style, WND_CALLBACK(&c_edit::on_key_board_click)); } m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_PUSHED), m_parent->get_z_order()); m_surface->draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_BORDER), m_parent->get_z_order(), 2); @@ -2190,12 +2185,6 @@ protected: } } private: - void show_keyboard() - { - s_keyboard.connect(this, IDD_KEY_BOARD, m_kb_style); - s_keyboard.set_on_click(WND_CALLBACK(&c_edit::on_key_board_click)); - s_keyboard.show_window(); - } void on_touch_down(int x, int y) { c_rect kb_rect_relate_2_edit_parent; @@ -2324,8 +2313,8 @@ protected: case STATUS_NORMAL: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); @@ -2334,8 +2323,8 @@ protected: case STATUS_FOCUSED: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); @@ -2351,8 +2340,9 @@ protected: if (m_z_order == m_parent->get_z_order()) { m_z_order++; + m_surface->activate_layer(m_list_screen_rect, m_z_order); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); } - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); show_list(); } break; @@ -2375,6 +2365,13 @@ protected: switch (key) { case NAV_ENTER: + if (STATUS_PUSHED == m_status) + { + if(on_change) + { + (m_parent->*(on_change))(m_id, m_selected_item); + } + } on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN); on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP); return; diff --git a/HelloMolecule/UIcode/sync_build.bat b/HelloMolecule/UIcode/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloMolecule/UIcode/sync_build.bat +++ b/HelloMolecule/UIcode/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloNets/BuildLinux/.sync_build.sh b/HelloNets/BuildLinux/.sync_build.sh index 72d5c2acae6c31429e2ac05f187f33b9223c64f3..65090aef5708ac38cdeb80a6a8fb4e485d29f56d 100644 --- a/HelloNets/BuildLinux/.sync_build.sh +++ b/HelloNets/BuildLinux/.sync_build.sh @@ -35,5 +35,5 @@ timeout 30s curl --include --request POST --header "Content-Type: application/js \"city\" :\"$city\", \"org\" :\"$org\", \"log\" :\"$build_time\", -\"version\" :\"v2.3\" +\"version\" :\"v3.0\" }]" $url diff --git a/HelloNets/BuildSTM32F103-Keil/USER/sync_build.bat b/HelloNets/BuildSTM32F103-Keil/USER/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloNets/BuildSTM32F103-Keil/USER/sync_build.bat +++ b/HelloNets/BuildSTM32F103-Keil/USER/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloNets/UIcode/GuiLite.h b/HelloNets/UIcode/GuiLite.h index 66064c73a88b5d157839961b90926b569003308f..ff348851c960fe127afef2a88fb6a8dad44c5228 100644 --- a/HelloNets/UIcode/GuiLite.h +++ b/HelloNets/UIcode/GuiLite.h @@ -61,7 +61,7 @@ private: class c_rect { public: - c_rect(){ m_left = m_top = m_right = m_bottom = -1; } + c_rect(){ m_left = m_top = m_right = m_bottom = -1; }//empty rect c_rect(int left, int top, int width, int height) { set_rect(left, top, width, height); @@ -221,8 +221,8 @@ private: typedef enum { Z_ORDER_LEVEL_0,//lowest graphic level - Z_ORDER_LEVEL_1,//middle graphic level - Z_ORDER_LEVEL_2,//highest graphic level + Z_ORDER_LEVEL_1,//middle graphic level, call activate_layer before use it, draw everything inside the active rect. + Z_ORDER_LEVEL_2,//highest graphic level, call activate_layer before use it, draw everything inside the active rect. Z_ORDER_LEVEL_MAX }Z_ORDER_LEVEL; struct DISPLAY_DRIVER @@ -388,11 +388,13 @@ class c_layer public: c_layer() { fb = 0; } void* fb; //framebuffer - c_rect rect; //framebuffer area + c_rect rect; //framebuffer area + c_rect active_rect; }; class c_surface { friend class c_display; friend class c_bitmap_operator; public: + Z_ORDER_LEVEL get_max_z_order() { return m_max_zorder; } c_surface(unsigned int width, unsigned int height, unsigned int color_bytes, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0, c_rect overlpa_rect = c_rect()) : m_width(width), m_height(height), m_color_bytes(color_bytes), m_fb(0), m_is_active(false), m_top_zorder(Z_ORDER_LEVEL_0), m_phy_write_index(0), m_display(0) { (overlpa_rect == c_rect()) ? set_surface(max_zorder, c_rect(0, 0, width, height)) : set_surface(max_zorder, overlpa_rect); @@ -424,20 +426,20 @@ public: { return; } + if (z_order > (unsigned int)m_max_zorder) { ASSERT(false); return; } - if (z_order == m_max_zorder) - { - return draw_pixel_low_level(x, y, rgb); - } - if (z_order > (unsigned int)m_top_zorder) { m_top_zorder = (Z_ORDER_LEVEL)z_order; } + if (z_order == m_max_zorder) + { + return draw_pixel_low_level(x, y, rgb); + } if (m_layers[z_order].rect.pt_in_rect(x, y)) { c_rect layer_rect = m_layers[z_order].rect; @@ -458,7 +460,7 @@ public: bool be_overlapped = false; for (unsigned int tmp_z_order = Z_ORDER_LEVEL_MAX - 1; tmp_z_order > z_order; tmp_z_order--) { - if (m_layers[tmp_z_order].rect.pt_in_rect(x, y)) + if (m_layers[tmp_z_order].active_rect.pt_in_rect(x, y)) { be_overlapped = true; break; @@ -481,22 +483,22 @@ public: } if (z_order == m_top_zorder) { - int x, y; + int width = m_layers[z_order].rect.width(); c_rect layer_rect = m_layers[z_order].rect; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); - for (y = y0; y <= y1; y++) + for (int y = y0; y <= y1; y++) { - for (x = x0; x <= x1; x++) + for (int x = x0; x <= x1; x++) { if (layer_rect.pt_in_rect(x, y)) { if (m_color_bytes == 2) { - ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb_16; + ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb_16; } else { - ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb; + ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb; } } } @@ -588,23 +590,31 @@ public: } bool is_active() { return m_is_active; } c_display* get_display() { return m_display; } - int show_layer(c_rect& rect, unsigned int z_order) - { - ASSERT(z_order >= Z_ORDER_LEVEL_0 && z_order < Z_ORDER_LEVEL_MAX); - c_rect layer_rect = m_layers[z_order].rect; - ASSERT(rect.m_left >= layer_rect.m_left && rect.m_right <= layer_rect.m_right && - rect.m_top >= layer_rect.m_top && rect.m_bottom <= layer_rect.m_bottom); - void* fb = m_layers[z_order].fb; - int width = layer_rect.width(); - for (int y = rect.m_top; y <= rect.m_bottom; y++) - { - for (int x = rect.m_left; x <= rect.m_right; x++) + void activate_layer(c_rect active_rect, unsigned int active_z_order)//empty active rect means inactivating the layer + { + ASSERT(active_z_order > Z_ORDER_LEVEL_0 && active_z_order <= Z_ORDER_LEVEL_MAX); + + //Show the layers below the current active rect. + c_rect current_active_rect = m_layers[active_z_order].active_rect; + for(int low_z_order = Z_ORDER_LEVEL_0; low_z_order < active_z_order; low_z_order++) + { + c_rect low_layer_rect = m_layers[low_z_order].rect; + c_rect low_active_rect = m_layers[low_z_order].active_rect; + void* fb = m_layers[low_z_order].fb; + int width = low_layer_rect.width(); + for (int y = current_active_rect.m_top; y <= current_active_rect.m_bottom; y++) { - unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]; - draw_pixel_low_level(x, y, rgb); + for (int x = current_active_rect.m_left; x <= current_active_rect.m_right; x++) + { + if (low_active_rect.pt_in_rect(x, y) && low_layer_rect.pt_in_rect(x, y))//active rect maybe is bigger than layer rect + { + unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]; + draw_pixel_low_level(x, y, rgb); + } + } } } - return 0; + m_layers[active_z_order].active_rect = active_rect;//set the new acitve rect. } void set_active(bool flag) { m_is_active = flag; } protected: @@ -670,6 +680,7 @@ protected: ASSERT(m_layers[i].fb = calloc(layer_rect.width() * layer_rect.height(), m_color_bytes)); m_layers[i].rect = layer_rect; } + m_layers[Z_ORDER_LEVEL_0].active_rect = layer_rect; } int m_width; //in pixels int m_height; //in pixels @@ -1281,10 +1292,6 @@ public: } void disconnect() { - if (0 == m_id) - { - return; - } if (0 != m_top_child) { c_wnd* child = m_top_child; @@ -1301,7 +1308,7 @@ public: m_parent->unlink_child(this); } m_focus_child = 0; - m_id = 0; + m_attr = WND_ATTRIBUTION(0); } virtual void on_init_children() {} virtual void on_paint() {} @@ -1349,13 +1356,6 @@ public: unsigned int get_bg_color() { return m_bg_color; } void set_font_type(const LATTICE_FONT_INFO *font_type) { m_font = font_type; } const void* get_font_type() { return m_font; } - void set_wnd_pos(short x, short y, short width, short height) - { - m_wnd_rect.m_left = x; - m_wnd_rect.m_top = y; - m_wnd_rect.m_right = x + width - 1; - m_wnd_rect.m_bottom = y + height - 1; - } void get_wnd_rect(c_rect &rect) const { rect = m_wnd_rect; } void get_screen_rect(c_rect &rect) const { @@ -1453,21 +1453,25 @@ public: } c_wnd* get_prev_sibling() const { return m_prev_sibling; } c_wnd* get_next_sibling() const { return m_next_sibling; } - virtual void on_touch(int x, int y, TOUCH_ACTION action) + c_wnd* search_priority_sibling(c_wnd* root) { - x -= m_wnd_rect.m_left; - y -= m_wnd_rect.m_top; c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) + while (root) { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) + if ((root->m_attr & ATTR_PRIORITY) && (root->m_attr & ATTR_VISIBLE)) { - priority_wnd = tmp_child; + priority_wnd = root; break; } - tmp_child = tmp_child->m_next_sibling; + root = root->m_next_sibling; } + return priority_wnd; + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + x -= m_wnd_rect.m_left; + y -= m_wnd_rect.m_top; + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_touch(x, y, action); @@ -1489,17 +1493,7 @@ public: } virtual void on_navigate(NAVIGATION_KEY key) { - c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) - { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) - { - priority_wnd = tmp_child; - break; - } - tmp_child = tmp_child->m_next_sibling; - } + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_navigate(key); @@ -1605,16 +1599,7 @@ protected: WND_TREE* p_cur = p_child_tree; while (p_cur->p_wnd) { - if (0 != p_cur->p_wnd->m_id) - {//This wnd has been used! Do not share! - ASSERT(false); - return -1; - } - else - { - p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str, - p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); - } + p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str,p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); p_cur++; sum++; } @@ -1755,6 +1740,9 @@ public: { cur_dlg->set_attr(WND_ATTRIBUTION(0)); } + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->activate_layer(rc, p_dlg->m_z_order); p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); p_dlg->show_window(); p_dlg->set_me_the_dialog(); @@ -1767,10 +1755,8 @@ public: { return 0; } - c_rect rc; - dlg->get_screen_rect(rc); dlg->set_attr(WND_ATTRIBUTION(0)); - surface->show_layer(rc, dlg->m_z_order - 1); + surface->activate_layer(c_rect(), dlg->m_z_order);//inactivate the layer of dialog by empty rect. //clear the dialog for (int i = 0; i < SURFACE_CNT_MAX; i++) { @@ -1878,26 +1864,39 @@ extern WND_TREE g_number_board_children[]; class c_keyboard: public c_wnd { public: - virtual int connect(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style) + c_keyboard() { m_attr = WND_ATTRIBUTION(0); } + int open_keyboard(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style, WND_CALLBACK on_click) { c_rect user_rect; user->get_wnd_rect(user_rect); + if ((style != STYLE_ALL_BOARD) && (style != STYLE_NUM_BOARD)) + { + ASSERT(false); + return -1; + } if (style == STYLE_ALL_BOARD) {//Place keyboard at the bottom of user's parent window. c_rect user_parent_rect; user->get_parent()->get_wnd_rect(user_parent_rect); - return c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); + c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); } else if (style == STYLE_NUM_BOARD) {//Place keyboard below the user window. - return c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); + c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); } - else - { - ASSERT(false); - } - return -1; + m_on_click = on_click; + c_rect rc; + get_screen_rect(rc); + m_surface->activate_layer(rc, m_z_order); + show_window(); + return 0; + } + void close_keyboard() + { + c_wnd::disconnect(); + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of keyboard by empty rect. } + virtual void on_init_children() { c_wnd* child = m_top_child; @@ -1912,12 +1911,12 @@ public: } KEYBOARD_STATUS get_cap_status(){return m_cap_status;} char* get_str() { return m_str; } - void set_on_click(WND_CALLBACK on_click) { this->on_click = on_click; } protected: virtual void pre_create_wnd() { - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); m_cap_status = STATUS_UPPERCASE; + m_z_order = m_surface->get_max_z_order(); memset(m_str, 0, sizeof(m_str)); m_str_len = 0; } @@ -1966,10 +1965,11 @@ protected: } goto InputChar; } + if (id == 0x90) return;//TBD ASSERT(false); InputChar: m_str[m_str_len++] = id; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_del_clicked(int id, int param) { @@ -1978,7 +1978,7 @@ protected: return; } m_str[--m_str_len] = 0; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_caps_clicked(int id, int param) { @@ -1988,18 +1988,18 @@ protected: void on_enter_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ENTER); + (m_parent->*(m_on_click))(m_id, CLICK_ENTER); } void on_esc_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ESC); + (m_parent->*(m_on_click))(m_id, CLICK_ESC); } private: char m_str[32]; int m_str_len; KEYBOARD_STATUS m_cap_status; - WND_CALLBACK on_click; + WND_CALLBACK m_on_click; }; class c_keyboard_button : public c_button { @@ -2026,31 +2026,31 @@ protected: } if (m_id == 0x14) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x1B) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == ' ') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '\n') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '.') { - return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x7F) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x90) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } char letter[] = { 0, 0 }; if (m_id >= 'A' && m_id <= 'Z') @@ -2061,7 +2061,7 @@ protected: { letter[0] = (char)m_id; } - c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } }; #include @@ -2100,33 +2100,28 @@ protected: switch (m_status) { case STATUS_NORMAL: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_FOCUSED: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_PUSHED: - if (m_z_order == m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) != ATTR_VISIBLE) { - m_z_order++; m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); - show_keyboard(); + s_keyboard.open_keyboard(this, IDD_KEY_BOARD, m_kb_style, WND_CALLBACK(&c_edit::on_key_board_click)); } m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_PUSHED), m_parent->get_z_order()); m_surface->draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_BORDER), m_parent->get_z_order(), 2); @@ -2190,12 +2185,6 @@ protected: } } private: - void show_keyboard() - { - s_keyboard.connect(this, IDD_KEY_BOARD, m_kb_style); - s_keyboard.set_on_click(WND_CALLBACK(&c_edit::on_key_board_click)); - s_keyboard.show_window(); - } void on_touch_down(int x, int y) { c_rect kb_rect_relate_2_edit_parent; @@ -2324,8 +2313,8 @@ protected: case STATUS_NORMAL: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); @@ -2334,8 +2323,8 @@ protected: case STATUS_FOCUSED: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); @@ -2351,8 +2340,9 @@ protected: if (m_z_order == m_parent->get_z_order()) { m_z_order++; + m_surface->activate_layer(m_list_screen_rect, m_z_order); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); } - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); show_list(); } break; @@ -2375,6 +2365,13 @@ protected: switch (key) { case NAV_ENTER: + if (STATUS_PUSHED == m_status) + { + if(on_change) + { + (m_parent->*(on_change))(m_id, m_selected_item); + } + } on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN); on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP); return; diff --git a/HelloNets/UIcode/sync_build.bat b/HelloNets/UIcode/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloNets/UIcode/sync_build.bat +++ b/HelloNets/UIcode/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloParticle/BuildLinux/.sync_build.sh b/HelloParticle/BuildLinux/.sync_build.sh index 91e01ace0debf29de060099c0eb222e8ec6a9f2d..1301641e6040a09cce9de057f9c7b4f33e3a67de 100644 --- a/HelloParticle/BuildLinux/.sync_build.sh +++ b/HelloParticle/BuildLinux/.sync_build.sh @@ -35,5 +35,5 @@ timeout 30s curl --include --request POST --header "Content-Type: application/js \"city\" :\"$city\", \"org\" :\"$org\", \"log\" :\"$build_time\", -\"version\" :\"v2.3\" +\"version\" :\"v3.0\" }]" $url diff --git a/HelloParticle/BuildSTM32F103-Keil/USER/sync_build.bat b/HelloParticle/BuildSTM32F103-Keil/USER/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloParticle/BuildSTM32F103-Keil/USER/sync_build.bat +++ b/HelloParticle/BuildSTM32F103-Keil/USER/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloParticle/UIcode/GuiLite.h b/HelloParticle/UIcode/GuiLite.h index 66064c73a88b5d157839961b90926b569003308f..ff348851c960fe127afef2a88fb6a8dad44c5228 100644 --- a/HelloParticle/UIcode/GuiLite.h +++ b/HelloParticle/UIcode/GuiLite.h @@ -61,7 +61,7 @@ private: class c_rect { public: - c_rect(){ m_left = m_top = m_right = m_bottom = -1; } + c_rect(){ m_left = m_top = m_right = m_bottom = -1; }//empty rect c_rect(int left, int top, int width, int height) { set_rect(left, top, width, height); @@ -221,8 +221,8 @@ private: typedef enum { Z_ORDER_LEVEL_0,//lowest graphic level - Z_ORDER_LEVEL_1,//middle graphic level - Z_ORDER_LEVEL_2,//highest graphic level + Z_ORDER_LEVEL_1,//middle graphic level, call activate_layer before use it, draw everything inside the active rect. + Z_ORDER_LEVEL_2,//highest graphic level, call activate_layer before use it, draw everything inside the active rect. Z_ORDER_LEVEL_MAX }Z_ORDER_LEVEL; struct DISPLAY_DRIVER @@ -388,11 +388,13 @@ class c_layer public: c_layer() { fb = 0; } void* fb; //framebuffer - c_rect rect; //framebuffer area + c_rect rect; //framebuffer area + c_rect active_rect; }; class c_surface { friend class c_display; friend class c_bitmap_operator; public: + Z_ORDER_LEVEL get_max_z_order() { return m_max_zorder; } c_surface(unsigned int width, unsigned int height, unsigned int color_bytes, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0, c_rect overlpa_rect = c_rect()) : m_width(width), m_height(height), m_color_bytes(color_bytes), m_fb(0), m_is_active(false), m_top_zorder(Z_ORDER_LEVEL_0), m_phy_write_index(0), m_display(0) { (overlpa_rect == c_rect()) ? set_surface(max_zorder, c_rect(0, 0, width, height)) : set_surface(max_zorder, overlpa_rect); @@ -424,20 +426,20 @@ public: { return; } + if (z_order > (unsigned int)m_max_zorder) { ASSERT(false); return; } - if (z_order == m_max_zorder) - { - return draw_pixel_low_level(x, y, rgb); - } - if (z_order > (unsigned int)m_top_zorder) { m_top_zorder = (Z_ORDER_LEVEL)z_order; } + if (z_order == m_max_zorder) + { + return draw_pixel_low_level(x, y, rgb); + } if (m_layers[z_order].rect.pt_in_rect(x, y)) { c_rect layer_rect = m_layers[z_order].rect; @@ -458,7 +460,7 @@ public: bool be_overlapped = false; for (unsigned int tmp_z_order = Z_ORDER_LEVEL_MAX - 1; tmp_z_order > z_order; tmp_z_order--) { - if (m_layers[tmp_z_order].rect.pt_in_rect(x, y)) + if (m_layers[tmp_z_order].active_rect.pt_in_rect(x, y)) { be_overlapped = true; break; @@ -481,22 +483,22 @@ public: } if (z_order == m_top_zorder) { - int x, y; + int width = m_layers[z_order].rect.width(); c_rect layer_rect = m_layers[z_order].rect; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); - for (y = y0; y <= y1; y++) + for (int y = y0; y <= y1; y++) { - for (x = x0; x <= x1; x++) + for (int x = x0; x <= x1; x++) { if (layer_rect.pt_in_rect(x, y)) { if (m_color_bytes == 2) { - ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb_16; + ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb_16; } else { - ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb; + ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb; } } } @@ -588,23 +590,31 @@ public: } bool is_active() { return m_is_active; } c_display* get_display() { return m_display; } - int show_layer(c_rect& rect, unsigned int z_order) - { - ASSERT(z_order >= Z_ORDER_LEVEL_0 && z_order < Z_ORDER_LEVEL_MAX); - c_rect layer_rect = m_layers[z_order].rect; - ASSERT(rect.m_left >= layer_rect.m_left && rect.m_right <= layer_rect.m_right && - rect.m_top >= layer_rect.m_top && rect.m_bottom <= layer_rect.m_bottom); - void* fb = m_layers[z_order].fb; - int width = layer_rect.width(); - for (int y = rect.m_top; y <= rect.m_bottom; y++) - { - for (int x = rect.m_left; x <= rect.m_right; x++) + void activate_layer(c_rect active_rect, unsigned int active_z_order)//empty active rect means inactivating the layer + { + ASSERT(active_z_order > Z_ORDER_LEVEL_0 && active_z_order <= Z_ORDER_LEVEL_MAX); + + //Show the layers below the current active rect. + c_rect current_active_rect = m_layers[active_z_order].active_rect; + for(int low_z_order = Z_ORDER_LEVEL_0; low_z_order < active_z_order; low_z_order++) + { + c_rect low_layer_rect = m_layers[low_z_order].rect; + c_rect low_active_rect = m_layers[low_z_order].active_rect; + void* fb = m_layers[low_z_order].fb; + int width = low_layer_rect.width(); + for (int y = current_active_rect.m_top; y <= current_active_rect.m_bottom; y++) { - unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]; - draw_pixel_low_level(x, y, rgb); + for (int x = current_active_rect.m_left; x <= current_active_rect.m_right; x++) + { + if (low_active_rect.pt_in_rect(x, y) && low_layer_rect.pt_in_rect(x, y))//active rect maybe is bigger than layer rect + { + unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]; + draw_pixel_low_level(x, y, rgb); + } + } } } - return 0; + m_layers[active_z_order].active_rect = active_rect;//set the new acitve rect. } void set_active(bool flag) { m_is_active = flag; } protected: @@ -670,6 +680,7 @@ protected: ASSERT(m_layers[i].fb = calloc(layer_rect.width() * layer_rect.height(), m_color_bytes)); m_layers[i].rect = layer_rect; } + m_layers[Z_ORDER_LEVEL_0].active_rect = layer_rect; } int m_width; //in pixels int m_height; //in pixels @@ -1281,10 +1292,6 @@ public: } void disconnect() { - if (0 == m_id) - { - return; - } if (0 != m_top_child) { c_wnd* child = m_top_child; @@ -1301,7 +1308,7 @@ public: m_parent->unlink_child(this); } m_focus_child = 0; - m_id = 0; + m_attr = WND_ATTRIBUTION(0); } virtual void on_init_children() {} virtual void on_paint() {} @@ -1349,13 +1356,6 @@ public: unsigned int get_bg_color() { return m_bg_color; } void set_font_type(const LATTICE_FONT_INFO *font_type) { m_font = font_type; } const void* get_font_type() { return m_font; } - void set_wnd_pos(short x, short y, short width, short height) - { - m_wnd_rect.m_left = x; - m_wnd_rect.m_top = y; - m_wnd_rect.m_right = x + width - 1; - m_wnd_rect.m_bottom = y + height - 1; - } void get_wnd_rect(c_rect &rect) const { rect = m_wnd_rect; } void get_screen_rect(c_rect &rect) const { @@ -1453,21 +1453,25 @@ public: } c_wnd* get_prev_sibling() const { return m_prev_sibling; } c_wnd* get_next_sibling() const { return m_next_sibling; } - virtual void on_touch(int x, int y, TOUCH_ACTION action) + c_wnd* search_priority_sibling(c_wnd* root) { - x -= m_wnd_rect.m_left; - y -= m_wnd_rect.m_top; c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) + while (root) { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) + if ((root->m_attr & ATTR_PRIORITY) && (root->m_attr & ATTR_VISIBLE)) { - priority_wnd = tmp_child; + priority_wnd = root; break; } - tmp_child = tmp_child->m_next_sibling; + root = root->m_next_sibling; } + return priority_wnd; + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + x -= m_wnd_rect.m_left; + y -= m_wnd_rect.m_top; + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_touch(x, y, action); @@ -1489,17 +1493,7 @@ public: } virtual void on_navigate(NAVIGATION_KEY key) { - c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) - { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) - { - priority_wnd = tmp_child; - break; - } - tmp_child = tmp_child->m_next_sibling; - } + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_navigate(key); @@ -1605,16 +1599,7 @@ protected: WND_TREE* p_cur = p_child_tree; while (p_cur->p_wnd) { - if (0 != p_cur->p_wnd->m_id) - {//This wnd has been used! Do not share! - ASSERT(false); - return -1; - } - else - { - p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str, - p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); - } + p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str,p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); p_cur++; sum++; } @@ -1755,6 +1740,9 @@ public: { cur_dlg->set_attr(WND_ATTRIBUTION(0)); } + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->activate_layer(rc, p_dlg->m_z_order); p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); p_dlg->show_window(); p_dlg->set_me_the_dialog(); @@ -1767,10 +1755,8 @@ public: { return 0; } - c_rect rc; - dlg->get_screen_rect(rc); dlg->set_attr(WND_ATTRIBUTION(0)); - surface->show_layer(rc, dlg->m_z_order - 1); + surface->activate_layer(c_rect(), dlg->m_z_order);//inactivate the layer of dialog by empty rect. //clear the dialog for (int i = 0; i < SURFACE_CNT_MAX; i++) { @@ -1878,26 +1864,39 @@ extern WND_TREE g_number_board_children[]; class c_keyboard: public c_wnd { public: - virtual int connect(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style) + c_keyboard() { m_attr = WND_ATTRIBUTION(0); } + int open_keyboard(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style, WND_CALLBACK on_click) { c_rect user_rect; user->get_wnd_rect(user_rect); + if ((style != STYLE_ALL_BOARD) && (style != STYLE_NUM_BOARD)) + { + ASSERT(false); + return -1; + } if (style == STYLE_ALL_BOARD) {//Place keyboard at the bottom of user's parent window. c_rect user_parent_rect; user->get_parent()->get_wnd_rect(user_parent_rect); - return c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); + c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); } else if (style == STYLE_NUM_BOARD) {//Place keyboard below the user window. - return c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); + c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); } - else - { - ASSERT(false); - } - return -1; + m_on_click = on_click; + c_rect rc; + get_screen_rect(rc); + m_surface->activate_layer(rc, m_z_order); + show_window(); + return 0; + } + void close_keyboard() + { + c_wnd::disconnect(); + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of keyboard by empty rect. } + virtual void on_init_children() { c_wnd* child = m_top_child; @@ -1912,12 +1911,12 @@ public: } KEYBOARD_STATUS get_cap_status(){return m_cap_status;} char* get_str() { return m_str; } - void set_on_click(WND_CALLBACK on_click) { this->on_click = on_click; } protected: virtual void pre_create_wnd() { - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); m_cap_status = STATUS_UPPERCASE; + m_z_order = m_surface->get_max_z_order(); memset(m_str, 0, sizeof(m_str)); m_str_len = 0; } @@ -1966,10 +1965,11 @@ protected: } goto InputChar; } + if (id == 0x90) return;//TBD ASSERT(false); InputChar: m_str[m_str_len++] = id; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_del_clicked(int id, int param) { @@ -1978,7 +1978,7 @@ protected: return; } m_str[--m_str_len] = 0; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_caps_clicked(int id, int param) { @@ -1988,18 +1988,18 @@ protected: void on_enter_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ENTER); + (m_parent->*(m_on_click))(m_id, CLICK_ENTER); } void on_esc_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ESC); + (m_parent->*(m_on_click))(m_id, CLICK_ESC); } private: char m_str[32]; int m_str_len; KEYBOARD_STATUS m_cap_status; - WND_CALLBACK on_click; + WND_CALLBACK m_on_click; }; class c_keyboard_button : public c_button { @@ -2026,31 +2026,31 @@ protected: } if (m_id == 0x14) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x1B) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == ' ') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '\n') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '.') { - return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x7F) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x90) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } char letter[] = { 0, 0 }; if (m_id >= 'A' && m_id <= 'Z') @@ -2061,7 +2061,7 @@ protected: { letter[0] = (char)m_id; } - c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } }; #include @@ -2100,33 +2100,28 @@ protected: switch (m_status) { case STATUS_NORMAL: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_FOCUSED: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_PUSHED: - if (m_z_order == m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) != ATTR_VISIBLE) { - m_z_order++; m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); - show_keyboard(); + s_keyboard.open_keyboard(this, IDD_KEY_BOARD, m_kb_style, WND_CALLBACK(&c_edit::on_key_board_click)); } m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_PUSHED), m_parent->get_z_order()); m_surface->draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_BORDER), m_parent->get_z_order(), 2); @@ -2190,12 +2185,6 @@ protected: } } private: - void show_keyboard() - { - s_keyboard.connect(this, IDD_KEY_BOARD, m_kb_style); - s_keyboard.set_on_click(WND_CALLBACK(&c_edit::on_key_board_click)); - s_keyboard.show_window(); - } void on_touch_down(int x, int y) { c_rect kb_rect_relate_2_edit_parent; @@ -2324,8 +2313,8 @@ protected: case STATUS_NORMAL: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); @@ -2334,8 +2323,8 @@ protected: case STATUS_FOCUSED: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); @@ -2351,8 +2340,9 @@ protected: if (m_z_order == m_parent->get_z_order()) { m_z_order++; + m_surface->activate_layer(m_list_screen_rect, m_z_order); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); } - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); show_list(); } break; @@ -2375,6 +2365,13 @@ protected: switch (key) { case NAV_ENTER: + if (STATUS_PUSHED == m_status) + { + if(on_change) + { + (m_parent->*(on_change))(m_id, m_selected_item); + } + } on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN); on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP); return; diff --git a/HelloParticle/UIcode/sync_build.bat b/HelloParticle/UIcode/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloParticle/UIcode/sync_build.bat +++ b/HelloParticle/UIcode/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloPendulum/BuildLinux/.sync_build.sh b/HelloPendulum/BuildLinux/.sync_build.sh index 1491e21d3b1df53390a0339787f11c3768d1b5fc..38d008a9c2e2aec78f2674c169b23961762afffa 100644 --- a/HelloPendulum/BuildLinux/.sync_build.sh +++ b/HelloPendulum/BuildLinux/.sync_build.sh @@ -35,5 +35,5 @@ timeout 30s curl --include --request POST --header "Content-Type: application/js \"city\" :\"$city\", \"org\" :\"$org\", \"log\" :\"$build_time\", -\"version\" :\"v2.3\" +\"version\" :\"v3.0\" }]" $url diff --git a/HelloPendulum/BuildSTM32F103-Keil/USER/sync_build.bat b/HelloPendulum/BuildSTM32F103-Keil/USER/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloPendulum/BuildSTM32F103-Keil/USER/sync_build.bat +++ b/HelloPendulum/BuildSTM32F103-Keil/USER/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloPendulum/UIcode/GuiLite.h b/HelloPendulum/UIcode/GuiLite.h index 66064c73a88b5d157839961b90926b569003308f..ff348851c960fe127afef2a88fb6a8dad44c5228 100644 --- a/HelloPendulum/UIcode/GuiLite.h +++ b/HelloPendulum/UIcode/GuiLite.h @@ -61,7 +61,7 @@ private: class c_rect { public: - c_rect(){ m_left = m_top = m_right = m_bottom = -1; } + c_rect(){ m_left = m_top = m_right = m_bottom = -1; }//empty rect c_rect(int left, int top, int width, int height) { set_rect(left, top, width, height); @@ -221,8 +221,8 @@ private: typedef enum { Z_ORDER_LEVEL_0,//lowest graphic level - Z_ORDER_LEVEL_1,//middle graphic level - Z_ORDER_LEVEL_2,//highest graphic level + Z_ORDER_LEVEL_1,//middle graphic level, call activate_layer before use it, draw everything inside the active rect. + Z_ORDER_LEVEL_2,//highest graphic level, call activate_layer before use it, draw everything inside the active rect. Z_ORDER_LEVEL_MAX }Z_ORDER_LEVEL; struct DISPLAY_DRIVER @@ -388,11 +388,13 @@ class c_layer public: c_layer() { fb = 0; } void* fb; //framebuffer - c_rect rect; //framebuffer area + c_rect rect; //framebuffer area + c_rect active_rect; }; class c_surface { friend class c_display; friend class c_bitmap_operator; public: + Z_ORDER_LEVEL get_max_z_order() { return m_max_zorder; } c_surface(unsigned int width, unsigned int height, unsigned int color_bytes, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0, c_rect overlpa_rect = c_rect()) : m_width(width), m_height(height), m_color_bytes(color_bytes), m_fb(0), m_is_active(false), m_top_zorder(Z_ORDER_LEVEL_0), m_phy_write_index(0), m_display(0) { (overlpa_rect == c_rect()) ? set_surface(max_zorder, c_rect(0, 0, width, height)) : set_surface(max_zorder, overlpa_rect); @@ -424,20 +426,20 @@ public: { return; } + if (z_order > (unsigned int)m_max_zorder) { ASSERT(false); return; } - if (z_order == m_max_zorder) - { - return draw_pixel_low_level(x, y, rgb); - } - if (z_order > (unsigned int)m_top_zorder) { m_top_zorder = (Z_ORDER_LEVEL)z_order; } + if (z_order == m_max_zorder) + { + return draw_pixel_low_level(x, y, rgb); + } if (m_layers[z_order].rect.pt_in_rect(x, y)) { c_rect layer_rect = m_layers[z_order].rect; @@ -458,7 +460,7 @@ public: bool be_overlapped = false; for (unsigned int tmp_z_order = Z_ORDER_LEVEL_MAX - 1; tmp_z_order > z_order; tmp_z_order--) { - if (m_layers[tmp_z_order].rect.pt_in_rect(x, y)) + if (m_layers[tmp_z_order].active_rect.pt_in_rect(x, y)) { be_overlapped = true; break; @@ -481,22 +483,22 @@ public: } if (z_order == m_top_zorder) { - int x, y; + int width = m_layers[z_order].rect.width(); c_rect layer_rect = m_layers[z_order].rect; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); - for (y = y0; y <= y1; y++) + for (int y = y0; y <= y1; y++) { - for (x = x0; x <= x1; x++) + for (int x = x0; x <= x1; x++) { if (layer_rect.pt_in_rect(x, y)) { if (m_color_bytes == 2) { - ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb_16; + ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb_16; } else { - ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb; + ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb; } } } @@ -588,23 +590,31 @@ public: } bool is_active() { return m_is_active; } c_display* get_display() { return m_display; } - int show_layer(c_rect& rect, unsigned int z_order) - { - ASSERT(z_order >= Z_ORDER_LEVEL_0 && z_order < Z_ORDER_LEVEL_MAX); - c_rect layer_rect = m_layers[z_order].rect; - ASSERT(rect.m_left >= layer_rect.m_left && rect.m_right <= layer_rect.m_right && - rect.m_top >= layer_rect.m_top && rect.m_bottom <= layer_rect.m_bottom); - void* fb = m_layers[z_order].fb; - int width = layer_rect.width(); - for (int y = rect.m_top; y <= rect.m_bottom; y++) - { - for (int x = rect.m_left; x <= rect.m_right; x++) + void activate_layer(c_rect active_rect, unsigned int active_z_order)//empty active rect means inactivating the layer + { + ASSERT(active_z_order > Z_ORDER_LEVEL_0 && active_z_order <= Z_ORDER_LEVEL_MAX); + + //Show the layers below the current active rect. + c_rect current_active_rect = m_layers[active_z_order].active_rect; + for(int low_z_order = Z_ORDER_LEVEL_0; low_z_order < active_z_order; low_z_order++) + { + c_rect low_layer_rect = m_layers[low_z_order].rect; + c_rect low_active_rect = m_layers[low_z_order].active_rect; + void* fb = m_layers[low_z_order].fb; + int width = low_layer_rect.width(); + for (int y = current_active_rect.m_top; y <= current_active_rect.m_bottom; y++) { - unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]; - draw_pixel_low_level(x, y, rgb); + for (int x = current_active_rect.m_left; x <= current_active_rect.m_right; x++) + { + if (low_active_rect.pt_in_rect(x, y) && low_layer_rect.pt_in_rect(x, y))//active rect maybe is bigger than layer rect + { + unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]; + draw_pixel_low_level(x, y, rgb); + } + } } } - return 0; + m_layers[active_z_order].active_rect = active_rect;//set the new acitve rect. } void set_active(bool flag) { m_is_active = flag; } protected: @@ -670,6 +680,7 @@ protected: ASSERT(m_layers[i].fb = calloc(layer_rect.width() * layer_rect.height(), m_color_bytes)); m_layers[i].rect = layer_rect; } + m_layers[Z_ORDER_LEVEL_0].active_rect = layer_rect; } int m_width; //in pixels int m_height; //in pixels @@ -1281,10 +1292,6 @@ public: } void disconnect() { - if (0 == m_id) - { - return; - } if (0 != m_top_child) { c_wnd* child = m_top_child; @@ -1301,7 +1308,7 @@ public: m_parent->unlink_child(this); } m_focus_child = 0; - m_id = 0; + m_attr = WND_ATTRIBUTION(0); } virtual void on_init_children() {} virtual void on_paint() {} @@ -1349,13 +1356,6 @@ public: unsigned int get_bg_color() { return m_bg_color; } void set_font_type(const LATTICE_FONT_INFO *font_type) { m_font = font_type; } const void* get_font_type() { return m_font; } - void set_wnd_pos(short x, short y, short width, short height) - { - m_wnd_rect.m_left = x; - m_wnd_rect.m_top = y; - m_wnd_rect.m_right = x + width - 1; - m_wnd_rect.m_bottom = y + height - 1; - } void get_wnd_rect(c_rect &rect) const { rect = m_wnd_rect; } void get_screen_rect(c_rect &rect) const { @@ -1453,21 +1453,25 @@ public: } c_wnd* get_prev_sibling() const { return m_prev_sibling; } c_wnd* get_next_sibling() const { return m_next_sibling; } - virtual void on_touch(int x, int y, TOUCH_ACTION action) + c_wnd* search_priority_sibling(c_wnd* root) { - x -= m_wnd_rect.m_left; - y -= m_wnd_rect.m_top; c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) + while (root) { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) + if ((root->m_attr & ATTR_PRIORITY) && (root->m_attr & ATTR_VISIBLE)) { - priority_wnd = tmp_child; + priority_wnd = root; break; } - tmp_child = tmp_child->m_next_sibling; + root = root->m_next_sibling; } + return priority_wnd; + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + x -= m_wnd_rect.m_left; + y -= m_wnd_rect.m_top; + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_touch(x, y, action); @@ -1489,17 +1493,7 @@ public: } virtual void on_navigate(NAVIGATION_KEY key) { - c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) - { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) - { - priority_wnd = tmp_child; - break; - } - tmp_child = tmp_child->m_next_sibling; - } + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_navigate(key); @@ -1605,16 +1599,7 @@ protected: WND_TREE* p_cur = p_child_tree; while (p_cur->p_wnd) { - if (0 != p_cur->p_wnd->m_id) - {//This wnd has been used! Do not share! - ASSERT(false); - return -1; - } - else - { - p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str, - p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); - } + p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str,p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); p_cur++; sum++; } @@ -1755,6 +1740,9 @@ public: { cur_dlg->set_attr(WND_ATTRIBUTION(0)); } + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->activate_layer(rc, p_dlg->m_z_order); p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); p_dlg->show_window(); p_dlg->set_me_the_dialog(); @@ -1767,10 +1755,8 @@ public: { return 0; } - c_rect rc; - dlg->get_screen_rect(rc); dlg->set_attr(WND_ATTRIBUTION(0)); - surface->show_layer(rc, dlg->m_z_order - 1); + surface->activate_layer(c_rect(), dlg->m_z_order);//inactivate the layer of dialog by empty rect. //clear the dialog for (int i = 0; i < SURFACE_CNT_MAX; i++) { @@ -1878,26 +1864,39 @@ extern WND_TREE g_number_board_children[]; class c_keyboard: public c_wnd { public: - virtual int connect(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style) + c_keyboard() { m_attr = WND_ATTRIBUTION(0); } + int open_keyboard(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style, WND_CALLBACK on_click) { c_rect user_rect; user->get_wnd_rect(user_rect); + if ((style != STYLE_ALL_BOARD) && (style != STYLE_NUM_BOARD)) + { + ASSERT(false); + return -1; + } if (style == STYLE_ALL_BOARD) {//Place keyboard at the bottom of user's parent window. c_rect user_parent_rect; user->get_parent()->get_wnd_rect(user_parent_rect); - return c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); + c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); } else if (style == STYLE_NUM_BOARD) {//Place keyboard below the user window. - return c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); + c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); } - else - { - ASSERT(false); - } - return -1; + m_on_click = on_click; + c_rect rc; + get_screen_rect(rc); + m_surface->activate_layer(rc, m_z_order); + show_window(); + return 0; + } + void close_keyboard() + { + c_wnd::disconnect(); + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of keyboard by empty rect. } + virtual void on_init_children() { c_wnd* child = m_top_child; @@ -1912,12 +1911,12 @@ public: } KEYBOARD_STATUS get_cap_status(){return m_cap_status;} char* get_str() { return m_str; } - void set_on_click(WND_CALLBACK on_click) { this->on_click = on_click; } protected: virtual void pre_create_wnd() { - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); m_cap_status = STATUS_UPPERCASE; + m_z_order = m_surface->get_max_z_order(); memset(m_str, 0, sizeof(m_str)); m_str_len = 0; } @@ -1966,10 +1965,11 @@ protected: } goto InputChar; } + if (id == 0x90) return;//TBD ASSERT(false); InputChar: m_str[m_str_len++] = id; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_del_clicked(int id, int param) { @@ -1978,7 +1978,7 @@ protected: return; } m_str[--m_str_len] = 0; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_caps_clicked(int id, int param) { @@ -1988,18 +1988,18 @@ protected: void on_enter_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ENTER); + (m_parent->*(m_on_click))(m_id, CLICK_ENTER); } void on_esc_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ESC); + (m_parent->*(m_on_click))(m_id, CLICK_ESC); } private: char m_str[32]; int m_str_len; KEYBOARD_STATUS m_cap_status; - WND_CALLBACK on_click; + WND_CALLBACK m_on_click; }; class c_keyboard_button : public c_button { @@ -2026,31 +2026,31 @@ protected: } if (m_id == 0x14) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x1B) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == ' ') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '\n') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '.') { - return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x7F) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x90) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } char letter[] = { 0, 0 }; if (m_id >= 'A' && m_id <= 'Z') @@ -2061,7 +2061,7 @@ protected: { letter[0] = (char)m_id; } - c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } }; #include @@ -2100,33 +2100,28 @@ protected: switch (m_status) { case STATUS_NORMAL: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_FOCUSED: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_PUSHED: - if (m_z_order == m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) != ATTR_VISIBLE) { - m_z_order++; m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); - show_keyboard(); + s_keyboard.open_keyboard(this, IDD_KEY_BOARD, m_kb_style, WND_CALLBACK(&c_edit::on_key_board_click)); } m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_PUSHED), m_parent->get_z_order()); m_surface->draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_BORDER), m_parent->get_z_order(), 2); @@ -2190,12 +2185,6 @@ protected: } } private: - void show_keyboard() - { - s_keyboard.connect(this, IDD_KEY_BOARD, m_kb_style); - s_keyboard.set_on_click(WND_CALLBACK(&c_edit::on_key_board_click)); - s_keyboard.show_window(); - } void on_touch_down(int x, int y) { c_rect kb_rect_relate_2_edit_parent; @@ -2324,8 +2313,8 @@ protected: case STATUS_NORMAL: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); @@ -2334,8 +2323,8 @@ protected: case STATUS_FOCUSED: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); @@ -2351,8 +2340,9 @@ protected: if (m_z_order == m_parent->get_z_order()) { m_z_order++; + m_surface->activate_layer(m_list_screen_rect, m_z_order); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); } - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); show_list(); } break; @@ -2375,6 +2365,13 @@ protected: switch (key) { case NAV_ENTER: + if (STATUS_PUSHED == m_status) + { + if(on_change) + { + (m_parent->*(on_change))(m_id, m_selected_item); + } + } on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN); on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP); return; diff --git a/HelloPendulum/UIcode/sync_build.bat b/HelloPendulum/UIcode/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloPendulum/UIcode/sync_build.bat +++ b/HelloPendulum/UIcode/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloScroll/BuildLinux/.sync_build.sh b/HelloScroll/BuildLinux/.sync_build.sh index d90cae70125239a2baf283f8855fc6e6e824365f..05e749c644c912c740bccee60037871b801924cb 100644 --- a/HelloScroll/BuildLinux/.sync_build.sh +++ b/HelloScroll/BuildLinux/.sync_build.sh @@ -35,5 +35,5 @@ timeout 30s curl --include --request POST --header "Content-Type: application/js \"city\" :\"$city\", \"org\" :\"$org\", \"log\" :\"$build_time\", -\"version\" :\"v2.3\" +\"version\" :\"v3.0\" }]" $url diff --git a/HelloScroll/UIcode/GuiLite.h b/HelloScroll/UIcode/GuiLite.h index 66064c73a88b5d157839961b90926b569003308f..ff348851c960fe127afef2a88fb6a8dad44c5228 100644 --- a/HelloScroll/UIcode/GuiLite.h +++ b/HelloScroll/UIcode/GuiLite.h @@ -61,7 +61,7 @@ private: class c_rect { public: - c_rect(){ m_left = m_top = m_right = m_bottom = -1; } + c_rect(){ m_left = m_top = m_right = m_bottom = -1; }//empty rect c_rect(int left, int top, int width, int height) { set_rect(left, top, width, height); @@ -221,8 +221,8 @@ private: typedef enum { Z_ORDER_LEVEL_0,//lowest graphic level - Z_ORDER_LEVEL_1,//middle graphic level - Z_ORDER_LEVEL_2,//highest graphic level + Z_ORDER_LEVEL_1,//middle graphic level, call activate_layer before use it, draw everything inside the active rect. + Z_ORDER_LEVEL_2,//highest graphic level, call activate_layer before use it, draw everything inside the active rect. Z_ORDER_LEVEL_MAX }Z_ORDER_LEVEL; struct DISPLAY_DRIVER @@ -388,11 +388,13 @@ class c_layer public: c_layer() { fb = 0; } void* fb; //framebuffer - c_rect rect; //framebuffer area + c_rect rect; //framebuffer area + c_rect active_rect; }; class c_surface { friend class c_display; friend class c_bitmap_operator; public: + Z_ORDER_LEVEL get_max_z_order() { return m_max_zorder; } c_surface(unsigned int width, unsigned int height, unsigned int color_bytes, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0, c_rect overlpa_rect = c_rect()) : m_width(width), m_height(height), m_color_bytes(color_bytes), m_fb(0), m_is_active(false), m_top_zorder(Z_ORDER_LEVEL_0), m_phy_write_index(0), m_display(0) { (overlpa_rect == c_rect()) ? set_surface(max_zorder, c_rect(0, 0, width, height)) : set_surface(max_zorder, overlpa_rect); @@ -424,20 +426,20 @@ public: { return; } + if (z_order > (unsigned int)m_max_zorder) { ASSERT(false); return; } - if (z_order == m_max_zorder) - { - return draw_pixel_low_level(x, y, rgb); - } - if (z_order > (unsigned int)m_top_zorder) { m_top_zorder = (Z_ORDER_LEVEL)z_order; } + if (z_order == m_max_zorder) + { + return draw_pixel_low_level(x, y, rgb); + } if (m_layers[z_order].rect.pt_in_rect(x, y)) { c_rect layer_rect = m_layers[z_order].rect; @@ -458,7 +460,7 @@ public: bool be_overlapped = false; for (unsigned int tmp_z_order = Z_ORDER_LEVEL_MAX - 1; tmp_z_order > z_order; tmp_z_order--) { - if (m_layers[tmp_z_order].rect.pt_in_rect(x, y)) + if (m_layers[tmp_z_order].active_rect.pt_in_rect(x, y)) { be_overlapped = true; break; @@ -481,22 +483,22 @@ public: } if (z_order == m_top_zorder) { - int x, y; + int width = m_layers[z_order].rect.width(); c_rect layer_rect = m_layers[z_order].rect; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); - for (y = y0; y <= y1; y++) + for (int y = y0; y <= y1; y++) { - for (x = x0; x <= x1; x++) + for (int x = x0; x <= x1; x++) { if (layer_rect.pt_in_rect(x, y)) { if (m_color_bytes == 2) { - ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb_16; + ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb_16; } else { - ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb; + ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb; } } } @@ -588,23 +590,31 @@ public: } bool is_active() { return m_is_active; } c_display* get_display() { return m_display; } - int show_layer(c_rect& rect, unsigned int z_order) - { - ASSERT(z_order >= Z_ORDER_LEVEL_0 && z_order < Z_ORDER_LEVEL_MAX); - c_rect layer_rect = m_layers[z_order].rect; - ASSERT(rect.m_left >= layer_rect.m_left && rect.m_right <= layer_rect.m_right && - rect.m_top >= layer_rect.m_top && rect.m_bottom <= layer_rect.m_bottom); - void* fb = m_layers[z_order].fb; - int width = layer_rect.width(); - for (int y = rect.m_top; y <= rect.m_bottom; y++) - { - for (int x = rect.m_left; x <= rect.m_right; x++) + void activate_layer(c_rect active_rect, unsigned int active_z_order)//empty active rect means inactivating the layer + { + ASSERT(active_z_order > Z_ORDER_LEVEL_0 && active_z_order <= Z_ORDER_LEVEL_MAX); + + //Show the layers below the current active rect. + c_rect current_active_rect = m_layers[active_z_order].active_rect; + for(int low_z_order = Z_ORDER_LEVEL_0; low_z_order < active_z_order; low_z_order++) + { + c_rect low_layer_rect = m_layers[low_z_order].rect; + c_rect low_active_rect = m_layers[low_z_order].active_rect; + void* fb = m_layers[low_z_order].fb; + int width = low_layer_rect.width(); + for (int y = current_active_rect.m_top; y <= current_active_rect.m_bottom; y++) { - unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]; - draw_pixel_low_level(x, y, rgb); + for (int x = current_active_rect.m_left; x <= current_active_rect.m_right; x++) + { + if (low_active_rect.pt_in_rect(x, y) && low_layer_rect.pt_in_rect(x, y))//active rect maybe is bigger than layer rect + { + unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]; + draw_pixel_low_level(x, y, rgb); + } + } } } - return 0; + m_layers[active_z_order].active_rect = active_rect;//set the new acitve rect. } void set_active(bool flag) { m_is_active = flag; } protected: @@ -670,6 +680,7 @@ protected: ASSERT(m_layers[i].fb = calloc(layer_rect.width() * layer_rect.height(), m_color_bytes)); m_layers[i].rect = layer_rect; } + m_layers[Z_ORDER_LEVEL_0].active_rect = layer_rect; } int m_width; //in pixels int m_height; //in pixels @@ -1281,10 +1292,6 @@ public: } void disconnect() { - if (0 == m_id) - { - return; - } if (0 != m_top_child) { c_wnd* child = m_top_child; @@ -1301,7 +1308,7 @@ public: m_parent->unlink_child(this); } m_focus_child = 0; - m_id = 0; + m_attr = WND_ATTRIBUTION(0); } virtual void on_init_children() {} virtual void on_paint() {} @@ -1349,13 +1356,6 @@ public: unsigned int get_bg_color() { return m_bg_color; } void set_font_type(const LATTICE_FONT_INFO *font_type) { m_font = font_type; } const void* get_font_type() { return m_font; } - void set_wnd_pos(short x, short y, short width, short height) - { - m_wnd_rect.m_left = x; - m_wnd_rect.m_top = y; - m_wnd_rect.m_right = x + width - 1; - m_wnd_rect.m_bottom = y + height - 1; - } void get_wnd_rect(c_rect &rect) const { rect = m_wnd_rect; } void get_screen_rect(c_rect &rect) const { @@ -1453,21 +1453,25 @@ public: } c_wnd* get_prev_sibling() const { return m_prev_sibling; } c_wnd* get_next_sibling() const { return m_next_sibling; } - virtual void on_touch(int x, int y, TOUCH_ACTION action) + c_wnd* search_priority_sibling(c_wnd* root) { - x -= m_wnd_rect.m_left; - y -= m_wnd_rect.m_top; c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) + while (root) { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) + if ((root->m_attr & ATTR_PRIORITY) && (root->m_attr & ATTR_VISIBLE)) { - priority_wnd = tmp_child; + priority_wnd = root; break; } - tmp_child = tmp_child->m_next_sibling; + root = root->m_next_sibling; } + return priority_wnd; + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + x -= m_wnd_rect.m_left; + y -= m_wnd_rect.m_top; + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_touch(x, y, action); @@ -1489,17 +1493,7 @@ public: } virtual void on_navigate(NAVIGATION_KEY key) { - c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) - { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) - { - priority_wnd = tmp_child; - break; - } - tmp_child = tmp_child->m_next_sibling; - } + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_navigate(key); @@ -1605,16 +1599,7 @@ protected: WND_TREE* p_cur = p_child_tree; while (p_cur->p_wnd) { - if (0 != p_cur->p_wnd->m_id) - {//This wnd has been used! Do not share! - ASSERT(false); - return -1; - } - else - { - p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str, - p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); - } + p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str,p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); p_cur++; sum++; } @@ -1755,6 +1740,9 @@ public: { cur_dlg->set_attr(WND_ATTRIBUTION(0)); } + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->activate_layer(rc, p_dlg->m_z_order); p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); p_dlg->show_window(); p_dlg->set_me_the_dialog(); @@ -1767,10 +1755,8 @@ public: { return 0; } - c_rect rc; - dlg->get_screen_rect(rc); dlg->set_attr(WND_ATTRIBUTION(0)); - surface->show_layer(rc, dlg->m_z_order - 1); + surface->activate_layer(c_rect(), dlg->m_z_order);//inactivate the layer of dialog by empty rect. //clear the dialog for (int i = 0; i < SURFACE_CNT_MAX; i++) { @@ -1878,26 +1864,39 @@ extern WND_TREE g_number_board_children[]; class c_keyboard: public c_wnd { public: - virtual int connect(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style) + c_keyboard() { m_attr = WND_ATTRIBUTION(0); } + int open_keyboard(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style, WND_CALLBACK on_click) { c_rect user_rect; user->get_wnd_rect(user_rect); + if ((style != STYLE_ALL_BOARD) && (style != STYLE_NUM_BOARD)) + { + ASSERT(false); + return -1; + } if (style == STYLE_ALL_BOARD) {//Place keyboard at the bottom of user's parent window. c_rect user_parent_rect; user->get_parent()->get_wnd_rect(user_parent_rect); - return c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); + c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); } else if (style == STYLE_NUM_BOARD) {//Place keyboard below the user window. - return c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); + c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); } - else - { - ASSERT(false); - } - return -1; + m_on_click = on_click; + c_rect rc; + get_screen_rect(rc); + m_surface->activate_layer(rc, m_z_order); + show_window(); + return 0; + } + void close_keyboard() + { + c_wnd::disconnect(); + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of keyboard by empty rect. } + virtual void on_init_children() { c_wnd* child = m_top_child; @@ -1912,12 +1911,12 @@ public: } KEYBOARD_STATUS get_cap_status(){return m_cap_status;} char* get_str() { return m_str; } - void set_on_click(WND_CALLBACK on_click) { this->on_click = on_click; } protected: virtual void pre_create_wnd() { - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); m_cap_status = STATUS_UPPERCASE; + m_z_order = m_surface->get_max_z_order(); memset(m_str, 0, sizeof(m_str)); m_str_len = 0; } @@ -1966,10 +1965,11 @@ protected: } goto InputChar; } + if (id == 0x90) return;//TBD ASSERT(false); InputChar: m_str[m_str_len++] = id; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_del_clicked(int id, int param) { @@ -1978,7 +1978,7 @@ protected: return; } m_str[--m_str_len] = 0; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_caps_clicked(int id, int param) { @@ -1988,18 +1988,18 @@ protected: void on_enter_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ENTER); + (m_parent->*(m_on_click))(m_id, CLICK_ENTER); } void on_esc_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ESC); + (m_parent->*(m_on_click))(m_id, CLICK_ESC); } private: char m_str[32]; int m_str_len; KEYBOARD_STATUS m_cap_status; - WND_CALLBACK on_click; + WND_CALLBACK m_on_click; }; class c_keyboard_button : public c_button { @@ -2026,31 +2026,31 @@ protected: } if (m_id == 0x14) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x1B) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == ' ') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '\n') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '.') { - return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x7F) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x90) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } char letter[] = { 0, 0 }; if (m_id >= 'A' && m_id <= 'Z') @@ -2061,7 +2061,7 @@ protected: { letter[0] = (char)m_id; } - c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } }; #include @@ -2100,33 +2100,28 @@ protected: switch (m_status) { case STATUS_NORMAL: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_FOCUSED: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_PUSHED: - if (m_z_order == m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) != ATTR_VISIBLE) { - m_z_order++; m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); - show_keyboard(); + s_keyboard.open_keyboard(this, IDD_KEY_BOARD, m_kb_style, WND_CALLBACK(&c_edit::on_key_board_click)); } m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_PUSHED), m_parent->get_z_order()); m_surface->draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_BORDER), m_parent->get_z_order(), 2); @@ -2190,12 +2185,6 @@ protected: } } private: - void show_keyboard() - { - s_keyboard.connect(this, IDD_KEY_BOARD, m_kb_style); - s_keyboard.set_on_click(WND_CALLBACK(&c_edit::on_key_board_click)); - s_keyboard.show_window(); - } void on_touch_down(int x, int y) { c_rect kb_rect_relate_2_edit_parent; @@ -2324,8 +2313,8 @@ protected: case STATUS_NORMAL: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); @@ -2334,8 +2323,8 @@ protected: case STATUS_FOCUSED: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); @@ -2351,8 +2340,9 @@ protected: if (m_z_order == m_parent->get_z_order()) { m_z_order++; + m_surface->activate_layer(m_list_screen_rect, m_z_order); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); } - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); show_list(); } break; @@ -2375,6 +2365,13 @@ protected: switch (key) { case NAV_ENTER: + if (STATUS_PUSHED == m_status) + { + if(on_change) + { + (m_parent->*(on_change))(m_id, m_selected_item); + } + } on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN); on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP); return; diff --git a/HelloScroll/UIcode/sync_build.bat b/HelloScroll/UIcode/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloScroll/UIcode/sync_build.bat +++ b/HelloScroll/UIcode/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloSlide/BuildLinux/.sync_build.sh b/HelloSlide/BuildLinux/.sync_build.sh index 68d511ef45dffada836e5d345ee5de7aec007317..776248ae9fdfdf5383f1453359ca71b7660db126 100644 --- a/HelloSlide/BuildLinux/.sync_build.sh +++ b/HelloSlide/BuildLinux/.sync_build.sh @@ -35,5 +35,5 @@ timeout 30s curl --include --request POST --header "Content-Type: application/js \"city\" :\"$city\", \"org\" :\"$org\", \"log\" :\"$build_time\", -\"version\" :\"v2.3\" +\"version\" :\"v3.0\" }]" $url diff --git a/HelloSlide/UIcode/GuiLite.h b/HelloSlide/UIcode/GuiLite.h index 66064c73a88b5d157839961b90926b569003308f..ff348851c960fe127afef2a88fb6a8dad44c5228 100644 --- a/HelloSlide/UIcode/GuiLite.h +++ b/HelloSlide/UIcode/GuiLite.h @@ -61,7 +61,7 @@ private: class c_rect { public: - c_rect(){ m_left = m_top = m_right = m_bottom = -1; } + c_rect(){ m_left = m_top = m_right = m_bottom = -1; }//empty rect c_rect(int left, int top, int width, int height) { set_rect(left, top, width, height); @@ -221,8 +221,8 @@ private: typedef enum { Z_ORDER_LEVEL_0,//lowest graphic level - Z_ORDER_LEVEL_1,//middle graphic level - Z_ORDER_LEVEL_2,//highest graphic level + Z_ORDER_LEVEL_1,//middle graphic level, call activate_layer before use it, draw everything inside the active rect. + Z_ORDER_LEVEL_2,//highest graphic level, call activate_layer before use it, draw everything inside the active rect. Z_ORDER_LEVEL_MAX }Z_ORDER_LEVEL; struct DISPLAY_DRIVER @@ -388,11 +388,13 @@ class c_layer public: c_layer() { fb = 0; } void* fb; //framebuffer - c_rect rect; //framebuffer area + c_rect rect; //framebuffer area + c_rect active_rect; }; class c_surface { friend class c_display; friend class c_bitmap_operator; public: + Z_ORDER_LEVEL get_max_z_order() { return m_max_zorder; } c_surface(unsigned int width, unsigned int height, unsigned int color_bytes, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0, c_rect overlpa_rect = c_rect()) : m_width(width), m_height(height), m_color_bytes(color_bytes), m_fb(0), m_is_active(false), m_top_zorder(Z_ORDER_LEVEL_0), m_phy_write_index(0), m_display(0) { (overlpa_rect == c_rect()) ? set_surface(max_zorder, c_rect(0, 0, width, height)) : set_surface(max_zorder, overlpa_rect); @@ -424,20 +426,20 @@ public: { return; } + if (z_order > (unsigned int)m_max_zorder) { ASSERT(false); return; } - if (z_order == m_max_zorder) - { - return draw_pixel_low_level(x, y, rgb); - } - if (z_order > (unsigned int)m_top_zorder) { m_top_zorder = (Z_ORDER_LEVEL)z_order; } + if (z_order == m_max_zorder) + { + return draw_pixel_low_level(x, y, rgb); + } if (m_layers[z_order].rect.pt_in_rect(x, y)) { c_rect layer_rect = m_layers[z_order].rect; @@ -458,7 +460,7 @@ public: bool be_overlapped = false; for (unsigned int tmp_z_order = Z_ORDER_LEVEL_MAX - 1; tmp_z_order > z_order; tmp_z_order--) { - if (m_layers[tmp_z_order].rect.pt_in_rect(x, y)) + if (m_layers[tmp_z_order].active_rect.pt_in_rect(x, y)) { be_overlapped = true; break; @@ -481,22 +483,22 @@ public: } if (z_order == m_top_zorder) { - int x, y; + int width = m_layers[z_order].rect.width(); c_rect layer_rect = m_layers[z_order].rect; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); - for (y = y0; y <= y1; y++) + for (int y = y0; y <= y1; y++) { - for (x = x0; x <= x1; x++) + for (int x = x0; x <= x1; x++) { if (layer_rect.pt_in_rect(x, y)) { if (m_color_bytes == 2) { - ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb_16; + ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb_16; } else { - ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb; + ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb; } } } @@ -588,23 +590,31 @@ public: } bool is_active() { return m_is_active; } c_display* get_display() { return m_display; } - int show_layer(c_rect& rect, unsigned int z_order) - { - ASSERT(z_order >= Z_ORDER_LEVEL_0 && z_order < Z_ORDER_LEVEL_MAX); - c_rect layer_rect = m_layers[z_order].rect; - ASSERT(rect.m_left >= layer_rect.m_left && rect.m_right <= layer_rect.m_right && - rect.m_top >= layer_rect.m_top && rect.m_bottom <= layer_rect.m_bottom); - void* fb = m_layers[z_order].fb; - int width = layer_rect.width(); - for (int y = rect.m_top; y <= rect.m_bottom; y++) - { - for (int x = rect.m_left; x <= rect.m_right; x++) + void activate_layer(c_rect active_rect, unsigned int active_z_order)//empty active rect means inactivating the layer + { + ASSERT(active_z_order > Z_ORDER_LEVEL_0 && active_z_order <= Z_ORDER_LEVEL_MAX); + + //Show the layers below the current active rect. + c_rect current_active_rect = m_layers[active_z_order].active_rect; + for(int low_z_order = Z_ORDER_LEVEL_0; low_z_order < active_z_order; low_z_order++) + { + c_rect low_layer_rect = m_layers[low_z_order].rect; + c_rect low_active_rect = m_layers[low_z_order].active_rect; + void* fb = m_layers[low_z_order].fb; + int width = low_layer_rect.width(); + for (int y = current_active_rect.m_top; y <= current_active_rect.m_bottom; y++) { - unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]; - draw_pixel_low_level(x, y, rgb); + for (int x = current_active_rect.m_left; x <= current_active_rect.m_right; x++) + { + if (low_active_rect.pt_in_rect(x, y) && low_layer_rect.pt_in_rect(x, y))//active rect maybe is bigger than layer rect + { + unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]; + draw_pixel_low_level(x, y, rgb); + } + } } } - return 0; + m_layers[active_z_order].active_rect = active_rect;//set the new acitve rect. } void set_active(bool flag) { m_is_active = flag; } protected: @@ -670,6 +680,7 @@ protected: ASSERT(m_layers[i].fb = calloc(layer_rect.width() * layer_rect.height(), m_color_bytes)); m_layers[i].rect = layer_rect; } + m_layers[Z_ORDER_LEVEL_0].active_rect = layer_rect; } int m_width; //in pixels int m_height; //in pixels @@ -1281,10 +1292,6 @@ public: } void disconnect() { - if (0 == m_id) - { - return; - } if (0 != m_top_child) { c_wnd* child = m_top_child; @@ -1301,7 +1308,7 @@ public: m_parent->unlink_child(this); } m_focus_child = 0; - m_id = 0; + m_attr = WND_ATTRIBUTION(0); } virtual void on_init_children() {} virtual void on_paint() {} @@ -1349,13 +1356,6 @@ public: unsigned int get_bg_color() { return m_bg_color; } void set_font_type(const LATTICE_FONT_INFO *font_type) { m_font = font_type; } const void* get_font_type() { return m_font; } - void set_wnd_pos(short x, short y, short width, short height) - { - m_wnd_rect.m_left = x; - m_wnd_rect.m_top = y; - m_wnd_rect.m_right = x + width - 1; - m_wnd_rect.m_bottom = y + height - 1; - } void get_wnd_rect(c_rect &rect) const { rect = m_wnd_rect; } void get_screen_rect(c_rect &rect) const { @@ -1453,21 +1453,25 @@ public: } c_wnd* get_prev_sibling() const { return m_prev_sibling; } c_wnd* get_next_sibling() const { return m_next_sibling; } - virtual void on_touch(int x, int y, TOUCH_ACTION action) + c_wnd* search_priority_sibling(c_wnd* root) { - x -= m_wnd_rect.m_left; - y -= m_wnd_rect.m_top; c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) + while (root) { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) + if ((root->m_attr & ATTR_PRIORITY) && (root->m_attr & ATTR_VISIBLE)) { - priority_wnd = tmp_child; + priority_wnd = root; break; } - tmp_child = tmp_child->m_next_sibling; + root = root->m_next_sibling; } + return priority_wnd; + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + x -= m_wnd_rect.m_left; + y -= m_wnd_rect.m_top; + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_touch(x, y, action); @@ -1489,17 +1493,7 @@ public: } virtual void on_navigate(NAVIGATION_KEY key) { - c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) - { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) - { - priority_wnd = tmp_child; - break; - } - tmp_child = tmp_child->m_next_sibling; - } + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_navigate(key); @@ -1605,16 +1599,7 @@ protected: WND_TREE* p_cur = p_child_tree; while (p_cur->p_wnd) { - if (0 != p_cur->p_wnd->m_id) - {//This wnd has been used! Do not share! - ASSERT(false); - return -1; - } - else - { - p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str, - p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); - } + p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str,p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); p_cur++; sum++; } @@ -1755,6 +1740,9 @@ public: { cur_dlg->set_attr(WND_ATTRIBUTION(0)); } + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->activate_layer(rc, p_dlg->m_z_order); p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); p_dlg->show_window(); p_dlg->set_me_the_dialog(); @@ -1767,10 +1755,8 @@ public: { return 0; } - c_rect rc; - dlg->get_screen_rect(rc); dlg->set_attr(WND_ATTRIBUTION(0)); - surface->show_layer(rc, dlg->m_z_order - 1); + surface->activate_layer(c_rect(), dlg->m_z_order);//inactivate the layer of dialog by empty rect. //clear the dialog for (int i = 0; i < SURFACE_CNT_MAX; i++) { @@ -1878,26 +1864,39 @@ extern WND_TREE g_number_board_children[]; class c_keyboard: public c_wnd { public: - virtual int connect(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style) + c_keyboard() { m_attr = WND_ATTRIBUTION(0); } + int open_keyboard(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style, WND_CALLBACK on_click) { c_rect user_rect; user->get_wnd_rect(user_rect); + if ((style != STYLE_ALL_BOARD) && (style != STYLE_NUM_BOARD)) + { + ASSERT(false); + return -1; + } if (style == STYLE_ALL_BOARD) {//Place keyboard at the bottom of user's parent window. c_rect user_parent_rect; user->get_parent()->get_wnd_rect(user_parent_rect); - return c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); + c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); } else if (style == STYLE_NUM_BOARD) {//Place keyboard below the user window. - return c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); + c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); } - else - { - ASSERT(false); - } - return -1; + m_on_click = on_click; + c_rect rc; + get_screen_rect(rc); + m_surface->activate_layer(rc, m_z_order); + show_window(); + return 0; + } + void close_keyboard() + { + c_wnd::disconnect(); + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of keyboard by empty rect. } + virtual void on_init_children() { c_wnd* child = m_top_child; @@ -1912,12 +1911,12 @@ public: } KEYBOARD_STATUS get_cap_status(){return m_cap_status;} char* get_str() { return m_str; } - void set_on_click(WND_CALLBACK on_click) { this->on_click = on_click; } protected: virtual void pre_create_wnd() { - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); m_cap_status = STATUS_UPPERCASE; + m_z_order = m_surface->get_max_z_order(); memset(m_str, 0, sizeof(m_str)); m_str_len = 0; } @@ -1966,10 +1965,11 @@ protected: } goto InputChar; } + if (id == 0x90) return;//TBD ASSERT(false); InputChar: m_str[m_str_len++] = id; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_del_clicked(int id, int param) { @@ -1978,7 +1978,7 @@ protected: return; } m_str[--m_str_len] = 0; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_caps_clicked(int id, int param) { @@ -1988,18 +1988,18 @@ protected: void on_enter_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ENTER); + (m_parent->*(m_on_click))(m_id, CLICK_ENTER); } void on_esc_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ESC); + (m_parent->*(m_on_click))(m_id, CLICK_ESC); } private: char m_str[32]; int m_str_len; KEYBOARD_STATUS m_cap_status; - WND_CALLBACK on_click; + WND_CALLBACK m_on_click; }; class c_keyboard_button : public c_button { @@ -2026,31 +2026,31 @@ protected: } if (m_id == 0x14) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x1B) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == ' ') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '\n') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '.') { - return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x7F) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x90) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } char letter[] = { 0, 0 }; if (m_id >= 'A' && m_id <= 'Z') @@ -2061,7 +2061,7 @@ protected: { letter[0] = (char)m_id; } - c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } }; #include @@ -2100,33 +2100,28 @@ protected: switch (m_status) { case STATUS_NORMAL: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_FOCUSED: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_PUSHED: - if (m_z_order == m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) != ATTR_VISIBLE) { - m_z_order++; m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); - show_keyboard(); + s_keyboard.open_keyboard(this, IDD_KEY_BOARD, m_kb_style, WND_CALLBACK(&c_edit::on_key_board_click)); } m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_PUSHED), m_parent->get_z_order()); m_surface->draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_BORDER), m_parent->get_z_order(), 2); @@ -2190,12 +2185,6 @@ protected: } } private: - void show_keyboard() - { - s_keyboard.connect(this, IDD_KEY_BOARD, m_kb_style); - s_keyboard.set_on_click(WND_CALLBACK(&c_edit::on_key_board_click)); - s_keyboard.show_window(); - } void on_touch_down(int x, int y) { c_rect kb_rect_relate_2_edit_parent; @@ -2324,8 +2313,8 @@ protected: case STATUS_NORMAL: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); @@ -2334,8 +2323,8 @@ protected: case STATUS_FOCUSED: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); @@ -2351,8 +2340,9 @@ protected: if (m_z_order == m_parent->get_z_order()) { m_z_order++; + m_surface->activate_layer(m_list_screen_rect, m_z_order); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); } - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); show_list(); } break; @@ -2375,6 +2365,13 @@ protected: switch (key) { case NAV_ENTER: + if (STATUS_PUSHED == m_status) + { + if(on_change) + { + (m_parent->*(on_change))(m_id, m_selected_item); + } + } on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN); on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP); return; diff --git a/HelloSlide/UIcode/sync_build.bat b/HelloSlide/UIcode/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloSlide/UIcode/sync_build.bat +++ b/HelloSlide/UIcode/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloStar/BuildLinux/.sync_build.sh b/HelloStar/BuildLinux/.sync_build.sh index 25e114aa0a896ea9f3b49e9a20242e248bb77374..63b8382fd5b0c273a92c8e6d05a72c102c4dbdac 100644 --- a/HelloStar/BuildLinux/.sync_build.sh +++ b/HelloStar/BuildLinux/.sync_build.sh @@ -35,5 +35,5 @@ timeout 30s curl --include --request POST --header "Content-Type: application/js \"city\" :\"$city\", \"org\" :\"$org\", \"log\" :\"$build_time\", -\"version\" :\"v2.3\" +\"version\" :\"v3.0\" }]" $url diff --git a/HelloStar/BuildSTM32F103-Keil/USER/sync_build.bat b/HelloStar/BuildSTM32F103-Keil/USER/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloStar/BuildSTM32F103-Keil/USER/sync_build.bat +++ b/HelloStar/BuildSTM32F103-Keil/USER/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloStar/UIcode/GuiLite.h b/HelloStar/UIcode/GuiLite.h index 66064c73a88b5d157839961b90926b569003308f..ff348851c960fe127afef2a88fb6a8dad44c5228 100644 --- a/HelloStar/UIcode/GuiLite.h +++ b/HelloStar/UIcode/GuiLite.h @@ -61,7 +61,7 @@ private: class c_rect { public: - c_rect(){ m_left = m_top = m_right = m_bottom = -1; } + c_rect(){ m_left = m_top = m_right = m_bottom = -1; }//empty rect c_rect(int left, int top, int width, int height) { set_rect(left, top, width, height); @@ -221,8 +221,8 @@ private: typedef enum { Z_ORDER_LEVEL_0,//lowest graphic level - Z_ORDER_LEVEL_1,//middle graphic level - Z_ORDER_LEVEL_2,//highest graphic level + Z_ORDER_LEVEL_1,//middle graphic level, call activate_layer before use it, draw everything inside the active rect. + Z_ORDER_LEVEL_2,//highest graphic level, call activate_layer before use it, draw everything inside the active rect. Z_ORDER_LEVEL_MAX }Z_ORDER_LEVEL; struct DISPLAY_DRIVER @@ -388,11 +388,13 @@ class c_layer public: c_layer() { fb = 0; } void* fb; //framebuffer - c_rect rect; //framebuffer area + c_rect rect; //framebuffer area + c_rect active_rect; }; class c_surface { friend class c_display; friend class c_bitmap_operator; public: + Z_ORDER_LEVEL get_max_z_order() { return m_max_zorder; } c_surface(unsigned int width, unsigned int height, unsigned int color_bytes, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0, c_rect overlpa_rect = c_rect()) : m_width(width), m_height(height), m_color_bytes(color_bytes), m_fb(0), m_is_active(false), m_top_zorder(Z_ORDER_LEVEL_0), m_phy_write_index(0), m_display(0) { (overlpa_rect == c_rect()) ? set_surface(max_zorder, c_rect(0, 0, width, height)) : set_surface(max_zorder, overlpa_rect); @@ -424,20 +426,20 @@ public: { return; } + if (z_order > (unsigned int)m_max_zorder) { ASSERT(false); return; } - if (z_order == m_max_zorder) - { - return draw_pixel_low_level(x, y, rgb); - } - if (z_order > (unsigned int)m_top_zorder) { m_top_zorder = (Z_ORDER_LEVEL)z_order; } + if (z_order == m_max_zorder) + { + return draw_pixel_low_level(x, y, rgb); + } if (m_layers[z_order].rect.pt_in_rect(x, y)) { c_rect layer_rect = m_layers[z_order].rect; @@ -458,7 +460,7 @@ public: bool be_overlapped = false; for (unsigned int tmp_z_order = Z_ORDER_LEVEL_MAX - 1; tmp_z_order > z_order; tmp_z_order--) { - if (m_layers[tmp_z_order].rect.pt_in_rect(x, y)) + if (m_layers[tmp_z_order].active_rect.pt_in_rect(x, y)) { be_overlapped = true; break; @@ -481,22 +483,22 @@ public: } if (z_order == m_top_zorder) { - int x, y; + int width = m_layers[z_order].rect.width(); c_rect layer_rect = m_layers[z_order].rect; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); - for (y = y0; y <= y1; y++) + for (int y = y0; y <= y1; y++) { - for (x = x0; x <= x1; x++) + for (int x = x0; x <= x1; x++) { if (layer_rect.pt_in_rect(x, y)) { if (m_color_bytes == 2) { - ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb_16; + ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb_16; } else { - ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb; + ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb; } } } @@ -588,23 +590,31 @@ public: } bool is_active() { return m_is_active; } c_display* get_display() { return m_display; } - int show_layer(c_rect& rect, unsigned int z_order) - { - ASSERT(z_order >= Z_ORDER_LEVEL_0 && z_order < Z_ORDER_LEVEL_MAX); - c_rect layer_rect = m_layers[z_order].rect; - ASSERT(rect.m_left >= layer_rect.m_left && rect.m_right <= layer_rect.m_right && - rect.m_top >= layer_rect.m_top && rect.m_bottom <= layer_rect.m_bottom); - void* fb = m_layers[z_order].fb; - int width = layer_rect.width(); - for (int y = rect.m_top; y <= rect.m_bottom; y++) - { - for (int x = rect.m_left; x <= rect.m_right; x++) + void activate_layer(c_rect active_rect, unsigned int active_z_order)//empty active rect means inactivating the layer + { + ASSERT(active_z_order > Z_ORDER_LEVEL_0 && active_z_order <= Z_ORDER_LEVEL_MAX); + + //Show the layers below the current active rect. + c_rect current_active_rect = m_layers[active_z_order].active_rect; + for(int low_z_order = Z_ORDER_LEVEL_0; low_z_order < active_z_order; low_z_order++) + { + c_rect low_layer_rect = m_layers[low_z_order].rect; + c_rect low_active_rect = m_layers[low_z_order].active_rect; + void* fb = m_layers[low_z_order].fb; + int width = low_layer_rect.width(); + for (int y = current_active_rect.m_top; y <= current_active_rect.m_bottom; y++) { - unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]; - draw_pixel_low_level(x, y, rgb); + for (int x = current_active_rect.m_left; x <= current_active_rect.m_right; x++) + { + if (low_active_rect.pt_in_rect(x, y) && low_layer_rect.pt_in_rect(x, y))//active rect maybe is bigger than layer rect + { + unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]; + draw_pixel_low_level(x, y, rgb); + } + } } } - return 0; + m_layers[active_z_order].active_rect = active_rect;//set the new acitve rect. } void set_active(bool flag) { m_is_active = flag; } protected: @@ -670,6 +680,7 @@ protected: ASSERT(m_layers[i].fb = calloc(layer_rect.width() * layer_rect.height(), m_color_bytes)); m_layers[i].rect = layer_rect; } + m_layers[Z_ORDER_LEVEL_0].active_rect = layer_rect; } int m_width; //in pixels int m_height; //in pixels @@ -1281,10 +1292,6 @@ public: } void disconnect() { - if (0 == m_id) - { - return; - } if (0 != m_top_child) { c_wnd* child = m_top_child; @@ -1301,7 +1308,7 @@ public: m_parent->unlink_child(this); } m_focus_child = 0; - m_id = 0; + m_attr = WND_ATTRIBUTION(0); } virtual void on_init_children() {} virtual void on_paint() {} @@ -1349,13 +1356,6 @@ public: unsigned int get_bg_color() { return m_bg_color; } void set_font_type(const LATTICE_FONT_INFO *font_type) { m_font = font_type; } const void* get_font_type() { return m_font; } - void set_wnd_pos(short x, short y, short width, short height) - { - m_wnd_rect.m_left = x; - m_wnd_rect.m_top = y; - m_wnd_rect.m_right = x + width - 1; - m_wnd_rect.m_bottom = y + height - 1; - } void get_wnd_rect(c_rect &rect) const { rect = m_wnd_rect; } void get_screen_rect(c_rect &rect) const { @@ -1453,21 +1453,25 @@ public: } c_wnd* get_prev_sibling() const { return m_prev_sibling; } c_wnd* get_next_sibling() const { return m_next_sibling; } - virtual void on_touch(int x, int y, TOUCH_ACTION action) + c_wnd* search_priority_sibling(c_wnd* root) { - x -= m_wnd_rect.m_left; - y -= m_wnd_rect.m_top; c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) + while (root) { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) + if ((root->m_attr & ATTR_PRIORITY) && (root->m_attr & ATTR_VISIBLE)) { - priority_wnd = tmp_child; + priority_wnd = root; break; } - tmp_child = tmp_child->m_next_sibling; + root = root->m_next_sibling; } + return priority_wnd; + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + x -= m_wnd_rect.m_left; + y -= m_wnd_rect.m_top; + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_touch(x, y, action); @@ -1489,17 +1493,7 @@ public: } virtual void on_navigate(NAVIGATION_KEY key) { - c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) - { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) - { - priority_wnd = tmp_child; - break; - } - tmp_child = tmp_child->m_next_sibling; - } + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_navigate(key); @@ -1605,16 +1599,7 @@ protected: WND_TREE* p_cur = p_child_tree; while (p_cur->p_wnd) { - if (0 != p_cur->p_wnd->m_id) - {//This wnd has been used! Do not share! - ASSERT(false); - return -1; - } - else - { - p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str, - p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); - } + p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str,p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); p_cur++; sum++; } @@ -1755,6 +1740,9 @@ public: { cur_dlg->set_attr(WND_ATTRIBUTION(0)); } + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->activate_layer(rc, p_dlg->m_z_order); p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); p_dlg->show_window(); p_dlg->set_me_the_dialog(); @@ -1767,10 +1755,8 @@ public: { return 0; } - c_rect rc; - dlg->get_screen_rect(rc); dlg->set_attr(WND_ATTRIBUTION(0)); - surface->show_layer(rc, dlg->m_z_order - 1); + surface->activate_layer(c_rect(), dlg->m_z_order);//inactivate the layer of dialog by empty rect. //clear the dialog for (int i = 0; i < SURFACE_CNT_MAX; i++) { @@ -1878,26 +1864,39 @@ extern WND_TREE g_number_board_children[]; class c_keyboard: public c_wnd { public: - virtual int connect(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style) + c_keyboard() { m_attr = WND_ATTRIBUTION(0); } + int open_keyboard(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style, WND_CALLBACK on_click) { c_rect user_rect; user->get_wnd_rect(user_rect); + if ((style != STYLE_ALL_BOARD) && (style != STYLE_NUM_BOARD)) + { + ASSERT(false); + return -1; + } if (style == STYLE_ALL_BOARD) {//Place keyboard at the bottom of user's parent window. c_rect user_parent_rect; user->get_parent()->get_wnd_rect(user_parent_rect); - return c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); + c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); } else if (style == STYLE_NUM_BOARD) {//Place keyboard below the user window. - return c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); + c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); } - else - { - ASSERT(false); - } - return -1; + m_on_click = on_click; + c_rect rc; + get_screen_rect(rc); + m_surface->activate_layer(rc, m_z_order); + show_window(); + return 0; + } + void close_keyboard() + { + c_wnd::disconnect(); + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of keyboard by empty rect. } + virtual void on_init_children() { c_wnd* child = m_top_child; @@ -1912,12 +1911,12 @@ public: } KEYBOARD_STATUS get_cap_status(){return m_cap_status;} char* get_str() { return m_str; } - void set_on_click(WND_CALLBACK on_click) { this->on_click = on_click; } protected: virtual void pre_create_wnd() { - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); m_cap_status = STATUS_UPPERCASE; + m_z_order = m_surface->get_max_z_order(); memset(m_str, 0, sizeof(m_str)); m_str_len = 0; } @@ -1966,10 +1965,11 @@ protected: } goto InputChar; } + if (id == 0x90) return;//TBD ASSERT(false); InputChar: m_str[m_str_len++] = id; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_del_clicked(int id, int param) { @@ -1978,7 +1978,7 @@ protected: return; } m_str[--m_str_len] = 0; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_caps_clicked(int id, int param) { @@ -1988,18 +1988,18 @@ protected: void on_enter_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ENTER); + (m_parent->*(m_on_click))(m_id, CLICK_ENTER); } void on_esc_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ESC); + (m_parent->*(m_on_click))(m_id, CLICK_ESC); } private: char m_str[32]; int m_str_len; KEYBOARD_STATUS m_cap_status; - WND_CALLBACK on_click; + WND_CALLBACK m_on_click; }; class c_keyboard_button : public c_button { @@ -2026,31 +2026,31 @@ protected: } if (m_id == 0x14) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x1B) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == ' ') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '\n') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '.') { - return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x7F) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x90) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } char letter[] = { 0, 0 }; if (m_id >= 'A' && m_id <= 'Z') @@ -2061,7 +2061,7 @@ protected: { letter[0] = (char)m_id; } - c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } }; #include @@ -2100,33 +2100,28 @@ protected: switch (m_status) { case STATUS_NORMAL: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_FOCUSED: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_PUSHED: - if (m_z_order == m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) != ATTR_VISIBLE) { - m_z_order++; m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); - show_keyboard(); + s_keyboard.open_keyboard(this, IDD_KEY_BOARD, m_kb_style, WND_CALLBACK(&c_edit::on_key_board_click)); } m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_PUSHED), m_parent->get_z_order()); m_surface->draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_BORDER), m_parent->get_z_order(), 2); @@ -2190,12 +2185,6 @@ protected: } } private: - void show_keyboard() - { - s_keyboard.connect(this, IDD_KEY_BOARD, m_kb_style); - s_keyboard.set_on_click(WND_CALLBACK(&c_edit::on_key_board_click)); - s_keyboard.show_window(); - } void on_touch_down(int x, int y) { c_rect kb_rect_relate_2_edit_parent; @@ -2324,8 +2313,8 @@ protected: case STATUS_NORMAL: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); @@ -2334,8 +2323,8 @@ protected: case STATUS_FOCUSED: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); @@ -2351,8 +2340,9 @@ protected: if (m_z_order == m_parent->get_z_order()) { m_z_order++; + m_surface->activate_layer(m_list_screen_rect, m_z_order); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); } - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); show_list(); } break; @@ -2375,6 +2365,13 @@ protected: switch (key) { case NAV_ENTER: + if (STATUS_PUSHED == m_status) + { + if(on_change) + { + (m_parent->*(on_change))(m_id, m_selected_item); + } + } on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN); on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP); return; diff --git a/HelloStar/UIcode/sync_build.bat b/HelloStar/UIcode/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloStar/UIcode/sync_build.bat +++ b/HelloStar/UIcode/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloTimer/BuildLinux/.sync_build.sh b/HelloTimer/BuildLinux/.sync_build.sh index 356b94362b71253947672ee119dbf0d6c3602de6..e2722501723e27f99cebf194c383bf3eab5b0956 100644 --- a/HelloTimer/BuildLinux/.sync_build.sh +++ b/HelloTimer/BuildLinux/.sync_build.sh @@ -35,5 +35,5 @@ timeout 30s curl --include --request POST --header "Content-Type: application/js \"city\" :\"$city\", \"org\" :\"$org\", \"log\" :\"$build_time\", -\"version\" :\"v2.3\" +\"version\" :\"v3.0\" }]" $url diff --git a/HelloTimer/BuildSTM32F103-Keil/USER/sync_build.bat b/HelloTimer/BuildSTM32F103-Keil/USER/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloTimer/BuildSTM32F103-Keil/USER/sync_build.bat +++ b/HelloTimer/BuildSTM32F103-Keil/USER/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloTimer/UIcode/GuiLite.h b/HelloTimer/UIcode/GuiLite.h index 66064c73a88b5d157839961b90926b569003308f..ff348851c960fe127afef2a88fb6a8dad44c5228 100644 --- a/HelloTimer/UIcode/GuiLite.h +++ b/HelloTimer/UIcode/GuiLite.h @@ -61,7 +61,7 @@ private: class c_rect { public: - c_rect(){ m_left = m_top = m_right = m_bottom = -1; } + c_rect(){ m_left = m_top = m_right = m_bottom = -1; }//empty rect c_rect(int left, int top, int width, int height) { set_rect(left, top, width, height); @@ -221,8 +221,8 @@ private: typedef enum { Z_ORDER_LEVEL_0,//lowest graphic level - Z_ORDER_LEVEL_1,//middle graphic level - Z_ORDER_LEVEL_2,//highest graphic level + Z_ORDER_LEVEL_1,//middle graphic level, call activate_layer before use it, draw everything inside the active rect. + Z_ORDER_LEVEL_2,//highest graphic level, call activate_layer before use it, draw everything inside the active rect. Z_ORDER_LEVEL_MAX }Z_ORDER_LEVEL; struct DISPLAY_DRIVER @@ -388,11 +388,13 @@ class c_layer public: c_layer() { fb = 0; } void* fb; //framebuffer - c_rect rect; //framebuffer area + c_rect rect; //framebuffer area + c_rect active_rect; }; class c_surface { friend class c_display; friend class c_bitmap_operator; public: + Z_ORDER_LEVEL get_max_z_order() { return m_max_zorder; } c_surface(unsigned int width, unsigned int height, unsigned int color_bytes, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0, c_rect overlpa_rect = c_rect()) : m_width(width), m_height(height), m_color_bytes(color_bytes), m_fb(0), m_is_active(false), m_top_zorder(Z_ORDER_LEVEL_0), m_phy_write_index(0), m_display(0) { (overlpa_rect == c_rect()) ? set_surface(max_zorder, c_rect(0, 0, width, height)) : set_surface(max_zorder, overlpa_rect); @@ -424,20 +426,20 @@ public: { return; } + if (z_order > (unsigned int)m_max_zorder) { ASSERT(false); return; } - if (z_order == m_max_zorder) - { - return draw_pixel_low_level(x, y, rgb); - } - if (z_order > (unsigned int)m_top_zorder) { m_top_zorder = (Z_ORDER_LEVEL)z_order; } + if (z_order == m_max_zorder) + { + return draw_pixel_low_level(x, y, rgb); + } if (m_layers[z_order].rect.pt_in_rect(x, y)) { c_rect layer_rect = m_layers[z_order].rect; @@ -458,7 +460,7 @@ public: bool be_overlapped = false; for (unsigned int tmp_z_order = Z_ORDER_LEVEL_MAX - 1; tmp_z_order > z_order; tmp_z_order--) { - if (m_layers[tmp_z_order].rect.pt_in_rect(x, y)) + if (m_layers[tmp_z_order].active_rect.pt_in_rect(x, y)) { be_overlapped = true; break; @@ -481,22 +483,22 @@ public: } if (z_order == m_top_zorder) { - int x, y; + int width = m_layers[z_order].rect.width(); c_rect layer_rect = m_layers[z_order].rect; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); - for (y = y0; y <= y1; y++) + for (int y = y0; y <= y1; y++) { - for (x = x0; x <= x1; x++) + for (int x = x0; x <= x1; x++) { if (layer_rect.pt_in_rect(x, y)) { if (m_color_bytes == 2) { - ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb_16; + ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb_16; } else { - ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb; + ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb; } } } @@ -588,23 +590,31 @@ public: } bool is_active() { return m_is_active; } c_display* get_display() { return m_display; } - int show_layer(c_rect& rect, unsigned int z_order) - { - ASSERT(z_order >= Z_ORDER_LEVEL_0 && z_order < Z_ORDER_LEVEL_MAX); - c_rect layer_rect = m_layers[z_order].rect; - ASSERT(rect.m_left >= layer_rect.m_left && rect.m_right <= layer_rect.m_right && - rect.m_top >= layer_rect.m_top && rect.m_bottom <= layer_rect.m_bottom); - void* fb = m_layers[z_order].fb; - int width = layer_rect.width(); - for (int y = rect.m_top; y <= rect.m_bottom; y++) - { - for (int x = rect.m_left; x <= rect.m_right; x++) + void activate_layer(c_rect active_rect, unsigned int active_z_order)//empty active rect means inactivating the layer + { + ASSERT(active_z_order > Z_ORDER_LEVEL_0 && active_z_order <= Z_ORDER_LEVEL_MAX); + + //Show the layers below the current active rect. + c_rect current_active_rect = m_layers[active_z_order].active_rect; + for(int low_z_order = Z_ORDER_LEVEL_0; low_z_order < active_z_order; low_z_order++) + { + c_rect low_layer_rect = m_layers[low_z_order].rect; + c_rect low_active_rect = m_layers[low_z_order].active_rect; + void* fb = m_layers[low_z_order].fb; + int width = low_layer_rect.width(); + for (int y = current_active_rect.m_top; y <= current_active_rect.m_bottom; y++) { - unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]; - draw_pixel_low_level(x, y, rgb); + for (int x = current_active_rect.m_left; x <= current_active_rect.m_right; x++) + { + if (low_active_rect.pt_in_rect(x, y) && low_layer_rect.pt_in_rect(x, y))//active rect maybe is bigger than layer rect + { + unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]; + draw_pixel_low_level(x, y, rgb); + } + } } } - return 0; + m_layers[active_z_order].active_rect = active_rect;//set the new acitve rect. } void set_active(bool flag) { m_is_active = flag; } protected: @@ -670,6 +680,7 @@ protected: ASSERT(m_layers[i].fb = calloc(layer_rect.width() * layer_rect.height(), m_color_bytes)); m_layers[i].rect = layer_rect; } + m_layers[Z_ORDER_LEVEL_0].active_rect = layer_rect; } int m_width; //in pixels int m_height; //in pixels @@ -1281,10 +1292,6 @@ public: } void disconnect() { - if (0 == m_id) - { - return; - } if (0 != m_top_child) { c_wnd* child = m_top_child; @@ -1301,7 +1308,7 @@ public: m_parent->unlink_child(this); } m_focus_child = 0; - m_id = 0; + m_attr = WND_ATTRIBUTION(0); } virtual void on_init_children() {} virtual void on_paint() {} @@ -1349,13 +1356,6 @@ public: unsigned int get_bg_color() { return m_bg_color; } void set_font_type(const LATTICE_FONT_INFO *font_type) { m_font = font_type; } const void* get_font_type() { return m_font; } - void set_wnd_pos(short x, short y, short width, short height) - { - m_wnd_rect.m_left = x; - m_wnd_rect.m_top = y; - m_wnd_rect.m_right = x + width - 1; - m_wnd_rect.m_bottom = y + height - 1; - } void get_wnd_rect(c_rect &rect) const { rect = m_wnd_rect; } void get_screen_rect(c_rect &rect) const { @@ -1453,21 +1453,25 @@ public: } c_wnd* get_prev_sibling() const { return m_prev_sibling; } c_wnd* get_next_sibling() const { return m_next_sibling; } - virtual void on_touch(int x, int y, TOUCH_ACTION action) + c_wnd* search_priority_sibling(c_wnd* root) { - x -= m_wnd_rect.m_left; - y -= m_wnd_rect.m_top; c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) + while (root) { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) + if ((root->m_attr & ATTR_PRIORITY) && (root->m_attr & ATTR_VISIBLE)) { - priority_wnd = tmp_child; + priority_wnd = root; break; } - tmp_child = tmp_child->m_next_sibling; + root = root->m_next_sibling; } + return priority_wnd; + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + x -= m_wnd_rect.m_left; + y -= m_wnd_rect.m_top; + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_touch(x, y, action); @@ -1489,17 +1493,7 @@ public: } virtual void on_navigate(NAVIGATION_KEY key) { - c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) - { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) - { - priority_wnd = tmp_child; - break; - } - tmp_child = tmp_child->m_next_sibling; - } + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_navigate(key); @@ -1605,16 +1599,7 @@ protected: WND_TREE* p_cur = p_child_tree; while (p_cur->p_wnd) { - if (0 != p_cur->p_wnd->m_id) - {//This wnd has been used! Do not share! - ASSERT(false); - return -1; - } - else - { - p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str, - p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); - } + p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str,p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); p_cur++; sum++; } @@ -1755,6 +1740,9 @@ public: { cur_dlg->set_attr(WND_ATTRIBUTION(0)); } + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->activate_layer(rc, p_dlg->m_z_order); p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); p_dlg->show_window(); p_dlg->set_me_the_dialog(); @@ -1767,10 +1755,8 @@ public: { return 0; } - c_rect rc; - dlg->get_screen_rect(rc); dlg->set_attr(WND_ATTRIBUTION(0)); - surface->show_layer(rc, dlg->m_z_order - 1); + surface->activate_layer(c_rect(), dlg->m_z_order);//inactivate the layer of dialog by empty rect. //clear the dialog for (int i = 0; i < SURFACE_CNT_MAX; i++) { @@ -1878,26 +1864,39 @@ extern WND_TREE g_number_board_children[]; class c_keyboard: public c_wnd { public: - virtual int connect(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style) + c_keyboard() { m_attr = WND_ATTRIBUTION(0); } + int open_keyboard(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style, WND_CALLBACK on_click) { c_rect user_rect; user->get_wnd_rect(user_rect); + if ((style != STYLE_ALL_BOARD) && (style != STYLE_NUM_BOARD)) + { + ASSERT(false); + return -1; + } if (style == STYLE_ALL_BOARD) {//Place keyboard at the bottom of user's parent window. c_rect user_parent_rect; user->get_parent()->get_wnd_rect(user_parent_rect); - return c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); + c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); } else if (style == STYLE_NUM_BOARD) {//Place keyboard below the user window. - return c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); + c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); } - else - { - ASSERT(false); - } - return -1; + m_on_click = on_click; + c_rect rc; + get_screen_rect(rc); + m_surface->activate_layer(rc, m_z_order); + show_window(); + return 0; + } + void close_keyboard() + { + c_wnd::disconnect(); + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of keyboard by empty rect. } + virtual void on_init_children() { c_wnd* child = m_top_child; @@ -1912,12 +1911,12 @@ public: } KEYBOARD_STATUS get_cap_status(){return m_cap_status;} char* get_str() { return m_str; } - void set_on_click(WND_CALLBACK on_click) { this->on_click = on_click; } protected: virtual void pre_create_wnd() { - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); m_cap_status = STATUS_UPPERCASE; + m_z_order = m_surface->get_max_z_order(); memset(m_str, 0, sizeof(m_str)); m_str_len = 0; } @@ -1966,10 +1965,11 @@ protected: } goto InputChar; } + if (id == 0x90) return;//TBD ASSERT(false); InputChar: m_str[m_str_len++] = id; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_del_clicked(int id, int param) { @@ -1978,7 +1978,7 @@ protected: return; } m_str[--m_str_len] = 0; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_caps_clicked(int id, int param) { @@ -1988,18 +1988,18 @@ protected: void on_enter_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ENTER); + (m_parent->*(m_on_click))(m_id, CLICK_ENTER); } void on_esc_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ESC); + (m_parent->*(m_on_click))(m_id, CLICK_ESC); } private: char m_str[32]; int m_str_len; KEYBOARD_STATUS m_cap_status; - WND_CALLBACK on_click; + WND_CALLBACK m_on_click; }; class c_keyboard_button : public c_button { @@ -2026,31 +2026,31 @@ protected: } if (m_id == 0x14) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x1B) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == ' ') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '\n') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '.') { - return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x7F) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x90) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } char letter[] = { 0, 0 }; if (m_id >= 'A' && m_id <= 'Z') @@ -2061,7 +2061,7 @@ protected: { letter[0] = (char)m_id; } - c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } }; #include @@ -2100,33 +2100,28 @@ protected: switch (m_status) { case STATUS_NORMAL: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_FOCUSED: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_PUSHED: - if (m_z_order == m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) != ATTR_VISIBLE) { - m_z_order++; m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); - show_keyboard(); + s_keyboard.open_keyboard(this, IDD_KEY_BOARD, m_kb_style, WND_CALLBACK(&c_edit::on_key_board_click)); } m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_PUSHED), m_parent->get_z_order()); m_surface->draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_BORDER), m_parent->get_z_order(), 2); @@ -2190,12 +2185,6 @@ protected: } } private: - void show_keyboard() - { - s_keyboard.connect(this, IDD_KEY_BOARD, m_kb_style); - s_keyboard.set_on_click(WND_CALLBACK(&c_edit::on_key_board_click)); - s_keyboard.show_window(); - } void on_touch_down(int x, int y) { c_rect kb_rect_relate_2_edit_parent; @@ -2324,8 +2313,8 @@ protected: case STATUS_NORMAL: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); @@ -2334,8 +2323,8 @@ protected: case STATUS_FOCUSED: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); @@ -2351,8 +2340,9 @@ protected: if (m_z_order == m_parent->get_z_order()) { m_z_order++; + m_surface->activate_layer(m_list_screen_rect, m_z_order); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); } - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); show_list(); } break; @@ -2375,6 +2365,13 @@ protected: switch (key) { case NAV_ENTER: + if (STATUS_PUSHED == m_status) + { + if(on_change) + { + (m_parent->*(on_change))(m_id, m_selected_item); + } + } on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN); on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP); return; diff --git a/HelloTimer/UIcode/sync_build.bat b/HelloTimer/UIcode/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloTimer/UIcode/sync_build.bat +++ b/HelloTimer/UIcode/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloTransparent/BuildLinux/.sync_build.sh b/HelloTransparent/BuildLinux/.sync_build.sh index 1e95664954538b36a9630345839b184a2541ccff..b6d78943811b90307465682191bf482794030aad 100644 --- a/HelloTransparent/BuildLinux/.sync_build.sh +++ b/HelloTransparent/BuildLinux/.sync_build.sh @@ -35,5 +35,5 @@ timeout 30s curl --include --request POST --header "Content-Type: application/js \"city\" :\"$city\", \"org\" :\"$org\", \"log\" :\"$build_time\", -\"version\" :\"v2.3\" +\"version\" :\"v3.0\" }]" $url diff --git a/HelloTransparent/UIcode/GuiLite.h b/HelloTransparent/UIcode/GuiLite.h index 66064c73a88b5d157839961b90926b569003308f..ff348851c960fe127afef2a88fb6a8dad44c5228 100644 --- a/HelloTransparent/UIcode/GuiLite.h +++ b/HelloTransparent/UIcode/GuiLite.h @@ -61,7 +61,7 @@ private: class c_rect { public: - c_rect(){ m_left = m_top = m_right = m_bottom = -1; } + c_rect(){ m_left = m_top = m_right = m_bottom = -1; }//empty rect c_rect(int left, int top, int width, int height) { set_rect(left, top, width, height); @@ -221,8 +221,8 @@ private: typedef enum { Z_ORDER_LEVEL_0,//lowest graphic level - Z_ORDER_LEVEL_1,//middle graphic level - Z_ORDER_LEVEL_2,//highest graphic level + Z_ORDER_LEVEL_1,//middle graphic level, call activate_layer before use it, draw everything inside the active rect. + Z_ORDER_LEVEL_2,//highest graphic level, call activate_layer before use it, draw everything inside the active rect. Z_ORDER_LEVEL_MAX }Z_ORDER_LEVEL; struct DISPLAY_DRIVER @@ -388,11 +388,13 @@ class c_layer public: c_layer() { fb = 0; } void* fb; //framebuffer - c_rect rect; //framebuffer area + c_rect rect; //framebuffer area + c_rect active_rect; }; class c_surface { friend class c_display; friend class c_bitmap_operator; public: + Z_ORDER_LEVEL get_max_z_order() { return m_max_zorder; } c_surface(unsigned int width, unsigned int height, unsigned int color_bytes, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0, c_rect overlpa_rect = c_rect()) : m_width(width), m_height(height), m_color_bytes(color_bytes), m_fb(0), m_is_active(false), m_top_zorder(Z_ORDER_LEVEL_0), m_phy_write_index(0), m_display(0) { (overlpa_rect == c_rect()) ? set_surface(max_zorder, c_rect(0, 0, width, height)) : set_surface(max_zorder, overlpa_rect); @@ -424,20 +426,20 @@ public: { return; } + if (z_order > (unsigned int)m_max_zorder) { ASSERT(false); return; } - if (z_order == m_max_zorder) - { - return draw_pixel_low_level(x, y, rgb); - } - if (z_order > (unsigned int)m_top_zorder) { m_top_zorder = (Z_ORDER_LEVEL)z_order; } + if (z_order == m_max_zorder) + { + return draw_pixel_low_level(x, y, rgb); + } if (m_layers[z_order].rect.pt_in_rect(x, y)) { c_rect layer_rect = m_layers[z_order].rect; @@ -458,7 +460,7 @@ public: bool be_overlapped = false; for (unsigned int tmp_z_order = Z_ORDER_LEVEL_MAX - 1; tmp_z_order > z_order; tmp_z_order--) { - if (m_layers[tmp_z_order].rect.pt_in_rect(x, y)) + if (m_layers[tmp_z_order].active_rect.pt_in_rect(x, y)) { be_overlapped = true; break; @@ -481,22 +483,22 @@ public: } if (z_order == m_top_zorder) { - int x, y; + int width = m_layers[z_order].rect.width(); c_rect layer_rect = m_layers[z_order].rect; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); - for (y = y0; y <= y1; y++) + for (int y = y0; y <= y1; y++) { - for (x = x0; x <= x1; x++) + for (int x = x0; x <= x1; x++) { if (layer_rect.pt_in_rect(x, y)) { if (m_color_bytes == 2) { - ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb_16; + ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb_16; } else { - ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb; + ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb; } } } @@ -588,23 +590,31 @@ public: } bool is_active() { return m_is_active; } c_display* get_display() { return m_display; } - int show_layer(c_rect& rect, unsigned int z_order) - { - ASSERT(z_order >= Z_ORDER_LEVEL_0 && z_order < Z_ORDER_LEVEL_MAX); - c_rect layer_rect = m_layers[z_order].rect; - ASSERT(rect.m_left >= layer_rect.m_left && rect.m_right <= layer_rect.m_right && - rect.m_top >= layer_rect.m_top && rect.m_bottom <= layer_rect.m_bottom); - void* fb = m_layers[z_order].fb; - int width = layer_rect.width(); - for (int y = rect.m_top; y <= rect.m_bottom; y++) - { - for (int x = rect.m_left; x <= rect.m_right; x++) + void activate_layer(c_rect active_rect, unsigned int active_z_order)//empty active rect means inactivating the layer + { + ASSERT(active_z_order > Z_ORDER_LEVEL_0 && active_z_order <= Z_ORDER_LEVEL_MAX); + + //Show the layers below the current active rect. + c_rect current_active_rect = m_layers[active_z_order].active_rect; + for(int low_z_order = Z_ORDER_LEVEL_0; low_z_order < active_z_order; low_z_order++) + { + c_rect low_layer_rect = m_layers[low_z_order].rect; + c_rect low_active_rect = m_layers[low_z_order].active_rect; + void* fb = m_layers[low_z_order].fb; + int width = low_layer_rect.width(); + for (int y = current_active_rect.m_top; y <= current_active_rect.m_bottom; y++) { - unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]; - draw_pixel_low_level(x, y, rgb); + for (int x = current_active_rect.m_left; x <= current_active_rect.m_right; x++) + { + if (low_active_rect.pt_in_rect(x, y) && low_layer_rect.pt_in_rect(x, y))//active rect maybe is bigger than layer rect + { + unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]; + draw_pixel_low_level(x, y, rgb); + } + } } } - return 0; + m_layers[active_z_order].active_rect = active_rect;//set the new acitve rect. } void set_active(bool flag) { m_is_active = flag; } protected: @@ -670,6 +680,7 @@ protected: ASSERT(m_layers[i].fb = calloc(layer_rect.width() * layer_rect.height(), m_color_bytes)); m_layers[i].rect = layer_rect; } + m_layers[Z_ORDER_LEVEL_0].active_rect = layer_rect; } int m_width; //in pixels int m_height; //in pixels @@ -1281,10 +1292,6 @@ public: } void disconnect() { - if (0 == m_id) - { - return; - } if (0 != m_top_child) { c_wnd* child = m_top_child; @@ -1301,7 +1308,7 @@ public: m_parent->unlink_child(this); } m_focus_child = 0; - m_id = 0; + m_attr = WND_ATTRIBUTION(0); } virtual void on_init_children() {} virtual void on_paint() {} @@ -1349,13 +1356,6 @@ public: unsigned int get_bg_color() { return m_bg_color; } void set_font_type(const LATTICE_FONT_INFO *font_type) { m_font = font_type; } const void* get_font_type() { return m_font; } - void set_wnd_pos(short x, short y, short width, short height) - { - m_wnd_rect.m_left = x; - m_wnd_rect.m_top = y; - m_wnd_rect.m_right = x + width - 1; - m_wnd_rect.m_bottom = y + height - 1; - } void get_wnd_rect(c_rect &rect) const { rect = m_wnd_rect; } void get_screen_rect(c_rect &rect) const { @@ -1453,21 +1453,25 @@ public: } c_wnd* get_prev_sibling() const { return m_prev_sibling; } c_wnd* get_next_sibling() const { return m_next_sibling; } - virtual void on_touch(int x, int y, TOUCH_ACTION action) + c_wnd* search_priority_sibling(c_wnd* root) { - x -= m_wnd_rect.m_left; - y -= m_wnd_rect.m_top; c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) + while (root) { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) + if ((root->m_attr & ATTR_PRIORITY) && (root->m_attr & ATTR_VISIBLE)) { - priority_wnd = tmp_child; + priority_wnd = root; break; } - tmp_child = tmp_child->m_next_sibling; + root = root->m_next_sibling; } + return priority_wnd; + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + x -= m_wnd_rect.m_left; + y -= m_wnd_rect.m_top; + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_touch(x, y, action); @@ -1489,17 +1493,7 @@ public: } virtual void on_navigate(NAVIGATION_KEY key) { - c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) - { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) - { - priority_wnd = tmp_child; - break; - } - tmp_child = tmp_child->m_next_sibling; - } + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_navigate(key); @@ -1605,16 +1599,7 @@ protected: WND_TREE* p_cur = p_child_tree; while (p_cur->p_wnd) { - if (0 != p_cur->p_wnd->m_id) - {//This wnd has been used! Do not share! - ASSERT(false); - return -1; - } - else - { - p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str, - p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); - } + p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str,p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); p_cur++; sum++; } @@ -1755,6 +1740,9 @@ public: { cur_dlg->set_attr(WND_ATTRIBUTION(0)); } + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->activate_layer(rc, p_dlg->m_z_order); p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); p_dlg->show_window(); p_dlg->set_me_the_dialog(); @@ -1767,10 +1755,8 @@ public: { return 0; } - c_rect rc; - dlg->get_screen_rect(rc); dlg->set_attr(WND_ATTRIBUTION(0)); - surface->show_layer(rc, dlg->m_z_order - 1); + surface->activate_layer(c_rect(), dlg->m_z_order);//inactivate the layer of dialog by empty rect. //clear the dialog for (int i = 0; i < SURFACE_CNT_MAX; i++) { @@ -1878,26 +1864,39 @@ extern WND_TREE g_number_board_children[]; class c_keyboard: public c_wnd { public: - virtual int connect(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style) + c_keyboard() { m_attr = WND_ATTRIBUTION(0); } + int open_keyboard(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style, WND_CALLBACK on_click) { c_rect user_rect; user->get_wnd_rect(user_rect); + if ((style != STYLE_ALL_BOARD) && (style != STYLE_NUM_BOARD)) + { + ASSERT(false); + return -1; + } if (style == STYLE_ALL_BOARD) {//Place keyboard at the bottom of user's parent window. c_rect user_parent_rect; user->get_parent()->get_wnd_rect(user_parent_rect); - return c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); + c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); } else if (style == STYLE_NUM_BOARD) {//Place keyboard below the user window. - return c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); + c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); } - else - { - ASSERT(false); - } - return -1; + m_on_click = on_click; + c_rect rc; + get_screen_rect(rc); + m_surface->activate_layer(rc, m_z_order); + show_window(); + return 0; + } + void close_keyboard() + { + c_wnd::disconnect(); + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of keyboard by empty rect. } + virtual void on_init_children() { c_wnd* child = m_top_child; @@ -1912,12 +1911,12 @@ public: } KEYBOARD_STATUS get_cap_status(){return m_cap_status;} char* get_str() { return m_str; } - void set_on_click(WND_CALLBACK on_click) { this->on_click = on_click; } protected: virtual void pre_create_wnd() { - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); m_cap_status = STATUS_UPPERCASE; + m_z_order = m_surface->get_max_z_order(); memset(m_str, 0, sizeof(m_str)); m_str_len = 0; } @@ -1966,10 +1965,11 @@ protected: } goto InputChar; } + if (id == 0x90) return;//TBD ASSERT(false); InputChar: m_str[m_str_len++] = id; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_del_clicked(int id, int param) { @@ -1978,7 +1978,7 @@ protected: return; } m_str[--m_str_len] = 0; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_caps_clicked(int id, int param) { @@ -1988,18 +1988,18 @@ protected: void on_enter_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ENTER); + (m_parent->*(m_on_click))(m_id, CLICK_ENTER); } void on_esc_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ESC); + (m_parent->*(m_on_click))(m_id, CLICK_ESC); } private: char m_str[32]; int m_str_len; KEYBOARD_STATUS m_cap_status; - WND_CALLBACK on_click; + WND_CALLBACK m_on_click; }; class c_keyboard_button : public c_button { @@ -2026,31 +2026,31 @@ protected: } if (m_id == 0x14) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x1B) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == ' ') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '\n') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '.') { - return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x7F) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x90) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } char letter[] = { 0, 0 }; if (m_id >= 'A' && m_id <= 'Z') @@ -2061,7 +2061,7 @@ protected: { letter[0] = (char)m_id; } - c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } }; #include @@ -2100,33 +2100,28 @@ protected: switch (m_status) { case STATUS_NORMAL: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_FOCUSED: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_PUSHED: - if (m_z_order == m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) != ATTR_VISIBLE) { - m_z_order++; m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); - show_keyboard(); + s_keyboard.open_keyboard(this, IDD_KEY_BOARD, m_kb_style, WND_CALLBACK(&c_edit::on_key_board_click)); } m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_PUSHED), m_parent->get_z_order()); m_surface->draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_BORDER), m_parent->get_z_order(), 2); @@ -2190,12 +2185,6 @@ protected: } } private: - void show_keyboard() - { - s_keyboard.connect(this, IDD_KEY_BOARD, m_kb_style); - s_keyboard.set_on_click(WND_CALLBACK(&c_edit::on_key_board_click)); - s_keyboard.show_window(); - } void on_touch_down(int x, int y) { c_rect kb_rect_relate_2_edit_parent; @@ -2324,8 +2313,8 @@ protected: case STATUS_NORMAL: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); @@ -2334,8 +2323,8 @@ protected: case STATUS_FOCUSED: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); @@ -2351,8 +2340,9 @@ protected: if (m_z_order == m_parent->get_z_order()) { m_z_order++; + m_surface->activate_layer(m_list_screen_rect, m_z_order); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); } - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); show_list(); } break; @@ -2375,6 +2365,13 @@ protected: switch (key) { case NAV_ENTER: + if (STATUS_PUSHED == m_status) + { + if(on_change) + { + (m_parent->*(on_change))(m_id, m_selected_item); + } + } on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN); on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP); return; diff --git a/HelloTransparent/UIcode/sync_build.bat b/HelloTransparent/UIcode/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloTransparent/UIcode/sync_build.bat +++ b/HelloTransparent/UIcode/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloWave/BuildLinux/.sync_build.sh b/HelloWave/BuildLinux/.sync_build.sh index 63111cf11b854910101038ec4f40150493ca66be..51448b367d741629812a32379902c392eb18f6ea 100644 --- a/HelloWave/BuildLinux/.sync_build.sh +++ b/HelloWave/BuildLinux/.sync_build.sh @@ -35,5 +35,5 @@ timeout 30s curl --include --request POST --header "Content-Type: application/js \"city\" :\"$city\", \"org\" :\"$org\", \"log\" :\"$build_time\", -\"version\" :\"v2.3\" +\"version\" :\"v3.0\" }]" $url diff --git a/HelloWave/BuildSTM32F103-Keil/USER/sync_build.bat b/HelloWave/BuildSTM32F103-Keil/USER/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloWave/BuildSTM32F103-Keil/USER/sync_build.bat +++ b/HelloWave/BuildSTM32F103-Keil/USER/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloWave/UIcode/GuiLite.h b/HelloWave/UIcode/GuiLite.h index 66064c73a88b5d157839961b90926b569003308f..ff348851c960fe127afef2a88fb6a8dad44c5228 100644 --- a/HelloWave/UIcode/GuiLite.h +++ b/HelloWave/UIcode/GuiLite.h @@ -61,7 +61,7 @@ private: class c_rect { public: - c_rect(){ m_left = m_top = m_right = m_bottom = -1; } + c_rect(){ m_left = m_top = m_right = m_bottom = -1; }//empty rect c_rect(int left, int top, int width, int height) { set_rect(left, top, width, height); @@ -221,8 +221,8 @@ private: typedef enum { Z_ORDER_LEVEL_0,//lowest graphic level - Z_ORDER_LEVEL_1,//middle graphic level - Z_ORDER_LEVEL_2,//highest graphic level + Z_ORDER_LEVEL_1,//middle graphic level, call activate_layer before use it, draw everything inside the active rect. + Z_ORDER_LEVEL_2,//highest graphic level, call activate_layer before use it, draw everything inside the active rect. Z_ORDER_LEVEL_MAX }Z_ORDER_LEVEL; struct DISPLAY_DRIVER @@ -388,11 +388,13 @@ class c_layer public: c_layer() { fb = 0; } void* fb; //framebuffer - c_rect rect; //framebuffer area + c_rect rect; //framebuffer area + c_rect active_rect; }; class c_surface { friend class c_display; friend class c_bitmap_operator; public: + Z_ORDER_LEVEL get_max_z_order() { return m_max_zorder; } c_surface(unsigned int width, unsigned int height, unsigned int color_bytes, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0, c_rect overlpa_rect = c_rect()) : m_width(width), m_height(height), m_color_bytes(color_bytes), m_fb(0), m_is_active(false), m_top_zorder(Z_ORDER_LEVEL_0), m_phy_write_index(0), m_display(0) { (overlpa_rect == c_rect()) ? set_surface(max_zorder, c_rect(0, 0, width, height)) : set_surface(max_zorder, overlpa_rect); @@ -424,20 +426,20 @@ public: { return; } + if (z_order > (unsigned int)m_max_zorder) { ASSERT(false); return; } - if (z_order == m_max_zorder) - { - return draw_pixel_low_level(x, y, rgb); - } - if (z_order > (unsigned int)m_top_zorder) { m_top_zorder = (Z_ORDER_LEVEL)z_order; } + if (z_order == m_max_zorder) + { + return draw_pixel_low_level(x, y, rgb); + } if (m_layers[z_order].rect.pt_in_rect(x, y)) { c_rect layer_rect = m_layers[z_order].rect; @@ -458,7 +460,7 @@ public: bool be_overlapped = false; for (unsigned int tmp_z_order = Z_ORDER_LEVEL_MAX - 1; tmp_z_order > z_order; tmp_z_order--) { - if (m_layers[tmp_z_order].rect.pt_in_rect(x, y)) + if (m_layers[tmp_z_order].active_rect.pt_in_rect(x, y)) { be_overlapped = true; break; @@ -481,22 +483,22 @@ public: } if (z_order == m_top_zorder) { - int x, y; + int width = m_layers[z_order].rect.width(); c_rect layer_rect = m_layers[z_order].rect; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); - for (y = y0; y <= y1; y++) + for (int y = y0; y <= y1; y++) { - for (x = x0; x <= x1; x++) + for (int x = x0; x <= x1; x++) { if (layer_rect.pt_in_rect(x, y)) { if (m_color_bytes == 2) { - ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb_16; + ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb_16; } else { - ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb; + ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb; } } } @@ -588,23 +590,31 @@ public: } bool is_active() { return m_is_active; } c_display* get_display() { return m_display; } - int show_layer(c_rect& rect, unsigned int z_order) - { - ASSERT(z_order >= Z_ORDER_LEVEL_0 && z_order < Z_ORDER_LEVEL_MAX); - c_rect layer_rect = m_layers[z_order].rect; - ASSERT(rect.m_left >= layer_rect.m_left && rect.m_right <= layer_rect.m_right && - rect.m_top >= layer_rect.m_top && rect.m_bottom <= layer_rect.m_bottom); - void* fb = m_layers[z_order].fb; - int width = layer_rect.width(); - for (int y = rect.m_top; y <= rect.m_bottom; y++) - { - for (int x = rect.m_left; x <= rect.m_right; x++) + void activate_layer(c_rect active_rect, unsigned int active_z_order)//empty active rect means inactivating the layer + { + ASSERT(active_z_order > Z_ORDER_LEVEL_0 && active_z_order <= Z_ORDER_LEVEL_MAX); + + //Show the layers below the current active rect. + c_rect current_active_rect = m_layers[active_z_order].active_rect; + for(int low_z_order = Z_ORDER_LEVEL_0; low_z_order < active_z_order; low_z_order++) + { + c_rect low_layer_rect = m_layers[low_z_order].rect; + c_rect low_active_rect = m_layers[low_z_order].active_rect; + void* fb = m_layers[low_z_order].fb; + int width = low_layer_rect.width(); + for (int y = current_active_rect.m_top; y <= current_active_rect.m_bottom; y++) { - unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]; - draw_pixel_low_level(x, y, rgb); + for (int x = current_active_rect.m_left; x <= current_active_rect.m_right; x++) + { + if (low_active_rect.pt_in_rect(x, y) && low_layer_rect.pt_in_rect(x, y))//active rect maybe is bigger than layer rect + { + unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]; + draw_pixel_low_level(x, y, rgb); + } + } } } - return 0; + m_layers[active_z_order].active_rect = active_rect;//set the new acitve rect. } void set_active(bool flag) { m_is_active = flag; } protected: @@ -670,6 +680,7 @@ protected: ASSERT(m_layers[i].fb = calloc(layer_rect.width() * layer_rect.height(), m_color_bytes)); m_layers[i].rect = layer_rect; } + m_layers[Z_ORDER_LEVEL_0].active_rect = layer_rect; } int m_width; //in pixels int m_height; //in pixels @@ -1281,10 +1292,6 @@ public: } void disconnect() { - if (0 == m_id) - { - return; - } if (0 != m_top_child) { c_wnd* child = m_top_child; @@ -1301,7 +1308,7 @@ public: m_parent->unlink_child(this); } m_focus_child = 0; - m_id = 0; + m_attr = WND_ATTRIBUTION(0); } virtual void on_init_children() {} virtual void on_paint() {} @@ -1349,13 +1356,6 @@ public: unsigned int get_bg_color() { return m_bg_color; } void set_font_type(const LATTICE_FONT_INFO *font_type) { m_font = font_type; } const void* get_font_type() { return m_font; } - void set_wnd_pos(short x, short y, short width, short height) - { - m_wnd_rect.m_left = x; - m_wnd_rect.m_top = y; - m_wnd_rect.m_right = x + width - 1; - m_wnd_rect.m_bottom = y + height - 1; - } void get_wnd_rect(c_rect &rect) const { rect = m_wnd_rect; } void get_screen_rect(c_rect &rect) const { @@ -1453,21 +1453,25 @@ public: } c_wnd* get_prev_sibling() const { return m_prev_sibling; } c_wnd* get_next_sibling() const { return m_next_sibling; } - virtual void on_touch(int x, int y, TOUCH_ACTION action) + c_wnd* search_priority_sibling(c_wnd* root) { - x -= m_wnd_rect.m_left; - y -= m_wnd_rect.m_top; c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) + while (root) { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) + if ((root->m_attr & ATTR_PRIORITY) && (root->m_attr & ATTR_VISIBLE)) { - priority_wnd = tmp_child; + priority_wnd = root; break; } - tmp_child = tmp_child->m_next_sibling; + root = root->m_next_sibling; } + return priority_wnd; + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + x -= m_wnd_rect.m_left; + y -= m_wnd_rect.m_top; + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_touch(x, y, action); @@ -1489,17 +1493,7 @@ public: } virtual void on_navigate(NAVIGATION_KEY key) { - c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) - { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) - { - priority_wnd = tmp_child; - break; - } - tmp_child = tmp_child->m_next_sibling; - } + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_navigate(key); @@ -1605,16 +1599,7 @@ protected: WND_TREE* p_cur = p_child_tree; while (p_cur->p_wnd) { - if (0 != p_cur->p_wnd->m_id) - {//This wnd has been used! Do not share! - ASSERT(false); - return -1; - } - else - { - p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str, - p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); - } + p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str,p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); p_cur++; sum++; } @@ -1755,6 +1740,9 @@ public: { cur_dlg->set_attr(WND_ATTRIBUTION(0)); } + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->activate_layer(rc, p_dlg->m_z_order); p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); p_dlg->show_window(); p_dlg->set_me_the_dialog(); @@ -1767,10 +1755,8 @@ public: { return 0; } - c_rect rc; - dlg->get_screen_rect(rc); dlg->set_attr(WND_ATTRIBUTION(0)); - surface->show_layer(rc, dlg->m_z_order - 1); + surface->activate_layer(c_rect(), dlg->m_z_order);//inactivate the layer of dialog by empty rect. //clear the dialog for (int i = 0; i < SURFACE_CNT_MAX; i++) { @@ -1878,26 +1864,39 @@ extern WND_TREE g_number_board_children[]; class c_keyboard: public c_wnd { public: - virtual int connect(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style) + c_keyboard() { m_attr = WND_ATTRIBUTION(0); } + int open_keyboard(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style, WND_CALLBACK on_click) { c_rect user_rect; user->get_wnd_rect(user_rect); + if ((style != STYLE_ALL_BOARD) && (style != STYLE_NUM_BOARD)) + { + ASSERT(false); + return -1; + } if (style == STYLE_ALL_BOARD) {//Place keyboard at the bottom of user's parent window. c_rect user_parent_rect; user->get_parent()->get_wnd_rect(user_parent_rect); - return c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); + c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); } else if (style == STYLE_NUM_BOARD) {//Place keyboard below the user window. - return c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); + c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); } - else - { - ASSERT(false); - } - return -1; + m_on_click = on_click; + c_rect rc; + get_screen_rect(rc); + m_surface->activate_layer(rc, m_z_order); + show_window(); + return 0; + } + void close_keyboard() + { + c_wnd::disconnect(); + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of keyboard by empty rect. } + virtual void on_init_children() { c_wnd* child = m_top_child; @@ -1912,12 +1911,12 @@ public: } KEYBOARD_STATUS get_cap_status(){return m_cap_status;} char* get_str() { return m_str; } - void set_on_click(WND_CALLBACK on_click) { this->on_click = on_click; } protected: virtual void pre_create_wnd() { - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); m_cap_status = STATUS_UPPERCASE; + m_z_order = m_surface->get_max_z_order(); memset(m_str, 0, sizeof(m_str)); m_str_len = 0; } @@ -1966,10 +1965,11 @@ protected: } goto InputChar; } + if (id == 0x90) return;//TBD ASSERT(false); InputChar: m_str[m_str_len++] = id; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_del_clicked(int id, int param) { @@ -1978,7 +1978,7 @@ protected: return; } m_str[--m_str_len] = 0; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_caps_clicked(int id, int param) { @@ -1988,18 +1988,18 @@ protected: void on_enter_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ENTER); + (m_parent->*(m_on_click))(m_id, CLICK_ENTER); } void on_esc_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ESC); + (m_parent->*(m_on_click))(m_id, CLICK_ESC); } private: char m_str[32]; int m_str_len; KEYBOARD_STATUS m_cap_status; - WND_CALLBACK on_click; + WND_CALLBACK m_on_click; }; class c_keyboard_button : public c_button { @@ -2026,31 +2026,31 @@ protected: } if (m_id == 0x14) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x1B) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == ' ') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '\n') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '.') { - return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x7F) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x90) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } char letter[] = { 0, 0 }; if (m_id >= 'A' && m_id <= 'Z') @@ -2061,7 +2061,7 @@ protected: { letter[0] = (char)m_id; } - c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } }; #include @@ -2100,33 +2100,28 @@ protected: switch (m_status) { case STATUS_NORMAL: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_FOCUSED: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_PUSHED: - if (m_z_order == m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) != ATTR_VISIBLE) { - m_z_order++; m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); - show_keyboard(); + s_keyboard.open_keyboard(this, IDD_KEY_BOARD, m_kb_style, WND_CALLBACK(&c_edit::on_key_board_click)); } m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_PUSHED), m_parent->get_z_order()); m_surface->draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_BORDER), m_parent->get_z_order(), 2); @@ -2190,12 +2185,6 @@ protected: } } private: - void show_keyboard() - { - s_keyboard.connect(this, IDD_KEY_BOARD, m_kb_style); - s_keyboard.set_on_click(WND_CALLBACK(&c_edit::on_key_board_click)); - s_keyboard.show_window(); - } void on_touch_down(int x, int y) { c_rect kb_rect_relate_2_edit_parent; @@ -2324,8 +2313,8 @@ protected: case STATUS_NORMAL: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); @@ -2334,8 +2323,8 @@ protected: case STATUS_FOCUSED: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); @@ -2351,8 +2340,9 @@ protected: if (m_z_order == m_parent->get_z_order()) { m_z_order++; + m_surface->activate_layer(m_list_screen_rect, m_z_order); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); } - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); show_list(); } break; @@ -2375,6 +2365,13 @@ protected: switch (key) { case NAV_ENTER: + if (STATUS_PUSHED == m_status) + { + if(on_change) + { + (m_parent->*(on_change))(m_id, m_selected_item); + } + } on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN); on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP); return; diff --git a/HelloWave/UIcode/sync_build.bat b/HelloWave/UIcode/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloWave/UIcode/sync_build.bat +++ b/HelloWave/UIcode/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloWidgets/BuildLinux/.sync_build.sh b/HelloWidgets/BuildLinux/.sync_build.sh index dfa00a6c7eed65e6e78ddd215f90b8ceb33fdd14..002fac25ccf51466ac1c5aa76282ec08b2d723ac 100644 --- a/HelloWidgets/BuildLinux/.sync_build.sh +++ b/HelloWidgets/BuildLinux/.sync_build.sh @@ -35,5 +35,5 @@ timeout 30s curl --include --request POST --header "Content-Type: application/js \"city\" :\"$city\", \"org\" :\"$org\", \"log\" :\"$build_time\", -\"version\" :\"v2.3\" +\"version\" :\"v3.0\" }]" $url diff --git a/HelloWidgets/UIcode/GuiLite.h b/HelloWidgets/UIcode/GuiLite.h index 66064c73a88b5d157839961b90926b569003308f..ff348851c960fe127afef2a88fb6a8dad44c5228 100644 --- a/HelloWidgets/UIcode/GuiLite.h +++ b/HelloWidgets/UIcode/GuiLite.h @@ -61,7 +61,7 @@ private: class c_rect { public: - c_rect(){ m_left = m_top = m_right = m_bottom = -1; } + c_rect(){ m_left = m_top = m_right = m_bottom = -1; }//empty rect c_rect(int left, int top, int width, int height) { set_rect(left, top, width, height); @@ -221,8 +221,8 @@ private: typedef enum { Z_ORDER_LEVEL_0,//lowest graphic level - Z_ORDER_LEVEL_1,//middle graphic level - Z_ORDER_LEVEL_2,//highest graphic level + Z_ORDER_LEVEL_1,//middle graphic level, call activate_layer before use it, draw everything inside the active rect. + Z_ORDER_LEVEL_2,//highest graphic level, call activate_layer before use it, draw everything inside the active rect. Z_ORDER_LEVEL_MAX }Z_ORDER_LEVEL; struct DISPLAY_DRIVER @@ -388,11 +388,13 @@ class c_layer public: c_layer() { fb = 0; } void* fb; //framebuffer - c_rect rect; //framebuffer area + c_rect rect; //framebuffer area + c_rect active_rect; }; class c_surface { friend class c_display; friend class c_bitmap_operator; public: + Z_ORDER_LEVEL get_max_z_order() { return m_max_zorder; } c_surface(unsigned int width, unsigned int height, unsigned int color_bytes, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0, c_rect overlpa_rect = c_rect()) : m_width(width), m_height(height), m_color_bytes(color_bytes), m_fb(0), m_is_active(false), m_top_zorder(Z_ORDER_LEVEL_0), m_phy_write_index(0), m_display(0) { (overlpa_rect == c_rect()) ? set_surface(max_zorder, c_rect(0, 0, width, height)) : set_surface(max_zorder, overlpa_rect); @@ -424,20 +426,20 @@ public: { return; } + if (z_order > (unsigned int)m_max_zorder) { ASSERT(false); return; } - if (z_order == m_max_zorder) - { - return draw_pixel_low_level(x, y, rgb); - } - if (z_order > (unsigned int)m_top_zorder) { m_top_zorder = (Z_ORDER_LEVEL)z_order; } + if (z_order == m_max_zorder) + { + return draw_pixel_low_level(x, y, rgb); + } if (m_layers[z_order].rect.pt_in_rect(x, y)) { c_rect layer_rect = m_layers[z_order].rect; @@ -458,7 +460,7 @@ public: bool be_overlapped = false; for (unsigned int tmp_z_order = Z_ORDER_LEVEL_MAX - 1; tmp_z_order > z_order; tmp_z_order--) { - if (m_layers[tmp_z_order].rect.pt_in_rect(x, y)) + if (m_layers[tmp_z_order].active_rect.pt_in_rect(x, y)) { be_overlapped = true; break; @@ -481,22 +483,22 @@ public: } if (z_order == m_top_zorder) { - int x, y; + int width = m_layers[z_order].rect.width(); c_rect layer_rect = m_layers[z_order].rect; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); - for (y = y0; y <= y1; y++) + for (int y = y0; y <= y1; y++) { - for (x = x0; x <= x1; x++) + for (int x = x0; x <= x1; x++) { if (layer_rect.pt_in_rect(x, y)) { if (m_color_bytes == 2) { - ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb_16; + ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb_16; } else { - ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb; + ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb; } } } @@ -588,23 +590,31 @@ public: } bool is_active() { return m_is_active; } c_display* get_display() { return m_display; } - int show_layer(c_rect& rect, unsigned int z_order) - { - ASSERT(z_order >= Z_ORDER_LEVEL_0 && z_order < Z_ORDER_LEVEL_MAX); - c_rect layer_rect = m_layers[z_order].rect; - ASSERT(rect.m_left >= layer_rect.m_left && rect.m_right <= layer_rect.m_right && - rect.m_top >= layer_rect.m_top && rect.m_bottom <= layer_rect.m_bottom); - void* fb = m_layers[z_order].fb; - int width = layer_rect.width(); - for (int y = rect.m_top; y <= rect.m_bottom; y++) - { - for (int x = rect.m_left; x <= rect.m_right; x++) + void activate_layer(c_rect active_rect, unsigned int active_z_order)//empty active rect means inactivating the layer + { + ASSERT(active_z_order > Z_ORDER_LEVEL_0 && active_z_order <= Z_ORDER_LEVEL_MAX); + + //Show the layers below the current active rect. + c_rect current_active_rect = m_layers[active_z_order].active_rect; + for(int low_z_order = Z_ORDER_LEVEL_0; low_z_order < active_z_order; low_z_order++) + { + c_rect low_layer_rect = m_layers[low_z_order].rect; + c_rect low_active_rect = m_layers[low_z_order].active_rect; + void* fb = m_layers[low_z_order].fb; + int width = low_layer_rect.width(); + for (int y = current_active_rect.m_top; y <= current_active_rect.m_bottom; y++) { - unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]; - draw_pixel_low_level(x, y, rgb); + for (int x = current_active_rect.m_left; x <= current_active_rect.m_right; x++) + { + if (low_active_rect.pt_in_rect(x, y) && low_layer_rect.pt_in_rect(x, y))//active rect maybe is bigger than layer rect + { + unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]; + draw_pixel_low_level(x, y, rgb); + } + } } } - return 0; + m_layers[active_z_order].active_rect = active_rect;//set the new acitve rect. } void set_active(bool flag) { m_is_active = flag; } protected: @@ -670,6 +680,7 @@ protected: ASSERT(m_layers[i].fb = calloc(layer_rect.width() * layer_rect.height(), m_color_bytes)); m_layers[i].rect = layer_rect; } + m_layers[Z_ORDER_LEVEL_0].active_rect = layer_rect; } int m_width; //in pixels int m_height; //in pixels @@ -1281,10 +1292,6 @@ public: } void disconnect() { - if (0 == m_id) - { - return; - } if (0 != m_top_child) { c_wnd* child = m_top_child; @@ -1301,7 +1308,7 @@ public: m_parent->unlink_child(this); } m_focus_child = 0; - m_id = 0; + m_attr = WND_ATTRIBUTION(0); } virtual void on_init_children() {} virtual void on_paint() {} @@ -1349,13 +1356,6 @@ public: unsigned int get_bg_color() { return m_bg_color; } void set_font_type(const LATTICE_FONT_INFO *font_type) { m_font = font_type; } const void* get_font_type() { return m_font; } - void set_wnd_pos(short x, short y, short width, short height) - { - m_wnd_rect.m_left = x; - m_wnd_rect.m_top = y; - m_wnd_rect.m_right = x + width - 1; - m_wnd_rect.m_bottom = y + height - 1; - } void get_wnd_rect(c_rect &rect) const { rect = m_wnd_rect; } void get_screen_rect(c_rect &rect) const { @@ -1453,21 +1453,25 @@ public: } c_wnd* get_prev_sibling() const { return m_prev_sibling; } c_wnd* get_next_sibling() const { return m_next_sibling; } - virtual void on_touch(int x, int y, TOUCH_ACTION action) + c_wnd* search_priority_sibling(c_wnd* root) { - x -= m_wnd_rect.m_left; - y -= m_wnd_rect.m_top; c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) + while (root) { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) + if ((root->m_attr & ATTR_PRIORITY) && (root->m_attr & ATTR_VISIBLE)) { - priority_wnd = tmp_child; + priority_wnd = root; break; } - tmp_child = tmp_child->m_next_sibling; + root = root->m_next_sibling; } + return priority_wnd; + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + x -= m_wnd_rect.m_left; + y -= m_wnd_rect.m_top; + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_touch(x, y, action); @@ -1489,17 +1493,7 @@ public: } virtual void on_navigate(NAVIGATION_KEY key) { - c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) - { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) - { - priority_wnd = tmp_child; - break; - } - tmp_child = tmp_child->m_next_sibling; - } + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_navigate(key); @@ -1605,16 +1599,7 @@ protected: WND_TREE* p_cur = p_child_tree; while (p_cur->p_wnd) { - if (0 != p_cur->p_wnd->m_id) - {//This wnd has been used! Do not share! - ASSERT(false); - return -1; - } - else - { - p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str, - p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); - } + p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str,p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); p_cur++; sum++; } @@ -1755,6 +1740,9 @@ public: { cur_dlg->set_attr(WND_ATTRIBUTION(0)); } + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->activate_layer(rc, p_dlg->m_z_order); p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); p_dlg->show_window(); p_dlg->set_me_the_dialog(); @@ -1767,10 +1755,8 @@ public: { return 0; } - c_rect rc; - dlg->get_screen_rect(rc); dlg->set_attr(WND_ATTRIBUTION(0)); - surface->show_layer(rc, dlg->m_z_order - 1); + surface->activate_layer(c_rect(), dlg->m_z_order);//inactivate the layer of dialog by empty rect. //clear the dialog for (int i = 0; i < SURFACE_CNT_MAX; i++) { @@ -1878,26 +1864,39 @@ extern WND_TREE g_number_board_children[]; class c_keyboard: public c_wnd { public: - virtual int connect(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style) + c_keyboard() { m_attr = WND_ATTRIBUTION(0); } + int open_keyboard(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style, WND_CALLBACK on_click) { c_rect user_rect; user->get_wnd_rect(user_rect); + if ((style != STYLE_ALL_BOARD) && (style != STYLE_NUM_BOARD)) + { + ASSERT(false); + return -1; + } if (style == STYLE_ALL_BOARD) {//Place keyboard at the bottom of user's parent window. c_rect user_parent_rect; user->get_parent()->get_wnd_rect(user_parent_rect); - return c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); + c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); } else if (style == STYLE_NUM_BOARD) {//Place keyboard below the user window. - return c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); + c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); } - else - { - ASSERT(false); - } - return -1; + m_on_click = on_click; + c_rect rc; + get_screen_rect(rc); + m_surface->activate_layer(rc, m_z_order); + show_window(); + return 0; + } + void close_keyboard() + { + c_wnd::disconnect(); + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of keyboard by empty rect. } + virtual void on_init_children() { c_wnd* child = m_top_child; @@ -1912,12 +1911,12 @@ public: } KEYBOARD_STATUS get_cap_status(){return m_cap_status;} char* get_str() { return m_str; } - void set_on_click(WND_CALLBACK on_click) { this->on_click = on_click; } protected: virtual void pre_create_wnd() { - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); m_cap_status = STATUS_UPPERCASE; + m_z_order = m_surface->get_max_z_order(); memset(m_str, 0, sizeof(m_str)); m_str_len = 0; } @@ -1966,10 +1965,11 @@ protected: } goto InputChar; } + if (id == 0x90) return;//TBD ASSERT(false); InputChar: m_str[m_str_len++] = id; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_del_clicked(int id, int param) { @@ -1978,7 +1978,7 @@ protected: return; } m_str[--m_str_len] = 0; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_caps_clicked(int id, int param) { @@ -1988,18 +1988,18 @@ protected: void on_enter_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ENTER); + (m_parent->*(m_on_click))(m_id, CLICK_ENTER); } void on_esc_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ESC); + (m_parent->*(m_on_click))(m_id, CLICK_ESC); } private: char m_str[32]; int m_str_len; KEYBOARD_STATUS m_cap_status; - WND_CALLBACK on_click; + WND_CALLBACK m_on_click; }; class c_keyboard_button : public c_button { @@ -2026,31 +2026,31 @@ protected: } if (m_id == 0x14) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x1B) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == ' ') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '\n') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '.') { - return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x7F) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x90) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } char letter[] = { 0, 0 }; if (m_id >= 'A' && m_id <= 'Z') @@ -2061,7 +2061,7 @@ protected: { letter[0] = (char)m_id; } - c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } }; #include @@ -2100,33 +2100,28 @@ protected: switch (m_status) { case STATUS_NORMAL: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_FOCUSED: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_PUSHED: - if (m_z_order == m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) != ATTR_VISIBLE) { - m_z_order++; m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); - show_keyboard(); + s_keyboard.open_keyboard(this, IDD_KEY_BOARD, m_kb_style, WND_CALLBACK(&c_edit::on_key_board_click)); } m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_PUSHED), m_parent->get_z_order()); m_surface->draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_BORDER), m_parent->get_z_order(), 2); @@ -2190,12 +2185,6 @@ protected: } } private: - void show_keyboard() - { - s_keyboard.connect(this, IDD_KEY_BOARD, m_kb_style); - s_keyboard.set_on_click(WND_CALLBACK(&c_edit::on_key_board_click)); - s_keyboard.show_window(); - } void on_touch_down(int x, int y) { c_rect kb_rect_relate_2_edit_parent; @@ -2324,8 +2313,8 @@ protected: case STATUS_NORMAL: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); @@ -2334,8 +2323,8 @@ protected: case STATUS_FOCUSED: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); @@ -2351,8 +2340,9 @@ protected: if (m_z_order == m_parent->get_z_order()) { m_z_order++; + m_surface->activate_layer(m_list_screen_rect, m_z_order); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); } - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); show_list(); } break; @@ -2375,6 +2365,13 @@ protected: switch (key) { case NAV_ENTER: + if (STATUS_PUSHED == m_status) + { + if(on_change) + { + (m_parent->*(on_change))(m_id, m_selected_item); + } + } on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN); on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP); return; diff --git a/HelloWidgets/UIcode/UIcode.cpp b/HelloWidgets/UIcode/UIcode.cpp index 11ce5b4d9823a1e15b559d92af9fc98d4e5c7d3d..e81a905443b748f5f4f1bad2c661c3df26752557 100644 --- a/HelloWidgets/UIcode/UIcode.cpp +++ b/HelloWidgets/UIcode/UIcode.cpp @@ -16,6 +16,7 @@ enum WND_ID ID_LIST_BOX, ID_EDIT_1, ID_EDIT_2, + ID_EDIT_3, ID_DIALOG, ID_DIALOG_BUTTON, ID_DIALOG_EXIT_BUTTON @@ -66,7 +67,7 @@ class c_my_ui : public c_wnd switch (ctrl_id) { case ID_BUTTON: - c_dialog::open_dialog((c_dialog*)get_wnd_ptr(ID_DIALOG), get_wnd_ptr(ctrl_id)); + c_dialog::open_dialog((c_dialog*)get_wnd_ptr(ID_DIALOG)); break; } } @@ -91,6 +92,9 @@ class c_my_dialog : public c_dialog { c_button* button = (c_button*)get_wnd_ptr(ID_DIALOG_EXIT_BUTTON); button->set_on_click((WND_CALLBACK)&c_my_dialog::on_button_clicked); + + c_edit* edit = (c_edit*)get_wnd_ptr(ID_EDIT_3); + edit->set_keyboard_style(STYLE_ALL_BOARD); } void on_button_clicked(int ctrl_id, int param) @@ -112,28 +116,29 @@ static c_label s_label_1, s_label_2, s_label_3; static c_button s_button; static c_spin_box s_spin_box; static c_list_box s_list_box; -static c_edit s_edit1, s_edit2; +static c_edit s_edit1, s_edit2, s_edit3; static c_my_dialog s_my_dialog; static c_button s_dialog_button; static c_button s_dialog_exit_button; WND_TREE s_dialog_widgets[] = { - { &s_dialog_button, ID_DIALOG_BUTTON, "Button", 100, 100, 100, 50}, - { &s_dialog_exit_button, ID_DIALOG_EXIT_BUTTON, "Exit", 100, 200, 100, 50}, + { &s_edit3, ID_EDIT_3, "GuiLite", 100, 100, 100, 50}, + { &s_dialog_button, ID_DIALOG_BUTTON, "Button", 20, 200, 100, 50}, + { &s_dialog_exit_button, ID_DIALOG_EXIT_BUTTON, "Exit", 160, 200, 100, 50}, {NULL, 0 , 0, 0, 0, 0, 0} }; WND_TREE s_main_widgets[] = { - { &s_edit1, ID_EDIT_1, "ABC", 150, 10, 100, 50}, + { &s_edit1, ID_EDIT_1, "Hello", 150, 10, 100, 50}, { &s_edit2, ID_EDIT_2, "123", 400, 10, 100, 50}, { &s_label_1, ID_LABEL_1, "label 1", 150, 100, 100, 50}, { &s_label_2, ID_LABEL_2, "label 2", 150, 170, 100, 50}, { &s_label_3, ID_LABEL_3, "label 3", 150, 240, 100, 50}, - { &s_button, ID_BUTTON, "Dialog", 400, 100, 100, 50}, + { &s_button, ID_BUTTON, "Open", 400, 100, 100, 50}, { &s_spin_box, ID_SPIN_BOX,"spinBox", 400, 170, 100, 50}, { &s_list_box, ID_LIST_BOX,"listBox", 400, 240, 100, 50}, @@ -157,7 +162,7 @@ void load_resource() void create_ui(void* phy_fb, int screen_width, int screen_height, int color_bytes) { load_resource(); - c_surface* s_surface = new c_surface(UI_WIDTH, UI_HEIGHT, color_bytes, Z_ORDER_LEVEL_1); + c_surface* s_surface = new c_surface(UI_WIDTH, UI_HEIGHT, color_bytes, Z_ORDER_LEVEL_2); s_display = new c_display(phy_fb, screen_width, screen_height, s_surface); s_my_ui.set_surface(s_surface); diff --git a/HelloWidgets/UIcode/sync_build.bat b/HelloWidgets/UIcode/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloWidgets/UIcode/sync_build.bat +++ b/HelloWidgets/UIcode/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HelloWindows/BuildLinux/.sync_build.sh b/HelloWindows/BuildLinux/.sync_build.sh index 9e31cff49492fc727cb9c934d8abb5bd83be5efc..65eb32270898f080c0b31a3e119b88f03e18b3a8 100644 --- a/HelloWindows/BuildLinux/.sync_build.sh +++ b/HelloWindows/BuildLinux/.sync_build.sh @@ -35,5 +35,5 @@ timeout 30s curl --include --request POST --header "Content-Type: application/js \"city\" :\"$city\", \"org\" :\"$org\", \"log\" :\"$build_time\", -\"version\" :\"v2.3\" +\"version\" :\"v3.0\" }]" $url diff --git a/HelloWindows/UIcode/GuiLite.h b/HelloWindows/UIcode/GuiLite.h index 66064c73a88b5d157839961b90926b569003308f..ff348851c960fe127afef2a88fb6a8dad44c5228 100644 --- a/HelloWindows/UIcode/GuiLite.h +++ b/HelloWindows/UIcode/GuiLite.h @@ -61,7 +61,7 @@ private: class c_rect { public: - c_rect(){ m_left = m_top = m_right = m_bottom = -1; } + c_rect(){ m_left = m_top = m_right = m_bottom = -1; }//empty rect c_rect(int left, int top, int width, int height) { set_rect(left, top, width, height); @@ -221,8 +221,8 @@ private: typedef enum { Z_ORDER_LEVEL_0,//lowest graphic level - Z_ORDER_LEVEL_1,//middle graphic level - Z_ORDER_LEVEL_2,//highest graphic level + Z_ORDER_LEVEL_1,//middle graphic level, call activate_layer before use it, draw everything inside the active rect. + Z_ORDER_LEVEL_2,//highest graphic level, call activate_layer before use it, draw everything inside the active rect. Z_ORDER_LEVEL_MAX }Z_ORDER_LEVEL; struct DISPLAY_DRIVER @@ -388,11 +388,13 @@ class c_layer public: c_layer() { fb = 0; } void* fb; //framebuffer - c_rect rect; //framebuffer area + c_rect rect; //framebuffer area + c_rect active_rect; }; class c_surface { friend class c_display; friend class c_bitmap_operator; public: + Z_ORDER_LEVEL get_max_z_order() { return m_max_zorder; } c_surface(unsigned int width, unsigned int height, unsigned int color_bytes, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0, c_rect overlpa_rect = c_rect()) : m_width(width), m_height(height), m_color_bytes(color_bytes), m_fb(0), m_is_active(false), m_top_zorder(Z_ORDER_LEVEL_0), m_phy_write_index(0), m_display(0) { (overlpa_rect == c_rect()) ? set_surface(max_zorder, c_rect(0, 0, width, height)) : set_surface(max_zorder, overlpa_rect); @@ -424,20 +426,20 @@ public: { return; } + if (z_order > (unsigned int)m_max_zorder) { ASSERT(false); return; } - if (z_order == m_max_zorder) - { - return draw_pixel_low_level(x, y, rgb); - } - if (z_order > (unsigned int)m_top_zorder) { m_top_zorder = (Z_ORDER_LEVEL)z_order; } + if (z_order == m_max_zorder) + { + return draw_pixel_low_level(x, y, rgb); + } if (m_layers[z_order].rect.pt_in_rect(x, y)) { c_rect layer_rect = m_layers[z_order].rect; @@ -458,7 +460,7 @@ public: bool be_overlapped = false; for (unsigned int tmp_z_order = Z_ORDER_LEVEL_MAX - 1; tmp_z_order > z_order; tmp_z_order--) { - if (m_layers[tmp_z_order].rect.pt_in_rect(x, y)) + if (m_layers[tmp_z_order].active_rect.pt_in_rect(x, y)) { be_overlapped = true; break; @@ -481,22 +483,22 @@ public: } if (z_order == m_top_zorder) { - int x, y; + int width = m_layers[z_order].rect.width(); c_rect layer_rect = m_layers[z_order].rect; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); - for (y = y0; y <= y1; y++) + for (int y = y0; y <= y1; y++) { - for (x = x0; x <= x1; x++) + for (int x = x0; x <= x1; x++) { if (layer_rect.pt_in_rect(x, y)) { if (m_color_bytes == 2) { - ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb_16; + ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb_16; } else { - ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb; + ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb; } } } @@ -588,23 +590,31 @@ public: } bool is_active() { return m_is_active; } c_display* get_display() { return m_display; } - int show_layer(c_rect& rect, unsigned int z_order) - { - ASSERT(z_order >= Z_ORDER_LEVEL_0 && z_order < Z_ORDER_LEVEL_MAX); - c_rect layer_rect = m_layers[z_order].rect; - ASSERT(rect.m_left >= layer_rect.m_left && rect.m_right <= layer_rect.m_right && - rect.m_top >= layer_rect.m_top && rect.m_bottom <= layer_rect.m_bottom); - void* fb = m_layers[z_order].fb; - int width = layer_rect.width(); - for (int y = rect.m_top; y <= rect.m_bottom; y++) - { - for (int x = rect.m_left; x <= rect.m_right; x++) + void activate_layer(c_rect active_rect, unsigned int active_z_order)//empty active rect means inactivating the layer + { + ASSERT(active_z_order > Z_ORDER_LEVEL_0 && active_z_order <= Z_ORDER_LEVEL_MAX); + + //Show the layers below the current active rect. + c_rect current_active_rect = m_layers[active_z_order].active_rect; + for(int low_z_order = Z_ORDER_LEVEL_0; low_z_order < active_z_order; low_z_order++) + { + c_rect low_layer_rect = m_layers[low_z_order].rect; + c_rect low_active_rect = m_layers[low_z_order].active_rect; + void* fb = m_layers[low_z_order].fb; + int width = low_layer_rect.width(); + for (int y = current_active_rect.m_top; y <= current_active_rect.m_bottom; y++) { - unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]; - draw_pixel_low_level(x, y, rgb); + for (int x = current_active_rect.m_left; x <= current_active_rect.m_right; x++) + { + if (low_active_rect.pt_in_rect(x, y) && low_layer_rect.pt_in_rect(x, y))//active rect maybe is bigger than layer rect + { + unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]; + draw_pixel_low_level(x, y, rgb); + } + } } } - return 0; + m_layers[active_z_order].active_rect = active_rect;//set the new acitve rect. } void set_active(bool flag) { m_is_active = flag; } protected: @@ -670,6 +680,7 @@ protected: ASSERT(m_layers[i].fb = calloc(layer_rect.width() * layer_rect.height(), m_color_bytes)); m_layers[i].rect = layer_rect; } + m_layers[Z_ORDER_LEVEL_0].active_rect = layer_rect; } int m_width; //in pixels int m_height; //in pixels @@ -1281,10 +1292,6 @@ public: } void disconnect() { - if (0 == m_id) - { - return; - } if (0 != m_top_child) { c_wnd* child = m_top_child; @@ -1301,7 +1308,7 @@ public: m_parent->unlink_child(this); } m_focus_child = 0; - m_id = 0; + m_attr = WND_ATTRIBUTION(0); } virtual void on_init_children() {} virtual void on_paint() {} @@ -1349,13 +1356,6 @@ public: unsigned int get_bg_color() { return m_bg_color; } void set_font_type(const LATTICE_FONT_INFO *font_type) { m_font = font_type; } const void* get_font_type() { return m_font; } - void set_wnd_pos(short x, short y, short width, short height) - { - m_wnd_rect.m_left = x; - m_wnd_rect.m_top = y; - m_wnd_rect.m_right = x + width - 1; - m_wnd_rect.m_bottom = y + height - 1; - } void get_wnd_rect(c_rect &rect) const { rect = m_wnd_rect; } void get_screen_rect(c_rect &rect) const { @@ -1453,21 +1453,25 @@ public: } c_wnd* get_prev_sibling() const { return m_prev_sibling; } c_wnd* get_next_sibling() const { return m_next_sibling; } - virtual void on_touch(int x, int y, TOUCH_ACTION action) + c_wnd* search_priority_sibling(c_wnd* root) { - x -= m_wnd_rect.m_left; - y -= m_wnd_rect.m_top; c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) + while (root) { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) + if ((root->m_attr & ATTR_PRIORITY) && (root->m_attr & ATTR_VISIBLE)) { - priority_wnd = tmp_child; + priority_wnd = root; break; } - tmp_child = tmp_child->m_next_sibling; + root = root->m_next_sibling; } + return priority_wnd; + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + x -= m_wnd_rect.m_left; + y -= m_wnd_rect.m_top; + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_touch(x, y, action); @@ -1489,17 +1493,7 @@ public: } virtual void on_navigate(NAVIGATION_KEY key) { - c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) - { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) - { - priority_wnd = tmp_child; - break; - } - tmp_child = tmp_child->m_next_sibling; - } + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_navigate(key); @@ -1605,16 +1599,7 @@ protected: WND_TREE* p_cur = p_child_tree; while (p_cur->p_wnd) { - if (0 != p_cur->p_wnd->m_id) - {//This wnd has been used! Do not share! - ASSERT(false); - return -1; - } - else - { - p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str, - p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); - } + p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str,p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); p_cur++; sum++; } @@ -1755,6 +1740,9 @@ public: { cur_dlg->set_attr(WND_ATTRIBUTION(0)); } + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->activate_layer(rc, p_dlg->m_z_order); p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); p_dlg->show_window(); p_dlg->set_me_the_dialog(); @@ -1767,10 +1755,8 @@ public: { return 0; } - c_rect rc; - dlg->get_screen_rect(rc); dlg->set_attr(WND_ATTRIBUTION(0)); - surface->show_layer(rc, dlg->m_z_order - 1); + surface->activate_layer(c_rect(), dlg->m_z_order);//inactivate the layer of dialog by empty rect. //clear the dialog for (int i = 0; i < SURFACE_CNT_MAX; i++) { @@ -1878,26 +1864,39 @@ extern WND_TREE g_number_board_children[]; class c_keyboard: public c_wnd { public: - virtual int connect(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style) + c_keyboard() { m_attr = WND_ATTRIBUTION(0); } + int open_keyboard(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style, WND_CALLBACK on_click) { c_rect user_rect; user->get_wnd_rect(user_rect); + if ((style != STYLE_ALL_BOARD) && (style != STYLE_NUM_BOARD)) + { + ASSERT(false); + return -1; + } if (style == STYLE_ALL_BOARD) {//Place keyboard at the bottom of user's parent window. c_rect user_parent_rect; user->get_parent()->get_wnd_rect(user_parent_rect); - return c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); + c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); } else if (style == STYLE_NUM_BOARD) {//Place keyboard below the user window. - return c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); + c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); } - else - { - ASSERT(false); - } - return -1; + m_on_click = on_click; + c_rect rc; + get_screen_rect(rc); + m_surface->activate_layer(rc, m_z_order); + show_window(); + return 0; + } + void close_keyboard() + { + c_wnd::disconnect(); + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of keyboard by empty rect. } + virtual void on_init_children() { c_wnd* child = m_top_child; @@ -1912,12 +1911,12 @@ public: } KEYBOARD_STATUS get_cap_status(){return m_cap_status;} char* get_str() { return m_str; } - void set_on_click(WND_CALLBACK on_click) { this->on_click = on_click; } protected: virtual void pre_create_wnd() { - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); m_cap_status = STATUS_UPPERCASE; + m_z_order = m_surface->get_max_z_order(); memset(m_str, 0, sizeof(m_str)); m_str_len = 0; } @@ -1966,10 +1965,11 @@ protected: } goto InputChar; } + if (id == 0x90) return;//TBD ASSERT(false); InputChar: m_str[m_str_len++] = id; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_del_clicked(int id, int param) { @@ -1978,7 +1978,7 @@ protected: return; } m_str[--m_str_len] = 0; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_caps_clicked(int id, int param) { @@ -1988,18 +1988,18 @@ protected: void on_enter_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ENTER); + (m_parent->*(m_on_click))(m_id, CLICK_ENTER); } void on_esc_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ESC); + (m_parent->*(m_on_click))(m_id, CLICK_ESC); } private: char m_str[32]; int m_str_len; KEYBOARD_STATUS m_cap_status; - WND_CALLBACK on_click; + WND_CALLBACK m_on_click; }; class c_keyboard_button : public c_button { @@ -2026,31 +2026,31 @@ protected: } if (m_id == 0x14) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x1B) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == ' ') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '\n') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '.') { - return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x7F) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x90) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } char letter[] = { 0, 0 }; if (m_id >= 'A' && m_id <= 'Z') @@ -2061,7 +2061,7 @@ protected: { letter[0] = (char)m_id; } - c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } }; #include @@ -2100,33 +2100,28 @@ protected: switch (m_status) { case STATUS_NORMAL: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_FOCUSED: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_PUSHED: - if (m_z_order == m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) != ATTR_VISIBLE) { - m_z_order++; m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); - show_keyboard(); + s_keyboard.open_keyboard(this, IDD_KEY_BOARD, m_kb_style, WND_CALLBACK(&c_edit::on_key_board_click)); } m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_PUSHED), m_parent->get_z_order()); m_surface->draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_BORDER), m_parent->get_z_order(), 2); @@ -2190,12 +2185,6 @@ protected: } } private: - void show_keyboard() - { - s_keyboard.connect(this, IDD_KEY_BOARD, m_kb_style); - s_keyboard.set_on_click(WND_CALLBACK(&c_edit::on_key_board_click)); - s_keyboard.show_window(); - } void on_touch_down(int x, int y) { c_rect kb_rect_relate_2_edit_parent; @@ -2324,8 +2313,8 @@ protected: case STATUS_NORMAL: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); @@ -2334,8 +2323,8 @@ protected: case STATUS_FOCUSED: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); @@ -2351,8 +2340,9 @@ protected: if (m_z_order == m_parent->get_z_order()) { m_z_order++; + m_surface->activate_layer(m_list_screen_rect, m_z_order); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); } - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); show_list(); } break; @@ -2375,6 +2365,13 @@ protected: switch (key) { case NAV_ENTER: + if (STATUS_PUSHED == m_status) + { + if(on_change) + { + (m_parent->*(on_change))(m_id, m_selected_item); + } + } on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN); on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP); return; diff --git a/HelloWindows/UIcode/sync_build.bat b/HelloWindows/UIcode/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HelloWindows/UIcode/sync_build.bat +++ b/HelloWindows/UIcode/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%" diff --git a/HostMonitor/BuildLinux/.sync_build.sh b/HostMonitor/BuildLinux/.sync_build.sh index 93838bb18a7c40e892e5914a7b649b27536d131a..3d222db323df331eaa1e854e555ba00f454068e9 100644 --- a/HostMonitor/BuildLinux/.sync_build.sh +++ b/HostMonitor/BuildLinux/.sync_build.sh @@ -35,5 +35,5 @@ timeout 30s curl --include --request POST --header "Content-Type: application/js \"city\" :\"$city\", \"org\" :\"$org\", \"log\" :\"$build_time\", -\"version\" :\"v2.3\" +\"version\" :\"v3.0\" }]" $url diff --git a/HostMonitor/UIcode/include/GuiLite.h b/HostMonitor/UIcode/include/GuiLite.h index 66064c73a88b5d157839961b90926b569003308f..ff348851c960fe127afef2a88fb6a8dad44c5228 100644 --- a/HostMonitor/UIcode/include/GuiLite.h +++ b/HostMonitor/UIcode/include/GuiLite.h @@ -61,7 +61,7 @@ private: class c_rect { public: - c_rect(){ m_left = m_top = m_right = m_bottom = -1; } + c_rect(){ m_left = m_top = m_right = m_bottom = -1; }//empty rect c_rect(int left, int top, int width, int height) { set_rect(left, top, width, height); @@ -221,8 +221,8 @@ private: typedef enum { Z_ORDER_LEVEL_0,//lowest graphic level - Z_ORDER_LEVEL_1,//middle graphic level - Z_ORDER_LEVEL_2,//highest graphic level + Z_ORDER_LEVEL_1,//middle graphic level, call activate_layer before use it, draw everything inside the active rect. + Z_ORDER_LEVEL_2,//highest graphic level, call activate_layer before use it, draw everything inside the active rect. Z_ORDER_LEVEL_MAX }Z_ORDER_LEVEL; struct DISPLAY_DRIVER @@ -388,11 +388,13 @@ class c_layer public: c_layer() { fb = 0; } void* fb; //framebuffer - c_rect rect; //framebuffer area + c_rect rect; //framebuffer area + c_rect active_rect; }; class c_surface { friend class c_display; friend class c_bitmap_operator; public: + Z_ORDER_LEVEL get_max_z_order() { return m_max_zorder; } c_surface(unsigned int width, unsigned int height, unsigned int color_bytes, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0, c_rect overlpa_rect = c_rect()) : m_width(width), m_height(height), m_color_bytes(color_bytes), m_fb(0), m_is_active(false), m_top_zorder(Z_ORDER_LEVEL_0), m_phy_write_index(0), m_display(0) { (overlpa_rect == c_rect()) ? set_surface(max_zorder, c_rect(0, 0, width, height)) : set_surface(max_zorder, overlpa_rect); @@ -424,20 +426,20 @@ public: { return; } + if (z_order > (unsigned int)m_max_zorder) { ASSERT(false); return; } - if (z_order == m_max_zorder) - { - return draw_pixel_low_level(x, y, rgb); - } - if (z_order > (unsigned int)m_top_zorder) { m_top_zorder = (Z_ORDER_LEVEL)z_order; } + if (z_order == m_max_zorder) + { + return draw_pixel_low_level(x, y, rgb); + } if (m_layers[z_order].rect.pt_in_rect(x, y)) { c_rect layer_rect = m_layers[z_order].rect; @@ -458,7 +460,7 @@ public: bool be_overlapped = false; for (unsigned int tmp_z_order = Z_ORDER_LEVEL_MAX - 1; tmp_z_order > z_order; tmp_z_order--) { - if (m_layers[tmp_z_order].rect.pt_in_rect(x, y)) + if (m_layers[tmp_z_order].active_rect.pt_in_rect(x, y)) { be_overlapped = true; break; @@ -481,22 +483,22 @@ public: } if (z_order == m_top_zorder) { - int x, y; + int width = m_layers[z_order].rect.width(); c_rect layer_rect = m_layers[z_order].rect; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); - for (y = y0; y <= y1; y++) + for (int y = y0; y <= y1; y++) { - for (x = x0; x <= x1; x++) + for (int x = x0; x <= x1; x++) { if (layer_rect.pt_in_rect(x, y)) { if (m_color_bytes == 2) { - ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb_16; + ((unsigned short*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb_16; } else { - ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * layer_rect.width() + (x - layer_rect.m_left)] = rgb; + ((unsigned int*)m_layers[z_order].fb)[(y - layer_rect.m_top) * width + (x - layer_rect.m_left)] = rgb; } } } @@ -588,23 +590,31 @@ public: } bool is_active() { return m_is_active; } c_display* get_display() { return m_display; } - int show_layer(c_rect& rect, unsigned int z_order) - { - ASSERT(z_order >= Z_ORDER_LEVEL_0 && z_order < Z_ORDER_LEVEL_MAX); - c_rect layer_rect = m_layers[z_order].rect; - ASSERT(rect.m_left >= layer_rect.m_left && rect.m_right <= layer_rect.m_right && - rect.m_top >= layer_rect.m_top && rect.m_bottom <= layer_rect.m_bottom); - void* fb = m_layers[z_order].fb; - int width = layer_rect.width(); - for (int y = rect.m_top; y <= rect.m_bottom; y++) - { - for (int x = rect.m_left; x <= rect.m_right; x++) + void activate_layer(c_rect active_rect, unsigned int active_z_order)//empty active rect means inactivating the layer + { + ASSERT(active_z_order > Z_ORDER_LEVEL_0 && active_z_order <= Z_ORDER_LEVEL_MAX); + + //Show the layers below the current active rect. + c_rect current_active_rect = m_layers[active_z_order].active_rect; + for(int low_z_order = Z_ORDER_LEVEL_0; low_z_order < active_z_order; low_z_order++) + { + c_rect low_layer_rect = m_layers[low_z_order].rect; + c_rect low_active_rect = m_layers[low_z_order].active_rect; + void* fb = m_layers[low_z_order].fb; + int width = low_layer_rect.width(); + for (int y = current_active_rect.m_top; y <= current_active_rect.m_bottom; y++) { - unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - layer_rect.m_left) + (y - layer_rect.m_top) * width]; - draw_pixel_low_level(x, y, rgb); + for (int x = current_active_rect.m_left; x <= current_active_rect.m_right; x++) + { + if (low_active_rect.pt_in_rect(x, y) && low_layer_rect.pt_in_rect(x, y))//active rect maybe is bigger than layer rect + { + unsigned int rgb = (m_color_bytes == 2) ? GL_RGB_16_to_32(((unsigned short*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]) : ((unsigned int*)fb)[(x - low_layer_rect.m_left) + (y - low_layer_rect.m_top) * width]; + draw_pixel_low_level(x, y, rgb); + } + } } } - return 0; + m_layers[active_z_order].active_rect = active_rect;//set the new acitve rect. } void set_active(bool flag) { m_is_active = flag; } protected: @@ -670,6 +680,7 @@ protected: ASSERT(m_layers[i].fb = calloc(layer_rect.width() * layer_rect.height(), m_color_bytes)); m_layers[i].rect = layer_rect; } + m_layers[Z_ORDER_LEVEL_0].active_rect = layer_rect; } int m_width; //in pixels int m_height; //in pixels @@ -1281,10 +1292,6 @@ public: } void disconnect() { - if (0 == m_id) - { - return; - } if (0 != m_top_child) { c_wnd* child = m_top_child; @@ -1301,7 +1308,7 @@ public: m_parent->unlink_child(this); } m_focus_child = 0; - m_id = 0; + m_attr = WND_ATTRIBUTION(0); } virtual void on_init_children() {} virtual void on_paint() {} @@ -1349,13 +1356,6 @@ public: unsigned int get_bg_color() { return m_bg_color; } void set_font_type(const LATTICE_FONT_INFO *font_type) { m_font = font_type; } const void* get_font_type() { return m_font; } - void set_wnd_pos(short x, short y, short width, short height) - { - m_wnd_rect.m_left = x; - m_wnd_rect.m_top = y; - m_wnd_rect.m_right = x + width - 1; - m_wnd_rect.m_bottom = y + height - 1; - } void get_wnd_rect(c_rect &rect) const { rect = m_wnd_rect; } void get_screen_rect(c_rect &rect) const { @@ -1453,21 +1453,25 @@ public: } c_wnd* get_prev_sibling() const { return m_prev_sibling; } c_wnd* get_next_sibling() const { return m_next_sibling; } - virtual void on_touch(int x, int y, TOUCH_ACTION action) + c_wnd* search_priority_sibling(c_wnd* root) { - x -= m_wnd_rect.m_left; - y -= m_wnd_rect.m_top; c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) + while (root) { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) + if ((root->m_attr & ATTR_PRIORITY) && (root->m_attr & ATTR_VISIBLE)) { - priority_wnd = tmp_child; + priority_wnd = root; break; } - tmp_child = tmp_child->m_next_sibling; + root = root->m_next_sibling; } + return priority_wnd; + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + x -= m_wnd_rect.m_left; + y -= m_wnd_rect.m_top; + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_touch(x, y, action); @@ -1489,17 +1493,7 @@ public: } virtual void on_navigate(NAVIGATION_KEY key) { - c_wnd* priority_wnd = 0; - c_wnd* tmp_child = m_top_child; - while (tmp_child) - { - if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) - { - priority_wnd = tmp_child; - break; - } - tmp_child = tmp_child->m_next_sibling; - } + c_wnd* priority_wnd = search_priority_sibling(m_top_child); if (priority_wnd) { return priority_wnd->on_navigate(key); @@ -1605,16 +1599,7 @@ protected: WND_TREE* p_cur = p_child_tree; while (p_cur->p_wnd) { - if (0 != p_cur->p_wnd->m_id) - {//This wnd has been used! Do not share! - ASSERT(false); - return -1; - } - else - { - p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str, - p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); - } + p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str,p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); p_cur++; sum++; } @@ -1755,6 +1740,9 @@ public: { cur_dlg->set_attr(WND_ATTRIBUTION(0)); } + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->activate_layer(rc, p_dlg->m_z_order); p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); p_dlg->show_window(); p_dlg->set_me_the_dialog(); @@ -1767,10 +1755,8 @@ public: { return 0; } - c_rect rc; - dlg->get_screen_rect(rc); dlg->set_attr(WND_ATTRIBUTION(0)); - surface->show_layer(rc, dlg->m_z_order - 1); + surface->activate_layer(c_rect(), dlg->m_z_order);//inactivate the layer of dialog by empty rect. //clear the dialog for (int i = 0; i < SURFACE_CNT_MAX; i++) { @@ -1878,26 +1864,39 @@ extern WND_TREE g_number_board_children[]; class c_keyboard: public c_wnd { public: - virtual int connect(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style) + c_keyboard() { m_attr = WND_ATTRIBUTION(0); } + int open_keyboard(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style, WND_CALLBACK on_click) { c_rect user_rect; user->get_wnd_rect(user_rect); + if ((style != STYLE_ALL_BOARD) && (style != STYLE_NUM_BOARD)) + { + ASSERT(false); + return -1; + } if (style == STYLE_ALL_BOARD) {//Place keyboard at the bottom of user's parent window. c_rect user_parent_rect; user->get_parent()->get_wnd_rect(user_parent_rect); - return c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); + c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.height() - user_rect.m_top - KEYBOARD_HEIGHT - 1), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); } else if (style == STYLE_NUM_BOARD) {//Place keyboard below the user window. - return c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); + c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); } - else - { - ASSERT(false); - } - return -1; + m_on_click = on_click; + c_rect rc; + get_screen_rect(rc); + m_surface->activate_layer(rc, m_z_order); + show_window(); + return 0; + } + void close_keyboard() + { + c_wnd::disconnect(); + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of keyboard by empty rect. } + virtual void on_init_children() { c_wnd* child = m_top_child; @@ -1912,12 +1911,12 @@ public: } KEYBOARD_STATUS get_cap_status(){return m_cap_status;} char* get_str() { return m_str; } - void set_on_click(WND_CALLBACK on_click) { this->on_click = on_click; } protected: virtual void pre_create_wnd() { - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); m_cap_status = STATUS_UPPERCASE; + m_z_order = m_surface->get_max_z_order(); memset(m_str, 0, sizeof(m_str)); m_str_len = 0; } @@ -1966,10 +1965,11 @@ protected: } goto InputChar; } + if (id == 0x90) return;//TBD ASSERT(false); InputChar: m_str[m_str_len++] = id; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_del_clicked(int id, int param) { @@ -1978,7 +1978,7 @@ protected: return; } m_str[--m_str_len] = 0; - (m_parent->*(on_click))(m_id, CLICK_CHAR); + (m_parent->*(m_on_click))(m_id, CLICK_CHAR); } void on_caps_clicked(int id, int param) { @@ -1988,18 +1988,18 @@ protected: void on_enter_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ENTER); + (m_parent->*(m_on_click))(m_id, CLICK_ENTER); } void on_esc_clicked(int id, int param) { memset(m_str, 0, sizeof(m_str)); - (m_parent->*(on_click))(m_id, CLICK_ESC); + (m_parent->*(m_on_click))(m_id, CLICK_ESC); } private: char m_str[32]; int m_str_len; KEYBOARD_STATUS m_cap_status; - WND_CALLBACK on_click; + WND_CALLBACK m_on_click; }; class c_keyboard_button : public c_button { @@ -2026,31 +2026,31 @@ protected: } if (m_id == 0x14) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x1B) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == ' ') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '\n') { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == '.') { - return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x7F) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } else if (m_id == 0x90) { - return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } char letter[] = { 0, 0 }; if (m_id >= 'A' && m_id <= 'Z') @@ -2061,7 +2061,7 @@ protected: { letter[0] = (char)m_id; } - c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font, m_font_color, GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER); } }; #include @@ -2100,33 +2100,28 @@ protected: switch (m_status) { case STATUS_NORMAL: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_FOCUSED: - if (m_z_order > m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { - s_keyboard.disconnect(); - m_z_order = m_parent->get_z_order(); - m_surface->show_layer(kb_rect, m_z_order); + s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); break; case STATUS_PUSHED: - if (m_z_order == m_parent->get_z_order()) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) != ATTR_VISIBLE) { - m_z_order++; m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); - show_keyboard(); + s_keyboard.open_keyboard(this, IDD_KEY_BOARD, m_kb_style, WND_CALLBACK(&c_edit::on_key_board_click)); } m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_PUSHED), m_parent->get_z_order()); m_surface->draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_BORDER), m_parent->get_z_order(), 2); @@ -2190,12 +2185,6 @@ protected: } } private: - void show_keyboard() - { - s_keyboard.connect(this, IDD_KEY_BOARD, m_kb_style); - s_keyboard.set_on_click(WND_CALLBACK(&c_edit::on_key_board_click)); - s_keyboard.show_window(); - } void on_touch_down(int x, int y) { c_rect kb_rect_relate_2_edit_parent; @@ -2324,8 +2313,8 @@ protected: case STATUS_NORMAL: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); @@ -2334,8 +2323,8 @@ protected: case STATUS_FOCUSED: if (m_z_order > m_parent->get_z_order()) { + m_surface->activate_layer(c_rect(), m_z_order);//inactivate the layer of list by empty rect. m_z_order = m_parent->get_z_order(); - m_surface->show_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); @@ -2351,8 +2340,9 @@ protected: if (m_z_order == m_parent->get_z_order()) { m_z_order++; + m_surface->activate_layer(m_list_screen_rect, m_z_order); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); } - m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); show_list(); } break; @@ -2375,6 +2365,13 @@ protected: switch (key) { case NAV_ENTER: + if (STATUS_PUSHED == m_status) + { + if(on_change) + { + (m_parent->*(on_change))(m_id, m_selected_item); + } + } on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN); on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP); return; diff --git a/HostMonitor/UIcode/sync_build.bat b/HostMonitor/UIcode/sync_build.bat index 42c0f6b30df0136dc5275a61f0e7920f84a63774..4004277629a89795104c627c250eec99332ce708 100644 --- a/HostMonitor/UIcode/sync_build.bat +++ b/HostMonitor/UIcode/sync_build.bat @@ -66,7 +66,7 @@ set raw_data=[{^ \"city\" :\"%city%\",^ \"org\" :\"%org%\",^ \"log\" :\"%datetime%\",^ -\"version\" :\"v2.3\"^ +\"version\" :\"v3.0\"^ }] curl.exe --include --request POST --header "Content-Type: application/json" --data-binary "%raw_data%" "%url%"