diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Main.tsx | 9 | ||||
-rw-r--r-- | src/Utils.ts | 4 | ||||
-rw-r--r-- | src/controllers/DocumentController.ts | 68 | ||||
-rw-r--r-- | src/controllers/DocumentReferenceController.ts | 14 | ||||
-rw-r--r-- | src/controllers/FieldController.ts | 45 | ||||
-rw-r--r-- | src/controllers/FieldUpdatedArgs.ts | 8 | ||||
-rw-r--r-- | src/controllers/KeyController.ts | 7 | ||||
-rw-r--r-- | src/controllers/ListController.ts | 30 | ||||
-rw-r--r-- | src/stores/VideoNodeStore.ts | 4 | ||||
-rw-r--r-- | src/views/freeformcanvas/FreeFormCanvas.tsx | 2 |
10 files changed, 154 insertions, 37 deletions
diff --git a/src/Main.tsx b/src/Main.tsx index 99401bf65..51a3c8bbd 100644 --- a/src/Main.tsx +++ b/src/Main.tsx @@ -6,6 +6,8 @@ import { RootStore } from './stores/RootStore'; import { StaticTextNodeStore } from './stores/StaticTextNodeStore'; import { VideoNodeStore } from './stores/VideoNodeStore'; import { FreeFormCanvas } from './views/freeformcanvas/FreeFormCanvas'; +import { KeyController } from './controllers/KeyController'; +import { NumberController } from './controllers/NumberController'; const mainNodeCollection = new NodeCollectionStore(); @@ -29,4 +31,11 @@ for (let i = 0; i < numNodes; i++) { 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" })); } + +let test1 = new KeyController("Test"), test2 = new KeyController("Test"); +let test3 = new NumberController(55); +console.log(test1 == test2); +console.log(test1 === test2); +console.log(test1.Equals(test2)); +console.log(test1.Equals(test3)); mainNodeCollection.AddNodes(nodes);
\ No newline at end of file diff --git a/src/Utils.ts b/src/Utils.ts index 7f26bc394..f404adf14 100644 --- a/src/Utils.ts +++ b/src/Utils.ts @@ -8,4 +8,8 @@ export class Utils { } return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4(); } + + public static GenerateDeterministicGuid(seed: string) { + return seed; + } }
\ No newline at end of file diff --git a/src/controllers/DocumentController.ts b/src/controllers/DocumentController.ts index 0c53a9c43..02ef66417 100644 --- a/src/controllers/DocumentController.ts +++ b/src/controllers/DocumentController.ts @@ -1,21 +1,38 @@ -import { FieldController } from "./FieldController" -import { KeyController } from "./KeyController" +import { FieldController, Cast, Opt } from "./FieldController" +import { KeyController, KeyStore } from "./KeyController" import { TypedEvent, Listener, Disposable } from "../util/TypedEvent"; import { DocumentUpdatedArgs, FieldUpdatedAction } from "./FieldUpdatedArgs"; export class DocumentController extends FieldController { private fields: { [key: string]: { key: KeyController, field: FieldController, disposer: Disposable } } = {}; - private fieldUpdateHandlers: { [key: string]: TypedEvent<DocumentUpdatedArgs> } + private fieldUpdateHandlers: { [key: string]: TypedEvent<DocumentUpdatedArgs> } = {}; - GetField(key: KeyController): FieldController { - if (key.Id in this.fields) { - return this.fields[key.Id].field; + GetField(key: KeyController, ignoreProto?: boolean): Opt<FieldController> { + let field: Opt<FieldController>; + if (ignoreProto) { + if (key.Id in this.fields) { + field = this.fields[key.Id].field; + } + } else { + let doc: Opt<DocumentController> = this; + while (doc && !(key.Id in doc.fields)) { + doc = doc.GetPrototype(); + } + + if (doc) { + field = doc.fields[key.Id].field; + } } - return null; + + return field; + } + + GetFieldT<T extends FieldController = FieldController>(key: KeyController, ctor: { new(): T }, ignoreProto?: boolean): Opt<T> { + return Cast(this.GetField(key, ignoreProto), ctor); } - SetField(key: KeyController, field: FieldController): void { - let oldField: FieldController = null; + SetField(key: KeyController, field: Opt<FieldController>): void { + let oldField: Opt<FieldController>; if (key.Id in this.fields) { let old = this.fields[key.Id]; oldField = old.field; @@ -26,7 +43,7 @@ export class DocumentController extends FieldController { return; } - if (field === null) { + if (field == null) { delete this.fields[key.Id]; } else { this.fields[key.Id] = { @@ -34,7 +51,7 @@ export class DocumentController extends FieldController { field: field, disposer: field.FieldUpdated.on((args) => this.DocumentFieldUpdated({ action: FieldUpdatedAction.Update, - oldValue: null, + oldValue: undefined, newValue: field, field: this, fieldArgs: args, @@ -52,18 +69,17 @@ export class DocumentController extends FieldController { key: key, oldValue: oldField, newValue: field, - fieldArgs: null, action: action }) } - SetFieldValue<T extends FieldController>(key:KeyController, value:any, ctor: {new():T}) : boolean { + SetFieldValue<T extends FieldController>(key: KeyController, value: any, ctor: { new(): T }): boolean { let field = this.GetField(key); - if(field !== null) { + if (field != null) { return field.TrySetValue(value); } else { field = new ctor(); - if(field.TrySetValue(value)) { + if (field.TrySetValue(value)) { this.SetField(key, field); return true; } else { @@ -72,6 +88,28 @@ export class DocumentController extends FieldController { } } + GetPrototype(): Opt<DocumentController> { + return this.GetFieldT(KeyStore.Prototype, DocumentController, true); + } + + GetAllPrototypes(): DocumentController[] { + let protos: DocumentController[] = []; + let doc: Opt<DocumentController> = 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; + } + private DocumentFieldUpdated(args: DocumentUpdatedArgs) { if (args.key.Id in this.fieldUpdateHandlers) { this.fieldUpdateHandlers[args.key.Id].emit(args); diff --git a/src/controllers/DocumentReferenceController.ts b/src/controllers/DocumentReferenceController.ts index 9d5bb7af2..9cf128614 100644 --- a/src/controllers/DocumentReferenceController.ts +++ b/src/controllers/DocumentReferenceController.ts @@ -1,4 +1,4 @@ -import { FieldController } from "./FieldController"; +import { FieldController, Opt } from "./FieldController"; import { DocumentController } from "./DocumentController"; import { KeyController } from "./KeyController"; import { DocumentUpdatedArgs } from "./FieldUpdatedArgs"; @@ -22,6 +22,18 @@ export class DocumentReferenceController extends FieldController { this.FieldUpdated.emit(args.fieldArgs); } + protected DereferenceImpl() : Opt<FieldController> { + return this.document.GetField(this.key); + } + + protected DereferenceToRootImpl(): Opt<FieldController> { + let field: Opt<FieldController> = this; + while (field instanceof DocumentReferenceController) { + field = field.Dereference(); + } + return field; + } + TrySetValue(value: any): boolean { throw new Error("Method not implemented."); } diff --git a/src/controllers/FieldController.ts b/src/controllers/FieldController.ts index 19205014a..6e7daf6e1 100644 --- a/src/controllers/FieldController.ts +++ b/src/controllers/FieldController.ts @@ -1,41 +1,60 @@ import { TypedEvent } from "../util/TypedEvent"; import { FieldUpdatedArgs } from "./FieldUpdatedArgs"; import { DocumentReferenceController } from "./DocumentReferenceController"; +import { Utils } from "../Utils"; + +export function Cast<T extends FieldController>(field: Opt<FieldController>, ctor: { new(): T }): Opt<T> { + if (field) { + if (ctor && field instanceof ctor) { + return field; + } + } + return undefined; +} + +export type Opt<T> = T | undefined; export abstract class FieldController { - Id: string; + FieldUpdated: TypedEvent<Opt<FieldUpdatedArgs>> = new TypedEvent<Opt<FieldUpdatedArgs>>(); - FieldUpdated: TypedEvent<FieldUpdatedArgs>; + private id: string; + get Id(): string { + return this.id; + } - protected DereferenceImpl(): FieldController { + constructor(id: Opt<string> = undefined) { + this.id = id || Utils.GenerateGuid(); + } + + protected DereferenceImpl(): Opt<FieldController> { return this; } - protected DereferenceToRootImpl(): FieldController { - let field = this; - while(field instanceof DocumentReferenceController) { - field = field.Dereference(); - } - return field; + protected DereferenceToRootImpl(): Opt<FieldController> { + return this; } - Dereference<T extends FieldController = FieldController>(ctor?: { new(): T }): T { + Dereference<T extends FieldController = FieldController>(ctor?: { new(): T }): Opt<T> { let field = this.DereferenceImpl(); if (ctor && field instanceof ctor) { return field; } else { - return null; + return undefined; } } - DereferenceToRoot<T extends FieldController = FieldController>(ctor?: { new(): T }): T { + DereferenceToRoot<T extends FieldController = FieldController>(ctor?: { new(): T }): Opt<T> { let field = this.DereferenceToRootImpl(); if (ctor && field instanceof ctor) { return field; } else { - return null; + return undefined; } } + Equals(other: FieldController) : boolean { + return this.id === other.id; + } + abstract TrySetValue(value: any): boolean; abstract GetValue(): any; diff --git a/src/controllers/FieldUpdatedArgs.ts b/src/controllers/FieldUpdatedArgs.ts index 786a44aa4..f258c53e2 100644 --- a/src/controllers/FieldUpdatedArgs.ts +++ b/src/controllers/FieldUpdatedArgs.ts @@ -1,4 +1,4 @@ -import { FieldController } from "./FieldController"; +import { FieldController, Opt } from "./FieldController"; import { DocumentController } from "./DocumentController"; import { KeyController } from "./KeyController"; @@ -18,10 +18,10 @@ export interface DocumentUpdatedArgs { field: DocumentController; key: KeyController; - oldValue: FieldController; - newValue: FieldController; + oldValue: Opt<FieldController>; + newValue: Opt<FieldController>; - fieldArgs: FieldUpdatedArgs; + fieldArgs?: FieldUpdatedArgs; action: FieldUpdatedAction; } diff --git a/src/controllers/KeyController.ts b/src/controllers/KeyController.ts index 96e41eded..ad410d756 100644 --- a/src/controllers/KeyController.ts +++ b/src/controllers/KeyController.ts @@ -1,4 +1,5 @@ import { FieldController } from "./FieldController" +import { Utils } from "../Utils"; export class KeyController extends FieldController { get Name():string { @@ -6,7 +7,7 @@ export class KeyController extends FieldController { } constructor(private name:string){ - super(); + super(Utils.GenerateDeterministicGuid(name)); } TrySetValue(value: any): boolean { @@ -23,3 +24,7 @@ export class KeyController extends FieldController { } + +export namespace KeyStore { + export let Prototype = new KeyController("Prototype"); +}
\ No newline at end of file diff --git a/src/controllers/ListController.ts b/src/controllers/ListController.ts new file mode 100644 index 000000000..94a4ae828 --- /dev/null +++ b/src/controllers/ListController.ts @@ -0,0 +1,30 @@ +import { FieldController } from "./FieldController"; +import { BasicFieldController } from "./BasicFieldController"; +import { NumberController } from "./NumberController"; +import { TextController } from "./TextController"; + +export class ListController<T extends FieldController> extends BasicFieldController<T[]> { + 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<T>(this.Data); + } + +}
\ No newline at end of file diff --git a/src/stores/VideoNodeStore.ts b/src/stores/VideoNodeStore.ts index 41fae2aff..e5187ab07 100644 --- a/src/stores/VideoNodeStore.ts +++ b/src/stores/VideoNodeStore.ts @@ -9,9 +9,9 @@ export class VideoNodeStore extends NodeStore { } @observable - public Title: string; + public Title: string = ""; @observable - public Url: string; + public Url: string = ""; }
\ No newline at end of file diff --git a/src/views/freeformcanvas/FreeFormCanvas.tsx b/src/views/freeformcanvas/FreeFormCanvas.tsx index d25341cbb..dada8f9e5 100644 --- a/src/views/freeformcanvas/FreeFormCanvas.tsx +++ b/src/views/freeformcanvas/FreeFormCanvas.tsx @@ -11,7 +11,7 @@ interface IProps { @observer export class FreeFormCanvas extends React.Component<IProps> { - private _isPointerDown: boolean; + private _isPointerDown: boolean = false; onPointerDown = (e: React.PointerEvent): void => { e.stopPropagation(); |