Moka-Decorators.st 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. Smalltalk current createPackage: 'Moka-Decorators'!
  2. MKDecorator subclass: #MKModalDecorator
  3. instanceVariableNames: 'overlay closeOnEnter closeOnClick'
  4. package: 'Moka-Decorators'!
  5. !MKModalDecorator commentStamp!
  6. I render my `decorated` view as a modal pane.!
  7. !MKModalDecorator methodsFor: 'accessing'!
  8. closeOnClick
  9. ^ closeOnClick ifNil: [ false ]
  10. !
  11. closeOnClick: aBoolean
  12. closeOnClick := aBoolean
  13. !
  14. closeOnEnter
  15. ^ closeOnEnter ifNil: [ false ]
  16. !
  17. closeOnEnter: aBoolean
  18. closeOnEnter := aBoolean
  19. !
  20. cssClass
  21. ^ super cssClass, ' mk_modal'
  22. !
  23. overlay
  24. ^ overlay ifNil: [ overlay := MKOverlayView childView: self ]
  25. !
  26. zindex
  27. ^ 1001
  28. ! !
  29. !MKModalDecorator methodsFor: 'defaults'!
  30. defaultControllerClass
  31. ^ MKModalController
  32. !
  33. defaultLayout
  34. ^ super defaultLayout
  35. centerY: 0;
  36. centerX: 0;"
  37. width: 300;
  38. height: 200;"
  39. yourself
  40. ! !
  41. !MKModalDecorator methodsFor: 'rendering'!
  42. renderOn: html
  43. super renderOn: html.
  44. root at: 'tabindex' put: '0'.
  45. root asJQuery focus.
  46. html with: self overlay
  47. ! !
  48. MKDecorator subclass: #MKScrollDecorator
  49. instanceVariableNames: 'verticalScrollbar horizontalScrollbar'
  50. package: 'Moka-Decorators'!
  51. !MKScrollDecorator commentStamp!
  52. I decorate a view adding scrollbars around it.
  53. The `decorated` view can send `MKViewScrolled` announcement to update the scrollbars position.!
  54. !MKScrollDecorator methodsFor: 'accessing'!
  55. cssClass
  56. ^ super cssClass, ' mk_scroll'
  57. !
  58. horizontalScrollbar
  59. ^ horizontalScrollbar
  60. !
  61. scrollPercent
  62. | element |
  63. element := self decorated asJQuery get: 0.
  64. ^ (element scrollLeft / element scrollWidth) @ (element scrollTop / element scrollHeight)
  65. !
  66. scrollbarPosition
  67. | position |
  68. position := self scrollPercent * (self domSize - self domScrollbarSize).
  69. ^ position x rounded @ position y rounded
  70. !
  71. scrollbarSize
  72. | domSize overflow |
  73. domSize := self domSize.
  74. overflow := self domOverflow.
  75. ^ ((domSize x / (overflow x + domSize x)) * 100) @ ((domSize y / (overflow y + domSize y) * 100))
  76. !
  77. verticalScrollbar
  78. ^ verticalScrollbar
  79. ! !
  80. !MKScrollDecorator methodsFor: 'actions'!
  81. resized
  82. super resized.
  83. self updateScrollbars
  84. !
  85. scrollDeltaX: aNumber
  86. | scrollbar left maxLeft |
  87. scrollbar := self horizontalScrollbar asJQuery.
  88. maxLeft := self domSize x - scrollbar width.
  89. left := ((scrollbar position left + aNumber) max: 0) min: maxLeft.
  90. scrollbar css: 'left' put: left.
  91. (self decorated asJQuery get: 0) at: 'scrollLeft' put: self domScrollPosition x
  92. !
  93. scrollDeltaY: aNumber
  94. | scrollbar top maxTop |
  95. scrollbar := self verticalScrollbar asJQuery.
  96. maxTop := self domSize y - scrollbar height.
  97. top := ((scrollbar position top - aNumber) max: 0) min: maxTop.
  98. scrollbar css: 'top' put: top.
  99. (self decorated asJQuery get: 0) at: 'scrollTop' put: self domScrollPosition y
  100. ! !
  101. !MKScrollDecorator methodsFor: 'defaults'!
  102. defaultControllerClass
  103. ^ MKScrollController
  104. ! !
  105. !MKScrollDecorator methodsFor: 'dom'!
  106. domDecoratedSize
  107. | element |
  108. element := self decorated asJQuery get: 0.
  109. ^ element scrollWidth @ element scrollHeight
  110. !
  111. domOverflow
  112. | element |
  113. element := self decorated asJQuery get: 0.
  114. ^ (element scrollWidth - element clientWidth) @ (element scrollHeight - element clientHeight)
  115. !
  116. domScrollPercent
  117. ^ self domScrollbarPosition / (self domSize - self domScrollbarSize)
  118. !
  119. domScrollPosition
  120. ^ (self domDecoratedSize - self domSize) * self domScrollPercent
  121. !
  122. domScrollbarPosition
  123. ^ horizontalScrollbar asJQuery position left @ verticalScrollbar asJQuery position top
  124. !
  125. domScrollbarSize
  126. ^ horizontalScrollbar asJQuery width @ verticalScrollbar asJQuery height
  127. ! !
  128. !MKScrollDecorator methodsFor: 'observing'!
  129. observeDecorated
  130. self decorated
  131. on: MKViewScroll
  132. send: #onDecoratedScroll
  133. to: self controller
  134. ! !
  135. !MKScrollDecorator methodsFor: 'private'!
  136. setupEventHandlers
  137. super setupEventHandlers.
  138. root asJQuery mousewheel: [ :event |
  139. self controller onMousewheel: event ].
  140. (jQuery value: window) resize: [ :event |
  141. self resized ]
  142. !
  143. setupScrollbars
  144. verticalScrollbar asJQuery draggable: #{
  145. 'containment' -> 'parent'.
  146. 'axis' -> 'y'.
  147. 'drag' -> [ :event | self controller onVerticalDrag: event ]
  148. }.
  149. horizontalScrollbar asJQuery draggable: #{
  150. 'containment' -> 'parent'.
  151. 'axis' -> 'x'.
  152. 'drag' -> [ :event | self controller onHorizontalDrag: event ]
  153. }.
  154. self updateScrollbars
  155. ! !
  156. !MKScrollDecorator methodsFor: 'rendering'!
  157. renderContentOn: html
  158. html div
  159. class: 'mk_scroll_container';
  160. with: [ super renderContentOn: html ].
  161. html div
  162. class: 'mk_scroll_rail vertical';
  163. with: [
  164. verticalScrollbar := html div
  165. class: 'mk_scrollbar';
  166. yourself ].
  167. html div
  168. class: 'mk_scroll_rail horizontal';
  169. with: [
  170. horizontalScrollbar := html div
  171. class: 'mk_scrollbar';
  172. yourself ].
  173. self setupScrollbars
  174. ! !
  175. !MKScrollDecorator methodsFor: 'testing'!
  176. hasHorizontalOverflow
  177. ^ self domOverflow x > 0
  178. !
  179. hasVerticalOverflow
  180. ^ self domOverflow y > 0
  181. ! !
  182. !MKScrollDecorator methodsFor: 'updating'!
  183. updateScrollbars
  184. | width height |
  185. width := self hasHorizontalOverflow
  186. ifTrue: [ self scrollbarSize x max: 10 ]
  187. ifFalse: [ 0 ].
  188. height := self hasVerticalOverflow
  189. ifTrue: [ self scrollbarSize y max: 10 ]
  190. ifFalse: [ 0 ].
  191. horizontalScrollbar asJQuery
  192. width: width asString, '%'.
  193. verticalScrollbar asJQuery
  194. height: height asString, '%'
  195. !
  196. updateScrollbarsPosition
  197. | position |
  198. position := self scrollbarPosition.
  199. horizontalScrollbar asJQuery
  200. css: 'left' put: position x.
  201. verticalScrollbar asJQuery
  202. css: 'top' put: position y
  203. ! !