⌈⌋ ⎇ branch:  Bitrhythm


Hex Artifact Content

Artifact acf82a95476c120135b95e2b219a8b5865a260c8ff8ad7120f5d1ef6991e7e18:


0000: 27 75 73 65 20 73 74 72 69 63 74 27 3b 0a 0a 69  'use strict';..i
0010: 6d 70 6f 72 74 20 6d 61 74 68 20 66 72 6f 6d 20  mport math from 
0020: 27 2e 2e 2f 75 74 69 6c 2f 6d 61 74 68 27 3b 0a  '../util/math';.
0030: 69 6d 70 6f 72 74 20 54 6f 67 67 6c 65 4d 6f 64  import ToggleMod
0040: 65 6c 20 66 72 6f 6d 20 27 2e 2e 2f 6d 6f 64 65  el from '../mode
0050: 6c 73 2f 74 6f 67 67 6c 65 27 3b 0a 0a 0a 2f 2a  ls/toggle';.../*
0060: 0a 68 6f 77 20 74 6f 20 75 73 65 20 3a 0a 0a 64  .how to use :..d
0070: 69 61 6c 2e 69 6e 74 65 72 61 63 74 69 6f 6e 20  ial.interaction 
0080: 3d 20 6e 65 77 20 48 61 6e 64 6c 65 28 27 72 61  = new Handle('ra
0090: 64 69 61 6c 27 2c 27 72 65 6c 61 74 69 76 65 27  dial','relative'
00a0: 2c 74 68 69 73 2e 77 69 64 74 68 2c 74 68 69 73  ,this.width,this
00b0: 2e 68 65 69 67 68 74 29 3b 0a 2f 2f 20 64 69 61  .height);.// dia
00c0: 6c 2e 69 6e 74 65 72 61 63 74 69 6f 6e 2e 6d 6f  l.interaction.mo
00d0: 64 65 20 3d 20 27 72 65 6c 61 74 69 76 65 27 0a  de = 'relative'.
00e0: 2f 2f 20 64 69 61 6c 2e 69 6e 74 65 72 61 63 74  // dial.interact
00f0: 69 6f 6e 2e 64 69 72 65 63 74 69 6f 6e 20 3d 20  ion.direction = 
0100: 27 72 61 64 69 61 6c 27 0a 0a 6f 6e 20 63 6c 69  'radial'..on cli
0110: 63 6b 3a 0a 64 69 61 6c 2e 69 6e 74 65 72 61 63  ck:.dial.interac
0120: 74 69 6f 6e 2e 61 6e 63 68 6f 72 20 3d 20 74 68  tion.anchor = th
0130: 69 73 2e 6d 6f 75 73 65 3b 0a 0a 6f 6e 20 6d 6f  is.mouse;..on mo
0140: 76 65 3a 0a 64 69 61 6c 2e 69 6e 74 65 72 61 63  ve:.dial.interac
0150: 74 69 6f 6e 2e 75 70 64 61 74 65 28 74 68 69 73  tion.update(this
0160: 2e 6d 6f 75 73 65 29 3b 0a 0a 63 6f 6e 73 6f 6c  .mouse);..consol
0170: 65 2e 6c 6f 67 28 20 64 69 61 6c 2e 69 6e 74 65  e.log( dial.inte
0180: 72 61 63 74 69 6f 6e 2e 76 61 6c 75 65 20 29 3b  raction.value );
0190: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 72   should be a nor
01a0: 6d 61 6c 69 7a 65 64 20 76 61 6c 75 65 2e 0a 0a  malized value...
01b0: 2a 2f 0a 0a 2f 2a 0a 20 20 61 62 73 6f 6c 75 74  */../*.  absolut
01c0: 65 2f 72 65 6c 61 74 69 76 65 20 61 72 65 20 70  e/relative are p
01d0: 72 6f 70 65 72 74 79 3a 20 6d 6f 64 65 0a 20 20  roperty: mode.  
01e0: 72 61 64 69 61 6c 2f 76 65 72 74 69 63 61 6c 2f  radial/vertical/
01f0: 68 6f 72 69 7a 6f 6e 74 61 6c 2f 32 64 20 61 72  horizontal/2d ar
0200: 65 20 70 72 6f 70 65 72 74 79 3a 20 64 69 72 65  e property: dire
0210: 63 74 69 6f 6e 0a 0a 20 20 70 6c 61 6e 20 3a 0a  ction..  plan :.
0220: 0a 20 20 69 66 20 72 65 6c 61 74 69 76 65 20 2d  .  if relative -
0230: 2d 0a 20 20 4e 4f 20 6f 6e 20 63 6c 69 63 6b 2c  -.  NO on click,
0240: 20 67 65 74 20 76 61 6c 75 65 20 6f 66 66 73 65   get value offse
0250: 74 20 62 65 74 77 65 65 6e 20 63 75 72 72 65 6e  t between curren
0260: 74 20 76 61 6c 75 65 20 61 6e 64 20 63 6c 69 63  t value and clic
0270: 6b 20 76 61 6c 75 65 2e 0a 20 20 4e 4f 20 6f 6e  k value..  NO on
0280: 20 6d 6f 76 65 2c 20 75 73 65 20 63 6c 69 63 6b   move, use click
0290: 20 76 61 6c 75 65 20 2d 20 6f 66 66 73 65 74 0a   value - offset.
02a0: 20 20 49 4e 53 54 45 41 44 0a 20 20 75 73 65 20    INSTEAD.  use 
02b0: 64 65 6c 74 61 20 2d 2d 20 62 63 20 76 65 72 74  delta -- bc vert
02c0: 69 63 61 6c 20 6d 6f 74 69 6f 6e 20 6f 6e 20 64  ical motion on d
02d0: 69 61 6c 20 69 73 20 69 6d 70 6f 73 73 69 62 6c  ial is impossibl
02e0: 65 20 6f 74 68 65 72 77 69 73 65 0a 20 20 61 6c  e otherwise.  al
02f0: 73 6f 20 61 6c 6c 6f 77 20 74 6f 20 73 65 74 20  so allow to set 
0300: 73 65 6e 73 69 74 69 76 69 74 79 0a 0a 2a 2f 0a  sensitivity..*/.
0310: 0a 65 78 70 6f 72 74 20 63 6c 61 73 73 20 48 61  .export class Ha
0320: 6e 64 6c 65 20 7b 0a 0a 20 20 63 6f 6e 73 74 72  ndle {..  constr
0330: 75 63 74 6f 72 28 6d 6f 64 65 3d 27 61 62 73 6f  uctor(mode='abso
0340: 6c 75 74 65 27 2c 64 69 72 65 63 74 69 6f 6e 3d  lute',direction=
0350: 27 76 65 72 74 69 63 61 6c 27 2c 78 62 6f 75 6e  'vertical',xboun
0360: 64 3d 5b 30 2c 31 30 30 5d 2c 79 62 6f 75 6e 64  d=[0,100],ybound
0370: 3d 5b 30 2c 31 30 30 5d 29 20 7b 0a 20 20 20 20  =[0,100]) {.    
0380: 74 68 69 73 2e 6d 6f 64 65 20 3d 20 6d 6f 64 65  this.mode = mode
0390: 3b 0a 20 20 20 20 74 68 69 73 2e 64 69 72 65 63  ;.    this.direc
03a0: 74 69 6f 6e 20 3d 20 64 69 72 65 63 74 69 6f 6e  tion = direction
03b0: 3b 0a 20 20 20 20 74 68 69 73 2e 70 72 65 76 69  ;.    this.previ
03c0: 6f 75 73 20 3d 20 30 3b 0a 20 20 20 20 74 68 69  ous = 0;.    thi
03d0: 73 2e 76 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20  s.value = 0;.   
03e0: 20 74 68 69 73 2e 73 65 6e 73 69 74 69 76 69 74   this.sensitivit
03f0: 79 20 3d 20 31 3b 0a 20 20 20 20 74 68 69 73 2e  y = 1;.    this.
0400: 72 65 73 69 7a 65 28 78 62 6f 75 6e 64 2c 79 62  resize(xbound,yb
0410: 6f 75 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ound);.  }..  re
0420: 73 69 7a 65 28 78 62 6f 75 6e 64 2c 79 62 6f 75  size(xbound,ybou
0430: 6e 64 29 20 7b 0a 20 20 20 20 74 68 69 73 2e 62  nd) {.    this.b
0440: 6f 75 6e 64 61 72 79 20 3d 20 7b 0a 20 20 20 20  oundary = {.    
0450: 20 20 6d 69 6e 3a 20 7b 0a 20 20 20 20 20 20 20    min: {.       
0460: 20 78 3a 20 78 62 6f 75 6e 64 5b 30 5d 2c 0a 20   x: xbound[0],. 
0470: 20 20 20 20 20 20 20 79 3a 20 79 62 6f 75 6e 64         y: ybound
0480: 5b 30 5d 0a 20 20 20 20 20 20 7d 2c 0a 20 20 20  [0].      },.   
0490: 20 20 20 6d 61 78 3a 20 7b 0a 20 20 20 20 20 20     max: {.      
04a0: 20 20 78 3a 20 78 62 6f 75 6e 64 5b 31 5d 2c 0a    x: xbound[1],.
04b0: 20 20 20 20 20 20 20 20 79 3a 20 79 62 6f 75 6e          y: yboun
04c0: 64 5b 31 5d 0a 20 20 20 20 20 20 7d 2c 0a 20 20  d[1].      },.  
04d0: 20 20 20 20 63 65 6e 74 65 72 3a 20 7b 0a 20 20      center: {.  
04e0: 20 20 20 20 20 20 78 3a 20 28 78 62 6f 75 6e 64        x: (xbound
04f0: 5b 31 5d 20 2d 20 78 62 6f 75 6e 64 5b 30 5d 29  [1] - xbound[0])
0500: 2f 32 20 2b 20 78 62 6f 75 6e 64 5b 30 5d 2c 0a  /2 + xbound[0],.
0510: 20 20 20 20 20 20 20 20 79 3a 20 28 79 62 6f 75          y: (ybou
0520: 6e 64 5b 31 5d 20 2d 20 79 62 6f 75 6e 64 5b 30  nd[1] - ybound[0
0530: 5d 29 2f 32 20 2b 20 79 62 6f 75 6e 64 5b 30 5d  ])/2 + ybound[0]
0540: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 3b 0a  .      }.    };.
0550: 20 20 7d 0a 0a 20 20 73 65 74 20 61 6e 63 68 6f    }..  set ancho
0560: 72 28 6d 6f 75 73 65 29 20 7b 0a 20 20 20 20 74  r(mouse) {.    t
0570: 68 69 73 2e 5f 61 6e 63 68 6f 72 20 3d 20 74 68  his._anchor = th
0580: 69 73 2e 63 6f 6e 76 65 72 74 50 6f 73 69 74 69  is.convertPositi
0590: 6f 6e 54 6f 56 61 6c 75 65 28 6d 6f 75 73 65 29  onToValue(mouse)
05a0: 3b 0a 20 20 7d 0a 0a 20 20 67 65 74 20 61 6e 63  ;.  }..  get anc
05b0: 68 6f 72 28 29 20 7b 0a 20 20 20 20 72 65 74 75  hor() {.    retu
05c0: 72 6e 20 74 68 69 73 2e 5f 61 6e 63 68 6f 72 3b  rn this._anchor;
05d0: 0a 20 20 7d 0a 0a 0a 20 20 75 70 64 61 74 65 28  .  }...  update(
05e0: 6d 6f 75 73 65 29 20 7b 0a 20 20 20 20 69 66 20  mouse) {.    if 
05f0: 28 74 68 69 73 2e 6d 6f 64 65 3d 3d 3d 27 72 65  (this.mode==='re
0600: 6c 61 74 69 76 65 27 29 20 7b 0a 20 20 20 20 20  lative') {.     
0610: 20 6c 65 74 20 69 6e 63 72 65 6d 65 6e 74 20 3d   let increment =
0620: 20 74 68 69 73 2e 63 6f 6e 76 65 72 74 50 6f 73   this.convertPos
0630: 69 74 69 6f 6e 54 6f 56 61 6c 75 65 28 6d 6f 75  itionToValue(mou
0640: 73 65 29 20 2d 20 74 68 69 73 2e 61 6e 63 68 6f  se) - this.ancho
0650: 72 3b 0a 20 20 20 20 20 20 69 66 20 28 4d 61 74  r;.      if (Mat
0660: 68 2e 61 62 73 28 69 6e 63 72 65 6d 65 6e 74 29  h.abs(increment)
0670: 20 3e 20 30 2e 35 29 20 7b 20 69 6e 63 72 65 6d   > 0.5) { increm
0680: 65 6e 74 20 3d 20 30 3b 20 7d 0a 20 20 20 20 20  ent = 0; }.     
0690: 20 74 68 69 73 2e 61 6e 63 68 6f 72 20 3d 20 6d   this.anchor = m
06a0: 6f 75 73 65 3b 0a 20 20 20 20 20 20 74 68 69 73  ouse;.      this
06b0: 2e 76 61 6c 75 65 20 3d 20 74 68 69 73 2e 76 61  .value = this.va
06c0: 6c 75 65 20 2b 20 69 6e 63 72 65 6d 65 6e 74 20  lue + increment 
06d0: 2a 20 74 68 69 73 2e 73 65 6e 73 69 74 69 76 69  * this.sensitivi
06e0: 74 79 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ty;.    } else {
06f0: 0a 20 20 20 20 20 20 74 68 69 73 2e 76 61 6c 75  .      this.valu
0700: 65 20 3d 20 74 68 69 73 2e 63 6f 6e 76 65 72 74  e = this.convert
0710: 50 6f 73 69 74 69 6f 6e 54 6f 56 61 6c 75 65 28  PositionToValue(
0720: 6d 6f 75 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  mouse);.    }.  
0730: 20 20 74 68 69 73 2e 76 61 6c 75 65 20 3d 20 6d    this.value = m
0740: 61 74 68 2e 63 6c 69 70 28 74 68 69 73 2e 76 61  ath.clip(this.va
0750: 6c 75 65 2c 30 2c 31 29 3b 0a 20 20 7d 0a 0a 20  lue,0,1);.  }.. 
0760: 20 63 6f 6e 76 65 72 74 50 6f 73 69 74 69 6f 6e   convertPosition
0770: 54 6f 56 61 6c 75 65 28 63 75 72 72 65 6e 74 29  ToValue(current)
0780: 20 7b 0a 20 20 20 20 73 77 69 74 63 68 28 74 68   {.    switch(th
0790: 69 73 2e 64 69 72 65 63 74 69 6f 6e 29 20 7b 0a  is.direction) {.
07a0: 20 20 20 20 20 20 63 61 73 65 20 27 72 61 64 69        case 'radi
07b0: 61 6c 27 3a 0a 20 20 20 20 20 20 20 20 6c 65 74  al':.        let
07c0: 20 70 6f 73 69 74 69 6f 6e 20 3d 20 6d 61 74 68   position = math
07d0: 2e 74 6f 50 6f 6c 61 72 28 63 75 72 72 65 6e 74  .toPolar(current
07e0: 2e 78 20 2d 20 74 68 69 73 2e 62 6f 75 6e 64 61  .x - this.bounda
07f0: 72 79 2e 63 65 6e 74 65 72 2e 78 2c 20 63 75 72  ry.center.x, cur
0800: 72 65 6e 74 2e 79 20 2d 20 74 68 69 73 2e 62 6f  rent.y - this.bo
0810: 75 6e 64 61 72 79 2e 63 65 6e 74 65 72 2e 79 29  undary.center.y)
0820: 3b 0a 20 20 20 20 20 20 20 20 70 6f 73 69 74 69  ;.        positi
0830: 6f 6e 20 3d 20 70 6f 73 69 74 69 6f 6e 2e 61 6e  on = position.an
0840: 67 6c 65 20 2f 20 28 4d 61 74 68 2e 50 49 2a 32  gle / (Math.PI*2
0850: 29 3b 0a 20 20 20 20 20 20 20 20 70 6f 73 69 74  );.        posit
0860: 69 6f 6e 20 3d 20 28 28 70 6f 73 69 74 69 6f 6e  ion = ((position
0870: 20 2d 20 30 2e 32 35 29 20 2b 20 31 29 20 25 20   - 0.25) + 1) % 
0880: 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
0890: 6e 20 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 20 20  n position;.    
08a0: 20 20 63 61 73 65 20 27 76 65 72 74 69 63 61 6c    case 'vertical
08b0: 27 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ':.        retur
08c0: 6e 20 6d 61 74 68 2e 73 63 61 6c 65 28 63 75 72  n math.scale(cur
08d0: 72 65 6e 74 2e 79 2c 74 68 69 73 2e 62 6f 75 6e  rent.y,this.boun
08e0: 64 61 72 79 2e 6d 69 6e 2e 79 2c 74 68 69 73 2e  dary.min.y,this.
08f0: 62 6f 75 6e 64 61 72 79 2e 6d 61 78 2e 79 2c 30  boundary.max.y,0
0900: 2c 31 29 3b 0a 20 20 20 20 20 20 63 61 73 65 20  ,1);.      case 
0910: 27 68 6f 72 69 7a 6f 6e 74 61 6c 27 3a 0a 20 20  'horizontal':.  
0920: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 61 74        return mat
0930: 68 2e 73 63 61 6c 65 28 63 75 72 72 65 6e 74 2e  h.scale(current.
0940: 78 2c 74 68 69 73 2e 62 6f 75 6e 64 61 72 79 2e  x,this.boundary.
0950: 6d 69 6e 2e 78 2c 74 68 69 73 2e 62 6f 75 6e 64  min.x,this.bound
0960: 61 72 79 2e 6d 61 78 2e 78 2c 30 2c 31 29 3b 0a  ary.max.x,0,1);.
0970: 20 20 20 20 7d 0a 20 20 7d 0a 0a 7d 0a 0a 0a 65      }.  }..}...e
0980: 78 70 6f 72 74 20 63 6c 61 73 73 20 42 75 74 74  xport class Butt
0990: 6f 6e 20 7b 0a 0a 20 20 63 6f 6e 73 74 72 75 63  on {..  construc
09a0: 74 6f 72 28 6d 6f 64 65 3d 27 62 75 74 74 6f 6e  tor(mode='button
09b0: 27 29 20 7b 0a 20 20 20 20 74 68 69 73 2e 6d 6f  ') {.    this.mo
09c0: 64 65 20 3d 20 6d 6f 64 65 3b 0a 20 20 20 20 74  de = mode;.    t
09d0: 68 69 73 2e 73 74 61 74 65 20 3d 20 6e 65 77 20  his.state = new 
09e0: 54 6f 67 67 6c 65 4d 6f 64 65 6c 28 29 3b 0a 20  ToggleModel();. 
09f0: 20 20 20 74 68 69 73 2e 70 61 69 6e 74 62 72 75     this.paintbru
0a00: 73 68 20 3d 20 66 61 6c 73 65 3b 0a 20 20 7d 0a  sh = false;.  }.
0a10: 0a 20 20 63 6c 69 63 6b 28 29 20 7b 0a 20 20 20  .  click() {.   
0a20: 20 73 77 69 74 63 68 20 28 74 68 69 73 2e 6d 6f   switch (this.mo
0a30: 64 65 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65  de) {.      case
0a40: 20 27 69 6d 70 75 6c 73 65 27 3a 0a 20 20 20 20   'impulse':.    
0a50: 20 20 20 20 74 68 69 73 2e 73 74 61 74 65 2e 6f      this.state.o
0a60: 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20  n();.        if 
0a70: 28 74 68 69 73 2e 74 69 6d 65 6f 75 74 29 20 7b  (this.timeout) {
0a80: 0a 20 20 20 20 20 20 20 20 20 20 63 6c 65 61 72  .          clear
0a90: 54 69 6d 65 6f 75 74 28 74 68 69 73 2e 74 69 6d  Timeout(this.tim
0aa0: 65 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  eout);.        }
0ab0: 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e 74 69  .        this.ti
0ac0: 6d 65 6f 75 74 20 3d 20 73 65 74 54 69 6d 65 6f  meout = setTimeo
0ad0: 75 74 28 74 68 69 73 2e 73 74 61 74 65 2e 6f 66  ut(this.state.of
0ae0: 66 2e 62 69 6e 64 28 74 68 69 73 29 2c 33 30 29  f.bind(this),30)
0af0: 3b 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e 65  ;.        this.e
0b00: 6d 69 74 28 27 63 68 61 6e 67 65 27 2c 74 68 69  mit('change',thi
0b10: 73 2e 73 74 61 74 65 29 3b 0a 20 20 20 20 20 20  s.state);.      
0b20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
0b30: 61 73 65 20 27 62 75 74 74 6f 6e 27 3a 0a 20 20  ase 'button':.  
0b40: 20 20 20 20 20 20 74 68 69 73 2e 74 75 72 6e 4f        this.turnO
0b50: 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 74 68 69  n();.        thi
0b60: 73 2e 65 6d 69 74 28 27 63 68 61 6e 67 65 27 2c  s.emit('change',
0b70: 74 68 69 73 2e 73 74 61 74 65 29 3b 0a 20 20 20  this.state);.   
0b80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0b90: 20 20 63 61 73 65 20 27 61 66 74 65 72 74 6f 75    case 'aftertou
0ba0: 63 68 27 3a 0a 20 20 20 20 20 20 20 20 74 68 69  ch':.        thi
0bb0: 73 2e 70 6f 73 69 74 69 6f 6e 20 3d 20 7b 0a 20  s.position = {. 
0bc0: 20 20 20 20 20 20 20 20 20 78 3a 20 6d 61 74 68           x: math
0bd0: 2e 63 6c 69 70 28 74 68 69 73 2e 6d 6f 75 73 65  .clip(this.mouse
0be0: 2e 78 20 2f 20 74 68 69 73 2e 77 69 64 74 68 2c  .x / this.width,
0bf0: 30 2c 31 29 2c 0a 20 20 20 20 20 20 20 20 20 20  0,1),.          
0c00: 79 3a 20 6d 61 74 68 2e 63 6c 69 70 28 31 20 2d  y: math.clip(1 -
0c10: 20 74 68 69 73 2e 6d 6f 75 73 65 2e 79 20 2f 20   this.mouse.y / 
0c20: 74 68 69 73 2e 68 65 69 67 68 74 2c 30 2c 31 29  this.height,0,1)
0c30: 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  .        };.    
0c40: 20 20 20 20 74 68 69 73 2e 74 75 72 6e 4f 6e 28      this.turnOn(
0c50: 29 3b 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e  );.        this.
0c60: 65 6d 69 74 28 27 63 68 61 6e 67 65 27 2c 7b 0a  emit('change',{.
0c70: 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 3a            state:
0c80: 20 74 68 69 73 2e 73 74 61 74 65 2c 0a 20 20 20   this.state,.   
0c90: 20 20 20 20 20 20 20 78 3a 20 74 68 69 73 2e 70         x: this.p
0ca0: 6f 73 69 74 69 6f 6e 2e 78 2c 0a 20 20 20 20 20  osition.x,.     
0cb0: 20 20 20 20 20 79 3a 20 74 68 69 73 2e 70 6f 73       y: this.pos
0cc0: 69 74 69 6f 6e 2e 79 2c 0a 20 20 20 20 20 20 20  ition.y,.       
0cd0: 20 7d 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   });.        bre
0ce0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 27  ak;.      case '
0cf0: 74 6f 67 67 6c 65 27 3a 0a 20 20 20 20 20 20 20  toggle':.       
0d00: 20 74 68 69 73 2e 66 6c 69 70 28 29 3b 0a 20 20   this.flip();.  
0d10: 20 20 20 20 20 20 74 68 69 73 2e 65 6d 69 74 28        this.emit(
0d20: 27 63 68 61 6e 67 65 27 2c 74 68 69 73 2e 73 74  'change',this.st
0d30: 61 74 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ate);.        br
0d40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a  eak;.    }..  }.
0d50: 0a 20 20 6d 6f 76 65 28 29 20 7b 0a 20 20 20 20  .  move() {.    
0d60: 69 66 20 28 74 68 69 73 2e 6d 6f 64 65 3d 3d 3d  if (this.mode===
0d70: 27 61 66 74 65 72 74 6f 75 63 68 27 29 20 7b 0a  'aftertouch') {.
0d80: 20 20 20 20 20 20 74 68 69 73 2e 70 6f 73 69 74        this.posit
0d90: 69 6f 6e 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  ion = {.        
0da0: 78 3a 20 6d 61 74 68 2e 63 6c 69 70 28 74 68 69  x: math.clip(thi
0db0: 73 2e 6d 6f 75 73 65 2e 78 20 2f 20 74 68 69 73  s.mouse.x / this
0dc0: 2e 77 69 64 74 68 2c 30 2c 31 29 2c 0a 20 20 20  .width,0,1),.   
0dd0: 20 20 20 20 20 79 3a 20 6d 61 74 68 2e 63 6c 69       y: math.cli
0de0: 70 28 31 20 2d 20 74 68 69 73 2e 6d 6f 75 73 65  p(1 - this.mouse
0df0: 2e 79 20 2f 20 74 68 69 73 2e 68 65 69 67 68 74  .y / this.height
0e00: 2c 30 2c 31 29 0a 20 20 20 20 20 20 7d 3b 0a 20  ,0,1).      };. 
0e10: 20 20 20 20 20 74 68 69 73 2e 65 6d 69 74 28 27       this.emit('
0e20: 63 68 61 6e 67 65 27 2c 7b 0a 20 20 20 20 20 20  change',{.      
0e30: 20 20 73 74 61 74 65 3a 20 74 68 69 73 2e 73 74    state: this.st
0e40: 61 74 65 2c 0a 20 20 20 20 20 20 20 20 78 3a 20  ate,.        x: 
0e50: 74 68 69 73 2e 70 6f 73 69 74 69 6f 6e 2e 78 2c  this.position.x,
0e60: 0a 20 20 20 20 20 20 20 20 79 3a 20 74 68 69 73  .        y: this
0e70: 2e 70 6f 73 69 74 69 6f 6e 2e 79 2c 0a 20 20 20  .position.y,.   
0e80: 20 20 20 7d 29 3b 0a 20 20 20 20 20 20 74 68 69     });.      thi
0e90: 73 2e 72 65 6e 64 65 72 28 29 3b 0a 20 20 20 20  s.render();.    
0ea0: 7d 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65  }.  }..  release
0eb0: 28 29 20 7b 0a 20 20 20 20 73 77 69 74 63 68 20  () {.    switch 
0ec0: 28 74 68 69 73 2e 6d 6f 64 65 29 20 7b 0a 20 20  (this.mode) {.  
0ed0: 20 20 20 20 63 61 73 65 20 27 62 75 74 74 6f 6e      case 'button
0ee0: 27 3a 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e  ':.        this.
0ef0: 74 75 72 6e 4f 66 66 28 29 3b 0a 20 20 20 20 20  turnOff();.     
0f00: 20 20 20 74 68 69 73 2e 65 6d 69 74 28 27 63 68     this.emit('ch
0f10: 61 6e 67 65 27 2c 74 68 69 73 2e 73 74 61 74 65  ange',this.state
0f20: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
0f30: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 27 61 66  ;.      case 'af
0f40: 74 65 72 74 6f 75 63 68 27 3a 0a 20 20 20 20 20  tertouch':.     
0f50: 20 20 20 74 68 69 73 2e 74 75 72 6e 4f 66 66 28     this.turnOff(
0f60: 29 3b 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e  );.        this.
0f70: 70 6f 73 69 74 69 6f 6e 20 3d 20 7b 0a 20 20 20  position = {.   
0f80: 20 20 20 20 20 20 20 78 3a 20 74 68 69 73 2e 6d         x: this.m
0f90: 6f 75 73 65 2e 78 20 2f 20 74 68 69 73 2e 77 69  ouse.x / this.wi
0fa0: 64 74 68 2c 0a 20 20 20 20 20 20 20 20 20 20 79  dth,.          y
0fb0: 3a 20 31 20 2d 20 74 68 69 73 2e 6d 6f 75 73 65  : 1 - this.mouse
0fc0: 2e 79 20 2f 20 74 68 69 73 2e 68 65 69 67 68 74  .y / this.height
0fd0: 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  .        };.    
0fe0: 20 20 20 20 74 68 69 73 2e 65 6d 69 74 28 27 63      this.emit('c
0ff0: 68 61 6e 67 65 27 2c 7b 0a 20 20 20 20 20 20 20  hange',{.       
1000: 20 20 20 73 74 61 74 65 3a 20 74 68 69 73 2e 73     state: this.s
1010: 74 61 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20  tate,.          
1020: 78 3a 20 74 68 69 73 2e 70 6f 73 69 74 69 6f 6e  x: this.position
1030: 2e 78 2c 0a 20 20 20 20 20 20 20 20 20 20 79 3a  .x,.          y:
1040: 20 74 68 69 73 2e 70 6f 73 69 74 69 6f 6e 2e 79   this.position.y
1050: 2c 0a 20 20 20 20 20 20 20 20 7d 29 3b 0a 20 20  ,.        });.  
1060: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1070: 20 7d 0a 20 20 7d 0a 7d 0a                        }.  }.}.