summaryrefslogtreecommitdiff
path: root/animism-align/frontend/views/align/components
diff options
context:
space:
mode:
authorJules Laplace <julescarbon@gmail.com>2020-06-28 20:48:28 +0200
committerJules Laplace <julescarbon@gmail.com>2020-06-28 20:48:28 +0200
commit4aaea8a6fe04b98d2ec67ca49c4c1655e58f2b60 (patch)
tree8243dcf3822c2724b55003e4ce4df2c5062c83b1 /animism-align/frontend/views/align/components
parent2b347f0bd515e7a3d7918c61dc3b8a0c1be99c2c (diff)
adding canvas, drawing tick timestamps based on zoom
Diffstat (limited to 'animism-align/frontend/views/align/components')
-rw-r--r--animism-align/frontend/views/align/components/ticks.component.js83
-rw-r--r--animism-align/frontend/views/align/components/timeline.component.js75
2 files changed, 158 insertions, 0 deletions
diff --git a/animism-align/frontend/views/align/components/ticks.component.js b/animism-align/frontend/views/align/components/ticks.component.js
new file mode 100644
index 0000000..3baa1f6
--- /dev/null
+++ b/animism-align/frontend/views/align/components/ticks.component.js
@@ -0,0 +1,83 @@
+import React, { Component } from 'react'
+
+import { ZOOM_STEPS, ZOOM_TICK_INTERVAL } from '../constants'
+import { timestamp } from '../../../util'
+
+export default class Ticks extends Component {
+ render() {
+ let { start_ts, zoom, duration } = this.props.timeline
+ start_ts = 65.0
+ duration /= 10
+ zoom = 2
+ const width = window.innerWidth
+
+ let secondsPerPixel = ZOOM_STEPS[zoom] / 10 // 0.1 sec / step
+ let pixelTimeDuration = 1 / secondsPerPixel // secs per pixel
+ let widthTimeDuration = width / pixelTimeDuration // secs per pixel
+ console.log(secondsPerPixel, pixelTimeDuration)
+ console.log('width in seconds', widthTimeDuration)
+
+ let secondsPerTick = ZOOM_STEPS[zoom] * 10 // secs
+ let pixelsPerTick = secondsPerTick * pixelTimeDuration
+ console.log('pixels per tick', pixelsPerTick)
+
+ let labelSpacing = pixelsPerTick
+ let subdivision = secondsPerTick
+ while (labelSpacing < 200) {
+ labelSpacing *= 2
+ subdivision *= 2
+ }
+
+ console.log('start ts', start_ts)
+ let pixelOffset = (start_ts / secondsPerPixel)
+ let pixelRemainder = pixelOffset % labelSpacing
+ // let startOffset = pixelsPerTick - (startTiming % pixelsPerTick)
+ let startOffset = labelSpacing - pixelRemainder
+ let startTiming = (pixelOffset + startOffset) * secondsPerPixel
+
+ let tickCount = Math.ceil(width / labelSpacing)
+ let offset, timing, tickLabels = [], ticks = []
+ for (var i = -1; i < tickCount; i++) {
+ offset = i * labelSpacing + startOffset
+ if (offset + 20 > width) continue
+ timing = i * subdivision + startTiming
+ if (timing > duration) {
+ break
+ }
+ tickLabels.push(
+ <div className='tickLabel' key={"tickLabel_" + i}
+ style={{
+ left: Math.floor(offset)
+ }}>
+ {timestamp(timing)}
+ </div>
+ )
+ }
+
+ // tickLabels.push(
+ // <div className='tickLabel tickLabelTotal' key={"tickLabel_total"}
+ // style={{
+ // left: width
+ // }}>
+ // {timestamp(duration, 1)}
+ // </div>
+ // )
+ // for (var i = 0; i < minuteCount; i += 1) {
+ // offset = i * labelSpacing
+ // timing = i * subdivision
+ // ticks.push(
+ // <div className='tick' key={"tick_" + i}
+ // style={{
+ // left: Math.floor(offset),
+ // }}
+ // />
+ // )
+ // }
+ return (
+ <div className='ticks'>
+ {ticks}
+ {tickLabels}
+ </div>
+ )
+ }
+}
diff --git a/animism-align/frontend/views/align/components/timeline.component.js b/animism-align/frontend/views/align/components/timeline.component.js
new file mode 100644
index 0000000..af3c57b
--- /dev/null
+++ b/animism-align/frontend/views/align/components/timeline.component.js
@@ -0,0 +1,75 @@
+import React, { Component } from 'react'
+// import { Link } from 'react-router-dom'
+// import { bindActionCreators } from 'redux'
+import { connect } from 'react-redux'
+
+import actions from '../../../actions'
+// import * as uploadActions from './upload.actions'
+
+import Ticks from './ticks.component'
+
+import * as constants from '../constants'
+
+class Timeline extends Component {
+ constructor(props){
+ super(props)
+ this.canvasRef = React.createRef()
+ this.handleKeydown = this.handleKeydown.bind(this)
+ }
+ componentDidMount() {
+ this.bind()
+ this.resize()
+ this.draw()
+ }
+ componentDidUpdate() {
+ this.draw()
+ }
+ componentWillUnmount() {
+ this.unbind()
+ }
+ bind() {
+ document.addEventListener('keydown', this.handleKeydown)
+ }
+ unbind() {
+ document.removeEventListener('keydown', this.handleKeydown)
+ }
+ handleKeydown(e) {
+ // console.log(e.shiftKey, e.keyCode)
+ }
+ resize() {
+ const canvas = this.canvasRef.current
+ canvas.width = window.innerWidth
+ canvas.height = constants.DEFAULT_HEIGHT
+ }
+ draw() {
+ const canvas = this.canvasRef.current
+ const ctx = canvas.getContext('2d')
+ const w = window.innerWidth
+ this.clearCanvas(ctx, w)
+ }
+ clearCanvas(ctx, w) {
+ const h = constants.WAVEFORM_HEIGHT
+ ctx.clearRect(0, 0, w, h)
+ ctx.fillStyle = 'rgba(0,0,0,0.5)'
+ ctx.fillRect(0, 0, w, h)
+ ctx.fillStyle = 'rgba(64,128,192,0.5)'
+ }
+ render() {
+ return (
+ <div className='timeline'>
+ <canvas ref={this.canvasRef} />
+ <Ticks timeline={this.props.timeline} />
+ </div>
+ )
+ }
+}
+
+const mapStateToProps = state => ({
+ timeline: state.align.timeline,
+})
+
+const mapDispatchToProps = dispatch => ({
+ // uploadActions: bindActionCreators({ ...uploadActions }, dispatch),
+})
+
+export default connect(mapStateToProps, mapDispatchToProps)(Timeline)