Skip to content

Commit a9c4949

Browse files
committed
A try with a dedicated dispatcher for skin stored in the element skin manager
1 parent 9249c2f commit a9c4949

File tree

5 files changed

+175
-7
lines changed

5 files changed

+175
-7
lines changed

src/Toplo/BlElement.extension.st

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ BlElement >> ensureCanManageToploSkin [
267267
BlElement >> ensureHaveSkinManager [
268268

269269
self ensureHaveToploExtension.
270-
self toploExtension ensureHaveSkinManager
270+
self ensuredSkinManager
271271
]
272272

273273
{ #category : #'*Toplo' }
@@ -286,6 +286,8 @@ BlElement >> ensuredShortcutsStore [
286286
BlElement >> ensuredSkinManager [
287287

288288
^ self ensuredToploExtension ensuredSkinManager
289+
onInstalledIn: self;
290+
yourself
289291
]
290292

291293
{ #category : #'*Toplo' }

src/Toplo/TToSimpleState.trait.st

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ TToSimpleState >> applyOn: anElement fromQueue: aQueue [
1010
se := self skinEvent.
1111
se isConsumed ifTrue: [ ^ self ].
1212
anElement spaceDo: [ :sp | se fillFromTime: sp time ].
13-
anElement dispatchEvent: se
13+
anElement skinManager dispatchSkinEvent: se
1414
]
1515

1616
{ #category : #'t - simple state' }

src/Toplo/ToIntrinsicState.class.st

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ ToIntrinsicState >> currentPatternOn: anElement [
7070
ToIntrinsicState >> dispatchSkinEvent: anEvent on: anElement [
7171

7272
anEvent ifNil: [ ^ self ].
73-
anElement dispatchEvent: anEvent
73+
anElement skinManager dispatchSkinEvent: anEvent
7474
]
7575

7676
{ #category : #accessing }
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
"
2+
I dispatch events directly to the registered event handlers.
3+
"
4+
Class {
5+
#name : #ToSkinEventDispatcher,
6+
#superclass : #BlEventDispatcher,
7+
#instVars : [
8+
'owner',
9+
'handlers'
10+
],
11+
#category : #'Toplo-Core-Skin'
12+
}
13+
14+
{ #category : #'instance creation' }
15+
ToSkinEventDispatcher class >> on: aTBlEventTarget [
16+
17+
^ self new
18+
owner: aTBlEventTarget;
19+
yourself
20+
]
21+
22+
{ #category : #'api - adding/removing' }
23+
ToSkinEventDispatcher >> addEventHandler: aHandler [
24+
25+
"Lazy initialization"
26+
handlers ifNil: [ handlers := self newHandlerRegistry ].
27+
handlers add: aHandler.
28+
29+
"send hook AFTER handler is added"
30+
aHandler onInstalledIn: self owner
31+
]
32+
33+
{ #category : #'api - event managing' }
34+
ToSkinEventDispatcher >> dispatchEvent: anEvent next: aBlEventDispatcherChain [
35+
36+
anEvent isConsumed ifTrue: [ ^ anEvent ].
37+
anEvent arrivedTarget: self owner.
38+
"handlers initialized lazily, do nothing if there are none of them"
39+
handlers ifNotNil: [ :theHandlers |
40+
theHandlers dispatchEvent: anEvent ].
41+
42+
^ anEvent
43+
]
44+
45+
{ #category : #'api - accessing' }
46+
ToSkinEventDispatcher >> filtersDo: aBlock [
47+
"Evaulate a given block with every event filter as an argument"
48+
49+
50+
]
51+
52+
{ #category : #'api - accessing' }
53+
ToSkinEventDispatcher >> handlersDo: aBlock [
54+
"Evaulate a given block with every event handler as an argument"
55+
56+
handlers ifNotNil: [ :aRegistry | aRegistry handlers do: aBlock ]
57+
]
58+
59+
{ #category : #'api - testing' }
60+
ToSkinEventDispatcher >> hasHandler: anEventHandler [
61+
62+
^ handlers
63+
ifNil: [ false ]
64+
ifNotNil: [ handlers hasHandler: anEventHandler ]
65+
]
66+
67+
{ #category : #initialization }
68+
ToSkinEventDispatcher >> initialize [
69+
70+
super initialize.
71+
handlers := nil
72+
]
73+
74+
{ #category : #initialization }
75+
ToSkinEventDispatcher >> newHandlerRegistry [
76+
77+
^ BlHandlerRegistry preferableHandlerRegistryClass new
78+
]
79+
80+
{ #category : #'api - accessing' }
81+
ToSkinEventDispatcher >> owner [
82+
83+
^ owner
84+
]
85+
86+
{ #category : #'private - accessing' }
87+
ToSkinEventDispatcher >> owner: aTBlEventTarget [
88+
89+
owner := aTBlEventTarget
90+
]
91+
92+
{ #category : #printing }
93+
ToSkinEventDispatcher >> printOn: aStream [
94+
95+
super printOn: aStream.
96+
aStream
97+
nextPutAll: '(owner: ';
98+
nextPutAll: owner asString;
99+
nextPut: $)
100+
]
101+
102+
{ #category : #'api - adding/removing' }
103+
ToSkinEventDispatcher >> removeEventHandler: anHandler [
104+
105+
(self hasHandler: anHandler) ifFalse: [ ^ self ].
106+
107+
handlers ifNil: [ ^ self ].
108+
handlers remove: anHandler.
109+
"free memory as soon as we got rid of all event handlers"
110+
handlers isEmpty ifTrue: [ handlers := nil ].
111+
112+
anHandler onUninstalledIn: self owner
113+
]
114+
115+
{ #category : #'api - adding/removing' }
116+
ToSkinEventDispatcher >> removeEventHandlers [
117+
"Remove all my event handlers"
118+
119+
| oldHandlers |
120+
handlers ifNil: [ ^ self ].
121+
122+
oldHandlers := handlers.
123+
handlers := nil.
124+
125+
oldHandlers do: [ :eachHandler |
126+
eachHandler onUninstalledIn: self owner ]
127+
]
128+
129+
{ #category : #'api - adding/removing' }
130+
ToSkinEventDispatcher >> removeEventHandlersSuchThat: aBlock [
131+
"Remove all event handlers for those aBlock returns true"
132+
133+
| toBeRemoved |
134+
handlers ifNil: [ ^ self ].
135+
136+
toBeRemoved := handlers removeAllSuchThat: aBlock.
137+
handlers isEmpty ifTrue: [ handlers := nil ].
138+
139+
toBeRemoved do: [ :aHandler | aHandler onUninstalledIn: self owner ]
140+
]
141+
142+
{ #category : #'api - event managing' }
143+
ToSkinEventDispatcher >> wantsEvent: anEvent [
144+
"Return true if there are any filters or handlers interesting in a given event,
145+
false otherwise"
146+
147+
(handlers isNotNil and: [
148+
handlers anySatisfy: [ :aHandler | aHandler wantsEvent: anEvent ] ])
149+
ifTrue: [ ^ true ].
150+
151+
^ false
152+
]

src/Toplo/ToSkinManager.class.st

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ Class {
44
#instVars : [
55
'skinStateQueue',
66
'newSkinRequested',
7-
'installedSkin'
7+
'installedSkin',
8+
'skinEventDispatcher'
89
],
910
#category : #'Toplo-Core-Skin'
1011
}
@@ -24,6 +25,12 @@ ToSkinManager >> checkedSkinEvent: aCheckedSkinEvent in: anElement [
2425
skinStateQueue checkedSkinEvent: aCheckedSkinEvent in: anElement
2526
]
2627

28+
{ #category : #private }
29+
ToSkinManager >> dispatchSkinEvent: aSkinEvent [
30+
31+
skinEventDispatcher dispatchEvent: aSkinEvent
32+
]
33+
2734
{ #category : #'skin state generation' }
2835
ToSkinManager >> enabledSkinEvent: aSkinEvent in: anElement [
2936

@@ -60,7 +67,8 @@ ToSkinManager >> initialize [
6067

6168
newSkinRequested := false.
6269
installedSkin := ToUnknownSkin instance.
63-
skinStateQueue := ToSkinStateQueue new
70+
skinStateQueue := ToSkinStateQueue new.
71+
skinEventDispatcher := ToSkinEventDispatcher new
6472
]
6573

6674
{ #category : #'skin - installing / uninstalling' }
@@ -94,7 +102,7 @@ ToSkinManager >> installSkin: aSkin in: anElement [
94102
" store the skin "
95103
aSkin isThemeSkin ifFalse: [ ToUnresolvedSkinError signal ].
96104
installedSkin := aSkin.
97-
anElement addEventHandler: installedSkin.
105+
skinEventDispatcher addEventHandler: installedSkin.
98106
self skinStateQueue enqueueInstallStateFor: anElement
99107
]
100108

@@ -118,6 +126,12 @@ ToSkinManager >> newSkinRequested [
118126
^ newSkinRequested
119127
]
120128

129+
{ #category : #'api - hooks' }
130+
ToSkinManager >> onInstalledIn: anElement [
131+
132+
skinEventDispatcher owner: anElement
133+
]
134+
121135
{ #category : #'skin - install / uninstall request' }
122136
ToSkinManager >> requestNewSkinIn: anElement [
123137

@@ -187,6 +201,6 @@ ToSkinManager >> uninstallSkinIn: anElement [
187201
installedSkin isUnknownSkin ifTrue: [ ^ self ].
188202
installedSkin isUnresolvedSkin ifFalse: [
189203
self skinStateQueue enqueueUninstallStateFor: anElement.
190-
anElement removeEventHandler: installedSkin ].
204+
skinEventDispatcher removeEventHandler: installedSkin ].
191205
installedSkin := ToUnknownSkin instance
192206
]

0 commit comments

Comments
 (0)