|
1 | 1 | // etoile is a simple 2D render engine for web and it don't take complex rendering into account.
|
2 | 2 | // So it's no need to implement a complex event algorithm or hit mode.
|
3 | 3 | // If one day etoile need to build as a useful library. Pls rewrite it!
|
| 4 | +// All of implementation don't want to consider the compatibility of the browser. |
4 | 5 |
|
5 | 6 | import { Display } from '../etoile/graph/display'
|
6 | 7 | import { Render, Event as _Event, easing, etoile } from '../etoile'
|
@@ -274,6 +275,36 @@ export class SelfEvent extends RegisterModule {
|
274 | 275 | smoothDrawing(this)
|
275 | 276 | }
|
276 | 277 |
|
| 278 | + onwheel(this: SelfEventContenxt, metadata: PrimitiveEventMetadata<'wheel'>) { |
| 279 | + const { self, treemap } = this |
| 280 | + // @ts-expect-error |
| 281 | + const wheelDelta = metadata.native.wheelDelta |
| 282 | + const absWheelDelta = Math.abs(wheelDelta) |
| 283 | + const offsetX = metadata.native.offsetX |
| 284 | + const offsetY = metadata.native.offsetY |
| 285 | + |
| 286 | + if (wheelDelta === 0) { |
| 287 | + return |
| 288 | + } |
| 289 | + self.forceDestroy = true |
| 290 | + self.isAnimating = true |
| 291 | + treemap.reset() |
| 292 | + const factor = absWheelDelta > 3 ? 1.4 : absWheelDelta > 1 ? 1.2 : 1.1 |
| 293 | + const delta = wheelDelta > 0 ? factor : 1 / factor |
| 294 | + |
| 295 | + self.scaleRatio *= delta |
| 296 | + |
| 297 | + const translateX = offsetX - (offsetX - self.translateX) * delta |
| 298 | + const translateY = offsetY - (offsetY - self.translateY) * delta |
| 299 | + self.translateX = translateX |
| 300 | + self.translateY = translateY |
| 301 | + applyGraphTransform(treemap.elements, self.translateX, self.translateY, self.scaleRatio) |
| 302 | + |
| 303 | + treemap.update() |
| 304 | + self.forceDestroy = false |
| 305 | + self.isAnimating = false |
| 306 | + } |
| 307 | + |
277 | 308 | init(app: App, treemap: TreemapLayout, render: Render): void {
|
278 | 309 | const event = this.event
|
279 | 310 | const nativeEvents: Array<ReturnType<typeof bindPrimitiveEvent>> = []
|
@@ -305,6 +336,9 @@ export class SelfEvent extends RegisterModule {
|
305 | 336 | selfEvt('mousemove', this.onmousemove)
|
306 | 337 | selfEvt('mouseout', this.onmouseout)
|
307 | 338 |
|
| 339 | + // wheel |
| 340 | + selfEvt('wheel', this.onwheel) |
| 341 | + |
308 | 342 | applyZoomEvent({ treemap, self: this })
|
309 | 343 |
|
310 | 344 | treemap.event.on('cleanup:selfevent', () => {
|
|
0 commit comments