UNPKG

vue-cesium

Version:
1 lines 59.5 kB
{"version":3,"file":"Timeline.mjs","sources":["../../../../../packages/shared/widgets/Timeline.ts"],"sourcesContent":["import { getElement } from '@vue-cesium/utils/private/dom'\nimport TimelineHighlightRange from './TimelineHighlightRange'\nimport TimelineTrack from './TimelineTrack'\n\nlet timelineWheelDelta = 1e12\n\nconst timelineMouseMode = {\n none: 0,\n scrub: 1,\n slide: 2,\n zoom: 3,\n touchOnly: 4\n}\nconst timelineTouchMode = {\n none: 0,\n scrub: 1,\n slideZoom: 2,\n singleTap: 3,\n ignore: 4\n}\n\nconst timelineTicScales = [\n 0.001,\n 0.002,\n 0.005,\n 0.01,\n 0.02,\n 0.05,\n 0.1,\n 0.25,\n 0.5,\n 1.0,\n 2.0,\n 5.0,\n 10.0,\n 15.0,\n 30.0,\n 60.0, // 1min\n 120.0, // 2min\n 300.0, // 5min\n 600.0, // 10min\n 900.0, // 15min\n 1800.0, // 30min\n 3600.0, // 1hr\n 7200.0, // 2hr\n 14400.0, // 4hr\n 21600.0, // 6hr\n 43200.0, // 12hr\n 86400.0, // 24hr\n 172800.0, // 2days\n 345600.0, // 4days\n 604800.0, // 7days\n 1296000.0, // 15days\n 2592000.0, // 30days\n 5184000.0, // 60days\n 7776000.0, // 90days\n 15552000.0, // 180days\n 31536000.0, // 365days\n 63072000.0, // 2years\n 126144000.0, // 4years\n 157680000.0, // 5years\n 315360000.0, // 10years\n 630720000.0, // 20years\n 1261440000.0, // 40years\n 1576800000.0, // 50years\n 3153600000.0, // 100years\n 6307200000.0, // 200years\n 12614400000.0, // 400years\n 15768000000.0, // 500years\n 31536000000.0 // 1000years\n]\n\nconst timelineMonthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n// const timelineMonthNames = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月']\n\nexport default class VcTimeline {\n container: Element\n _topDiv: HTMLDivElement\n _endJulian: any\n _epochJulian: any\n _lastXPos: any\n _scrubElement: any\n _startJulian: any\n _timeBarSecondsSpan: any\n _clock: Cesium.Clock\n _scrubJulian: Cesium.JulianDate\n _mainTicSpan: number\n _mouseMode: number\n _touchMode: number\n _touchState: { centerX: number; spanX: number }\n _mouseX: number\n _timelineDrag: number\n _timelineDragLocation: any\n _lastHeight: any\n _lastWidth: any\n _timeBarEle: any\n _trackContainer: any\n _trackListEle: any\n _needleEle: any\n _rulerEle: any\n _context: any\n _trackList: any[]\n _highlightRanges: any[]\n _onMouseDown: (e: any) => void\n _onMouseUp: (e: any) => void\n _onMouseMove: (e: any) => void\n _onMouseWheel: (e: any) => void\n _onTouchStart: (e: any) => void\n _onTouchMove: (e: any) => void\n _onTouchEnd: (e: any) => void\n constructor(container: Element, clock: Cesium.Clock) {\n const { defined, DeveloperError } = Cesium\n //>>includeStart('debug', pragmas.debug);\n if (!defined(container)) {\n throw new DeveloperError('container is required.')\n }\n if (!defined(clock)) {\n throw new DeveloperError('clock is required.')\n }\n //>>includeEnd('debug');\n\n container = getElement(container)\n\n const ownerDocument = container.ownerDocument\n\n /**\n * Gets the parent container.\n * @type {Element}\n */\n this.container = container\n\n const topDiv = ownerDocument.createElement('div')\n topDiv.className = 'cesium-timeline-main'\n container.appendChild(topDiv)\n this._topDiv = topDiv\n\n this._endJulian = undefined\n this._epochJulian = undefined\n this._lastXPos = undefined\n this._scrubElement = undefined\n this._startJulian = undefined\n this._timeBarSecondsSpan = undefined\n this._clock = clock\n this._scrubJulian = clock.currentTime\n this._mainTicSpan = -1\n this._mouseMode = timelineMouseMode.none\n this._touchMode = timelineTouchMode.none\n this._touchState = {\n centerX: 0,\n spanX: 0\n }\n this._mouseX = 0\n this._timelineDrag = 0\n this._timelineDragLocation = undefined\n this._lastHeight = undefined\n this._lastWidth = undefined\n\n this._topDiv.innerHTML =\n '<div class=\"cesium-timeline-bar\"></div><div class=\"cesium-timeline-trackContainer\">' +\n '<canvas class=\"cesium-timeline-tracks\" width=\"10\" height=\"1\">' +\n '</canvas></div><div class=\"cesium-timeline-needle\"></div><span class=\"cesium-timeline-ruler\"></span>'\n this._timeBarEle = this._topDiv.childNodes[0]\n this._trackContainer = this._topDiv.childNodes[1]\n this._trackListEle = this._topDiv.childNodes[1].childNodes[0]\n this._needleEle = this._topDiv.childNodes[2]\n this._rulerEle = this._topDiv.childNodes[3]\n this._context = this._trackListEle.getContext('2d')\n\n this._trackList = []\n this._highlightRanges = []\n\n this.zoomTo(clock.startTime, clock.stopTime)\n\n this._onMouseDown = createMouseDownCallback(this)\n this._onMouseUp = createMouseUpCallback(this)\n this._onMouseMove = createMouseMoveCallback(this)\n this._onMouseWheel = createMouseWheelCallback(this)\n this._onTouchStart = createTouchStartCallback(this)\n this._onTouchMove = createTouchMoveCallback(this)\n this._onTouchEnd = createTouchEndCallback(this)\n\n const timeBarEle = this._timeBarEle\n ownerDocument.addEventListener('mouseup', this._onMouseUp, false)\n ownerDocument.addEventListener('mousemove', this._onMouseMove, false)\n timeBarEle.addEventListener('mousedown', this._onMouseDown, false)\n timeBarEle.addEventListener('DOMMouseScroll', this._onMouseWheel, false) // Mozilla mouse wheel\n timeBarEle.addEventListener('mousewheel', this._onMouseWheel, false)\n timeBarEle.addEventListener('touchstart', this._onTouchStart, false)\n timeBarEle.addEventListener('touchmove', this._onTouchMove, false)\n timeBarEle.addEventListener('touchend', this._onTouchEnd, false)\n timeBarEle.addEventListener('touchcancel', this._onTouchEnd, false)\n\n this._topDiv.oncontextmenu = function () {\n return false\n }\n\n clock.onTick.addEventListener(this.updateFromClock, this)\n this.updateFromClock()\n }\n\n smallestTicInPixels = 7.0\n\n addEventListener(type, listener, useCapture) {\n this._topDiv.addEventListener(type, listener, useCapture)\n }\n\n removeEventListener(type, listener, useCapture) {\n this._topDiv.removeEventListener(type, listener, useCapture)\n }\n\n isDestroyed() {\n return false\n }\n\n destroy() {\n this._clock.onTick.removeEventListener(this.updateFromClock, this)\n\n const doc = this.container.ownerDocument\n doc.removeEventListener('mouseup', this._onMouseUp, false)\n doc.removeEventListener('mousemove', this._onMouseMove, false)\n\n const timeBarEle = this._timeBarEle\n timeBarEle.removeEventListener('mousedown', this._onMouseDown, false)\n timeBarEle.removeEventListener('DOMMouseScroll', this._onMouseWheel, false) // Mozilla mouse wheel\n timeBarEle.removeEventListener('mousewheel', this._onMouseWheel, false)\n timeBarEle.removeEventListener('touchstart', this._onTouchStart, false)\n timeBarEle.removeEventListener('touchmove', this._onTouchMove, false)\n timeBarEle.removeEventListener('touchend', this._onTouchEnd, false)\n timeBarEle.removeEventListener('touchcancel', this._onTouchEnd, false)\n this.container.removeChild(this._topDiv)\n Cesium.destroyObject(this)\n }\n\n addHighlightRange(color, heightInPx, base) {\n const newHighlightRange = new TimelineHighlightRange(color, heightInPx, base)\n this._highlightRanges.push(newHighlightRange)\n this.resize()\n return newHighlightRange\n }\n\n addTrack(interval, heightInPx, color, backgroundColor) {\n // console.log('addTrack', interval, heightInPx, color, backgroundColor)\n const newTrack = new TimelineTrack(interval, heightInPx, color, backgroundColor)\n this._trackList.push(newTrack)\n this._lastHeight = undefined\n this.resize()\n return newTrack\n }\n\n resize() {\n const width = this.container.clientWidth\n const height = this.container.clientHeight\n\n if (width === this._lastWidth && height === this._lastHeight) {\n return\n }\n\n this._trackContainer.style.height = `${height}px`\n\n let trackListHeight = 1\n this._trackList.forEach(function (track) {\n trackListHeight += track.height\n })\n this._trackListEle.style.height = `${trackListHeight.toString()}px`\n this._trackListEle.width = this._trackListEle.clientWidth\n this._trackListEle.height = trackListHeight\n this._makeTics()\n\n this._lastXPos = undefined\n this._lastWidth = width\n this._lastHeight = height\n }\n\n zoomTo(startTime, stopTime) {\n const { defined, JulianDate, DeveloperError, ClockRange } = Cesium\n //>>includeStart('debug', pragmas.debug);\n if (!defined(startTime)) {\n throw new DeveloperError('startTime is required.')\n }\n if (!defined(stopTime)) {\n throw new DeveloperError('stopTime is required')\n }\n if (JulianDate.lessThanOrEquals(stopTime, startTime)) {\n throw new DeveloperError('Start time must come before end time.')\n }\n //>>includeEnd('debug');\n\n this._startJulian = startTime\n this._endJulian = stopTime\n this._timeBarSecondsSpan = JulianDate.secondsDifference(stopTime, startTime)\n\n // If clock is not unbounded, clamp timeline range to clock.\n if (this._clock && this._clock.clockRange !== ClockRange.UNBOUNDED) {\n const clockStart = this._clock.startTime\n const clockEnd = this._clock.stopTime\n const clockSpan = JulianDate.secondsDifference(clockEnd, clockStart)\n const startOffset = JulianDate.secondsDifference(clockStart, this._startJulian)\n const endOffset = JulianDate.secondsDifference(clockEnd, this._endJulian)\n\n if (this._timeBarSecondsSpan >= clockSpan) {\n // if new duration longer than clock range duration, clamp to full range.\n this._timeBarSecondsSpan = clockSpan\n this._startJulian = this._clock.startTime\n this._endJulian = this._clock.stopTime\n } else if (startOffset > 0) {\n // if timeline start is before clock start, shift right\n this._endJulian = JulianDate.addSeconds(this._endJulian, startOffset, new JulianDate())\n this._startJulian = clockStart\n this._timeBarSecondsSpan = JulianDate.secondsDifference(this._endJulian, this._startJulian)\n } else if (endOffset < 0) {\n // if timeline end is after clock end, shift left\n this._startJulian = JulianDate.addSeconds(this._startJulian, endOffset, new JulianDate())\n this._endJulian = clockEnd\n this._timeBarSecondsSpan = JulianDate.secondsDifference(this._endJulian, this._startJulian)\n }\n }\n\n this._makeTics()\n\n // const evt = document.createEvent('Event')\n const evt: any = new Event('setzoom', { bubbles: true, cancelable: true, composed: true })\n // evt.initEvent('setzoom', true, true)\n evt.startJulian = this._startJulian\n evt.endJulian = this._endJulian\n evt.epochJulian = this._epochJulian\n evt.totalSpan = this._timeBarSecondsSpan\n evt.mainTicSpan = this._mainTicSpan\n this._topDiv.dispatchEvent(evt)\n }\n\n updateFromClock() {\n const { defined, JulianDate } = Cesium\n this._scrubJulian = this._clock.currentTime\n const scrubElement = this._scrubElement\n if (defined(this._scrubElement)) {\n const seconds = JulianDate.secondsDifference(this._scrubJulian, this._startJulian)\n const xPos = Math.round((seconds * this._topDiv.clientWidth) / this._timeBarSecondsSpan)\n\n if (this._lastXPos !== xPos) {\n this._lastXPos = xPos\n\n scrubElement.style.left = `${xPos - 8}px`\n this._needleEle.style.left = `${xPos}px`\n }\n }\n if (defined(this._timelineDragLocation)) {\n this._setTimeBarTime(this._timelineDragLocation, (this._timelineDragLocation * this._timeBarSecondsSpan) / this._topDiv.clientWidth)\n this.zoomTo(\n JulianDate.addSeconds(this._startJulian, this._timelineDrag, new JulianDate()),\n JulianDate.addSeconds(this._endJulian, this._timelineDrag, new JulianDate())\n )\n }\n }\n\n _setTimeBarTime(xPos, seconds) {\n const { JulianDate } = Cesium\n xPos = Math.round(xPos)\n this._scrubJulian = JulianDate.addSeconds(this._startJulian, seconds, new JulianDate())\n if (this._scrubElement) {\n const scrubX = xPos - 8\n this._scrubElement.style.left = `${scrubX.toString()}px`\n this._needleEle.style.left = `${xPos.toString()}px`\n }\n\n // const evt = document.createEvent('Event')\n // evt.initEvent('settime', true, true)\n const evt: any = new Event('settime', { bubbles: true, cancelable: true, composed: true })\n evt.clientX = xPos\n evt.timeSeconds = seconds\n evt.timeJulian = this._scrubJulian\n evt.clock = this._clock\n this._topDiv.dispatchEvent(evt)\n }\n\n zoomFrom(amount) {\n const { JulianDate } = Cesium\n let centerSec = JulianDate.secondsDifference(this._scrubJulian, this._startJulian)\n if (amount > 1 || centerSec < 0 || centerSec > this._timeBarSecondsSpan) {\n centerSec = this._timeBarSecondsSpan * 0.5\n } else {\n centerSec += centerSec - this._timeBarSecondsSpan * 0.5\n }\n const centerSecFlip = this._timeBarSecondsSpan - centerSec\n this.zoomTo(\n JulianDate.addSeconds(this._startJulian, centerSec - centerSec * amount, new JulianDate()),\n JulianDate.addSeconds(this._endJulian, centerSecFlip * amount - centerSecFlip, new JulianDate())\n )\n }\n\n makeLabel(time) {\n const { JulianDate } = Cesium\n const gregorian = JulianDate.toGregorianDate(time)\n const millisecond = gregorian.millisecond\n let millisecondString = ' UTC'\n if (millisecond > 0 && this._timeBarSecondsSpan < 3600) {\n millisecondString = Math.floor(millisecond).toString()\n while (millisecondString.length < 3) {\n millisecondString = `0${millisecondString}`\n }\n millisecondString = `.${millisecondString}`\n }\n\n return `${timelineMonthNames[gregorian.month - 1]} ${gregorian.day} ${gregorian.year} ${twoDigits(gregorian.hour)}:${twoDigits(\n gregorian.minute\n )}:${twoDigits(gregorian.second)}${millisecondString}`\n }\n\n _makeTics() {\n const { JulianDate } = Cesium\n const timeBar = this._timeBarEle\n\n const seconds = JulianDate.secondsDifference(this._scrubJulian, this._startJulian)\n const xPos = Math.round((seconds * this._topDiv.clientWidth) / this._timeBarSecondsSpan)\n const scrubX = xPos - 8\n let tic\n const widget = this\n\n this._needleEle.style.left = `${xPos.toString()}px`\n\n let tics = ''\n\n const minimumDuration = 0.01\n const maximumDuration = 31536000000.0 // ~1000 years\n const epsilon = 1e-10\n\n // If time step size is known, enter it here...\n let minSize = 0\n\n let duration = this._timeBarSecondsSpan\n if (duration < minimumDuration) {\n duration = minimumDuration\n this._timeBarSecondsSpan = minimumDuration\n this._endJulian = JulianDate.addSeconds(this._startJulian, minimumDuration, new JulianDate())\n } else if (duration > maximumDuration) {\n duration = maximumDuration\n this._timeBarSecondsSpan = maximumDuration\n this._endJulian = JulianDate.addSeconds(this._startJulian, maximumDuration, new JulianDate())\n }\n\n let timeBarWidth = this._timeBarEle.clientWidth\n if (timeBarWidth < 10) {\n timeBarWidth = 10\n }\n const startJulian = this._startJulian\n\n // epsilonTime: a small fraction of one pixel width of the timeline, measured in seconds.\n const epsilonTime = Math.min((duration / timeBarWidth) * 1e-5, 0.4)\n\n // epochJulian: a nearby time to be considered \"zero seconds\", should be a round-ish number by human standards.\n let epochJulian\n const gregorianDate = JulianDate.toGregorianDate(startJulian)\n if (duration > 315360000) {\n // 3650+ days visible, epoch is start of the first visible century.\n epochJulian = JulianDate.fromDate(new Date(Date.UTC(Math.floor(gregorianDate.year / 100) * 100, 0)))\n } else if (duration > 31536000) {\n // 365+ days visible, epoch is start of the first visible decade.\n epochJulian = JulianDate.fromDate(new Date(Date.UTC(Math.floor(gregorianDate.year / 10) * 10, 0)))\n } else if (duration > 86400) {\n // 1+ day(s) visible, epoch is start of the year.\n epochJulian = JulianDate.fromDate(new Date(Date.UTC(gregorianDate.year, 0)))\n } else {\n // Less than a day on timeline, epoch is midnight of the visible day.\n epochJulian = JulianDate.fromDate(new Date(Date.UTC(gregorianDate.year, gregorianDate.month, gregorianDate.day)))\n }\n\n // startTime: Seconds offset of the left side of the timeline from epochJulian.\n const startTime = JulianDate.secondsDifference(this._startJulian, JulianDate.addSeconds(epochJulian, epsilonTime, new JulianDate()))\n // endTime: Seconds offset of the right side of the timeline from epochJulian.\n let endTime = startTime + duration\n this._epochJulian = epochJulian\n\n function getStartTic(ticScale) {\n return Math.floor(startTime / ticScale) * ticScale\n }\n\n function getNextTic(tic, ticScale) {\n return Math.ceil(tic / ticScale + 0.5) * ticScale\n }\n\n function getAlpha(time) {\n return (time - startTime) / duration\n }\n\n function remainder(x, y) {\n //return x % y;\n return x - y * Math.round(x / y)\n }\n\n // Width in pixels of a typical label, plus padding\n this._rulerEle.innerHTML = this.makeLabel(JulianDate.addSeconds(this._endJulian, -minimumDuration, new JulianDate()))\n let sampleWidth = this._rulerEle.offsetWidth + 20\n if (sampleWidth < 30) {\n // Workaround an apparent IE bug with measuring the width after going full-screen from inside an iframe.\n sampleWidth = 180\n }\n\n const origMinSize = minSize\n minSize -= epsilon\n\n const renderState: any = {\n startTime: startTime,\n startJulian: startJulian,\n epochJulian: epochJulian,\n duration: duration,\n timeBarWidth: timeBarWidth,\n getAlpha: getAlpha\n }\n this._highlightRanges.forEach(function (highlightRange) {\n tics += highlightRange.render(renderState)\n })\n\n // Calculate tic mark label spacing in the TimeBar.\n let mainTic = 0.0,\n subTic = 0.0,\n tinyTic = 0.0\n // Ideal labeled tic as percentage of zoom interval\n let idealTic = sampleWidth / timeBarWidth\n if (idealTic > 1.0) {\n // Clamp to width of window, for thin windows.\n idealTic = 1.0\n }\n // Ideal labeled tic size in seconds\n idealTic *= this._timeBarSecondsSpan\n let ticIndex = -1,\n smallestIndex = -1\n\n const ticScaleLen = timelineTicScales.length\n let i\n for (i = 0; i < ticScaleLen; ++i) {\n const sc = timelineTicScales[i]\n ++ticIndex\n mainTic = sc\n // Find acceptable main tic size not smaller than ideal size.\n if (sc > idealTic && sc > minSize) {\n break\n }\n if (smallestIndex < 0 && timeBarWidth * (sc / this._timeBarSecondsSpan) >= this.smallestTicInPixels) {\n smallestIndex = ticIndex\n }\n }\n if (ticIndex > 0) {\n while (ticIndex > 0) {\n // Compute sub-tic size that evenly divides main tic.\n --ticIndex\n if (Math.abs(remainder(mainTic, timelineTicScales[ticIndex])) < 0.00001) {\n if (timelineTicScales[ticIndex] >= minSize) {\n subTic = timelineTicScales[ticIndex]\n }\n break\n }\n }\n\n if (smallestIndex >= 0) {\n while (smallestIndex < ticIndex) {\n // Compute tiny tic size that evenly divides sub-tic.\n if (Math.abs(remainder(subTic, timelineTicScales[smallestIndex])) < 0.00001 && timelineTicScales[smallestIndex] >= minSize) {\n tinyTic = timelineTicScales[smallestIndex]\n break\n }\n ++smallestIndex\n }\n }\n }\n\n minSize = origMinSize\n if (minSize > epsilon && tinyTic < 0.00001 && Math.abs(minSize - mainTic) > epsilon) {\n tinyTic = minSize\n if (minSize <= mainTic + epsilon) {\n subTic = 0.0\n }\n }\n\n let lastTextLeft = -999999,\n textWidth\n if (timeBarWidth * (tinyTic / this._timeBarSecondsSpan) >= 3.0) {\n for (tic = getStartTic(tinyTic); tic <= endTime; tic = getNextTic(tic, tinyTic)) {\n tics += `<span class=\"cesium-timeline-ticTiny\" style=\"left: ${Math.round(timeBarWidth * getAlpha(tic)).toString()}px;\"></span>`\n }\n }\n if (timeBarWidth * (subTic / this._timeBarSecondsSpan) >= 3.0) {\n for (tic = getStartTic(subTic); tic <= endTime; tic = getNextTic(tic, subTic)) {\n tics += `<span class=\"cesium-timeline-ticSub\" style=\"left: ${Math.round(timeBarWidth * getAlpha(tic)).toString()}px;\"></span>`\n }\n }\n if (timeBarWidth * (mainTic / this._timeBarSecondsSpan) >= 2.0) {\n this._mainTicSpan = mainTic\n endTime += mainTic\n tic = getStartTic(mainTic)\n const leapSecond = JulianDate.computeTaiMinusUtc(epochJulian)\n while (tic <= endTime) {\n let ticTime = JulianDate.addSeconds(startJulian, tic - startTime, new JulianDate())\n if (mainTic > 2.1) {\n const ticLeap = JulianDate.computeTaiMinusUtc(ticTime)\n if (Math.abs(ticLeap - leapSecond) > 0.1) {\n tic += ticLeap - leapSecond\n ticTime = JulianDate.addSeconds(startJulian, tic - startTime, new JulianDate())\n }\n }\n const ticLeft = Math.round(timeBarWidth * getAlpha(tic))\n const ticLabel = this.makeLabel(ticTime)\n this._rulerEle.innerHTML = ticLabel\n textWidth = this._rulerEle.offsetWidth\n if (textWidth < 10) {\n // IE iframe fullscreen sampleWidth workaround, continued.\n textWidth = sampleWidth\n }\n const labelLeft = ticLeft - (textWidth / 2 - 1)\n if (labelLeft > lastTextLeft) {\n lastTextLeft = labelLeft + textWidth + 5\n tics +=\n `<span class=\"cesium-timeline-ticMain\" style=\"left: ${ticLeft.toString()}px;\"></span>` +\n `<span class=\"cesium-timeline-ticLabel\" style=\"left: ${labelLeft.toString()}px;\">${ticLabel}</span>`\n } else {\n tics += `<span class=\"cesium-timeline-ticSub\" style=\"left: ${ticLeft.toString()}px;\"></span>`\n }\n tic = getNextTic(tic, mainTic)\n }\n } else {\n this._mainTicSpan = -1\n }\n\n tics += `<span class=\"cesium-timeline-icon16\" style=\"left:${scrubX}px;bottom:0;background-position: 0 0;\"></span>`\n timeBar.innerHTML = tics\n this._scrubElement = timeBar.lastChild\n\n // Clear track canvas.\n this._context.clearRect(0, 0, this._trackListEle.width, this._trackListEle.height)\n\n renderState.y = 0\n this._trackList.forEach(function (track) {\n track.render(widget._context, renderState)\n renderState.y += track.height\n })\n }\n}\n\nfunction createMouseDownCallback(timeline) {\n return function (e) {\n if (timeline._mouseMode !== timelineMouseMode.touchOnly) {\n if (e.button === 0) {\n timeline._mouseMode = timelineMouseMode.scrub\n if (timeline._scrubElement) {\n timeline._scrubElement.style.backgroundPosition = '-16px 0'\n }\n timeline._onMouseMove(e)\n } else {\n timeline._mouseX = e.clientX\n if (e.button === 2) {\n timeline._mouseMode = timelineMouseMode.zoom\n } else {\n timeline._mouseMode = timelineMouseMode.slide\n }\n }\n }\n e.preventDefault()\n }\n}\n\nfunction createMouseUpCallback(timeline) {\n return function (e) {\n timeline._mouseMode = timelineMouseMode.none\n if (timeline._scrubElement) {\n timeline._scrubElement.style.backgroundPosition = '0 0'\n }\n timeline._timelineDrag = 0\n timeline._timelineDragLocation = undefined\n }\n}\n\nfunction createMouseMoveCallback(timeline) {\n return function (e) {\n let dx\n if (timeline._mouseMode === timelineMouseMode.scrub) {\n e.preventDefault()\n const x = e.clientX - timeline._topDiv.getBoundingClientRect().left\n // console.log(`createMouseMoveCallback scrub; x: ${x}; clientWidth: ${timeline._topDiv.clientWidth};`)\n if (x < 0) {\n timeline._timelineDragLocation = 0\n timeline._timelineDrag = -0.01 * timeline._timeBarSecondsSpan\n } else if (x > timeline._topDiv.clientWidth) {\n timeline._timelineDragLocation = timeline._topDiv.clientWidth\n timeline._timelineDrag = 0.01 * timeline._timeBarSecondsSpan\n } else {\n // console.log('_setTimeBarTime')\n timeline._timelineDragLocation = undefined\n timeline._setTimeBarTime(x, (x * timeline._timeBarSecondsSpan) / timeline._topDiv.clientWidth)\n }\n } else if (timeline._mouseMode === timelineMouseMode.slide) {\n // console.log('createMouseMoveCallback slide')\n dx = timeline._mouseX - e.clientX\n timeline._mouseX = e.clientX\n if (dx !== 0) {\n const { JulianDate } = Cesium\n const dsec = (dx * timeline._timeBarSecondsSpan) / timeline._topDiv.clientWidth\n timeline.zoomTo(\n JulianDate.addSeconds(timeline._startJulian, dsec, new JulianDate()),\n JulianDate.addSeconds(timeline._endJulian, dsec, new JulianDate())\n )\n }\n } else if (timeline._mouseMode === timelineMouseMode.zoom) {\n // console.log('createMouseMoveCallback zoom')\n dx = timeline._mouseX - e.clientX\n timeline._mouseX = e.clientX\n if (dx !== 0) {\n timeline.zoomFrom(Math.pow(1.01, dx))\n }\n }\n }\n}\n\nfunction createMouseWheelCallback(timeline) {\n return function (e) {\n let dy = e.wheelDeltaY || e.wheelDelta || -e.detail\n timelineWheelDelta = Math.max(Math.min(Math.abs(dy), timelineWheelDelta), 1)\n dy /= timelineWheelDelta\n timeline.zoomFrom(Math.pow(1.05, -dy))\n }\n}\n\nfunction createTouchStartCallback(timeline) {\n return function (e) {\n const len = e.touches.length\n let seconds, xPos\n const leftX = timeline._topDiv.getBoundingClientRect().left\n e.preventDefault()\n timeline._mouseMode = timelineMouseMode.touchOnly\n if (len === 1) {\n seconds = Cesium.JulianDate.secondsDifference(timeline._scrubJulian, timeline._startJulian)\n xPos = Math.round((seconds * timeline._topDiv.clientWidth) / timeline._timeBarSecondsSpan + leftX)\n if (Math.abs(e.touches[0].clientX - xPos) < 50) {\n timeline._touchMode = timelineTouchMode.scrub\n if (timeline._scrubElement) {\n timeline._scrubElement.style.backgroundPosition = len === 1 ? '-16px 0' : '0 0'\n }\n } else {\n timeline._touchMode = timelineTouchMode.singleTap\n timeline._touchState.centerX = e.touches[0].clientX - leftX\n }\n } else if (len === 2) {\n timeline._touchMode = timelineTouchMode.slideZoom\n timeline._touchState.centerX = (e.touches[0].clientX + e.touches[1].clientX) * 0.5 - leftX\n timeline._touchState.spanX = Math.abs(e.touches[0].clientX - e.touches[1].clientX)\n } else {\n timeline._touchMode = timelineTouchMode.ignore\n }\n }\n}\n\nfunction createTouchEndCallback(timeline) {\n return function (e) {\n const len = e.touches.length,\n leftX = timeline._topDiv.getBoundingClientRect().left\n if (timeline._touchMode === timelineTouchMode.singleTap) {\n timeline._touchMode = timelineTouchMode.scrub\n timeline._onTouchMove(e)\n } else if (timeline._touchMode === timelineTouchMode.scrub) {\n timeline._onTouchMove(e)\n }\n timeline._mouseMode = timelineMouseMode.touchOnly\n if (len !== 1) {\n timeline._touchMode = len > 0 ? timelineTouchMode.ignore : timelineTouchMode.none\n } else if (timeline._touchMode === timelineTouchMode.slideZoom) {\n timeline._touchState.centerX = e.touches[0].clientX - leftX\n }\n if (timeline._scrubElement) {\n timeline._scrubElement.style.backgroundPosition = '0 0'\n }\n }\n}\n\nfunction createTouchMoveCallback(timeline) {\n return function (e) {\n let dx,\n x,\n len,\n newCenter,\n newSpan,\n newStartTime,\n zoom = 1\n const leftX = timeline._topDiv.getBoundingClientRect().left\n if (timeline._touchMode === timelineTouchMode.singleTap) {\n timeline._touchMode = timelineTouchMode.slideZoom\n }\n timeline._mouseMode = timelineMouseMode.touchOnly\n if (timeline._touchMode === timelineTouchMode.scrub) {\n e.preventDefault()\n if (e.changedTouches.length === 1) {\n x = e.changedTouches[0].clientX - leftX\n if (x >= 0 && x <= timeline._topDiv.clientWidth) {\n timeline._setTimeBarTime(x, (x * timeline._timeBarSecondsSpan) / timeline._topDiv.clientWidth)\n }\n }\n } else if (timeline._touchMode === timelineTouchMode.slideZoom) {\n len = e.touches.length\n if (len === 2) {\n newCenter = (e.touches[0].clientX + e.touches[1].clientX) * 0.5 - leftX\n newSpan = Math.abs(e.touches[0].clientX - e.touches[1].clientX)\n } else if (len === 1) {\n newCenter = e.touches[0].clientX - leftX\n newSpan = 0\n }\n\n const { defined, JulianDate } = Cesium\n\n if (defined(newCenter)) {\n if (newSpan > 0 && timeline._touchState.spanX > 0) {\n // Zoom and slide\n zoom = timeline._touchState.spanX / newSpan\n newStartTime = JulianDate.addSeconds(\n timeline._startJulian,\n (timeline._touchState.centerX * timeline._timeBarSecondsSpan - newCenter * timeline._timeBarSecondsSpan * zoom) /\n timeline._topDiv.clientWidth,\n new JulianDate()\n )\n } else {\n // Slide to newCenter\n dx = timeline._touchState.centerX - newCenter\n newStartTime = JulianDate.addSeconds(\n timeline._startJulian,\n (dx * timeline._timeBarSecondsSpan) / timeline._topDiv.clientWidth,\n new JulianDate()\n )\n }\n\n timeline.zoomTo(newStartTime, JulianDate.addSeconds(newStartTime, timeline._timeBarSecondsSpan * zoom, new JulianDate()))\n timeline._touchState.centerX = newCenter\n timeline._touchState.spanX = newSpan\n }\n }\n }\n}\n\nfunction twoDigits(num) {\n return num < 10 ? `0${num.toString()}` : num.toString()\n}\n"],"names":["TimelineHighlightRange","tic"],"mappings":"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