diff --git a/demos/demo_desktop.c b/demos/demo_desktop.c
index 7601428ed..d06470bee 100644
--- a/demos/demo_desktop.c
+++ b/demos/demo_desktop.c
@@ -21,6 +21,8 @@
#include "awtk.h"
+static ret_t install_one(void* ctx, const void* iter);
+
static ret_t on_fullscreen(void* ctx, event_t* e) {
widget_t* btn = WIDGET(e->target);
window_t* win = WINDOW(widget_get_window(btn));
@@ -42,18 +44,79 @@ static ret_t on_click_enlarge(void* ctx, event_t* e) {
return RET_OK;
}
-static ret_t on_click_close(void* ctx, event_t* e) {
+static ret_t on_click_win_close(void* ctx, event_t* e) {
tk_quit();
return RET_OK;
}
+static ret_t on_close(void* ctx, event_t* e) {
+ widget_t* win = WIDGET(ctx);
+ if (widget_is_dialog(win)) {
+ dialog_quit(win, DIALOG_QUIT_CANCEL);
+ } else {
+ window_close(win);
+ }
+
+ return RET_OK;
+}
+
+static ret_t on_ok(void* ctx, event_t* e) {
+ widget_t* win = WIDGET(ctx);
+ if (widget_is_dialog(win)) {
+ dialog_quit(win, DIALOG_QUIT_OK);
+ }
+ return RET_OK;
+}
+
+static ret_t on_open_window(void* ctx, event_t* e) {
+ const char* name = (const char*)ctx;
+ widget_t* win = window_open(name);
+ widget_foreach(win, install_one, win);
+ if (tk_str_eq(name, "toast")) {
+ dialog_toast("Hello AWTK!\nThis is a toast(1)!", 4000);
+ } else if (tk_str_eq(name, "info")) {
+ dialog_info("info", "hello awtk");
+ } else if (widget_is_dialog(win)) {
+ dialog_quit_code_t quit_code = dialog_modal(win);
+ switch (quit_code) {
+ case DIALOG_QUIT_OK:
+ log_debug("dialog_quit : DIALOG_QUIT_OK\n");
+ break;
+ case DIALOG_QUIT_CANCEL:
+ log_debug("dialog_quit : DIALOG_QUIT_CANCEL\n");
+ break;
+ default:
+ log_debug("DIALOG_QUIT_NONE\n");
+ break;
+ }
+ }
+ return RET_OK;
+}
+
+static ret_t install_one(void* ctx, const void* iter) {
+ widget_t* widget = WIDGET(iter);
+ widget_t* win = widget_get_window(widget);
+ if (widget->name != NULL) {
+ const char* name = widget->name;
+ if (strstr(name, "open:") == name) {
+ widget_on(widget, EVT_CLICK, on_open_window, (void*)(name + 5));
+ } else if (tk_str_eq(name, "close")) {
+ widget_on(widget, EVT_CLICK, on_close, win);
+ } else if (tk_str_eq(name, "ok")) {
+ widget_on(widget, EVT_CLICK, on_ok, win);
+ }
+ }
+ return RET_OK;
+}
+
ret_t application_init(void) {
widget_t* win = window_open("desktop");
- widget_child_on(win, "close", EVT_CLICK, on_click_close, NULL);
+ widget_child_on(win, "win_close", EVT_CLICK, on_click_win_close, NULL);
widget_child_on(win, "enlarge", EVT_CLICK, on_click_enlarge, NULL);
widget_child_on(win, "fullscreen", EVT_CLICK, on_fullscreen, win);
+ widget_foreach(win, install_one, win);
return RET_OK;
}
diff --git a/design/default/ui/desktop.xml b/design/default/ui/desktop.xml
index 422605c69..bf703ff59 100644
--- a/design/default/ui/desktop.xml
+++ b/design/default/ui/desktop.xml
@@ -15,6 +15,7 @@
+
-
+
diff --git a/design/default/ui/dialog_win.xml b/design/default/ui/dialog_win.xml
new file mode 100644
index 000000000..554208fbd
--- /dev/null
+++ b/design/default/ui/dialog_win.xml
@@ -0,0 +1,24 @@
+
\ No newline at end of file
diff --git a/docs/changes.md b/docs/changes.md
index f07fd129e..1a9a60492 100644
--- a/docs/changes.md
+++ b/docs/changes.md
@@ -1,5 +1,8 @@
# 最新动态
+2025/04/08
+ * 给window增加accept_button和cancel_button的属性(感谢智明提供补丁)
+
2025/04/03
* 完善tree(感谢兆坤提供补丁)
* 修复编译警告(感谢智明提供补丁)
diff --git a/res/assets/__assets_all_dark.inc b/res/assets/__assets_all_dark.inc
index 2bd13ce95..a27e5d99b 100644
--- a/res/assets/__assets_all_dark.inc
+++ b/res/assets/__assets_all_dark.inc
@@ -103,6 +103,7 @@ extern TK_CONST_DATA_ALIGN(const unsigned char ui_dialog2_default[]);
extern TK_CONST_DATA_ALIGN(const unsigned char ui_color_picker_hsv_default[]);
extern TK_CONST_DATA_ALIGN(const unsigned char ui_menu_down_right_default[]);
extern TK_CONST_DATA_ALIGN(const unsigned char ui_tab_bottom_default[]);
+extern TK_CONST_DATA_ALIGN(const unsigned char ui_dialog_win_default[]);
extern TK_CONST_DATA_ALIGN(const unsigned char ui_fruit_default[]);
extern TK_CONST_DATA_ALIGN(const unsigned char ui_list_view_m_default[]);
extern TK_CONST_DATA_ALIGN(const unsigned char ui_slide_view_h_loop_default[]);
@@ -1041,6 +1042,7 @@ ret_t assets_init_dark(void) {
assets_manager_add(am, ui_color_picker_hsv_default);
assets_manager_add(am, ui_menu_down_right_default);
assets_manager_add(am, ui_tab_bottom_default);
+ assets_manager_add(am, ui_dialog_win_default);
assets_manager_add(am, ui_fruit_default);
assets_manager_add(am, ui_list_view_m_default);
assets_manager_add(am, ui_slide_view_h_loop_default);
diff --git a/res/assets/__assets_all_default.inc b/res/assets/__assets_all_default.inc
index da8febd23..cb3246b0e 100644
--- a/res/assets/__assets_all_default.inc
+++ b/res/assets/__assets_all_default.inc
@@ -103,6 +103,7 @@
#include "default/inc/ui/color_picker_hsv.data"
#include "default/inc/ui/menu_down_right.data"
#include "default/inc/ui/tab_bottom.data"
+#include "default/inc/ui/dialog_win.data"
#include "default/inc/ui/fruit.data"
#include "default/inc/ui/list_view_m.data"
#include "default/inc/ui/slide_view_h_loop.data"
@@ -1041,6 +1042,7 @@ ret_t assets_init_default(void) {
assets_manager_add(am, ui_color_picker_hsv_default);
assets_manager_add(am, ui_menu_down_right_default);
assets_manager_add(am, ui_tab_bottom_default);
+ assets_manager_add(am, ui_dialog_win_default);
assets_manager_add(am, ui_fruit_default);
assets_manager_add(am, ui_list_view_m_default);
assets_manager_add(am, ui_slide_view_h_loop_default);
diff --git a/res/assets/__assets_old_dark.inc b/res/assets/__assets_old_dark.inc
index 02c51836a..1cd5e44d2 100644
--- a/res/assets/__assets_old_dark.inc
+++ b/res/assets/__assets_old_dark.inc
@@ -100,6 +100,7 @@ extern TK_CONST_DATA_ALIGN(const unsigned char ui_dialog2_default[]);
extern TK_CONST_DATA_ALIGN(const unsigned char ui_color_picker_hsv_default[]);
extern TK_CONST_DATA_ALIGN(const unsigned char ui_menu_down_right_default[]);
extern TK_CONST_DATA_ALIGN(const unsigned char ui_tab_bottom_default[]);
+extern TK_CONST_DATA_ALIGN(const unsigned char ui_dialog_win_default[]);
extern TK_CONST_DATA_ALIGN(const unsigned char ui_fruit_default[]);
extern TK_CONST_DATA_ALIGN(const unsigned char ui_list_view_m_default[]);
extern TK_CONST_DATA_ALIGN(const unsigned char ui_slide_view_h_loop_default[]);
@@ -661,6 +662,7 @@ ret_t assets_init_dark(void) {
assets_manager_add(am, ui_color_picker_hsv_default);
assets_manager_add(am, ui_menu_down_right_default);
assets_manager_add(am, ui_tab_bottom_default);
+ assets_manager_add(am, ui_dialog_win_default);
assets_manager_add(am, ui_fruit_default);
assets_manager_add(am, ui_list_view_m_default);
assets_manager_add(am, ui_slide_view_h_loop_default);
diff --git a/res/assets/__assets_old_default.inc b/res/assets/__assets_old_default.inc
index 9b8d97a99..ae377e0aa 100644
--- a/res/assets/__assets_old_default.inc
+++ b/res/assets/__assets_old_default.inc
@@ -100,6 +100,7 @@
#include "default/inc/ui/color_picker_hsv.data"
#include "default/inc/ui/menu_down_right.data"
#include "default/inc/ui/tab_bottom.data"
+#include "default/inc/ui/dialog_win.data"
#include "default/inc/ui/fruit.data"
#include "default/inc/ui/list_view_m.data"
#include "default/inc/ui/slide_view_h_loop.data"
@@ -661,6 +662,7 @@ ret_t assets_init_default(void) {
assets_manager_add(am, ui_color_picker_hsv_default);
assets_manager_add(am, ui_menu_down_right_default);
assets_manager_add(am, ui_tab_bottom_default);
+ assets_manager_add(am, ui_dialog_win_default);
assets_manager_add(am, ui_fruit_default);
assets_manager_add(am, ui_list_view_m_default);
assets_manager_add(am, ui_slide_view_h_loop_default);
diff --git a/res/assets/default/inc/ui/desktop.data b/res/assets/default/inc/ui/desktop.data
index 96791b22c..7ff80b0aa 100644
--- a/res/assets/default/inc/ui/desktop.data
+++ b/res/assets/default/inc/ui/desktop.data
@@ -1,5 +1,5 @@
TK_CONST_DATA_ALIGN(const unsigned char ui_desktop_default[]) = {
-0x04,0x00,0x01,0x01,0xef,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x65,0x73,0x6b,0x74,0x6f,0x70,0x00,
+0x04,0x00,0x01,0x01,0x88,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x65,0x73,0x6b,0x74,0x6f,0x70,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x12,0x12,0x22,0x11,0x77,0x69,0x6e,0x64,0x6f,0x77,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
@@ -68,13 +68,20 @@ TK_CONST_DATA_ALIGN(const unsigned char ui_desktop_default[]) = {
0x00,0x00,0x00,0x62,0x75,0x74,0x74,0x6f,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x73,0x65,0x6c,0x66,0x5f,0x6c,0x61,0x79,0x6f,
-0x75,0x74,0x00,0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x28,0x78,0x3d,0x63,0x3a,0x2d,0x35,0x30,0x2c,0x79,
-0x3d,0x62,0x3a,0x31,0x30,0x2c,0x77,0x3d,0x38,0x30,0x2c,0x68,0x3d,0x33,0x30,0x29,0x00,0x6e,0x61,0x6d,
-0x65,0x00,0x65,0x6e,0x6c,0x61,0x72,0x67,0x65,0x00,0x74,0x65,0x78,0x74,0x00,0x45,0x6e,0x6c,0x61,0x72,
-0x67,0x65,0x00,0x00,0x00,0x62,0x75,0x74,0x74,0x6f,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x73,0x65,0x6c,0x66,0x5f,0x6c,0x61,
-0x79,0x6f,0x75,0x74,0x00,0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x28,0x78,0x3d,0x63,0x3a,0x35,0x30,0x2c,
+0x75,0x74,0x00,0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x28,0x78,0x3d,0x63,0x3a,0x2d,0x31,0x35,0x30,0x2c,
0x79,0x3d,0x62,0x3a,0x31,0x30,0x2c,0x77,0x3d,0x38,0x30,0x2c,0x68,0x3d,0x33,0x30,0x29,0x00,0x6e,0x61,
-0x6d,0x65,0x00,0x63,0x6c,0x6f,0x73,0x65,0x00,0x74,0x65,0x78,0x74,0x00,0x43,0x6c,0x6f,0x73,0x65,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,};/*1567*/
+0x6d,0x65,0x00,0x6f,0x70,0x65,0x6e,0x3a,0x64,0x69,0x61,0x6c,0x6f,0x67,0x5f,0x77,0x69,0x6e,0x00,0x66,
+0x6f,0x63,0x75,0x73,0x61,0x62,0x6c,0x65,0x00,0x74,0x72,0x75,0x65,0x00,0x74,0x65,0x78,0x74,0x00,0x64,
+0x69,0x61,0x6c,0x6f,0x67,0x5f,0x77,0x69,0x6e,0x00,0x00,0x00,0x62,0x75,0x74,0x74,0x6f,0x6e,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,
+0x73,0x65,0x6c,0x66,0x5f,0x6c,0x61,0x79,0x6f,0x75,0x74,0x00,0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x28,
+0x78,0x3d,0x63,0x3a,0x2d,0x35,0x30,0x2c,0x79,0x3d,0x62,0x3a,0x31,0x30,0x2c,0x77,0x3d,0x38,0x30,0x2c,
+0x68,0x3d,0x33,0x30,0x29,0x00,0x6e,0x61,0x6d,0x65,0x00,0x65,0x6e,0x6c,0x61,0x72,0x67,0x65,0x00,0x74,
+0x65,0x78,0x74,0x00,0x45,0x6e,0x6c,0x61,0x72,0x67,0x65,0x00,0x00,0x00,0x62,0x75,0x74,0x74,0x6f,0x6e,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x1e,0x00,
+0x00,0x00,0x73,0x65,0x6c,0x66,0x5f,0x6c,0x61,0x79,0x6f,0x75,0x74,0x00,0x64,0x65,0x66,0x61,0x75,0x6c,
+0x74,0x28,0x78,0x3d,0x63,0x3a,0x35,0x30,0x2c,0x79,0x3d,0x62,0x3a,0x31,0x30,0x2c,0x77,0x3d,0x38,0x30,
+0x2c,0x68,0x3d,0x33,0x30,0x29,0x00,0x6e,0x61,0x6d,0x65,0x00,0x77,0x69,0x6e,0x5f,0x63,0x6c,0x6f,0x73,
+0x65,0x00,0x74,0x65,0x78,0x74,0x00,0x43,0x6c,0x6f,0x73,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};/*1720*/
diff --git a/res/assets/default/inc/ui/dialog_win.data b/res/assets/default/inc/ui/dialog_win.data
new file mode 100644
index 000000000..5b4ec93bb
--- /dev/null
+++ b/res/assets/default/inc/ui/dialog_win.data
@@ -0,0 +1,101 @@
+TK_CONST_DATA_ALIGN(const unsigned char ui_dialog_win_default[]) = {
+0x04,0x00,0x01,0x01,0x91,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x69,0x61,0x6c,0x6f,0x67,0x5f,0x77,
+0x69,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x12,0x12,0x22,0x11,0x64,0x69,0x61,0x6c,0x6f,0x67,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x73,0x65,0x6c,0x66,
+0x5f,0x6c,0x61,0x79,0x6f,0x75,0x74,0x00,0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x28,0x78,0x3d,0x63,0x2c,
+0x79,0x3d,0x6d,0x2c,0x77,0x3d,0x35,0x30,0x25,0x2c,0x68,0x3d,0x35,0x30,0x25,0x29,0x00,0x68,0x69,0x67,
+0x68,0x6c,0x69,0x67,0x68,0x74,0x00,0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x28,0x61,0x6c,0x70,0x68,0x61,
+0x3d,0x31,0x30,0x30,0x29,0x00,0x61,0x63,0x63,0x65,0x70,0x74,0x5f,0x62,0x75,0x74,0x74,0x6f,0x6e,0x00,
+0x6f,0x6b,0x00,0x63,0x61,0x6e,0x63,0x65,0x6c,0x5f,0x62,0x75,0x74,0x74,0x6f,0x6e,0x00,0x63,0x6c,0x6f,
+0x73,0x65,0x00,0x73,0x74,0x79,0x6c,0x65,0x3a,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x3a,0x62,0x67,0x5f,0x63,
+0x6f,0x6c,0x6f,0x72,0x00,0x23,0x66,0x30,0x66,0x30,0x66,0x30,0x00,0x00,0x76,0x69,0x65,0x77,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x1b,0x00,
+0x00,0x00,0x73,0x65,0x6c,0x66,0x5f,0x6c,0x61,0x79,0x6f,0x75,0x74,0x00,0x64,0x65,0x66,0x61,0x75,0x6c,
+0x74,0x28,0x77,0x3d,0x31,0x30,0x30,0x25,0x2c,0x68,0x3d,0x32,0x37,0x29,0x00,0x73,0x74,0x79,0x6c,0x65,
+0x3a,0x62,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x00,0x67,0x72,0x61,0x79,0x00,0x00,0x6c,0x61,0x62,0x65,
+0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf1,0xff,0xff,0xff,
+0x64,0x00,0x00,0x00,0x73,0x65,0x6c,0x66,0x5f,0x6c,0x61,0x79,0x6f,0x75,0x74,0x00,0x64,0x65,0x66,0x61,
+0x75,0x6c,0x74,0x28,0x78,0x3d,0x31,0x35,0x2c,0x79,0x3d,0x30,0x2c,0x77,0x3d,0x2d,0x31,0x35,0x2c,0x68,
+0x3d,0x31,0x30,0x30,0x25,0x29,0x00,0x6e,0x61,0x6d,0x65,0x00,0x74,0x69,0x74,0x6c,0x65,0x00,0x74,0x65,
+0x78,0x74,0x00,0x74,0x69,0x74,0x6c,0x65,0x00,0x00,0x00,0x62,0x75,0x74,0x74,0x6f,0x6e,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x73,
+0x65,0x6c,0x66,0x5f,0x6c,0x61,0x79,0x6f,0x75,0x74,0x00,0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x28,0x78,
+0x3d,0x72,0x3a,0x30,0x2c,0x79,0x3d,0x30,0x2c,0x77,0x3d,0x32,0x37,0x2c,0x68,0x3d,0x31,0x30,0x30,0x25,
+0x29,0x00,0x6e,0x61,0x6d,0x65,0x00,0x63,0x6c,0x6f,0x73,0x65,0x00,0x74,0x65,0x78,0x74,0x00,0x58,0x00,
+0x00,0x00,0x00,0x76,0x69,0x65,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x73,0x65,0x6c,0x66,0x5f,0x6c,0x61,0x79,0x6f,
+0x75,0x74,0x00,0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x28,0x78,0x3d,0x30,0x2c,0x79,0x3d,0x62,0x3a,0x36,
+0x35,0x2c,0x77,0x3d,0x31,0x30,0x30,0x25,0x2c,0x68,0x3d,0x31,0x29,0x00,0x6e,0x61,0x6d,0x65,0x00,0x73,
+0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x00,0x73,0x74,0x79,0x6c,0x65,0x3a,0x6e,0x6f,0x72,0x6d,0x61,
+0x6c,0x3a,0x62,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x00,0x67,0x72,0x61,0x79,0x00,0x00,0x00,0x62,0x75,
+0x74,0x74,0x6f,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,
+0x00,0x00,0x1b,0x00,0x00,0x00,0x73,0x65,0x6c,0x66,0x5f,0x6c,0x61,0x79,0x6f,0x75,0x74,0x00,0x64,0x65,
+0x66,0x61,0x75,0x6c,0x74,0x28,0x78,0x3d,0x72,0x3a,0x39,0x30,0x2c,0x79,0x3d,0x62,0x3a,0x32,0x31,0x2c,
+0x77,0x3d,0x36,0x30,0x2c,0x68,0x3d,0x32,0x37,0x29,0x00,0x6e,0x61,0x6d,0x65,0x00,0x6f,0x6b,0x00,0x66,
+0x6f,0x63,0x75,0x73,0x61,0x62,0x6c,0x65,0x00,0x74,0x72,0x75,0x65,0x00,0x74,0x65,0x78,0x74,0x00,0x4f,
+0x6b,0x00,0x00,0x00,0x62,0x75,0x74,0x74,0x6f,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x73,0x65,0x6c,0x66,0x5f,0x6c,0x61,0x79,
+0x6f,0x75,0x74,0x00,0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x28,0x78,0x3d,0x72,0x3a,0x31,0x35,0x2c,0x79,
+0x3d,0x62,0x3a,0x32,0x31,0x2c,0x77,0x3d,0x36,0x30,0x2c,0x68,0x3d,0x32,0x37,0x29,0x00,0x6e,0x61,0x6d,
+0x65,0x00,0x63,0x6c,0x6f,0x73,0x65,0x00,0x66,0x6f,0x63,0x75,0x73,0x61,0x62,0x6c,0x65,0x00,0x74,0x72,
+0x75,0x65,0x00,0x74,0x65,0x78,0x74,0x00,0x43,0x6c,0x6f,0x73,0x65,0x00,0x00,0x00,0x76,0x69,0x65,0x77,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x7c,0x01,0x00,0x00,
+0x32,0x00,0x00,0x00,0x6e,0x61,0x6d,0x65,0x00,0x76,0x69,0x65,0x77,0x00,0x00,0x65,0x64,0x69,0x74,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x1c,
+0x00,0x00,0x00,0x6d,0x69,0x6e,0x00,0x30,0x00,0x6d,0x61,0x78,0x00,0x31,0x30,0x32,0x34,0x00,0x73,0x74,
+0x65,0x70,0x00,0x31,0x00,0x6e,0x61,0x6d,0x65,0x00,0x65,0x64,0x69,0x74,0x00,0x66,0x6f,0x63,0x75,0x73,
+0x65,0x64,0x00,0x74,0x72,0x75,0x65,0x00,0x00,0x00,0x62,0x75,0x74,0x74,0x6f,0x6e,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x1f,0x01,0x00,0x00,0x0a,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x6e,0x61,
+0x6d,0x65,0x00,0x6f,0x70,0x65,0x6e,0x3a,0x74,0x6f,0x61,0x73,0x74,0x00,0x66,0x6f,0x63,0x75,0x73,0x61,
+0x62,0x6c,0x65,0x00,0x74,0x72,0x75,0x65,0x00,0x74,0x65,0x78,0x74,0x00,0x74,0x6f,0x61,0x73,0x74,0x00,
+0x00,0x00,0x6c,0x61,0x62,0x65,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,
+0x00,0x00,0x41,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x6e,0x61,0x6d,0x65,0x00,0x6c,0x61,0x62,0x65,0x6c,
+0x00,0x74,0x65,0x78,0x74,0x00,0x46,0x69,0x6c,0x65,0x50,0x61,0x74,0x68,0x3a,0x00,0x00,0x00,0x00,0x76,
+0x69,0x65,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x7c,
+0x01,0x00,0x00,0x32,0x00,0x00,0x00,0x6e,0x61,0x6d,0x65,0x00,0x76,0x69,0x65,0x77,0x00,0x00,0x65,0x64,
+0x69,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0xca,0x00,
+0x00,0x00,0x1c,0x00,0x00,0x00,0x6d,0x69,0x6e,0x00,0x30,0x00,0x6d,0x61,0x78,0x00,0x31,0x30,0x32,0x34,
+0x00,0x73,0x74,0x65,0x70,0x00,0x31,0x00,0x6e,0x61,0x6d,0x65,0x00,0x65,0x64,0x69,0x74,0x00,0x00,0x00,
+0x62,0x75,0x74,0x74,0x6f,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x01,0x00,0x00,0x0a,0x00,0x00,0x00,
+0x52,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x6e,0x61,0x6d,0x65,0x00,0x6f,0x70,0x65,0x6e,0x3a,0x69,0x6e,
+0x66,0x6f,0x00,0x66,0x6f,0x63,0x75,0x73,0x61,0x62,0x6c,0x65,0x00,0x74,0x72,0x75,0x65,0x00,0x74,0x65,
+0x78,0x74,0x00,0x69,0x6e,0x66,0x6f,0x00,0x00,0x00,0x6c,0x61,0x62,0x65,0x6c,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x0a,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x6e,0x61,
+0x6d,0x65,0x00,0x6c,0x61,0x62,0x65,0x6c,0x00,0x74,0x65,0x78,0x74,0x00,0x44,0x69,0x72,0x50,0x61,0x74,
+0x68,0x3a,0x00,0x00,0x00,0x00,0x76,0x69,0x65,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,
+0x00,0x00,0x78,0x00,0x00,0x00,0x7c,0x01,0x00,0x00,0x32,0x00,0x00,0x00,0x6e,0x61,0x6d,0x65,0x00,0x76,
+0x69,0x65,0x77,0x00,0x00,0x63,0x68,0x65,0x63,0x6b,0x5f,0x62,0x75,0x74,0x74,0x6f,0x6e,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,0x00,
+0x00,0x0a,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x74,0x65,0x78,0x74,0x00,0x42,0x6f,
+0x6f,0x6b,0x00,0x66,0x6f,0x63,0x75,0x73,0x61,0x62,0x6c,0x65,0x00,0x74,0x72,0x75,0x65,0x00,0x00,0x00,
+0x6d,0x6c,0x65,0x64,0x69,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x64,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x73,0x65,0x6c,0x66,0x5f,0x6c,0x61,0x79,0x6f,0x75,0x74,0x00,
+0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x28,0x78,0x3d,0x31,0x34,0x35,0x2c,0x79,0x3d,0x30,0x2c,0x77,0x3d,
+0x31,0x30,0x30,0x2c,0x68,0x3d,0x31,0x30,0x30,0x25,0x29,0x00,0x74,0x65,0x78,0x74,0x00,0x61,0x63,0x63,
+0x65,0x70,0x74,0x20,0x3d,0x20,0x66,0x61,0x6c,0x73,0x65,0x00,0x61,0x63,0x63,0x65,0x70,0x74,0x5f,0x72,
+0x65,0x74,0x75,0x72,0x6e,0x00,0x66,0x61,0x6c,0x73,0x65,0x00,0x61,0x63,0x63,0x65,0x70,0x74,0x5f,0x74,
+0x61,0x62,0x00,0x66,0x61,0x6c,0x73,0x65,0x00,0x00,0x00,0x6d,0x6c,0x65,0x64,0x69,0x74,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x73,
+0x65,0x6c,0x66,0x5f,0x6c,0x61,0x79,0x6f,0x75,0x74,0x00,0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x28,0x78,
+0x3d,0x32,0x35,0x30,0x2c,0x79,0x3d,0x30,0x2c,0x77,0x3d,0x31,0x30,0x30,0x2c,0x68,0x3d,0x31,0x30,0x30,
+0x25,0x29,0x00,0x74,0x65,0x78,0x74,0x00,0x61,0x73,0x64,0x66,0x61,0x73,0x64,0x66,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,};/*1985*/
diff --git a/res/assets/default/raw/ui/desktop.bin b/res/assets/default/raw/ui/desktop.bin
index f0e1dd0dc..ecaac4a67 100644
Binary files a/res/assets/default/raw/ui/desktop.bin and b/res/assets/default/raw/ui/desktop.bin differ
diff --git a/res/assets/default/raw/ui/dialog_win.bin b/res/assets/default/raw/ui/dialog_win.bin
new file mode 100644
index 000000000..fad438d81
Binary files /dev/null and b/res/assets/default/raw/ui/dialog_win.bin differ
diff --git a/res/assets_all_dark.inc b/res/assets_all_dark.inc
index 2cf990553..6f9b3f025 100644
--- a/res/assets_all_dark.inc
+++ b/res/assets_all_dark.inc
@@ -103,6 +103,7 @@
#include "assets/default/inc/ui/color_picker_hsv.data"
#include "assets/default/inc/ui/menu_down_right.data"
#include "assets/default/inc/ui/tab_bottom.data"
+#include "assets/default/inc/ui/dialog_win.data"
#include "assets/default/inc/ui/fruit.data"
#include "assets/default/inc/ui/list_view_m.data"
#include "assets/default/inc/ui/slide_view_h_loop.data"
@@ -1041,6 +1042,7 @@ ret_t assets_init(void) {
assets_manager_add(am, ui_color_picker_hsv_default);
assets_manager_add(am, ui_menu_down_right_default);
assets_manager_add(am, ui_tab_bottom_default);
+ assets_manager_add(am, ui_dialog_win_default);
assets_manager_add(am, ui_fruit_default);
assets_manager_add(am, ui_list_view_m_default);
assets_manager_add(am, ui_slide_view_h_loop_default);
diff --git a/res/assets_all_default.inc b/res/assets_all_default.inc
index 0e39b144d..7315fdab0 100644
--- a/res/assets_all_default.inc
+++ b/res/assets_all_default.inc
@@ -103,6 +103,7 @@
#include "assets/default/inc/ui/color_picker_hsv.data"
#include "assets/default/inc/ui/menu_down_right.data"
#include "assets/default/inc/ui/tab_bottom.data"
+#include "assets/default/inc/ui/dialog_win.data"
#include "assets/default/inc/ui/fruit.data"
#include "assets/default/inc/ui/list_view_m.data"
#include "assets/default/inc/ui/slide_view_h_loop.data"
@@ -1041,6 +1042,7 @@ ret_t assets_init(void) {
assets_manager_add(am, ui_color_picker_hsv_default);
assets_manager_add(am, ui_menu_down_right_default);
assets_manager_add(am, ui_tab_bottom_default);
+ assets_manager_add(am, ui_dialog_win_default);
assets_manager_add(am, ui_fruit_default);
assets_manager_add(am, ui_list_view_m_default);
assets_manager_add(am, ui_slide_view_h_loop_default);
diff --git a/res/assets_old_dark.inc b/res/assets_old_dark.inc
index 029ebf40d..182a9918e 100644
--- a/res/assets_old_dark.inc
+++ b/res/assets_old_dark.inc
@@ -100,6 +100,7 @@
#include "assets/default/inc/ui/color_picker_hsv.data"
#include "assets/default/inc/ui/menu_down_right.data"
#include "assets/default/inc/ui/tab_bottom.data"
+#include "assets/default/inc/ui/dialog_win.data"
#include "assets/default/inc/ui/fruit.data"
#include "assets/default/inc/ui/list_view_m.data"
#include "assets/default/inc/ui/slide_view_h_loop.data"
@@ -661,6 +662,7 @@ ret_t assets_init(void) {
assets_manager_add(am, ui_color_picker_hsv_default);
assets_manager_add(am, ui_menu_down_right_default);
assets_manager_add(am, ui_tab_bottom_default);
+ assets_manager_add(am, ui_dialog_win_default);
assets_manager_add(am, ui_fruit_default);
assets_manager_add(am, ui_list_view_m_default);
assets_manager_add(am, ui_slide_view_h_loop_default);
diff --git a/res/assets_old_default.inc b/res/assets_old_default.inc
index 0377cad86..af25083cf 100644
--- a/res/assets_old_default.inc
+++ b/res/assets_old_default.inc
@@ -100,6 +100,7 @@
#include "assets/default/inc/ui/color_picker_hsv.data"
#include "assets/default/inc/ui/menu_down_right.data"
#include "assets/default/inc/ui/tab_bottom.data"
+#include "assets/default/inc/ui/dialog_win.data"
#include "assets/default/inc/ui/fruit.data"
#include "assets/default/inc/ui/list_view_m.data"
#include "assets/default/inc/ui/slide_view_h_loop.data"
@@ -661,6 +662,7 @@ ret_t assets_init(void) {
assets_manager_add(am, ui_color_picker_hsv_default);
assets_manager_add(am, ui_menu_down_right_default);
assets_manager_add(am, ui_tab_bottom_default);
+ assets_manager_add(am, ui_dialog_win_default);
assets_manager_add(am, ui_fruit_default);
assets_manager_add(am, ui_list_view_m_default);
assets_manager_add(am, ui_slide_view_h_loop_default);
diff --git a/src/base/widget.c b/src/base/widget.c
index 3f020b3ec..31acc659b 100644
--- a/src/base/widget.c
+++ b/src/base/widget.c
@@ -851,6 +851,12 @@ ret_t widget_set_focused_internal(widget_t* widget, bool_t focused) {
return RET_OK;
}
+ret_t widget_set_accept_button_widget_state(widget_t* widget, bool_t accept_state) {
+ return_value_if_fail(widget != NULL && widget->vt != NULL, RET_BAD_PARAMS);
+ widget_set_prop_bool(widget, WIDGET_PROP_IS_ACCEPT_STATUS, accept_state);
+ return widget_set_need_update_style(widget);
+}
+
ret_t widget_set_focused(widget_t* widget, bool_t focused) {
return_value_if_fail(widget != NULL && widget->vt != NULL, RET_BAD_PARAMS);
@@ -2820,13 +2826,18 @@ static bool_t shortcut_fast_match(const char* shortcut, key_event_t* e) {
}
static bool_t widget_match_key(widget_t* widget, const char* prop, key_event_t* e) {
+ widget_t* win = NULL;
const char* shortcut = NULL;
- widget_t* win = widget_get_real_window_or_keyboard(widget);
if (widget_is_window_manager(widget)) {
return FALSE;
}
+ if (e->key == TK_KEY_TAB && widget_get_prop_bool(widget, WIDGET_PROP_ACCEPT_TAB, FALSE)) {
+ return FALSE;
+ }
+
+ win = widget_get_real_window_or_keyboard(widget);
return_value_if_fail(win != NULL, FALSE);
shortcut = widget_get_prop_str(win, prop, NULL);
@@ -2964,9 +2975,40 @@ static ret_t widget_on_keyup_before_children(widget_t* widget, key_event_t* e) {
return widget_on_event_before_children(widget, (event_t*)e);
}
+static widget_t* widget_get_final_key_target(widget_t* widget) {
+ widget_t* key_target = NULL;
+ return_value_if_fail(widget != NULL, NULL);
+ if (widget->key_target != NULL) {
+ key_target = widget_get_final_key_target(widget->key_target);
+ if (key_target == NULL) {
+ return widget->key_target;
+ } else {
+ return key_target;
+ }
+ }
+ return NULL;
+}
+
static ret_t widget_on_keyup_children(widget_t* widget, key_event_t* e) {
ret_t ret = RET_OK;
+ if (widget_is_window(widget)) {
+ widget_t* accept_button_widget = WIDGET(widget_get_prop_pointer(widget, WIDGET_PROP_ACCEPT_BUTTON));
+ widget_t* cancel_button_widget = WIDGET(widget_get_prop_pointer(widget, WIDGET_PROP_CANCEL_BUTTON));
+ if (accept_button_widget != NULL && key_code_is_enter(e->key)) {
+#ifdef MACOS
+ bool_t is_control = e->cmd;
+#else
+ bool_t is_control = e->ctrl;
+#endif
+ widget_t* final_key_target = widget_get_final_key_target(widget);
+ if (!final_key_target->vt->return_key_to_activate && !is_control && !widget_get_prop_bool(final_key_target, WIDGET_PROP_ACCEPT_RETRUN, FALSE)) {
+ return widget_on_keyup(accept_button_widget, e);
+ }
+ } else if (cancel_button_widget!= NULL && e->key == TK_KEY_ESCAPE) {
+ return widget_on_keyup(cancel_button_widget, e);
+ }
+ }
if (widget->key_target != NULL) {
ret = widget_on_keyup(widget->key_target, e);
}
@@ -2984,6 +3026,7 @@ static ret_t widget_on_keyup_after_children(widget_t* widget, key_event_t* e) {
static ret_t widget_on_keyup_impl(widget_t* widget, key_event_t* e) {
ret_t ret = RET_OK;
+ widget_t* cancel_button_widget = NULL;
return_value_if_fail(widget != NULL && e != NULL, RET_BAD_PARAMS);
return_value_if_fail(widget->vt != NULL, RET_BAD_PARAMS);
@@ -2991,7 +3034,14 @@ static ret_t widget_on_keyup_impl(widget_t* widget, key_event_t* e) {
return_value_if_equal(widget_on_keyup_children(widget, e), RET_STOP);
return_value_if_equal(widget_on_keyup_after_children(widget, e), RET_STOP);
- if (widget_is_activate_key(widget, e)) {
+ if (e->key == TK_KEY_ESCAPE) {
+ widget_t* win = widget_get_window(widget);
+ if (win != NULL) {
+ cancel_button_widget = WIDGET(widget_get_prop_pointer(win, WIDGET_PROP_CANCEL_BUTTON));
+ }
+ }
+
+ if (widget_is_activate_key(widget, e) || cancel_button_widget == widget) {
pointer_event_t click;
if (widget_is_focusable(widget)) {
widget_set_state(widget, WIDGET_STATE_FOCUSED);
@@ -3225,6 +3275,14 @@ ret_t widget_on_pointer_down_children(widget_t* widget, pointer_event_t* e) {
widget->target = target;
}
+ if (widget->target == NULL) {
+ widget_t* accept_button_widget = WIDGET(widget_get_prop_pointer(widget_get_window(widget), WIDGET_PROP_ACCEPT_BUTTON));
+ if (accept_button_widget != NULL) {
+ bool_t accept = !widget->vt->return_key_to_activate && !widget_get_prop_bool(widget, WIDGET_PROP_ACCEPT_RETRUN, FALSE);
+ widget_set_accept_button_widget_state(accept_button_widget, accept);
+ }
+ }
+
if (widget->target != NULL && widget->target->enable && widget->target->sensitive) {
ret = widget_on_pointer_down(widget->target, e);
}
@@ -4671,6 +4729,13 @@ ret_t widget_move_focus(widget_t* widget, widget_find_wanted_focus_widget_t find
widget_t* focus = find(widget, &all_focusable);
if (focus != NULL && focus != widget) {
+ widget_t* win = widget_get_window(widget);
+ widget_t* accept_button_widget = WIDGET(widget_get_prop_pointer(win, WIDGET_PROP_ACCEPT_BUTTON));
+ if (accept_button_widget != NULL) {
+ bool_t accept = !focus->vt->return_key_to_activate && !widget_get_prop_bool(focus, WIDGET_PROP_ACCEPT_RETRUN, FALSE);
+ widget_set_accept_button_widget_state(accept_button_widget, accept);
+ }
+
widget_set_prop_bool(widget, WIDGET_PROP_FOCUSED, FALSE);
widget_set_prop_bool(focus, WIDGET_PROP_FOCUSED, TRUE);
ret = RET_OK;
diff --git a/src/base/widget.h b/src/base/widget.h
index 45068729a..e725ab7a7 100644
--- a/src/base/widget.h
+++ b/src/base/widget.h
@@ -3385,6 +3385,7 @@ ret_t widget_remove_child_prepare(widget_t* widget, widget_t* child);
ret_t widget_set_text_impl(widget_t* widget, const wchar_t* text, bool_t check_diff);
ret_t widget_set_text_utf8_impl(widget_t* widget, const char* text, bool_t check_diff);
+ret_t widget_set_accept_button_widget_state(widget_t* widget, bool_t accept_state);
ret_t widget_on_visit_focusable(void* ctx, const void* data);
/*public for input_device_status*/
diff --git a/src/base/widget_consts.h b/src/base/widget_consts.h
index 31c933208..0e974fa58 100644
--- a/src/base/widget_consts.h
+++ b/src/base/widget_consts.h
@@ -787,6 +787,12 @@ BEGIN_C_DECLS
*/
#define WIDGET_PROP_ENABLE_PREVIEW "enable_preview"
+/**
+ * @const WIDGET_PROP_IS_ACCEPT_STATUS
+ * 是否为 accept 状态
+ */
+#define WIDGET_PROP_IS_ACCEPT_STATUS "is_accept_status"
+
/**
* @const WIDGET_PROP_CLICK_THROUGH
* 是否启用点击穿透。
@@ -1045,6 +1051,31 @@ BEGIN_C_DECLS
*/
#define WIDGET_PROP_MOVE_FOCUS_RIGHT_KEY "move_focus_right_key"
+/**
+ * @const WIDGET_PROP_ACCEPT_BUTTON
+ * 窗口中按下 Enter 默认触发单击 button 控件名字。
+ * 备注:如果控件接管了 Enter 的话,accept_button 控件是不会进入 focused 风格,例如:设置 accept_return 为 true 或者 widget->vt->return_key_to_activate 为 true
+ */
+#define WIDGET_PROP_ACCEPT_BUTTON "accept_button"
+
+/**
+ * @const WIDGET_PROP_CANCEL_BUTTON
+ * 窗口中按下 Esc 默认触发单击 button 控件名字。
+ */
+#define WIDGET_PROP_CANCEL_BUTTON "cancel_button"
+
+/**
+ * @const WIDGET_PROP_ACCEPT_RETRUN
+ * 控件中是否支持 Enter 按钮输入。
+ */
+#define WIDGET_PROP_ACCEPT_RETRUN "accept_return"
+
+/**
+ * @const WIDGET_PROP_ACCEPT_TAB
+ * 控件中是否支持 Tab 按钮输入。
+ */
+#define WIDGET_PROP_ACCEPT_TAB "accept_tab"
+
/**
* @const WIDGET_PROP_ROWS
* 行数。
diff --git a/src/base/window_base.c b/src/base/window_base.c
index 13b267400..61e0a86d7 100644
--- a/src/base/window_base.c
+++ b/src/base/window_base.c
@@ -329,6 +329,12 @@ ret_t window_base_get_prop(widget_t* widget, const char* name, value_t* v) {
} else if (tk_str_eq(name, WIDGET_PROP_APPLET_NAME)) {
value_set_str(v, window_base->applet_name);
return RET_OK;
+ } else if (tk_str_eq(name, WIDGET_PROP_ACCEPT_BUTTON)) {
+ value_set_pointer(v, window_base->accept_button_widget);
+ return RET_OK;
+ } else if (tk_str_eq(name, WIDGET_PROP_CANCEL_BUTTON)) {
+ value_set_pointer(v, window_base->cancel_button_widget);
+ return RET_OK;
}
return RET_NOT_FOUND;
@@ -366,6 +372,47 @@ static ret_t window_base_set_applet_name(widget_t* widget, const char* applet_na
return RET_OK;
}
+ret_t window_base_set_accept_button(widget_t* widget, const char* accept_button) {
+ window_base_t* window_base = WINDOW_BASE(widget);
+ return_value_if_fail(widget != NULL, RET_BAD_PARAMS);
+ if (accept_button == NULL) {
+ if (window_base->accept_button != NULL) {
+ TKMEM_FREE(window_base->accept_button);
+ window_base->accept_button = NULL;
+ }
+ if (window_base->accept_button_widget != NULL) {
+ widget_set_accept_button_widget_state(window_base->accept_button_widget, FALSE);
+ }
+ window_base->accept_button_widget = NULL;
+ return RET_OK;
+ } else {
+ window_base->accept_button = tk_str_copy(window_base->accept_button, accept_button);
+ window_base->accept_button_widget = widget_lookup(widget, accept_button, TRUE);
+ return_value_if_fail(window_base->accept_button_widget != NULL, RET_FAIL);
+ widget_set_accept_button_widget_state(window_base->accept_button_widget, TRUE);
+ }
+ return RET_OK;
+}
+
+ret_t window_base_set_cancel_button(widget_t* widget, const char* cancel_button) {
+ window_base_t* window_base = WINDOW_BASE(widget);
+ return_value_if_fail(widget != NULL, RET_BAD_PARAMS);
+ window_base->cancel_button = cancel_button;
+ if (cancel_button == NULL) {
+ if (window_base->cancel_button != NULL) {
+ TKMEM_FREE(window_base->cancel_button);
+ window_base->cancel_button = NULL;
+ }
+ window_base->cancel_button_widget = NULL;
+ return RET_OK;
+ } else {
+ window_base->cancel_button = tk_str_copy(window_base->cancel_button, cancel_button);
+ window_base->cancel_button_widget = widget_lookup(widget, cancel_button, TRUE);
+ return_value_if_fail(window_base->cancel_button_widget != NULL, RET_FAIL);
+ }
+ return RET_OK;
+}
+
ret_t window_base_set_prop(widget_t* widget, const char* name, const value_t* v) {
window_base_t* window_base = WINDOW_BASE(widget);
return_value_if_fail(widget != NULL && name != NULL && v != NULL, RET_BAD_PARAMS);
@@ -446,6 +493,20 @@ ret_t window_base_set_prop(widget_t* widget, const char* name, const value_t* v)
} else if (tk_str_eq(name, WIDGET_PROP_APPLET_NAME)) {
window_base_set_applet_name(widget, value_str(v));
return RET_OK;
+ } else if (tk_str_eq(name, WIDGET_PROP_ACCEPT_BUTTON)) {
+ if (widget->loading) {
+ window_base->accept_button = tk_str_copy(window_base->accept_button, value_str(v));
+ } else {
+ window_base_set_accept_button(widget, value_str(v));
+ }
+ return RET_OK;
+ } else if (tk_str_eq(name, WIDGET_PROP_CANCEL_BUTTON)) {
+ if (widget->loading) {
+ window_base->cancel_button = tk_str_copy(window_base->cancel_button, value_str(v));
+ } else {
+ window_base_set_cancel_button(widget, value_str(v));
+ }
+ return RET_OK;
}
return RET_NOT_FOUND;
@@ -471,6 +532,9 @@ ret_t window_base_on_destroy(widget_t* widget) {
TKMEM_FREE(window_base->move_focus_left_key);
TKMEM_FREE(window_base->move_focus_right_key);
+ TKMEM_FREE(window_base->accept_button);
+ TKMEM_FREE(window_base->cancel_button);
+
window_base_unload_theme_obj(widget);
return RET_OK;
@@ -553,6 +617,8 @@ ret_t window_base_on_event(widget_t* widget, event_t* e) {
if (widget->sensitive) {
widget_set_focused_internal(widget, TRUE);
}
+ window_base_set_accept_button(widget, win->accept_button);
+ window_base_set_cancel_button(widget, win->cancel_button);
} else if (e->type == EVT_WINDOW_OPEN) {
win->stage = WINDOW_STAGE_OPENED;
if (widget->sensitive) {
diff --git a/src/base/window_base.h b/src/base/window_base.h
index 15027f2d1..93ea9a738 100644
--- a/src/base/window_base.h
+++ b/src/base/window_base.h
@@ -243,6 +243,20 @@ typedef struct _window_base_t {
*/
char* move_focus_right_key;
+ /**
+ * @property {char*} accept_button
+ * @annotation ["set_prop","get_prop","readable","persitent","design","scriptable"]
+ * 窗口中按下 Enter 按钮默认触发单击 button 控件名字
+ */
+ char* accept_button;
+
+ /**
+ * @property {char*} cancel_button
+ * @annotation ["set_prop","get_prop","readable","persitent","design","scriptable"]
+ * 窗口中按下 Esc 按钮默认触发单击 button 控件名字
+ */
+ char* cancel_button;
+
/**
* @property {char*} applet_name
* @annotation ["set_prop","get_prop","readable","persitent","design","scriptable"]
@@ -280,6 +294,9 @@ typedef struct _window_base_t {
assets_manager_t* assets_manager;
image_manager_t* image_manager;
locale_info_t* locale_info;
+
+ widget_t* accept_button_widget;
+ widget_t* cancel_button_widget;
} window_base_t;
/**
@@ -449,6 +466,26 @@ ret_t window_base_set_need_relayout(widget_t* widget, bool_t need_relayout);
*/
ret_t window_base_on_copy(widget_t* widget, widget_t* other);
+/**
+ * @method window_base_set_accept_button
+ * 设置 accept_button 控件。
+ * @param {widget_t*} widget window_base对象。
+ * @param {const char*} accept_button 控件名字。
+ *
+ * @return {ret_t} 返回RET_OK表示成功,否则表示失败。。
+ */
+ret_t window_base_set_accept_button(widget_t* widget, const char* accept_button);
+
+/**
+ * @method window_base_set_cancel_button
+ * 设置 cancel_button 控件。
+ * @param {widget_t*} widget window_base对象。
+ * @param {const char*} cancel_button 控件名字。
+ *
+ * @return {ret_t} 返回RET_OK表示成功,否则表示失败。。
+ */
+ret_t window_base_set_cancel_button(widget_t* widget, const char* cancel_button);
+
#define WINDOW_BASE(widget) ((window_base_t*)(window_base_cast(WIDGET(widget))))
/*public for subclass and runtime type check*/
diff --git a/src/ext_widgets/mledit/mledit.c b/src/ext_widgets/mledit/mledit.c
index d6a93166f..dd11d8e56 100644
--- a/src/ext_widgets/mledit/mledit.c
+++ b/src/ext_widgets/mledit/mledit.c
@@ -329,6 +329,12 @@ static ret_t mledit_get_prop(widget_t* widget, const char* name, value_t* v) {
}
value_set_bool(v, inputing);
return RET_OK;
+ } else if (tk_str_eq(name, WIDGET_PROP_ACCEPT_RETRUN)) {
+ value_set_bool(v, mledit->accept_return);
+ return RET_OK;
+ } else if (tk_str_eq(name, WIDGET_PROP_ACCEPT_TAB)) {
+ value_set_bool(v, mledit->accept_tab);
+ return RET_OK;
}
return RET_NOT_FOUND;
@@ -427,6 +433,12 @@ static ret_t mledit_set_prop(widget_t* widget, const char* name, const value_t*
} else if (tk_str_eq(name, WIDGET_PROP_KEYBOARD)) {
mledit_set_keyboard(widget, value_str(v));
return RET_OK;
+ } else if (tk_str_eq(name, WIDGET_PROP_ACCEPT_RETRUN)) {
+ mledit->accept_return = value_bool(v);
+ return RET_OK;
+ } else if (tk_str_eq(name, WIDGET_PROP_ACCEPT_TAB)) {
+ mledit->accept_tab = value_bool(v);
+ return RET_OK;
}
return RET_NOT_FOUND;
@@ -750,6 +762,10 @@ static ret_t mledit_on_event(widget_t* widget, event_t* e) {
break;
}
}
+ if ((!mledit->accept_tab && !is_control && key == TK_KEY_TAB) || (!mledit->accept_return && !is_control && key_code_is_enter(key))) {
+ ret = RET_OK;
+ break;
+ }
if ((key < 128 && tk_isprint(key)) || key == TK_KEY_BACKSPACE || key == TK_KEY_DELETE ||
key == TK_KEY_TAB || key_code_is_enter(key)) {
wstr_set(&(mledit->last_changing_text), widget->text.str);
@@ -1289,6 +1305,8 @@ static ret_t mledit_init(widget_t* widget) {
mledit->bottom_margin = 0;
mledit->scroll_line = 1.0f;
mledit->max_lines = 100;
+ mledit->accept_tab = TRUE;
+ mledit->accept_return = TRUE;
wstr_init(&(mledit->temp), 0);
wstr_init(&(mledit->last_changing_text), 0);
wstr_init(&(mledit->last_changed_text), 0);
diff --git a/src/ext_widgets/mledit/mledit.h b/src/ext_widgets/mledit/mledit.h
index 77ac318e3..e934262cb 100644
--- a/src/ext_widgets/mledit/mledit.h
+++ b/src/ext_widgets/mledit/mledit.h
@@ -139,6 +139,22 @@ typedef struct _mledit_t {
*
*/
bool_t close_im_when_blured;
+ /**
+ * @property {bool_t} accept_return
+ * @annotation ["set_prop","get_prop","readable","persitent","design","scriptable"]
+ *
+ * 是否支持 Enter 按钮输入。
+ *
+ */
+ bool_t accept_return;
+ /**
+ * @property {bool_t} accept_tab
+ * @annotation ["set_prop","get_prop","readable","persitent","design","scriptable"]
+ *
+ * 是否支持 Tab 按钮输入。
+ *
+ */
+ bool_t accept_tab;
/*private*/
bool_t lock_scrollbar_value;
uint8_t margin;
diff --git a/src/widgets/button.c b/src/widgets/button.c
index e97df1be9..95b5d2c93 100644
--- a/src/widgets/button.c
+++ b/src/widgets/button.c
@@ -322,6 +322,16 @@ static ret_t button_get_prop(widget_t* widget, const char* name, value_t* v) {
} else if (tk_str_eq(name, WIDGET_PROP_ENABLE_PREVIEW)) {
value_set_bool(v, button->enable_preview);
return RET_OK;
+ } else if (tk_str_eq(name, WIDGET_PROP_STATE_FOR_STYLE)) {
+ if (button->is_accept_status) {
+ if (widget->visible && widget->sensitive && widget->enable) {
+ value_set_str(v, WIDGET_STATE_FOCUSED);
+ return RET_OK;
+ }
+ }
+ } else if (tk_str_eq(name, WIDGET_PROP_IS_ACCEPT_STATUS)) {
+ value_set_bool(v, button->is_accept_status);
+ return RET_OK;
}
return RET_NOT_FOUND;
@@ -348,7 +358,8 @@ static ret_t button_get_prop_default_value(widget_t* widget, const char* name, v
}
static ret_t button_set_prop(widget_t* widget, const char* name, const value_t* v) {
- return_value_if_fail(widget != NULL && name != NULL && v != NULL, RET_BAD_PARAMS);
+ button_t* button = BUTTON(widget);
+ return_value_if_fail(button != NULL && name != NULL && v != NULL, RET_BAD_PARAMS);
if (tk_str_eq(name, WIDGET_PROP_REPEAT)) {
return button_set_repeat(widget, value_int(v));
@@ -358,6 +369,9 @@ static ret_t button_set_prop(widget_t* widget, const char* name, const value_t*
return button_set_enable_long_press(widget, value_bool(v));
} else if (tk_str_eq(name, WIDGET_PROP_ENABLE_PREVIEW)) {
return button_set_enable_preview(widget, value_bool(v));
+ } else if (tk_str_eq(name, WIDGET_PROP_IS_ACCEPT_STATUS)) {
+ button->is_accept_status = value_bool(v);
+ return RET_OK;
}
return RET_NOT_FOUND;
diff --git a/src/widgets/button.h b/src/widgets/button.h
index b10efd0e5..a3d2db6ac 100644
--- a/src/widgets/button.h
+++ b/src/widgets/button.h
@@ -107,12 +107,12 @@ typedef struct _button_t {
bool_t enable_preview;
/**
- * @property {uint32_t} long_press_time
- * @annotation ["set_prop","get_prop","readable","persitent","design","scriptable"]
- * 触发长按事件的时间(毫秒)
+ * @property {bool_t} is_accept_status
+ * @annotation ["set_prop","get_prop","readable","scriptable"]
+ * 是否为 accept 状态
*
*/
- uint32_t long_press_time;
+ bool_t is_accept_status;
/**
* @property {bool_t} pressed
@@ -122,6 +122,14 @@ typedef struct _button_t {
*/
bool_t pressed;
+ /**
+ * @property {uint32_t} long_press_time
+ * @annotation ["set_prop","get_prop","readable","persitent","design","scriptable"]
+ * 触发长按事件的时间(毫秒)
+ *
+ */
+ uint32_t long_press_time;
+
/*private*/
int32_t timer_id;
int32_t repeat_nr;