aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Main.tsx9
-rw-r--r--src/Utils.ts4
-rw-r--r--src/controllers/DocumentController.ts68
-rw-r--r--src/controllers/DocumentReferenceController.ts14
-rw-r--r--src/controllers/FieldController.ts45
-rw-r--r--src/controllers/FieldUpdatedArgs.ts8
-rw-r--r--src/controllers/KeyController.ts7
-rw-r--r--src/controllers/ListController.ts30
-rw-r--r--src/stores/VideoNodeStore.ts4
-rw-r--r--src/views/freeformcanvas/FreeFormCanvas.tsx2
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();