|
|
@@ -8,6 +8,11 @@ PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>)
|
|
|
===========
|
|
|
*/
|
|
|
|
|
|
+///=== {
|
|
|
+///// event 模块实现了一个事件驱动编程框架,
|
|
|
+///// 提供基本的事件驱动编程 API,允许用户定义、发射、订阅事件。
|
|
|
+///// };
|
|
|
+
|
|
|
#var lib_event[META] {
|
|
|
{NAME} {事件驱动编程框架}
|
|
|
{DESC} {提供基本的事件驱动编程 API,允许用户定义、发射、订阅事件}
|
|
|
@@ -26,13 +31,27 @@ PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>)
|
|
|
|
|
|
#func {__xtt_event_name_is_valid__} {
|
|
|
#local name {%1};
|
|
|
- #if { "$name" == "{[_a-zA-Z]([./_a-zA-Z0-9-]*[./_a-zA-Z0-9])?}" } {
|
|
|
+ #if { "$name" == "{[_a-zA-Z]([./_a-zA-Z0-9-]*[a-zA-Z0-9])?}" } {
|
|
|
#return {true};
|
|
|
};
|
|
|
-
|
|
|
+
|
|
|
#return {false};
|
|
|
};
|
|
|
|
|
|
+///=== {
|
|
|
+// ## event.Define <名称> <类型> <模块> <说明>
|
|
|
+// 定义事件。事件在使用前必须先定义。事件经过定义后,可以用 event.List 查看。
|
|
|
+// 参数列表:
|
|
|
+// - 名称:标识事件的唯一名称,只能以拉丁字母或下划线开头,后面跟若干个
|
|
|
+// 字母、数字、下划线(_)、斜线(/)、小数点(.) 组成。其中三个
|
|
|
+// 标点符号不能出现在末尾,只能出现在中间。
|
|
|
+// - 类型:枚举值,{有参} 或者 {无参} 二选一。
|
|
|
+// 如果事件被定义为有参,则允许发射事件时携带参数,事件驱动会将
|
|
|
+// 参数传递给事件处理句柄。
|
|
|
+// - 模块:标识事件所属模块,一般来说事件发射方为事件所属模块。
|
|
|
+// 这里要用标准的 PaoTin++ 模块描述符。
|
|
|
+// - 说明:事件的简短说明。会出现在类似于 event.List 的用户交互界面。
|
|
|
+// };
|
|
|
#alias {event.Define} {
|
|
|
#local name {%1};
|
|
|
#local type {%2};
|
|
|
@@ -40,7 +59,7 @@ PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>)
|
|
|
#local desc {%4};
|
|
|
|
|
|
#if { "@__xtt_event_name_is_valid__{{$name}}" != "true" } {
|
|
|
- errLog 事件名称不是合法的标识符名称。;
|
|
|
+ xtt.Usage event.Define 事件名称不是合法的标识符名称;
|
|
|
#return;
|
|
|
};
|
|
|
|
|
|
@@ -49,7 +68,7 @@ PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>)
|
|
|
};
|
|
|
|
|
|
#if { "$type" != "{有参|无参}" } {
|
|
|
- errLog 事件类型只能是「有参」和「无参」两者之一,省略表示「无参」。;
|
|
|
+ xtt.Usage event.Define 事件类型参数值不正确;
|
|
|
#return;
|
|
|
};
|
|
|
|
|
|
@@ -60,6 +79,10 @@ PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>)
|
|
|
};
|
|
|
};
|
|
|
|
|
|
+///=== {
|
|
|
+// ## event.List
|
|
|
+// 列出所有已定义的事件,以及目前已注册在这些事件上面的钩子。
|
|
|
+// };
|
|
|
#alias {event.List} {
|
|
|
#local event {};
|
|
|
|
|
|
@@ -91,7 +114,7 @@ PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>)
|
|
|
#math count {$count + 1};
|
|
|
#local lead {├};
|
|
|
#if { $count == &gEventHandlers[$event][] } {
|
|
|
- #Local lead {╰};
|
|
|
+ #local lead {╰};
|
|
|
};
|
|
|
#echo { $lead@str.Repeat{$len;─} %s %-30s %s}{$hook}
|
|
|
{@genModuleLink{$gEventHandlers[$event][$hook][module];MOD}}
|
|
|
@@ -102,18 +125,24 @@ PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>)
|
|
|
#echo {%h};
|
|
|
};
|
|
|
|
|
|
+///=== {
|
|
|
+// ## event.Emit <事件名称> [<回调钩子通配符>] [<事件参数>]
|
|
|
+// 发射事件。这将导致与回调钩子通配符相匹配的回调钩子被立即执行。
|
|
|
+// 默认会触发所有注册在本事件下的事件回调钩子。
|
|
|
+// 你可以参考 event.Handle 理解什么是事件回调钩子。
|
|
|
+// };
|
|
|
#alias {event.Emit} {
|
|
|
#local name {%1};
|
|
|
#local pHook {%2};
|
|
|
#local args {%3};
|
|
|
|
|
|
#if { "@__xtt_event_name_is_valid__{{$name}}" != "true" } {
|
|
|
- errLog 事件名称不是合法的标识符名称。;
|
|
|
+ xtt.Usage event.Emit 事件名称不是合法的标识符名称;
|
|
|
#return;
|
|
|
};
|
|
|
|
|
|
#if { "$gValidEvent[$name]" == "" } {
|
|
|
- errLog 未定义的事件名称: $name;
|
|
|
+ xtt.Usage event.Emit {未定义的事件名称: $name};
|
|
|
#return;
|
|
|
};
|
|
|
|
|
|
@@ -127,7 +156,7 @@ PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>)
|
|
|
#local code {$gEventHandlers[$name][$hook][code]};
|
|
|
#nop 如果发射事件时指定了 pHook,则只唤醒指定的 hook,注意这里的 pHook 支持通配符;
|
|
|
#if { "$pHook" != "" && "$hook" != "$pHook" } {
|
|
|
- #return;
|
|
|
+ #continue;
|
|
|
};
|
|
|
#if { "$options[justOnce]" == "true" } {
|
|
|
#unvar {gEventHandlers[$name][$hook]};
|
|
|
@@ -141,18 +170,28 @@ PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>)
|
|
|
};
|
|
|
};
|
|
|
|
|
|
+///=== {
|
|
|
+// ## event.Handle <事件名称> <回调钩子> <所属模块> <回调代码>
|
|
|
+// 注册事件回调钩子。参数说明如下:
|
|
|
+// - 事件名称: 本钩子要关联的事件的名称,需要事先用 event.Define 声明。
|
|
|
+// - 回调钩子: 本次注册的钩子,可以在随后用来取消本钩子,或者当事件发射时,
|
|
|
+// 发射方可以用正则表达式指定要触发哪些钩子。
|
|
|
+// - 所属模块: 注册钩子所在的代码模块。必须是一个严格的 PaoTin++ 模块描述符。
|
|
|
+// - 回调代码: 用来指明钩子被回调时要执行的代码。
|
|
|
+// };
|
|
|
#alias {event.Handle} {
|
|
|
#local name {%1};
|
|
|
#local hook {%2};
|
|
|
#local module {%3};
|
|
|
#local code {%4};
|
|
|
|
|
|
- #if { "$name" == "" || "$hook" == "" || "$module" == "" || "$code" == "" } {
|
|
|
+ #if { "$name" == "" || "$hook" == "" || "$module" == "" || {$code} == {} } {
|
|
|
+ xtt.Usage event.Handle;
|
|
|
#return;
|
|
|
};
|
|
|
|
|
|
#if { "@__xtt_event_name_is_valid__{{$name}}" != "true" } {
|
|
|
- errLog 事件名称不是合法的标识符名称。;
|
|
|
+ xtt.Usage event.Handle 事件名称不是合法的标识符名称;
|
|
|
#return;
|
|
|
};
|
|
|
|
|
|
@@ -162,34 +201,29 @@ PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>)
|
|
|
};
|
|
|
};
|
|
|
|
|
|
-#alias {event.UnHandle} {
|
|
|
- #local name {%1};
|
|
|
- #local hook {%2};
|
|
|
-
|
|
|
- #if { "$name" == "" || "$hook" == "" } {
|
|
|
- #return;
|
|
|
- };
|
|
|
-
|
|
|
- #if { "@__xtt_event_name_is_valid__{{$name}}" != "true" } {
|
|
|
- errLog 事件名称不是合法的标识符名称。;
|
|
|
- #return;
|
|
|
- };
|
|
|
-
|
|
|
- #unvar {gEventHandlers[$name][$hook]};
|
|
|
-};
|
|
|
-
|
|
|
+///=== {
|
|
|
+// ## event.HandleOnce <事件名称> <回调钩子> <所属模块> <回调代码>
|
|
|
+// 注册事件回调钩子,但是本钩子只会被执行一次,然后会自动注销。
|
|
|
+// 参数说明如下:
|
|
|
+// - 事件名称: 本钩子要关联的事件的名称,需要事先用 event.Define 声明。
|
|
|
+// - 回调钩子: 本次注册的钩子,可以在随后用来取消本钩子,或者当事件发射时,
|
|
|
+// 发射方可以用正则表达式指定要触发哪些钩子。
|
|
|
+// - 所属模块: 注册钩子所在的代码模块。必须是一个严格的 PaoTin++ 模块描述符。
|
|
|
+// - 回调代码: 用来指明钩子被回调时要执行的代码。
|
|
|
+// };
|
|
|
#alias {event.HandleOnce} {
|
|
|
#local name {%1};
|
|
|
#local hook {%2};
|
|
|
#local module {%3};
|
|
|
#local code {%4};
|
|
|
|
|
|
- #if { "$name" == "" || "$hook" == "" || "$module" == "" || "$code" == "" } {
|
|
|
+ #if { "$name" == "" || "$hook" == "" || "$module" == "" || {$code} == {} } {
|
|
|
+ xtt.Usage event.HandleOnce;
|
|
|
#return;
|
|
|
};
|
|
|
|
|
|
#if { "@__xtt_event_name_is_valid__{{$name}}" != "true" } {
|
|
|
- errLog 事件名称不是合法的标识符名称。;
|
|
|
+ xtt.Usage event.HandleOnce 事件名称不是合法的标识符名称;
|
|
|
#return;
|
|
|
};
|
|
|
|
|
|
@@ -199,3 +233,24 @@ PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>)
|
|
|
{code}{$code}
|
|
|
};
|
|
|
};
|
|
|
+
|
|
|
+///=== {
|
|
|
+// ## event.UnHandle <事件名称> <事件回调钩子名称>
|
|
|
+// 注销已注册的事件回调钩子。
|
|
|
+// };
|
|
|
+#alias {event.UnHandle} {
|
|
|
+ #local name {%1};
|
|
|
+ #local hook {%2};
|
|
|
+
|
|
|
+ #if { "$name" == "" || "$hook" == "" } {
|
|
|
+ xtt.Usage event.UnHandle;
|
|
|
+ #return;
|
|
|
+ };
|
|
|
+
|
|
|
+ #if { "@__xtt_event_name_is_valid__{{$name}}" != "true" } {
|
|
|
+ xtt.Usage event.UnHandle 事件名称不是合法的标识符名称;
|
|
|
+ #return;
|
|
|
+ };
|
|
|
+
|
|
|
+ #unvar {gEventHandlers[$name][$hook]};
|
|
|
+};
|