Skip to content

Commit

Permalink
Make the clock touch friendly
Browse files Browse the repository at this point in the history
  • Loading branch information
javivelasco committed Aug 30, 2015
1 parent b3ec693 commit af51771
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 1 deletion.
6 changes: 5 additions & 1 deletion components/clock/face.cjsx
Expand Up @@ -20,7 +20,11 @@ module.exports = React.createClass

# -- Render
render: ->
<div ref="root" className={css.face} onMouseDown={@props.onMouseDown} style={@_faceStyle()}>
<div ref="root"
className={css.face}
onTouchStart={@props.onTouchStart}
onMouseDown={@props.onMouseDown}
style={@_faceStyle()}>
{ for i, k in @props.numbers
<span className={css.number + (if parseInt(i) == @props.active then ' active' else '')}
style={@_numberStyle(@props.radius - @props.spacing, k + 1)}
Expand Down
26 changes: 26 additions & 0 deletions components/clock/hand.cjsx
Expand Up @@ -36,17 +36,32 @@ module.exports = React.createClass
mousemove : @onMouseMove
mouseup : @onMouseUp

_getTouchEventMap: ->
touchmove: @onTouchMove
touchend: @onTouchEnd

onMouseMove: (event) ->
@_move(_getMousePosition(event))

onTouchMove: (event) ->
@_move(_getTouchPosition(event))

onMouseUp: ->
@_end(@_getMouseEventMap())

onTouchEnd: ->
@_end(@_getTouchEventMap())

# -- Public API
mouseStart: (event) ->
_addEventsToDocument(@_getMouseEventMap())
@_move(_getMousePosition(event))

touchStart: (event) ->
_addEventsToDocument(@_getTouchEventMap())
@_move(_getTouchPosition(event))
_pauseEvent(event)

# -- Internal methods
_move: (position) ->
@props.onHandMouseMove(@_getPositionRadius(position)) if @props.onHandMouseMove
Expand Down Expand Up @@ -85,10 +100,21 @@ _addEventsToDocument = (events) ->
_removeEventsFromDocument = (events) ->
document.removeEventListener(key, events[key], false) for key of events

_pauseEvent = (event) ->
event.stopPropagation()
event.preventDefault()
event.returnValue = false
event.cancelBubble = true
return null

_getMousePosition = (event) ->
x: event.pageX
y: event.pageY

_getTouchPosition = (event) ->
x: event.touches[0]['pageX']
y: event.touches[0]['pageY']

_angle360 = (cx, cy, ex, ey) ->
theta = _angle(cx, cy, ex, ey)
if (theta < 0) then 360 + theta else theta
Expand Down
4 changes: 4 additions & 0 deletions components/clock/hours.cjsx
Expand Up @@ -25,6 +25,9 @@ module.exports = React.createClass
_onMouseDown: (event)->
@refs.hand.mouseStart(event)

_onTouchStart: (event) ->
@refs.hand.touchStart(event)

# -- Internal Methods
_valueFromDegrees: (degrees) ->
if @props.format == 'ampm' || @props.format == '24hr' && @state.innerNumber
Expand All @@ -41,6 +44,7 @@ module.exports = React.createClass

<div>
<Face
onTouchStart={@_onTouchStart}
onMouseDown={@_onMouseDown}
numbers={if @props.format == '24hr' then OUTER_NUMBERS else INNER_NUMBERS}
spacing={@props.spacing}
Expand Down
4 changes: 4 additions & 0 deletions components/clock/minutes.cjsx
Expand Up @@ -19,12 +19,16 @@ module.exports = React.createClass
_onMouseDown: (event)->
@refs.hand.mouseStart(event)

_onTouchStart: (event) ->
@refs.hand.touchStart(event)

# -- Render
render: ->
handClass = if MINUTES.indexOf(('0' + @props.selected).slice(-2)) == -1 then 'smallKnob' else ''

<div>
<Face
onTouchStart={@_onTouchStart}
onMouseDown={@_onMouseDown}
numbers={MINUTES}
spacing={@props.spacing}
Expand Down

0 comments on commit af51771

Please sign in to comment.