/**& n( |% q' M+ B- d: J
* 闭包的存放容器
' ^% @; m, p# H1 c) s0 W' Y5 x * 允许将闭包作为一个队列存放,并在fire的时,按照队列先后顺序执行。
& U; v1 [2 z9 B- T7 \/ I3 ? * @author Janpoem
: C1 T: ^: J0 ]- f */( `) [0 ]5 `% \7 m. q
sealed case class FnContainer(fn : Fn) {
7 c J" N. v) T private var fns = ArrayBuffer[Fn](fn). E8 `) G, s6 C* F9 U
def +(fn : Fn) : this.type = {- _( K+ u/ Y2 U( \7 D8 N' `$ S, P, a$ j
fns += fn
& E/ ~8 F2 g0 O0 k this( w. s$ b; s8 O( O
}
z$ x5 q; O6 k5 k0 ]1 s H# l def fire(widget : T, event : QEvent) : EventHandle = {
) p( C% j9 V; w- w5 c, h val handle = EventHandle(widget, event)
3 ]% ^; k! @1 j3 F fns.foreach(_(handle))$ c& c# Z. {* b( I0 \ {) o
handle$ x8 B1 `/ W/ R3 Q# b- @, b% ]
}5 c7 O# |$ J. J+ h a
}( o! m1 C3 ?, f/ e
// 定义Qt标准时间类型转换到当前类的助记名: u9 A# G2 D; X3 Z, @& \) o
// name统一使用小写
! T7 E- V6 K$ H% [. {" a // @TODO 要不断增加QEvent.Type的内容& b) R7 `3 B5 Z! b& Y
private val _eventsMap = HashMap[QEvent.Type, String](2 ], g. F7 Z5 @# t( o* C/ P
QEvent.Type.Show
6 A" h! [+ `; @, c -> "show",
% d6 d' o( _1 T+ D QEvent.Type.MouseButtonPress
6 {* }% }" i8 ~8 i) N0 D -> "click",4 X y: ?1 b$ U8 h6 k( X& N
QEvent.Type.MouseButtonDblClick -> "doubleclick",
) j7 T# c9 B% c; p3 ?& Z. F8 r' [ QEvent.Type.FocusIn3 f8 h/ Y: _- b
-> "focus",
# n# m, i+ |; O D' a QEvent.Type.FocusOut
+ a7 D- M4 ~0 Y6 A, q! M4 i- }* s -> "blur",
! Y- a* @2 A- O2 R9 N. k QEvent.Type.Enter" k( e% v! [: \: i. D: S# p7 `$ U9 [
-> "enter",
' k% K, v7 T4 k% D: @2 `/ U9 c' x QEvent.Type.Leave" i0 b! R1 M, c! |* Y
-> "leave"- s; T# }& Q" t& |% i
)5 |% K2 H/ n2 i8 e" v2 }9 ]( V
// 事件* _: J: E9 j8 J+ ?+ ^ q$ H
private val _events = HashMap[String, FnContainer](): V% n6 i8 k0 F" ?
// 传入Qt的QEvent.Type,获取其在Eventable内部的快捷助记名
0 y! o" v% u3 @1 }- \& w4 Y+ C def eventType2Name(_type : QEvent.Type) : Option[String] = _eventsMap.get(_type)
! P0 l+ H4 o1 s // 装载事件
& D0 L& [. f* O: ?5 l. R1 i" l' | // w.addEvent("show", handle => { /* */ })
( X! c; ^( E/ b5 A* K3 Z: r8 C def addEvent(s : String, fn : Fn) : this.type = {7 w) F; M9 s* T) e; i# b( m. \
val name = s.toEventName
! ^1 T b, A% x Y/ L3 f& ~ if (!this.hasEvent(name))
% n& A6 w& K8 _6 B _events(name) = FnContainer(fn)
' l$ t0 S% R( M6 p* @ C else# T2 l/ f l4 Q( |* B" G" D
_events(name) + fn; b( n- a$ l! H6 | r3 C9 U2 H, z% l
this# V9 R& P3 E2 A* h
}
" K. y) ] W4 G9 H2 R7 v // w.addEvent("click" -> { handle => println(handle.event) })
M& w) z _* Z def addEvent(event : Ev) : thisthis.type = this.addEvent(event._1, event._2)6 E* u) M. u, v7 V: k1 [0 G) _
def addEvents(events : Ev*) : this.type = {$ b' h# g& |) i0 M% G# n5 t7 i
events.foreach(this.addEvent(_))8 g2 H" H m' {; R. c0 h r
this. z( f& w) P6 L# k; }
} |