Moka-Controllers.st 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. Smalltalk current createPackage: 'Moka-Controllers'!
  2. MKSingleAspectController subclass: #MKAnyKeyInputController
  3. instanceVariableNames: 'lastValue'
  4. package: 'Moka-Controllers'!
  5. !MKAnyKeyInputController commentStamp!
  6. I am the default controller for `MKTextAreaView`. Actions are performed on any key press if the view's value changes.!
  7. !MKAnyKeyInputController methodsFor: 'accessing'!
  8. inputText
  9. ^ self view value
  10. ! !
  11. !MKAnyKeyInputController methodsFor: 'actions'!
  12. onKeyUp: anEvent
  13. self setNewValue
  14. !
  15. setNewValue
  16. | newValue |
  17. newValue := self inputText.
  18. newValue = lastValue ifTrue: [ ^ self ].
  19. lastValue := newValue.
  20. self performAspectActionWith: newValue
  21. ! !
  22. MKAnyKeyInputController subclass: #MKEnterInputController
  23. instanceVariableNames: ''
  24. package: 'Moka-Controllers'!
  25. !MKEnterInputController commentStamp!
  26. I am the default controller for `MKInputView`.
  27. Actions are performed on 'enter' key press.!
  28. !MKEnterInputController methodsFor: 'actions'!
  29. onKeyDown: anEvent
  30. anEvent keyCode = String cr asciiValue ifTrue: [
  31. self setNewValue ]
  32. !
  33. onKeyUp: anEvent
  34. ! !
  35. MKSingleAspectController subclass: #MKButtonController
  36. instanceVariableNames: ''
  37. package: 'Moka-Controllers'!
  38. !MKButtonController commentStamp!
  39. I am the default controller for `MKButtonView`.!
  40. !MKButtonController methodsFor: 'actions'!
  41. onClick: anEvent
  42. self performAspectAction
  43. ! !
  44. MKSingleAspectController subclass: #MKCheckboxController
  45. instanceVariableNames: ''
  46. package: 'Moka-Controllers'!
  47. !MKCheckboxController commentStamp!
  48. I am the default controller for `MKCheckboxView`.!
  49. !MKCheckboxController methodsFor: 'actions'!
  50. onClick: anEvent
  51. self toggle
  52. !
  53. onKeyDown: anEvent
  54. "Avoid scrolling in scrollable views"
  55. anEvent stopPropagation
  56. !
  57. onKeyPress: anEvent
  58. anEvent charCode = ' ' asciiValue ifTrue: [
  59. self toggle.
  60. anEvent stopPropagation; preventDefault ]
  61. !
  62. toggle
  63. self performAspectActionWith: self view checked not
  64. ! !
  65. MKAspectsController subclass: #MKDropdownController
  66. instanceVariableNames: ''
  67. package: 'Moka-Controllers'!
  68. !MKDropdownController commentStamp!
  69. I am the default controller for `MKDropdownView`.!
  70. !MKDropdownController methodsFor: 'actions'!
  71. onClick: anEvent
  72. self view popupList
  73. !
  74. onKeyDown: anEvent
  75. anEvent keyCode = String cr asciiValue ifTrue: [
  76. self view popupList ]
  77. ! !
  78. MKAspectsController subclass: #MKListController
  79. instanceVariableNames: 'downRepeater upRepeater'
  80. package: 'Moka-Controllers'!
  81. !MKListController methodsFor: 'accessing'!
  82. activeItem
  83. ^ self view activeItem
  84. !
  85. collection
  86. ^ self view collection
  87. !
  88. downRepeater
  89. ^ downRepeater ifNil: [ downRepeater := MKRepeater new ]
  90. !
  91. upRepeater
  92. ^ upRepeater ifNil: [ upRepeater := MKRepeater new ]
  93. ! !
  94. !MKListController methodsFor: 'actions'!
  95. activateItem: anItem
  96. "On item activation, change the model selection"
  97. self selectItem: anItem
  98. !
  99. onClick: anEvent
  100. self selectItem: (self itemForTarget: anEvent target)
  101. !
  102. onKeyDown: anEvent
  103. "Down"
  104. anEvent keyCode = 40 ifTrue: [
  105. anEvent preventDefault; stopPropagation.
  106. self upRepeater stopRepeating.
  107. self downRepeater repeat: [
  108. self activateItem: self nextItem ] ].
  109. "Up"
  110. anEvent keyCode = 38 ifTrue: [
  111. anEvent preventDefault; stopPropagation.
  112. self downRepeater stopRepeating.
  113. self upRepeater repeat: [
  114. self activateItem: self previousItem ] ].
  115. !
  116. onKeyUp: anEvent
  117. self downRepeater stopRepeating.
  118. self upRepeater stopRepeating
  119. !
  120. selectItem: anItem
  121. self
  122. performAspectAction: self view selectionAspect
  123. with: anItem
  124. ! !
  125. !MKListController methodsFor: 'private'!
  126. itemForTarget: aDOMElement
  127. ^ self view findItemFor: aDOMElement
  128. !
  129. nextItem
  130. ^ self collection
  131. at: (self collection indexOf: self activeItem) + 1
  132. ifAbsent: [ self collection last ]
  133. !
  134. previousItem
  135. ^ self view collection
  136. at: (self view collection indexOf: self activeItem) - 1
  137. ifAbsent: [ self view collection first ]
  138. ! !
  139. MKListController subclass: #MKDropdownListController
  140. instanceVariableNames: ''
  141. package: 'Moka-Controllers'!
  142. !MKDropdownListController methodsFor: 'actions'!
  143. activateItem: anItem
  144. "Select the list item in the view.
  145. No change is done to the model"
  146. self view activateItem: anItem
  147. !
  148. onKeyDown: anEvent
  149. super onKeyDown: anEvent.
  150. anEvent keyCode = String cr asciiValue ifTrue: [
  151. self selectItem: self view activeItem ]
  152. !
  153. onMouseMove: anEvent
  154. (self upRepeater isRepeating or: [ self downRepeater isRepeating ])
  155. ifTrue: [ ^ self ].
  156. self activateItem: (self itemForTarget: anEvent target)
  157. ! !
  158. MKSingleAspectController subclass: #MKModalController
  159. instanceVariableNames: ''
  160. package: 'Moka-Controllers'!
  161. !MKModalController methodsFor: 'actions'!
  162. onClick: anEvent
  163. self view closeOnClick ifTrue: [ self removeView ]
  164. !
  165. onKeyDown: anEvent
  166. self view closeOnEnter ifTrue: [
  167. anEvent keyCode = String cr asciiValue ifTrue: [
  168. self removeView.
  169. anEvent
  170. stopPropagation;
  171. preventDefault ] ].
  172. "ESC"
  173. anEvent keyCode = 27 ifTrue: [
  174. self removeView ]
  175. !
  176. removeView
  177. self view overlay remove
  178. ! !
  179. MKSingleAspectController subclass: #MKOverlayController
  180. instanceVariableNames: ''
  181. package: 'Moka-Controllers'!
  182. !MKOverlayController commentStamp!
  183. I am the default controller for `MKOverlayView`.
  184. On a click to the overlay, it is removed together with it's content view.!
  185. !MKOverlayController methodsFor: 'actions'!
  186. onClick: anEvent
  187. self view remove
  188. ! !
  189. Object subclass: #MKRepeater
  190. instanceVariableNames: 'repeatInterval interval delay'
  191. package: 'Moka-Controllers'!
  192. !MKRepeater commentStamp!
  193. I am an internal class used by controllers to repeat block actions after a `delay` and with an `interval`.!
  194. !MKRepeater methodsFor: 'accessing'!
  195. repeatInterval
  196. ^ repeatInterval ifNil: [ self defaultRepeatInterval ]
  197. !
  198. repeatInterval: aNumber
  199. repeatInterval := aNumber
  200. ! !
  201. !MKRepeater methodsFor: 'actions'!
  202. repeat: aBlock
  203. self isRepeating ifTrue: [ ^ self ].
  204. aBlock value.
  205. delay := [ interval := aBlock valueWithInterval: self repeatInterval ]
  206. valueWithTimeout: 300
  207. !
  208. stopRepeating
  209. interval ifNotNil: [ interval clearInterval ].
  210. delay ifNotNil: [ delay clearTimeout ].
  211. interval := delay := nil
  212. ! !
  213. !MKRepeater methodsFor: 'defaults'!
  214. defaultRepeatInterval
  215. ^ 70
  216. ! !
  217. !MKRepeater methodsFor: 'testing'!
  218. isRepeating
  219. ^ delay notNil
  220. ! !
  221. MKController subclass: #MKScrollController
  222. instanceVariableNames: ''
  223. package: 'Moka-Controllers'!
  224. !MKScrollController commentStamp!
  225. I am the default controller for `MKScrollDecorator`.!
  226. !MKScrollController methodsFor: 'actions'!
  227. onDecoratedScroll
  228. self view updateScrollbarsPosition
  229. !
  230. onHorizontalDrag: anEvent
  231. (self view decorated asJQuery get: 0) at: 'scrollLeft' put: self view domScrollPosition x
  232. !
  233. onMousewheel: anEvent
  234. anEvent deltaY ~= 0 ifTrue: [
  235. self view scrollDeltaY: anEvent deltaY * 10 ].
  236. anEvent deltaX ~= 0 ifTrue: [
  237. self view scrollDeltaX: anEvent deltaX * 10 ]
  238. !
  239. onResize
  240. self view resized
  241. !
  242. onVerticalDrag: anEvent
  243. (self view decorated asJQuery get: 0) at: 'scrollTop' put: self view domScrollPosition y
  244. ! !