From 89204d74d2a5014b4e241973b1bdb8461ed4f78c Mon Sep 17 00:00:00 2001 From: Tyler Schicke Date: Tue, 15 Jan 2019 22:31:57 -0500 Subject: More stuff set up --- src/Main.tsx | 40 +++++++---- src/Utils.ts | 14 ++-- src/controllers/BasicFieldController.ts | 38 ----------- src/controllers/DocumentController.ts | 90 ------------------------- src/controllers/DocumentReferenceController.ts | 46 ------------- src/controllers/FieldController.ts | 54 --------------- src/controllers/FieldUpdatedArgs.ts | 27 -------- src/controllers/KeyController.ts | 36 ---------- src/controllers/ListController.ts | 30 --------- src/controllers/NumberController.ts | 14 ---- src/controllers/TextController.ts | 14 ---- src/fields/BasicField.ts | 38 +++++++++++ src/fields/Document.ts | 93 ++++++++++++++++++++++++++ src/fields/DocumentReference.ts | 46 +++++++++++++ src/fields/Field.ts | 54 +++++++++++++++ src/fields/FieldUpdatedArgs.ts | 27 ++++++++ src/fields/Key.ts | 37 ++++++++++ src/fields/ListField.ts | 21 ++++++ src/fields/NumberField.ts | 13 ++++ src/fields/TextField.ts | 13 ++++ src/stores/NodeCollectionStore.ts | 4 +- src/viewmodels/DocumentViewModel.ts | 11 +++ src/views/freeformcanvas/FreeFormCanvas.tsx | 19 +++--- src/views/freeformcanvas/NodeContainer.tsx | 3 +- src/views/nodes/DocumentView.tsx | 50 +++++++++----- 25 files changed, 435 insertions(+), 397 deletions(-) delete mode 100644 src/controllers/BasicFieldController.ts delete mode 100644 src/controllers/DocumentController.ts delete mode 100644 src/controllers/DocumentReferenceController.ts delete mode 100644 src/controllers/FieldController.ts delete mode 100644 src/controllers/FieldUpdatedArgs.ts delete mode 100644 src/controllers/KeyController.ts delete mode 100644 src/controllers/ListController.ts delete mode 100644 src/controllers/NumberController.ts delete mode 100644 src/controllers/TextController.ts create mode 100644 src/fields/BasicField.ts create mode 100644 src/fields/Document.ts create mode 100644 src/fields/DocumentReference.ts create mode 100644 src/fields/Field.ts create mode 100644 src/fields/FieldUpdatedArgs.ts create mode 100644 src/fields/Key.ts create mode 100644 src/fields/ListField.ts create mode 100644 src/fields/NumberField.ts create mode 100644 src/fields/TextField.ts create mode 100644 src/viewmodels/DocumentViewModel.ts (limited to 'src') diff --git a/src/Main.tsx b/src/Main.tsx index af7e2a8d4..21d8b4c1a 100644 --- a/src/Main.tsx +++ b/src/Main.tsx @@ -6,11 +6,17 @@ import { RootStore } from './stores/RootStore'; import { StaticTextNodeStore } from './stores/StaticTextNodeStore'; import { VideoNodeStore } from './stores/VideoNodeStore'; import { FreeFormCanvas } from './views/freeformcanvas/FreeFormCanvas'; -import { KeyController, KeyStore as KS } from './controllers/KeyController'; -import { NumberController } from './controllers/NumberController'; -import { DocumentController } from './controllers/DocumentController'; -import { TextController } from './controllers/TextController'; +import { Key, KeyStore as KS } from './fields/Key'; +import { NumberField } from './fields/NumberField'; +import { Document } from './fields/Document'; +import { TextField } from './fields/TextField'; +import { configure, runInAction } from 'mobx'; +import { NodeStore } from './stores/NodeStore'; +import { ListField } from './fields/ListField'; +configure({ + enforceActions: "observed" +}); const mainNodeCollection = new NodeCollectionStore(); ReactDOM.render(( @@ -25,7 +31,7 @@ ReactDOM.render(( let numNodes = 300; let maxX = 10000; let maxY = 10000; -let nodes = [] +let nodes:NodeStore[] = [] for (let i = 0; i < numNodes; i++) { nodes.push(new StaticTextNodeStore({ X: Math.random() * maxX, Y: Math.random() * maxY, Title: "Text Node Title", Text: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?" })); } @@ -34,11 +40,19 @@ for (let i = 0; i < 20; i++) { nodes.push(new VideoNodeStore({ X: Math.random() * maxX, Y: Math.random() * maxY, Title: "Video Node Title", Url: "http://cs.brown.edu/people/peichman/downloads/cted.mp4" })); } -mainNodeCollection.AddNodes(nodes); -let doc1 = new DocumentController(); -doc1.SetField(KS.X, new NumberController(5)); -doc1.SetField(KS.Y, new NumberController(5)); -doc1.SetField(KS.Width, new NumberController(5)); -doc1.SetField(KS.Height, new NumberController(5)); -doc1.SetField(KS.Data, new TextController("Hello world")); -mainNodeCollection.Docs.push(doc1); \ No newline at end of file +runInAction(() => { + mainNodeCollection.AddNodes(nodes); + let doc1 = new Document(); + doc1.SetField(KS.X, new NumberField(5)); + doc1.SetField(KS.Y, new NumberField(5)); + doc1.SetField(KS.Width, new NumberField(100)); + doc1.SetField(KS.Height, new NumberField(50)); + doc1.SetField(KS.Data, new TextField("Hello world")); + doc1.SetField(KS.View, new TextField('

{Data + X}

')); + doc1.SetField(KS.ViewProps, new ListField([KS.Data, KS.X])); + let doc2 = doc1.MakeDelegate(); + doc2.SetField(KS.X, new NumberField(150)); + doc2.SetField(KS.Y, new NumberField(20)); + mainNodeCollection.Docs.push(doc1); + mainNodeCollection.Docs.push(doc2); +}); \ No newline at end of file diff --git a/src/Utils.ts b/src/Utils.ts index f404adf14..f352b87e3 100644 --- a/src/Utils.ts +++ b/src/Utils.ts @@ -1,15 +1,13 @@ - +import v4 = require('uuid/v4'); +import v5 = require("uuid/v5"); export class Utils { - public static GenerateGuid() { - function s4() { - return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1); - } - return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4(); + public static GenerateGuid(): string { + return v4(); } - public static GenerateDeterministicGuid(seed: string) { - return seed; + public static GenerateDeterministicGuid(seed: string): string { + return v5(seed, v5.URL); } } \ No newline at end of file diff --git a/src/controllers/BasicFieldController.ts b/src/controllers/BasicFieldController.ts deleted file mode 100644 index 923bc335c..000000000 --- a/src/controllers/BasicFieldController.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { FieldController } from "./FieldController" -import { observable, computed, action } from "mobx"; - -export abstract class BasicFieldController extends FieldController { - constructor(data: T) { - super(); - - this.data = data; - } - - @observable - private data:T; - - @computed - get Data(): T { - return this.data; - } - - set Data(value: T) { - if(this.data === value) { - return; - } - this.data = value; - } - - @action - TrySetValue(value: any): boolean { - if (typeof value == typeof this.data) { - this.Data = value; - return true; - } - return false; - } - - GetValue(): any { - return this.Data; - } -} diff --git a/src/controllers/DocumentController.ts b/src/controllers/DocumentController.ts deleted file mode 100644 index 0627f9717..000000000 --- a/src/controllers/DocumentController.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { FieldController, Cast, Opt } from "./FieldController" -import { KeyController, KeyStore } from "./KeyController" -import { TypedEvent, Listener, Disposable } from "../util/TypedEvent"; -import { DocumentUpdatedArgs, FieldUpdatedAction } from "./FieldUpdatedArgs"; -import { ObservableMap } from "mobx"; - -export class DocumentController extends FieldController { - private fields: ObservableMap = new ObservableMap(); - - GetField(key: KeyController, ignoreProto?: boolean): Opt { - let field: Opt; - if (ignoreProto) { - if (this.fields.has(key)) { - field = this.fields.get(key); - } - } else { - let doc: Opt = this; - while (doc && !(doc.fields.has(key))) { - doc = doc.GetPrototype(); - } - - if (doc) { - field = doc.fields.get(key); - } - } - - return field; - } - - GetFieldT(key: KeyController, ctor: { new(): T }, ignoreProto?: boolean): Opt { - return Cast(this.GetField(key, ignoreProto), ctor); - } - - SetField(key: KeyController, field: Opt): void { - if (field) { - this.fields.set(key, field); - } else { - this.fields.delete(key); - } - } - - SetFieldValue(key: KeyController, value: any, ctor: { new(): T }): boolean { - let field = this.GetField(key); - if (field != null) { - return field.TrySetValue(value); - } else { - field = new ctor(); - if (field.TrySetValue(value)) { - this.SetField(key, field); - return true; - } else { - return false; - } - } - } - - GetPrototype(): Opt { - return this.GetFieldT(KeyStore.Prototype, DocumentController, true); - } - - GetAllPrototypes(): DocumentController[] { - let protos: DocumentController[] = []; - let doc: Opt = this; - while (doc != null) { - protos.push(doc); - doc = doc.GetPrototype(); - } - return protos; - } - - MakeDelegate(): DocumentController { - let delegate = new DocumentController(); - - delegate.SetField(KeyStore.Prototype, this); - - return delegate; - } - - TrySetValue(value: any): boolean { - throw new Error("Method not implemented."); - } - GetValue() { - throw new Error("Method not implemented."); - } - Copy(): FieldController { - throw new Error("Method not implemented."); - } - - -} \ No newline at end of file diff --git a/src/controllers/DocumentReferenceController.ts b/src/controllers/DocumentReferenceController.ts deleted file mode 100644 index 8e0aaf0e9..000000000 --- a/src/controllers/DocumentReferenceController.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { FieldController, Opt } from "./FieldController"; -import { DocumentController } from "./DocumentController"; -import { KeyController } from "./KeyController"; -import { DocumentUpdatedArgs } from "./FieldUpdatedArgs"; - -export class DocumentReferenceController extends FieldController { - get Key(): KeyController{ - return this.key; - } - - get Document(): DocumentController { - return this.document; - } - - constructor(private document: DocumentController, private key: KeyController) { - super(); - } - - private DocFieldUpdated(args: DocumentUpdatedArgs):void{ - // this.FieldUpdated.emit(args.fieldArgs); - } - - Dereference() : Opt { - return this.document.GetField(this.key); - } - - DereferenceToRoot(): Opt { - let field: Opt = this; - while (field instanceof DocumentReferenceController) { - field = field.Dereference(); - } - return field; - } - - TrySetValue(value: any): boolean { - throw new Error("Method not implemented."); - } - GetValue() { - throw new Error("Method not implemented."); - } - Copy(): FieldController { - throw new Error("Method not implemented."); - } - - -} \ No newline at end of file diff --git a/src/controllers/FieldController.ts b/src/controllers/FieldController.ts deleted file mode 100644 index ec59f53e8..000000000 --- a/src/controllers/FieldController.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { TypedEvent } from "../util/TypedEvent"; -import { FieldUpdatedArgs } from "./FieldUpdatedArgs"; -import { DocumentReferenceController } from "./DocumentReferenceController"; -import { Utils } from "../Utils"; - -export function Cast(field: Opt, ctor: { new(): T }): Opt { - if (field) { - if (ctor && field instanceof ctor) { - return field; - } - } - return undefined; -} - -export type Opt = T | undefined; - -export abstract class FieldController { - //FieldUpdated: TypedEvent> = new TypedEvent>(); - - private id: string; - get Id(): string { - return this.id; - } - - constructor(id: Opt = undefined) { - this.id = id || Utils.GenerateGuid(); - } - - Dereference(): Opt { - return this; - } - DereferenceToRoot(): Opt { - return this; - } - - DereferenceT(ctor: { new(): T }): Opt { - return Cast(this.Dereference(), ctor); - } - - DereferenceToRootT(ctor: { new(): T }): Opt { - return Cast(this.DereferenceToRoot(), ctor); - } - - Equals(other: FieldController): boolean { - return this.id === other.id; - } - - abstract TrySetValue(value: any): boolean; - - abstract GetValue(): any; - - abstract Copy(): FieldController; - -} \ No newline at end of file diff --git a/src/controllers/FieldUpdatedArgs.ts b/src/controllers/FieldUpdatedArgs.ts deleted file mode 100644 index f258c53e2..000000000 --- a/src/controllers/FieldUpdatedArgs.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { FieldController, Opt } from "./FieldController"; -import { DocumentController } from "./DocumentController"; -import { KeyController } from "./KeyController"; - -export enum FieldUpdatedAction { - Add, - Remove, - Replace, - Update -} - -export interface FieldUpdatedArgs { - field: FieldController; - action: FieldUpdatedAction; -} - -export interface DocumentUpdatedArgs { - field: DocumentController; - key: KeyController; - - oldValue: Opt; - newValue: Opt; - - fieldArgs?: FieldUpdatedArgs; - - action: FieldUpdatedAction; -} diff --git a/src/controllers/KeyController.ts b/src/controllers/KeyController.ts deleted file mode 100644 index 68eed3961..000000000 --- a/src/controllers/KeyController.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { FieldController } from "./FieldController" -import { Utils } from "../Utils"; - -export class KeyController extends FieldController { - get Name():string { - return this.name; - } - - constructor(private name:string){ - super(Utils.GenerateDeterministicGuid(name)); - } - - TrySetValue(value: any): boolean { - throw new Error("Method not implemented."); - } - - GetValue() { - return this.Name; - } - - Copy(): FieldController { - return this; - } - - -} - -export namespace KeyStore { - export let Prototype = new KeyController("Prototype"); - export let X = new KeyController("Y"); - export let Y = new KeyController("Y"); - export let Width = new KeyController("Width"); - export let Height = new KeyController("Height"); - export let Data = new KeyController("Data"); - export let View = new KeyController("View"); -} \ No newline at end of file diff --git a/src/controllers/ListController.ts b/src/controllers/ListController.ts deleted file mode 100644 index 94a4ae828..000000000 --- a/src/controllers/ListController.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { FieldController } from "./FieldController"; -import { BasicFieldController } from "./BasicFieldController"; -import { NumberController } from "./NumberController"; -import { TextController } from "./TextController"; - -export class ListController extends BasicFieldController { - constructor(data: T[] = []) { - super(data.slice()); - - let arr:TextController[] = []; - this.Test(arr); - } - - Test(test: FieldController[]){ - test.push(new NumberController()); - } - - Get(index:number) : T{ - return this.Data[index]; - } - - Set(index:number, value:T):void { - this.Data[index] = value; - } - - Copy(): FieldController { - return new ListController(this.Data); - } - -} \ No newline at end of file diff --git a/src/controllers/NumberController.ts b/src/controllers/NumberController.ts deleted file mode 100644 index aeedf025b..000000000 --- a/src/controllers/NumberController.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { BasicFieldController } from "./BasicFieldController" -import { FieldUpdatedAction } from "./FieldUpdatedArgs"; - -export class NumberController extends BasicFieldController { - constructor(data: number = 0) { - super(data); - } - - Copy() { - return new NumberController(this.Data); - } - - -} \ No newline at end of file diff --git a/src/controllers/TextController.ts b/src/controllers/TextController.ts deleted file mode 100644 index 5d4b43170..000000000 --- a/src/controllers/TextController.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { BasicFieldController } from "./BasicFieldController" -import { FieldUpdatedAction } from "./FieldUpdatedArgs"; - -export class TextController extends BasicFieldController { - constructor(data: string = "") { - super(data); - } - - Copy() { - return new TextController(this.Data); - } - - -} diff --git a/src/fields/BasicField.ts b/src/fields/BasicField.ts new file mode 100644 index 000000000..437024d07 --- /dev/null +++ b/src/fields/BasicField.ts @@ -0,0 +1,38 @@ +import { Field } from "./Field" +import { observable, computed, action } from "mobx"; + +export abstract class BasicField extends Field { + constructor(data: T) { + super(); + + this.data = data; + } + + @observable + private data:T; + + @computed + get Data(): T { + return this.data; + } + + set Data(value: T) { + if(this.data === value) { + return; + } + this.data = value; + } + + @action + TrySetValue(value: any): boolean { + if (typeof value == typeof this.data) { + this.Data = value; + return true; + } + return false; + } + + GetValue(): any { + return this.Data; + } +} diff --git a/src/fields/Document.ts b/src/fields/Document.ts new file mode 100644 index 000000000..c315beaef --- /dev/null +++ b/src/fields/Document.ts @@ -0,0 +1,93 @@ +import { Field, Cast, Opt } from "./Field" +import { Key, KeyStore } from "./Key" +import { ObservableMap } from "mobx"; + +export class Document extends Field { + private fields: ObservableMap = new ObservableMap(); + + GetField(key: Key, ignoreProto?: boolean): Opt { + let field: Opt; + if (ignoreProto) { + if (this.fields.has(key)) { + field = this.fields.get(key); + } + } else { + let doc: Opt = this; + while (doc && !(doc.fields.has(key))) { + doc = doc.GetPrototype(); + } + + if (doc) { + field = doc.fields.get(key); + } + } + + return field; + } + + GetFieldT(key: Key, ctor: { new(): T }, ignoreProto?: boolean): Opt { + return Cast(this.GetField(key, ignoreProto), ctor); + } + + GetFieldValue(key: Key, ctor: { new(): U }, defaultVal: T): T { + let val = this.GetField(key); + return (val && val instanceof ctor) ? val.Data : defaultVal; + } + + SetField(key: Key, field: Opt): void { + if (field) { + this.fields.set(key, field); + } else { + this.fields.delete(key); + } + } + + SetFieldValue(key: Key, value: any, ctor: { new(): T }): boolean { + let field = this.GetField(key); + if (field != null) { + return field.TrySetValue(value); + } else { + field = new ctor(); + if (field.TrySetValue(value)) { + this.SetField(key, field); + return true; + } else { + return false; + } + } + } + + GetPrototype(): Opt { + return this.GetFieldT(KeyStore.Prototype, Document, true); + } + + GetAllPrototypes(): Document[] { + let protos: Document[] = []; + let doc: Opt = this; + while (doc != null) { + protos.push(doc); + doc = doc.GetPrototype(); + } + return protos; + } + + MakeDelegate(): Document { + let delegate = new Document(); + + delegate.SetField(KeyStore.Prototype, this); + + return delegate; + } + + TrySetValue(value: any): boolean { + throw new Error("Method not implemented."); + } + GetValue() { + throw new Error("Method not implemented."); + } + Copy(): Field { + throw new Error("Method not implemented."); + } + + +} \ No newline at end of file diff --git a/src/fields/DocumentReference.ts b/src/fields/DocumentReference.ts new file mode 100644 index 000000000..936067bd2 --- /dev/null +++ b/src/fields/DocumentReference.ts @@ -0,0 +1,46 @@ +import { Field, Opt } from "./Field"; +import { Document } from "./Document"; +import { Key } from "./Key"; +import { DocumentUpdatedArgs } from "./FieldUpdatedArgs"; + +export class DocumentReference extends Field { + get Key(): Key{ + return this.key; + } + + get Document(): Document { + return this.document; + } + + constructor(private document: Document, private key: Key) { + super(); + } + + private DocFieldUpdated(args: DocumentUpdatedArgs):void{ + // this.FieldUpdated.emit(args.fieldArgs); + } + + Dereference() : Opt { + return this.document.GetField(this.key); + } + + DereferenceToRoot(): Opt { + let field: Opt = this; + while (field instanceof DocumentReference) { + field = field.Dereference(); + } + return field; + } + + TrySetValue(value: any): boolean { + throw new Error("Method not implemented."); + } + GetValue() { + throw new Error("Method not implemented."); + } + Copy(): Field { + throw new Error("Method not implemented."); + } + + +} \ No newline at end of file diff --git a/src/fields/Field.ts b/src/fields/Field.ts new file mode 100644 index 000000000..46f92f203 --- /dev/null +++ b/src/fields/Field.ts @@ -0,0 +1,54 @@ +import { TypedEvent } from "../util/TypedEvent"; +import { FieldUpdatedArgs } from "./FieldUpdatedArgs"; +import { DocumentReference } from "./DocumentReference"; +import { Utils } from "../Utils"; + +export function Cast(field: Opt, ctor: { new(): T }): Opt { + if (field) { + if (ctor && field instanceof ctor) { + return field; + } + } + return undefined; +} + +export type Opt = T | undefined; + +export abstract class Field { + //FieldUpdated: TypedEvent> = new TypedEvent>(); + + private id: string; + get Id(): string { + return this.id; + } + + constructor(id: Opt = undefined) { + this.id = id || Utils.GenerateGuid(); + } + + Dereference(): Opt { + return this; + } + DereferenceToRoot(): Opt { + return this; + } + + DereferenceT(ctor: { new(): T }): Opt { + return Cast(this.Dereference(), ctor); + } + + DereferenceToRootT(ctor: { new(): T }): Opt { + return Cast(this.DereferenceToRoot(), ctor); + } + + Equals(other: Field): boolean { + return this.id === other.id; + } + + abstract TrySetValue(value: any): boolean; + + abstract GetValue(): any; + + abstract Copy(): Field; + +} \ No newline at end of file diff --git a/src/fields/FieldUpdatedArgs.ts b/src/fields/FieldUpdatedArgs.ts new file mode 100644 index 000000000..23ccf2a5a --- /dev/null +++ b/src/fields/FieldUpdatedArgs.ts @@ -0,0 +1,27 @@ +import { Field, Opt } from "./Field"; +import { Document } from "./Document"; +import { Key } from "./Key"; + +export enum FieldUpdatedAction { + Add, + Remove, + Replace, + Update +} + +export interface FieldUpdatedArgs { + field: Field; + action: FieldUpdatedAction; +} + +export interface DocumentUpdatedArgs { + field: Document; + key: Key; + + oldValue: Opt; + newValue: Opt; + + fieldArgs?: FieldUpdatedArgs; + + action: FieldUpdatedAction; +} diff --git a/src/fields/Key.ts b/src/fields/Key.ts new file mode 100644 index 000000000..42881c8a6 --- /dev/null +++ b/src/fields/Key.ts @@ -0,0 +1,37 @@ +import { Field } from "./Field" +import { Utils } from "../Utils"; + +export class Key extends Field { + get Name():string { + return this.name; + } + + constructor(private name:string){ + super(Utils.GenerateDeterministicGuid(name)); + } + + TrySetValue(value: any): boolean { + throw new Error("Method not implemented."); + } + + GetValue() { + return this.Name; + } + + Copy(): Field { + return this; + } + + +} + +export namespace KeyStore { + export let Prototype = new Key("Prototype"); + export let X = new Key("X"); + export let Y = new Key("Y"); + export let Width = new Key("Width"); + export let Height = new Key("Height"); + export let Data = new Key("Data"); + export let View = new Key("View"); + export let ViewProps = new Key("ViewProps"); +} \ No newline at end of file diff --git a/src/fields/ListField.ts b/src/fields/ListField.ts new file mode 100644 index 000000000..dd96ea8c8 --- /dev/null +++ b/src/fields/ListField.ts @@ -0,0 +1,21 @@ +import { Field } from "./Field"; +import { BasicField } from "./BasicField"; + +export class ListField extends BasicField { + constructor(data: T[] = []) { + super(data.slice()); + } + + Get(index:number) : T{ + return this.Data[index]; + } + + Set(index:number, value:T):void { + this.Data[index] = value; + } + + Copy(): Field { + return new ListField(this.Data); + } + +} \ No newline at end of file diff --git a/src/fields/NumberField.ts b/src/fields/NumberField.ts new file mode 100644 index 000000000..cbe15f987 --- /dev/null +++ b/src/fields/NumberField.ts @@ -0,0 +1,13 @@ +import { BasicField } from "./BasicField" + +export class NumberField extends BasicField { + constructor(data: number = 0) { + super(data); + } + + Copy() { + return new NumberField(this.Data); + } + + +} \ No newline at end of file diff --git a/src/fields/TextField.ts b/src/fields/TextField.ts new file mode 100644 index 000000000..a7c221788 --- /dev/null +++ b/src/fields/TextField.ts @@ -0,0 +1,13 @@ +import { BasicField } from "./BasicField" + +export class TextField extends BasicField { + constructor(data: string = "") { + super(data); + } + + Copy() { + return new TextField(this.Data); + } + + +} diff --git a/src/stores/NodeCollectionStore.ts b/src/stores/NodeCollectionStore.ts index b6f2ef8e0..ac4f515f1 100644 --- a/src/stores/NodeCollectionStore.ts +++ b/src/stores/NodeCollectionStore.ts @@ -1,6 +1,6 @@ import { computed, observable, action } from "mobx"; import { NodeStore } from "./NodeStore"; -import { DocumentController } from "../controllers/DocumentController"; +import { Document } from "../fields/Document"; export class NodeCollectionStore extends NodeStore { @@ -11,7 +11,7 @@ export class NodeCollectionStore extends NodeStore { public Nodes: NodeStore[] = new Array(); @observable - public Docs: DocumentController[] = []; + public Docs: Document[] = []; @computed public get Transform(): string { diff --git a/src/viewmodels/DocumentViewModel.ts b/src/viewmodels/DocumentViewModel.ts new file mode 100644 index 000000000..008275f3c --- /dev/null +++ b/src/viewmodels/DocumentViewModel.ts @@ -0,0 +1,11 @@ +import { Document } from "../fields/Document"; + +export class DocumentViewModel { + constructor(private doc: Document) { + + } + + get Doc(): Document { + return this.doc; + } +} \ No newline at end of file diff --git a/src/views/freeformcanvas/FreeFormCanvas.tsx b/src/views/freeformcanvas/FreeFormCanvas.tsx index a80e11ef5..3552ffa54 100644 --- a/src/views/freeformcanvas/FreeFormCanvas.tsx +++ b/src/views/freeformcanvas/FreeFormCanvas.tsx @@ -3,8 +3,10 @@ import { NodeCollectionStore } from "../../stores/NodeCollectionStore"; import "./FreeFormCanvas.scss"; import { NodeContainer } from "./NodeContainer"; import React = require("react"); -import { KeyStore } from "../../controllers/KeyController"; -import { NumberController } from "../../controllers/NumberController"; +import { KeyStore } from "../../fields/Key"; +import { NumberField } from "../../fields/NumberField"; +import { TextField } from "../../fields/TextField"; +import { action } from "mobx"; interface IProps { store: NodeCollectionStore @@ -15,6 +17,7 @@ export class FreeFormCanvas extends React.Component { private _isPointerDown: boolean = false; + @action onPointerDown = (e: React.PointerEvent): void => { e.stopPropagation(); e.preventDefault(); @@ -25,6 +28,7 @@ export class FreeFormCanvas extends React.Component { document.addEventListener("pointerup", this.onPointerUp); } + @action onPointerUp = (e: PointerEvent): void => { e.stopPropagation(); e.preventDefault(); @@ -33,14 +37,12 @@ export class FreeFormCanvas extends React.Component { document.removeEventListener("pointerup", this.onPointerUp); let doc = this.props.store.Docs[0]; - let xField = doc.GetFieldT(KeyStore.X, NumberController); - let x = xField ? xField.Data : 0; - let yField = doc.GetFieldT(KeyStore.Y, NumberController); - let y = yField ? yField.Data : 0; - this.props.store.Docs[0].SetFieldValue(KeyStore.X, x + 10, NumberController); - this.props.store.Docs[0].SetFieldValue(KeyStore.Y, y + 10, NumberController); + let dataField = doc.GetFieldT(KeyStore.Data, TextField); + let data = dataField ? dataField.Data : ""; + this.props.store.Docs[0].SetFieldValue(KeyStore.Data, data + " hello", TextField); } + @action onPointerMove = (e: PointerEvent): void => { e.stopPropagation(); e.preventDefault(); @@ -51,6 +53,7 @@ export class FreeFormCanvas extends React.Component { this.props.store.Y += e.movementY; } + @action onPointerWheel = (e: React.WheelEvent): void => { e.stopPropagation(); e.preventDefault(); diff --git a/src/views/freeformcanvas/NodeContainer.tsx b/src/views/freeformcanvas/NodeContainer.tsx index c59ab194e..6c3cb2af2 100644 --- a/src/views/freeformcanvas/NodeContainer.tsx +++ b/src/views/freeformcanvas/NodeContainer.tsx @@ -7,6 +7,7 @@ import { VideoNodeView } from "../nodes/VideoNodeView"; import "./FreeFormCanvas.scss"; import React = require("react"); import { DocumentView } from "../nodes/DocumentView"; +import { DocumentViewModel } from "../../viewmodels/DocumentViewModel"; interface IProps { store: NodeCollectionStore @@ -19,7 +20,7 @@ export class NodeContainer extends React.Component { return (
{this.props.store.Docs.map(doc => { - return (); + return (); })}
); diff --git a/src/views/nodes/DocumentView.tsx b/src/views/nodes/DocumentView.tsx index d3f025388..059d6c69e 100644 --- a/src/views/nodes/DocumentView.tsx +++ b/src/views/nodes/DocumentView.tsx @@ -1,27 +1,27 @@ import { observer } from "mobx-react"; -import { DocumentController } from "../../controllers/DocumentController"; import React = require("react"); import { computed } from "mobx"; -import { KeyStore } from "../../controllers/KeyController"; -import { NumberController } from "../../controllers/NumberController"; -import { TextController } from "../../controllers/TextController"; +import { KeyStore, Key } from "../../fields/Key"; +import { NumberField } from "../../fields/NumberField"; +import { TextField } from "../../fields/TextField"; +import { DocumentViewModel } from "../../viewmodels/DocumentViewModel"; +import { ListField } from "../../fields/ListField"; +const JsxParser = require('react-jsx-parser').default;//TODO Why does this need to be imported like this? interface IProps { - doc:DocumentController; + dvm:DocumentViewModel; } @observer export class DocumentView extends React.Component { @computed get x(): number { - let field = this.props.doc.GetFieldT(KeyStore.X, NumberController); - return field ? field.Data : 0; + return this.props.dvm.Doc.GetFieldValue(KeyStore.X, NumberField, Number(0)); } @computed get y(): number { - let field = this.props.doc.GetFieldT(KeyStore.Y, NumberController); - return field ? field.Data : 0; + return this.props.dvm.Doc.GetFieldValue(KeyStore.Y, NumberField, Number(0)); } @computed @@ -31,31 +31,49 @@ export class DocumentView extends React.Component { @computed get width(): number { - let field = this.props.doc.GetFieldT(KeyStore.Width, NumberController); - return field ? field.Data : 0; + return this.props.dvm.Doc.GetFieldValue(KeyStore.Width, NumberField, Number(0)); } @computed get height(): number { - let field = this.props.doc.GetFieldT(KeyStore.Height, NumberController); - return field ? field.Data : 0; + return this.props.dvm.Doc.GetFieldValue(KeyStore.Height, NumberField, Number(0)); } //Temp @computed get data(): string { - let field = this.props.doc.GetFieldT(KeyStore.Data, TextController); - return field ? field.Data : ""; + return this.props.dvm.Doc.GetFieldValue(KeyStore.Data, TextField, String("")); + } + + @computed + get layout(): string { + return this.props.dvm.Doc.GetFieldValue(KeyStore.View, TextField, String("

Error loading layout data

")); + } + + @computed + get layoutFields(): Key[] { + return this.props.dvm.Doc.GetFieldValue(KeyStore.ViewProps, ListField, new Array()); } render() { + let doc = this.props.dvm.Doc; + let bindings:any = {}; + for (const key of this.layoutFields) { + let field = doc.GetField(key); + if(field) { + bindings[key.Name] = field.GetValue(); + } + } return (
-

{this.data}

+
); } -- cgit v1.2.3-70-g09d2