event.tin 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. #function {lib_event.Init} {
  2. #var gEventHandlers {};
  3. #var gValidEvent {};
  4. #return true;
  5. };
  6. #function {__xtt_event_name_is_valid__} {
  7. #local name {%1};
  8. #if { "$name" == "{[_a-zA-Z]([./_a-zA-Z0-9-]*[./_a-zA-Z0-9])?}" } {
  9. #return {true};
  10. };
  11. #return {false};
  12. };
  13. #alias {event.Define} {
  14. #local name {%1};
  15. #local type {%2};
  16. #local module {%3};
  17. #local desc {%4};
  18. #if { "@__xtt_event_name_is_valid__{{$name}}" != "true" } {
  19. errLog 事件名称不是合法的标识符名称。;
  20. #return;
  21. };
  22. #if { "$type" == "" } {
  23. #local type {无参};
  24. };
  25. #if { "$type" != "{有参|无参}" } {
  26. errLog 事件类型只能是「有参」和「无参」两者之一,省略表示「无参」。;
  27. #return;
  28. };
  29. #var {gValidEvent[$name]} {
  30. {type}{$type}
  31. {module}{$module}
  32. {desc}{$desc}
  33. };
  34. };
  35. #alias {event.List} {
  36. #local event {};
  37. #if { &gValidEvent[] <= 0 } {
  38. infoLog 尚未定义任何事件。;
  39. #return;
  40. };
  41. #echo {%h} { 已经定义的事件列表 };
  42. #echo {%-20s %-5s %-20s %s} {事件/已注册的钩子} {类型} {模块} {说明/代码};
  43. #echo {%-20s %-5s %-20s %s} {--------------------} {----} {----------} {------------};
  44. #foreach {*gValidEvent[]} {event} {
  45. #local type {有参};
  46. #if { "$gValidEvent[$event][type]" == "{无参|}" } {
  47. #local type {无参};
  48. };
  49. #echo {%-20s %-5s %-20s %s} {$event} {$type} {$gValidEvent[$event][module]} {$gValidEvent[$event][desc]};
  50. #local hook {};
  51. #local count {0};
  52. #foreach {*gEventHandlers[$event][]} {hook} {
  53. #local len {1};
  54. #format len {%L} {$hook};
  55. #math len {16 - $len};
  56. #math count {$count + 1};
  57. #local lead {├};
  58. #if { $count == &gEventHandlers[$event][] } {
  59. #Local lead {╰};
  60. };
  61. #echo { $lead@repeat{$len;─} %s %-20s %s}{$hook}
  62. {$gEventHandlers[$event][$hook][module]}
  63. {$gEventHandlers[$event][$hook][code]};
  64. };
  65. };
  66. #echo {%h};
  67. };
  68. #alias {event.Emit} {
  69. #local name {%1};
  70. #local pHook {%2};
  71. #local args {%3};
  72. #if { "@__xtt_event_name_is_valid__{{$name}}" != "true" } {
  73. errLog 事件名称不是合法的标识符名称。;
  74. #return;
  75. };
  76. #if { "$gValidEvent[$name]" == "" } {
  77. errLog 未定义的事件名称: $name;
  78. #return;
  79. };
  80. #if { &gEventHandlers[$name][] <= 0 } {
  81. #return;
  82. };
  83. #local hook {};
  84. #foreach {*gEventHandlers[$name][]} {hook} {
  85. #local options {$gEventHandlers[$name][$hook][options]};
  86. #local code {$gEventHandlers[$name][$hook][code]};
  87. #nop 如果发射事件时指定了 pHook,则只唤醒指定的 hook,注意这里的 pHook 支持通配符;
  88. #if { "$pHook" != "" && "$hook" != "$pHook" } {
  89. #return;
  90. };
  91. #if { "$options[justOnce]" == "true" } {
  92. #unvar {gEventHandlers[$name][$hook]};
  93. };
  94. #if { "$args" == "" || "$gValidEvent[$name][type]" == "无参" } {
  95. $code;
  96. };
  97. #else {
  98. $code {$args};
  99. };
  100. };
  101. };
  102. #alias {event.Handle} {
  103. #local name {%1};
  104. #local hook {%2};
  105. #local module {%3};
  106. #local code {%4};
  107. #if { "$name" == "" || "$hook" == "" || "$module" == "" || "$code" == "" } {
  108. #return;
  109. };
  110. #if { "@__xtt_event_name_is_valid__{{$name}}" != "true" } {
  111. errLog 事件名称不是合法的标识符名称。;
  112. #return;
  113. };
  114. #var {gEventHandlers[$name][$hook]} {
  115. {module}{$module}
  116. {code}{$code}
  117. };
  118. };
  119. #alias {event.UnHandle} {
  120. #local name {%1};
  121. #local hook {%2};
  122. #if { "$name" == "" || "$hook" == "" } {
  123. #return;
  124. };
  125. #if { "@__xtt_event_name_is_valid__{{$name}}" != "true" } {
  126. errLog 事件名称不是合法的标识符名称。;
  127. #return;
  128. };
  129. #unvar {gEventHandlers[$name][$hook]};
  130. };
  131. #alias {event.HandleOnce} {
  132. #local name {%1};
  133. #local hook {%2};
  134. #local module {%3};
  135. #local code {%4};
  136. #if { "$name" == "" || "$hook" == "" || "$module" == "" || "$code" == "" } {
  137. #return;
  138. };
  139. #if { "@__xtt_event_name_is_valid__{{$name}}" != "true" } {
  140. errLog 事件名称不是合法的标识符名称。;
  141. #return;
  142. };
  143. #var {gEventHandlers[$name][$hook]} {
  144. {options}{{justOnce}{true}}
  145. {module}{$module}
  146. {code}{$code}
  147. };
  148. };