aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/nodes/Timeline.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/views/nodes/Timeline.tsx')
-rw-r--r--src/client/views/nodes/Timeline.tsx170
1 files changed, 89 insertions, 81 deletions
diff --git a/src/client/views/nodes/Timeline.tsx b/src/client/views/nodes/Timeline.tsx
index 1c51dbcad..d25aa7953 100644
--- a/src/client/views/nodes/Timeline.tsx
+++ b/src/client/views/nodes/Timeline.tsx
@@ -4,7 +4,7 @@ import { CollectionSubView } from "../collections/CollectionSubView";
import { Document, listSpec, createSchema, makeInterface, defaultSpec } from "../../../new_fields/Schema";
import { observer } from "mobx-react";
import { Track } from "./Track";
-import { observable, reaction, action, IReactionDisposer, observe, IObservableArray, computed, toJS, Reaction, IObservableObject } from "mobx";
+import { observable, reaction, action, IReactionDisposer, observe, IObservableArray, computed, toJS, Reaction, IObservableObject, trace, autorun, runInAction } from "mobx";
import { Cast, NumCast } from "../../../new_fields/Types";
import { SelectionManager } from "../../util/SelectionManager";
import { List } from "../../../new_fields/List";
@@ -22,30 +22,30 @@ export interface FlyoutProps {
x?: number;
y?: number;
display?: string;
- regiondata?:Doc;
- regions?:List<Doc>;
+ regiondata?: Doc;
+ regions?: List<Doc>;
}
@observer
export class Timeline extends CollectionSubView(Document) {
private readonly DEFAULT_CONTAINER_HEIGHT: number = 300;
- private readonly DEFAULT_TICK_SPACING:number = 50;
+ private readonly DEFAULT_TICK_SPACING: number = 50;
private readonly MIN_CONTAINER_HEIGHT: number = 205;
private readonly MAX_CONTAINER_HEIGHT: number = 800;
-
+
@observable private _isMinimized = false;
@observable private _tickSpacing = this.DEFAULT_TICK_SPACING;
@observable private _scrubberbox = React.createRef<HTMLDivElement>();
- @observable private _scrubber = React.createRef<HTMLDivElement>();
+ @observable private _scrubber = React.createRef<HTMLDivElement>();
@observable private _trackbox = React.createRef<HTMLDivElement>();
@observable private _titleContainer = React.createRef<HTMLDivElement>();
@observable private _timelineContainer = React.createRef<HTMLDivElement>();
- @observable private _timeInput = React.createRef<HTMLInputElement>();
- @observable private _durationInput = React.createRef<HTMLInputElement>();
- @observable private _fadeInInput = React.createRef<HTMLInputElement>();
- @observable private _fadeOutInput = React.createRef<HTMLInputElement>();
+ @observable private _timeInput = React.createRef<HTMLInputElement>();
+ @observable private _durationInput = React.createRef<HTMLInputElement>();
+ @observable private _fadeInInput = React.createRef<HTMLInputElement>();
+ @observable private _fadeOutInput = React.createRef<HTMLInputElement>();
@observable private _currentBarX: number = 0;
@@ -59,12 +59,25 @@ export class Timeline extends CollectionSubView(Document) {
@observable private _infoContainer = React.createRef<HTMLDivElement>();
@observable private _ticks: number[] = [];
- @observable private flyoutInfo: FlyoutProps = { x: 0, y: 0, display: "none", regiondata: new Doc(), regions: new List<Doc>()};
+ @observable private flyoutInfo: FlyoutProps = { x: 0, y: 0, display: "none", regiondata: new Doc(), regions: new List<Doc>() };
private block = false;
- @action
componentDidMount() {
+ this.initialize();
+ }
+
+ componentWillMount() {
+ runInAction(() => {
+ //check if this is a video frame
+ for (let i = 0; i < this._time;) {
+ this._ticks.push(i);
+ i += 1000;
+ }
+ });
+ }
+
+ initialize = action(() => {
let scrubber = this._scrubberbox.current!;
this._boxLength = scrubber.getBoundingClientRect().width;
let children = Cast(this.props.Document[this.props.fieldKey], listSpec(Doc));
@@ -81,17 +94,12 @@ export class Timeline extends CollectionSubView(Document) {
trackbox.style.width = `${this._boxLength}`;
});
- //check if this is a video frame
- for (let i = 0; i < this._time;) {
- this._ticks.push(i);
- i += 1000;
- }
document.addEventListener("pointerdown", this.closeFlyout);
- }
+ });
- @action
+ @action
changeCurrentBarX = (x: number) => {
- this._currentBarX = x;
+ this._currentBarX = x;
}
@action
onFlyoutDown = (e: React.PointerEvent) => {
@@ -108,10 +116,10 @@ export class Timeline extends CollectionSubView(Document) {
this.flyoutInfo.display = "none";
}
- @action
componentDidUpdate() {
- this._time = 100001;
+ runInAction(() => this._time = 100001);
}
+
componentWillUnmount() {
document.removeEventListener("pointerdown", this.closeFlyout);
}
@@ -182,7 +190,7 @@ export class Timeline extends CollectionSubView(Document) {
this._currentBarX = offset;
}
-
+
@action
onPanDown = (e: React.PointerEvent) => {
@@ -230,22 +238,22 @@ export class Timeline extends CollectionSubView(Document) {
}
}
- @action
- onTimelineDown = (e:React.PointerEvent) => {
- e.preventDefault();
- e.stopPropagation();
- document.addEventListener("pointermove", this.onTimelineMove);
- document.addEventListener("pointerup", () => {document.removeEventListener("pointermove", this.onTimelineMove);});
+ @action
+ onTimelineDown = (e: React.PointerEvent) => {
+ e.preventDefault();
+ e.stopPropagation();
+ document.addEventListener("pointermove", this.onTimelineMove);
+ document.addEventListener("pointerup", () => { document.removeEventListener("pointermove", this.onTimelineMove); });
}
- @action
- onTimelineMove = (e:PointerEvent) => {
- e.preventDefault();
- e.stopPropagation();
- let timelineContainer = this._timelineContainer.current!;
- timelineContainer.style.transform = `translate(${timelineContainer.getBoundingClientRect().left + 1}px, ${timelineContainer.getBoundingClientRect().top + 1}px)`;
- console.log("mouse move!");
- timelineContainer.style.width = "500px";
+ @action
+ onTimelineMove = (e: PointerEvent) => {
+ e.preventDefault();
+ e.stopPropagation();
+ let timelineContainer = this._timelineContainer.current!;
+ timelineContainer.style.transform = `translate(${timelineContainer.getBoundingClientRect().left + 1}px, ${timelineContainer.getBoundingClientRect().top + 1}px)`;
+ console.log("mouse move!");
+ timelineContainer.style.width = "500px";
}
@action
@@ -292,54 +300,54 @@ export class Timeline extends CollectionSubView(Document) {
}), icon: "pinterest"
});
ContextMenu.Instance.addItem({ description: "Timeline Funcs...", subitems: subitems });
-
+
}
@action
changeTime = (e: React.KeyboardEvent) => {
- let time = this._timeInput.current!;
- if (e.keyCode === 13){
- if (!Number.isNaN(Number(time.value))){
- this.flyoutInfo.regiondata!.position = Number(time.value) / 1000 * this._tickSpacing;
- time.placeholder = time.value +"ms";
+ let time = this._timeInput.current!;
+ if (e.keyCode === 13) {
+ if (!Number.isNaN(Number(time.value))) {
+ this.flyoutInfo.regiondata!.position = Number(time.value) / 1000 * this._tickSpacing;
+ time.placeholder = time.value + "ms";
time.value = "";
}
}
}
- @action
- changeDuration = (e:React.KeyboardEvent) => {
- let duration = this._durationInput.current!;
- if (e.keyCode === 13){
- if (!Number.isNaN(Number(duration.value))){
- this.flyoutInfo.regiondata!.duration = Number(duration.value) / 1000 * this._tickSpacing;
- duration.placeholder = duration.value +"ms";
+ @action
+ changeDuration = (e: React.KeyboardEvent) => {
+ let duration = this._durationInput.current!;
+ if (e.keyCode === 13) {
+ if (!Number.isNaN(Number(duration.value))) {
+ this.flyoutInfo.regiondata!.duration = Number(duration.value) / 1000 * this._tickSpacing;
+ duration.placeholder = duration.value + "ms";
duration.value = "";
}
}
}
- @action
- changeFadeIn = (e:React.KeyboardEvent) => {
- let fadeIn = this._fadeInInput.current!;
- if (e.keyCode === 13){
- if (!Number.isNaN(Number(fadeIn.value))){
+ @action
+ changeFadeIn = (e: React.KeyboardEvent) => {
+ let fadeIn = this._fadeInInput.current!;
+ if (e.keyCode === 13) {
+ if (!Number.isNaN(Number(fadeIn.value))) {
this.flyoutInfo.regiondata!.fadeIn = Number(fadeIn.value);
- fadeIn.placeholder = fadeIn.value +"ms";
+ fadeIn.placeholder = fadeIn.value + "ms";
fadeIn.value = "";
}
}
}
- @action
- changeFadeOut = (e:React.KeyboardEvent) => {
- let fadeOut = this._fadeOutInput.current!;
- if (e.keyCode === 13){
- if (!Number.isNaN(Number(fadeOut.value))){
- this.flyoutInfo.regiondata!.fadeOut = Number(fadeOut.value);
- fadeOut.placeholder = fadeOut.value +"ms";
- fadeOut.value = "";
+ @action
+ changeFadeOut = (e: React.KeyboardEvent) => {
+ let fadeOut = this._fadeOutInput.current!;
+ if (e.keyCode === 13) {
+ if (!Number.isNaN(Number(fadeOut.value))) {
+ this.flyoutInfo.regiondata!.fadeOut = Number(fadeOut.value);
+ fadeOut.placeholder = fadeOut.value + "ms";
+ fadeOut.value = "";
}
}
}
@@ -348,23 +356,23 @@ export class Timeline extends CollectionSubView(Document) {
return (
<div>
<button className="minimize" onClick={this.minimize}>Minimize</button>
- <div className="flyout-container" style={{left:`${this.flyoutInfo.x}px`, top:`${this.flyoutInfo.y}px`, display: `${this.flyoutInfo.display!}` }} onPointerDown={this.onFlyoutDown}>
- <FontAwesomeIcon className="flyout" icon="comment-alt" color="grey" />
- <div className="text-container">
- <p>Time:</p>
- <p>Duration:</p>
- <p>Fade-in</p>
- <p>Fade-out</p>
- </div>
- <div className="input-container">
- <input ref = {this._timeInput} type="text" placeholder={`${Math.round(NumCast(this.flyoutInfo.regiondata!.position)/ this._tickSpacing * 1000)}ms`} onKeyDown={this.changeTime} />
- <input ref = {this._durationInput} type="text" placeholder={`${Math.round(NumCast(this.flyoutInfo.regiondata!.duration) / this._tickSpacing * 1000)}ms`} onKeyDown={this.changeDuration}/>
- <input ref = {this._fadeInInput} type="text" placeholder={`${Math.round(NumCast(this.flyoutInfo.regiondata!.fadeIn))}ms`} onKeyDown={this.changeFadeIn}/>
- <input ref = {this._fadeOutInput} type="text" placeholder={`${Math.round(NumCast(this.flyoutInfo.regiondata!.fadeOut))}ms`} onKeyDown={this.changeFadeOut}/>
-
- </div>
- <button onClick={action((e:React.MouseEvent)=>{this.flyoutInfo.regions!.splice(this.flyoutInfo.regions!.indexOf(this.flyoutInfo.regiondata!), 1); this.flyoutInfo.display = "none";})}>delete</button>
+ <div className="flyout-container" style={{ left: `${this.flyoutInfo.x}px`, top: `${this.flyoutInfo.y}px`, display: `${this.flyoutInfo.display!}` }} onPointerDown={this.onFlyoutDown}>
+ <FontAwesomeIcon className="flyout" icon="comment-alt" color="grey" />
+ <div className="text-container">
+ <p>Time:</p>
+ <p>Duration:</p>
+ <p>Fade-in</p>
+ <p>Fade-out</p>
</div>
+ <div className="input-container">
+ <input ref={this._timeInput} type="text" placeholder={`${Math.round(NumCast(this.flyoutInfo.regiondata!.position) / this._tickSpacing * 1000)}ms`} onKeyDown={this.changeTime} />
+ <input ref={this._durationInput} type="text" placeholder={`${Math.round(NumCast(this.flyoutInfo.regiondata!.duration) / this._tickSpacing * 1000)}ms`} onKeyDown={this.changeDuration} />
+ <input ref={this._fadeInInput} type="text" placeholder={`${Math.round(NumCast(this.flyoutInfo.regiondata!.fadeIn))}ms`} onKeyDown={this.changeFadeIn} />
+ <input ref={this._fadeOutInput} type="text" placeholder={`${Math.round(NumCast(this.flyoutInfo.regiondata!.fadeOut))}ms`} onKeyDown={this.changeFadeOut} />
+
+ </div>
+ <button onClick={action((e: React.MouseEvent) => { this.flyoutInfo.regions!.splice(this.flyoutInfo.regions!.indexOf(this.flyoutInfo.regiondata!), 1); this.flyoutInfo.display = "none"; })}>delete</button>
+ </div>
<div className="timeline-container" style={{ height: `${this._containerHeight}px` }} ref={this._timelineContainer} onContextMenu={this.timelineContextMenu} >
<div className="toolbox">
<div onClick={this.windBackward}> <FontAwesomeIcon icon={faBackward} size="2x" /> </div>
@@ -387,7 +395,7 @@ export class Timeline extends CollectionSubView(Document) {
</div>
<div className="trackbox" ref={this._trackbox} onPointerDown={this.onPanDown}>
{this._nodes.map(doc => {
- return <Track node={(doc as any).value() as Doc} currentBarX={this._currentBarX} changeCurrentBarX = {this.changeCurrentBarX} setFlyout={this.getFlyout} />;
+ return <Track node={(doc as any).value() as Doc} currentBarX={this._currentBarX} changeCurrentBarX={this.changeCurrentBarX} setFlyout={this.getFlyout} />;
})}
</div>
</div>