/**
; n9 E! B: b, m* m * 闭包的存放容器
) P6 M# h! J/ l- P3 o * 允许将闭包作为一个队列存放,并在fire的时,按照队列先后顺序执行。! z* v3 m* y n. V
* @author Janpoem* d( \; y$ U* k: {: l
*/6 y: M- E# x, c x
sealed case class FnContainer(fn : Fn) {
& J% N1 m. A4 e0 ~0 l private var fns = ArrayBuffer[Fn](fn)% T9 ~% B( K+ r/ [; M6 L S8 x
def +(fn : Fn) : this.type = {
) Q3 n' l; C- q0 a4 c2 W. E fns += fn2 e M9 X5 d/ d
this
. n' p- |" a! b/ ]" Y% V/ s { }) f- O$ J+ m3 F& R5 Q
def fire(widget : T, event : QEvent) : EventHandle = {
9 Q5 a C: d9 L: K" H3 Z val handle = EventHandle(widget, event)
; w/ X' e3 @7 H' W0 Q8 | fns.foreach(_(handle)); E. f" n, G6 g! ^; D% b) @
handle
2 u: ? o3 N4 ~0 [ }' `$ K/ X- Y+ T3 t: c, P
}
3 f) O8 \7 [2 A4 _1 @" [ // 定义Qt标准时间类型转换到当前类的助记名6 [9 @0 C: b; i# J% f5 O$ V/ r4 a
// name统一使用小写
& k( ~8 j4 k2 R1 s. \8 ^) ? // @TODO 要不断增加QEvent.Type的内容
- w- \" X; i4 P" m# H# b private val _eventsMap = HashMap[QEvent.Type, String](9 F6 _/ {; i8 A j# Z: j# J3 M' S
QEvent.Type.Show
E! y8 q# p- A8 k6 n -> "show",8 n2 g g& y, X' c' r
QEvent.Type.MouseButtonPress& x0 r6 ]0 J$ E
-> "click",1 ~2 M c! R- D4 j" o4 q; U
QEvent.Type.MouseButtonDblClick -> "doubleclick",6 G. \* h8 Y. w# R
QEvent.Type.FocusIn
" q( ]. Z* p" P; U( m -> "focus",9 v0 O: w$ G& p; M4 D9 l; P( Q
QEvent.Type.FocusOut
( V8 l+ G3 j6 r ^( M -> "blur",
7 k: m4 s+ M r. M QEvent.Type.Enter: D0 B+ A0 o* k
-> "enter",5 ~7 {. V# T- c# o% H. |( V$ V7 c$ |
QEvent.Type.Leave1 R& W& I* P3 v }; @
-> "leave"4 |, A8 W% V: Z6 J8 G3 W
)$ |/ ?& w& c' g7 @+ B7 X9 u- { o @$ {8 C
// 事件
1 | F7 l' D+ d private val _events = HashMap[String, FnContainer]()$ o5 g8 M# {( e; u
// 传入Qt的QEvent.Type,获取其在Eventable内部的快捷助记名
B% m6 R k4 J* ^4 h def eventType2Name(_type : QEvent.Type) : Option[String] = _eventsMap.get(_type)
7 c v# x0 z9 G& ?3 O0 S, L // 装载事件" x3 H( [- ?# R$ b
// w.addEvent("show", handle => { /* */ })/ r; R: u6 a- x3 U" N
def addEvent(s : String, fn : Fn) : this.type = {
+ W6 `# t: B! A! z' x6 N val name = s.toEventName+ M) @+ y3 ?+ n; Z, K0 O
if (!this.hasEvent(name))# V4 `0 H# q- J! H% t% X
_events(name) = FnContainer(fn)
1 S+ {4 e- ^/ x+ O- G" c else
5 a# v) d9 P5 c _events(name) + fn% ~8 V w z" \" G8 p+ v
this5 `, g! q E6 _% [7 C
}
4 e$ Q4 D% G8 r, q/ K$ E5 U // w.addEvent("click" -> { handle => println(handle.event) })" Q V2 S) N! O# [" H' s
def addEvent(event : Ev) : thisthis.type = this.addEvent(event._1, event._2)9 o. a, u1 T* p6 Z8 U
def addEvents(events : Ev*) : this.type = {
1 i+ ^6 A# W' _* Z: k events.foreach(this.addEvent(_))
9 t' U- ~5 z+ `3 v% m; C this
) ^! D2 x9 j: V J, ~( w- ? } |