diff --git a/GuiLite.h b/GuiLite.h index 38adf92..027ec72 100644 --- a/GuiLite.h +++ b/GuiLite.h @@ -388,7 +388,8 @@ 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; @@ -430,16 +431,15 @@ public: 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 (m_layers[z_order].rect.pt_in_rect(x, y)) + if (z_order == m_max_zorder) + { + return draw_pixel_low_level(x, y, rgb); + } + if (m_layers[z_order].active_rect.pt_in_rect(x, y)) { c_rect layer_rect = m_layers[z_order].rect; if (m_color_bytes == 2) @@ -459,7 +459,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; @@ -483,7 +483,7 @@ public: if (z_order == m_top_zorder) { int x, y; - c_rect layer_rect = m_layers[z_order].rect; + c_rect layer_rect = m_layers[z_order].active_rect; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); for (y = y0; y <= y1; y++) { @@ -589,27 +589,32 @@ public: } bool is_active() { return m_is_active; } c_display* get_display() { return m_display; } - int show_layers_below_target(c_rect& target_rect, unsigned int target_z_order) + void enable_layer(c_rect& target_rect, unsigned int target_z_order) { + m_layers[target_z_order].active_rect = target_rect; + } + void disable_layer(unsigned int target_z_order) + {//show layers below the target layer ASSERT(target_z_order > Z_ORDER_LEVEL_0 && target_z_order <= Z_ORDER_LEVEL_MAX); + c_rect target_rect = m_layers[target_z_order].active_rect; for(int z_order = Z_ORDER_LEVEL_0; z_order < target_z_order; z_order++) { c_rect layer_rect = m_layers[z_order].rect; + c_rect active_rect = m_layers[z_order].active_rect; ASSERT(target_rect.m_left >= layer_rect.m_left && target_rect.m_right <= layer_rect.m_right && target_rect.m_top >= layer_rect.m_top && target_rect.m_bottom <= layer_rect.m_bottom); void* fb = m_layers[z_order].fb; int width = layer_rect.width(); - for (int y = target_rect.m_top; y <= target_rect.m_bottom; y++) + for (int y = target_rect.m_top; (y <= target_rect.m_bottom && y <= active_rect.m_bottom); y++) { - for (int x = target_rect.m_left; x <= target_rect.m_right; x++) + for (int x = target_rect.m_left; (x <= target_rect.m_right && x <= active_rect.m_right); x++) { 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); } } } - - return 0; + m_layers[target_z_order].active_rect = c_rect();//empty active rect } void set_active(bool flag) { m_is_active = flag; } protected: @@ -674,6 +679,10 @@ protected: {//Top layber fb always be 0 ASSERT(m_layers[i].fb = calloc(layer_rect.width() * layer_rect.height(), m_color_bytes)); m_layers[i].rect = layer_rect; + if(i == Z_ORDER_LEVEL_0) + { + m_layers[i].active_rect = layer_rect; + } } } int m_width; //in pixels @@ -1243,7 +1252,7 @@ typedef void (c_wnd::*WND_CALLBACK)(int, int); class c_wnd { public: - c_wnd() : m_status(STATUS_NORMAL), m_attr((WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)), m_parent(0), m_top_child(0), m_prev_sibling(0), m_next_sibling(0), + c_wnd() : m_status(STATUS_NORMAL), m_attr(WND_ATTRIBUTION(0)), m_parent(0), m_top_child(0), m_prev_sibling(0), m_next_sibling(0), m_str(0), m_font_color(0), m_bg_color(0), m_id(0), m_z_order(Z_ORDER_LEVEL_0), m_focus_child(0), m_surface(0) {}; virtual ~c_wnd() {}; virtual int connect(c_wnd *parent, unsigned short resource_id, const char* str, @@ -1285,16 +1294,26 @@ public: return 0; } void disconnect() - {// disconnect from parent wnd. + { if (0 == m_id) { return; } + if (0 != m_top_child) + { + c_wnd* child = m_top_child; + c_wnd* next_child = 0; + while (child) + { + next_child = child->m_next_sibling; + child->disconnect(); + child = next_child; + } + } if (0 != m_parent) { m_parent->unlink_child(this); } - m_focus_child = 0; m_id = 0; m_attr = (WND_ATTRIBUTION)0; @@ -1449,21 +1468,25 @@ public: } c_wnd* get_prev_sibling() const { return m_prev_sibling; } c_wnd* get_next_sibling() const { return m_next_sibling; } + c_wnd* search_priority_sibling(c_wnd* root) + { + c_wnd* priority_wnd = 0; + while (root) + { + if ((root->m_attr & ATTR_PRIORITY) && (root->m_attr & ATTR_VISIBLE)) + { + priority_wnd = root; + break; + } + 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 = 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_touch(x, y, action); @@ -1485,17 +1508,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); @@ -1735,7 +1748,7 @@ typedef struct class c_dialog : public c_wnd { public: - static int open_dialog(c_dialog* p_dlg, bool modal_mode = true) + static int open_dialog(c_dialog* p_dlg) { if (0 == p_dlg) { @@ -1751,7 +1764,10 @@ public: { cur_dlg->set_attr(WND_ATTRIBUTION(0)); } - p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->enable_layer(rc, p_dlg->m_z_order); + p_dlg->set_attr((WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY)); p_dlg->show_window(); p_dlg->set_me_the_dialog(); return 1; @@ -1763,10 +1779,8 @@ public: { return 0; } - c_rect rc; - dlg->get_screen_rect(rc); dlg->set_attr(WND_ATTRIBUTION(0)); - surface->show_layers_below_target(rc, dlg->m_z_order); + surface->disable_layer(dlg->m_z_order); //clear the dialog for (int i = 0; i < SURFACE_CNT_MAX; i++) { @@ -1894,15 +1908,16 @@ public: c_wnd::connect(user, resource_id, 0, 0, user_rect.height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); } m_on_click = on_click; + c_rect rc; + get_screen_rect(rc); + m_surface->enable_layer(rc, m_z_order); show_window(); return 0; } void close_keyboard() { c_wnd::disconnect(); - c_rect rc; - get_screen_rect(rc); - m_surface->show_layers_below_target(rc, m_z_order); + m_surface->disable_layer(m_z_order); } virtual void on_init_children() @@ -2033,31 +2048,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') @@ -2068,7 +2083,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 @@ -2107,7 +2122,7 @@ protected: switch (m_status) { case STATUS_NORMAL: - if (s_keyboard.get_attr()&ATTR_VISIBLE == ATTR_VISIBLE) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); @@ -2116,7 +2131,7 @@ protected: 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 (s_keyboard.get_attr()&ATTR_VISIBLE == ATTR_VISIBLE) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); @@ -2125,8 +2140,9 @@ protected: 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 (s_keyboard.get_attr()&ATTR_VISIBLE != ATTR_VISIBLE) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) != ATTR_VISIBLE) { + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); 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()); @@ -2319,7 +2335,7 @@ protected: case STATUS_NORMAL: if (m_z_order > m_parent->get_z_order()) { - m_surface->show_layers_below_target(m_list_screen_rect, m_z_order); + m_surface->disable_layer(m_z_order); m_z_order = m_parent->get_z_order(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } @@ -2329,7 +2345,7 @@ protected: case STATUS_FOCUSED: if (m_z_order > m_parent->get_z_order()) { - m_surface->show_layers_below_target(m_list_screen_rect, m_z_order); + m_surface->disable_layer(m_z_order); m_z_order = m_parent->get_z_order(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } @@ -2347,6 +2363,7 @@ protected: { m_z_order++; } + m_surface->enable_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); show_list(); } diff --git a/src/core/display.h b/src/core/display.h index 98a20f5..03d66a2 100644 --- a/src/core/display.h +++ b/src/core/display.h @@ -198,7 +198,8 @@ 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 { @@ -239,23 +240,24 @@ 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 (m_layers[z_order].rect.pt_in_rect(x, y)) + if (z_order == m_max_zorder) + { + return draw_pixel_low_level(x, y, rgb); + } + + if (m_layers[z_order].active_rect.pt_in_rect(x, y)) { c_rect layer_rect = m_layers[z_order].rect; if (m_color_bytes == 2) @@ -276,7 +278,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; @@ -304,7 +306,7 @@ public: if (z_order == m_top_zorder) { int x, y; - c_rect layer_rect = m_layers[z_order].rect; + c_rect layer_rect = m_layers[z_order].active_rect; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); for (y = y0; y <= y1; y++) { @@ -425,29 +427,35 @@ public: bool is_active() { return m_is_active; } c_display* get_display() { return m_display; } - int show_layers_below_target(c_rect& target_rect, unsigned int target_z_order) + void enable_layer(c_rect& target_rect, unsigned int target_z_order) { + m_layers[target_z_order].active_rect = target_rect; + } + + void disable_layer(unsigned int target_z_order) + {//show layers below the target layer ASSERT(target_z_order > Z_ORDER_LEVEL_0 && target_z_order <= Z_ORDER_LEVEL_MAX); + c_rect target_rect = m_layers[target_z_order].active_rect; for(int z_order = Z_ORDER_LEVEL_0; z_order < target_z_order; z_order++) { c_rect layer_rect = m_layers[z_order].rect; + c_rect active_rect = m_layers[z_order].active_rect; ASSERT(target_rect.m_left >= layer_rect.m_left && target_rect.m_right <= layer_rect.m_right && target_rect.m_top >= layer_rect.m_top && target_rect.m_bottom <= layer_rect.m_bottom); void* fb = m_layers[z_order].fb; int width = layer_rect.width(); - for (int y = target_rect.m_top; y <= target_rect.m_bottom; y++) + for (int y = target_rect.m_top; (y <= target_rect.m_bottom && y <= active_rect.m_bottom); y++) { - for (int x = target_rect.m_left; x <= target_rect.m_right; x++) + for (int x = target_rect.m_left; (x <= target_rect.m_right && x <= active_rect.m_right); x++) { 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); } } } - - return 0; + m_layers[target_z_order].active_rect = c_rect();//empty active rect } void set_active(bool flag) { m_is_active = flag; } @@ -518,6 +526,10 @@ protected: {//Top layber fb always be 0 ASSERT(m_layers[i].fb = calloc(layer_rect.width() * layer_rect.height(), m_color_bytes)); m_layers[i].rect = layer_rect; + if(i == Z_ORDER_LEVEL_0) + { + m_layers[i].active_rect = layer_rect; + } } } diff --git a/src/core/wnd.h b/src/core/wnd.h index f5e7d32..35802de 100644 --- a/src/core/wnd.h +++ b/src/core/wnd.h @@ -52,7 +52,7 @@ typedef void (c_wnd::*WND_CALLBACK)(int, int); class c_wnd { public: - c_wnd() : m_status(STATUS_NORMAL), m_attr((WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)), m_parent(0), m_top_child(0), m_prev_sibling(0), m_next_sibling(0), + c_wnd() : m_status(STATUS_NORMAL), m_attr(WND_ATTRIBUTION(0)), m_parent(0), m_top_child(0), m_prev_sibling(0), m_next_sibling(0), m_str(0), m_font_color(0), m_bg_color(0), m_id(0), m_z_order(Z_ORDER_LEVEL_0), m_focus_child(0), m_surface(0) {}; virtual ~c_wnd() {}; virtual int connect(c_wnd *parent, unsigned short resource_id, const char* str, @@ -99,22 +99,36 @@ public: } return 0; } + void disconnect() - {// disconnect from parent wnd. + { if (0 == m_id) { return; } + if (0 != m_top_child) + { + c_wnd* child = m_top_child; + c_wnd* next_child = 0; + + while (child) + { + next_child = child->m_next_sibling; + child->disconnect(); + child = next_child; + } + } + if (0 != m_parent) { 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() {} virtual void show_window() @@ -287,22 +301,28 @@ public: c_wnd* get_prev_sibling() const { return m_prev_sibling; } c_wnd* get_next_sibling() const { return m_next_sibling; } + c_wnd* search_priority_sibling(c_wnd* root) + { + c_wnd* priority_wnd = 0; + while (root) + { + if ((root->m_attr & ATTR_PRIORITY) && (root->m_attr & ATTR_VISIBLE)) + { + priority_wnd = root; + break; + } + 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 = 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_touch(x, y, action); @@ -325,17 +345,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); diff --git a/src/widgets/dialog.h b/src/widgets/dialog.h index 845653e..9e6e677 100644 --- a/src/widgets/dialog.h +++ b/src/widgets/dialog.h @@ -19,7 +19,7 @@ typedef struct class c_dialog : public c_wnd { public: - static int open_dialog(c_dialog* p_dlg, bool modal_mode = true) + static int open_dialog(c_dialog* p_dlg) { if (0 == p_dlg) { @@ -37,7 +37,11 @@ public: cur_dlg->set_attr(WND_ATTRIBUTION(0)); } - p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->enable_layer(rc, p_dlg->m_z_order); + + p_dlg->set_attr((WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY)); p_dlg->show_window(); p_dlg->set_me_the_dialog(); return 1; @@ -51,10 +55,9 @@ public: { return 0; } - c_rect rc; - dlg->get_screen_rect(rc); + dlg->set_attr(WND_ATTRIBUTION(0)); - surface->show_layers_below_target(rc, dlg->m_z_order); + surface->disable_layer(dlg->m_z_order); //clear the dialog for (int i = 0; i < SURFACE_CNT_MAX; i++) diff --git a/src/widgets/edit.h b/src/widgets/edit.h index 9746468..55299cf 100644 --- a/src/widgets/edit.h +++ b/src/widgets/edit.h @@ -47,7 +47,7 @@ protected: switch (m_status) { case STATUS_NORMAL: - if (s_keyboard.get_attr()&ATTR_VISIBLE == ATTR_VISIBLE) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); @@ -56,7 +56,7 @@ protected: 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 (s_keyboard.get_attr()&ATTR_VISIBLE == ATTR_VISIBLE) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) == ATTR_VISIBLE) { s_keyboard.close_keyboard(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); @@ -65,8 +65,9 @@ protected: 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 (s_keyboard.get_attr()&ATTR_VISIBLE != ATTR_VISIBLE) + if ((s_keyboard.get_attr()&ATTR_VISIBLE) != ATTR_VISIBLE) { + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); 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()); diff --git a/src/widgets/keyboard.h b/src/widgets/keyboard.h index bc262c9..8108931 100644 --- a/src/widgets/keyboard.h +++ b/src/widgets/keyboard.h @@ -78,6 +78,9 @@ public: } m_on_click = on_click; + c_rect rc; + get_screen_rect(rc); + m_surface->enable_layer(rc, m_z_order); show_window(); return 0; } @@ -85,9 +88,7 @@ public: void close_keyboard() { c_wnd::disconnect(); - c_rect rc; - get_screen_rect(rc); - m_surface->show_layers_below_target(rc, m_z_order); + m_surface->disable_layer(m_z_order); } virtual void on_init_children() @@ -223,31 +224,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 }; @@ -259,6 +260,6 @@ 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); } }; diff --git a/src/widgets/list_box.h b/src/widgets/list_box.h index 47e2eb1..d6a1964 100644 --- a/src/widgets/list_box.h +++ b/src/widgets/list_box.h @@ -65,7 +65,7 @@ protected: case STATUS_NORMAL: if (m_z_order > m_parent->get_z_order()) { - m_surface->show_layers_below_target(m_list_screen_rect, m_z_order); + m_surface->disable_layer(m_z_order); m_z_order = m_parent->get_z_order(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } @@ -75,7 +75,7 @@ protected: case STATUS_FOCUSED: if (m_z_order > m_parent->get_z_order()) { - m_surface->show_layers_below_target(m_list_screen_rect, m_z_order); + m_surface->disable_layer(m_z_order); m_z_order = m_parent->get_z_order(); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); } @@ -93,6 +93,8 @@ protected: { m_z_order++; } + + m_surface->enable_layer(m_list_screen_rect, m_z_order); m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); show_list(); }