From 3de39e2608e62a278b9c8cc37b53333f0877fa59 Mon Sep 17 00:00:00 2001 From: Tyler Schicke Date: Tue, 15 Jan 2019 07:57:16 -0500 Subject: Have most of document stuff working --- src/controllers/BasicFieldController.ts | 22 ++++---- src/controllers/DocumentController.ts | 73 ++++---------------------- src/controllers/DocumentReferenceController.ts | 8 ++- src/controllers/FieldController.ts | 26 +++------ src/controllers/KeyController.ts | 6 +++ 5 files changed, 38 insertions(+), 97 deletions(-) (limited to 'src/controllers') diff --git a/src/controllers/BasicFieldController.ts b/src/controllers/BasicFieldController.ts index ff88f8781..923bc335c 100644 --- a/src/controllers/BasicFieldController.ts +++ b/src/controllers/BasicFieldController.ts @@ -1,7 +1,17 @@ import { FieldController } from "./FieldController" -import { FieldUpdatedAction } from "./FieldUpdatedArgs"; +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; } @@ -11,17 +21,9 @@ export abstract class BasicFieldController extends FieldController { return; } this.data = value; - - this.FieldUpdated.emit({ - field: this, - action: FieldUpdatedAction.Update - }); - } - - constructor(private data: T) { - super(); } + @action TrySetValue(value: any): boolean { if (typeof value == typeof this.data) { this.Data = value; diff --git a/src/controllers/DocumentController.ts b/src/controllers/DocumentController.ts index 02ef66417..0627f9717 100644 --- a/src/controllers/DocumentController.ts +++ b/src/controllers/DocumentController.ts @@ -2,25 +2,25 @@ 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: { [key: string]: { key: KeyController, field: FieldController, disposer: Disposable } } = {}; - private fieldUpdateHandlers: { [key: string]: TypedEvent } = {}; + private fields: ObservableMap = new ObservableMap(); GetField(key: KeyController, ignoreProto?: boolean): Opt { let field: Opt; if (ignoreProto) { - if (key.Id in this.fields) { - field = this.fields[key.Id].field; + if (this.fields.has(key)) { + field = this.fields.get(key); } } else { let doc: Opt = this; - while (doc && !(key.Id in doc.fields)) { + while (doc && !(doc.fields.has(key))) { doc = doc.GetPrototype(); } if (doc) { - field = doc.fields[key.Id].field; + field = doc.fields.get(key); } } @@ -32,45 +32,11 @@ export class DocumentController extends FieldController { } SetField(key: KeyController, field: Opt): void { - let oldField: Opt; - if (key.Id in this.fields) { - let old = this.fields[key.Id]; - oldField = old.field; - old.disposer.dispose(); - } - - if (oldField === field) { - return; - } - - if (field == null) { - delete this.fields[key.Id]; + if (field) { + this.fields.set(key, field); } else { - this.fields[key.Id] = { - key: key, - field: field, - disposer: field.FieldUpdated.on((args) => this.DocumentFieldUpdated({ - action: FieldUpdatedAction.Update, - oldValue: undefined, - newValue: field, - field: this, - fieldArgs: args, - key: key - })) - } + this.fields.delete(key); } - - let action = oldField === null ? FieldUpdatedAction.Add : - (field === null ? FieldUpdatedAction.Remove : - FieldUpdatedAction.Replace); - - this.DocumentFieldUpdated({ - field: this, - key: key, - oldValue: oldField, - newValue: field, - action: action - }) } SetFieldValue(key: KeyController, value: any, ctor: { new(): T }): boolean { @@ -110,27 +76,6 @@ export class DocumentController extends FieldController { return delegate; } - private DocumentFieldUpdated(args: DocumentUpdatedArgs) { - if (args.key.Id in this.fieldUpdateHandlers) { - this.fieldUpdateHandlers[args.key.Id].emit(args); - } - this.FieldUpdated.emit(args); - } - - AddFieldUpdatedHandler(key: KeyController, listener: Listener): Disposable { - if (!(key.Id in this.fieldUpdateHandlers)) { - this.fieldUpdateHandlers[key.Id] = new TypedEvent(); - } - - return this.fieldUpdateHandlers[key.Id].on(listener); - } - - RemoveFieldUpdatedHandler(key: KeyController, listener: Listener) { - if (key.Id in this.fieldUpdateHandlers) { - this.fieldUpdateHandlers[key.Id].off(listener); - } - } - TrySetValue(value: any): boolean { throw new Error("Method not implemented."); } diff --git a/src/controllers/DocumentReferenceController.ts b/src/controllers/DocumentReferenceController.ts index 9cf128614..8e0aaf0e9 100644 --- a/src/controllers/DocumentReferenceController.ts +++ b/src/controllers/DocumentReferenceController.ts @@ -14,19 +14,17 @@ export class DocumentReferenceController extends FieldController { constructor(private document: DocumentController, private key: KeyController) { super(); - - document.AddFieldUpdatedHandler(key, this.DocFieldUpdated); } private DocFieldUpdated(args: DocumentUpdatedArgs):void{ - this.FieldUpdated.emit(args.fieldArgs); + // this.FieldUpdated.emit(args.fieldArgs); } - protected DereferenceImpl() : Opt { + Dereference() : Opt { return this.document.GetField(this.key); } - protected DereferenceToRootImpl(): Opt { + DereferenceToRoot(): Opt { let field: Opt = this; while (field instanceof DocumentReferenceController) { field = field.Dereference(); diff --git a/src/controllers/FieldController.ts b/src/controllers/FieldController.ts index 6e7daf6e1..ec59f53e8 100644 --- a/src/controllers/FieldController.ts +++ b/src/controllers/FieldController.ts @@ -15,7 +15,7 @@ export function Cast(field: Opt, cto export type Opt = T | undefined; export abstract class FieldController { - FieldUpdated: TypedEvent> = new TypedEvent>(); + //FieldUpdated: TypedEvent> = new TypedEvent>(); private id: string; get Id(): string { @@ -26,32 +26,22 @@ export abstract class FieldController { this.id = id || Utils.GenerateGuid(); } - protected DereferenceImpl(): Opt { + Dereference(): Opt { return this; } - protected DereferenceToRootImpl(): Opt { + DereferenceToRoot(): Opt { return this; } - Dereference(ctor?: { new(): T }): Opt { - let field = this.DereferenceImpl(); - if (ctor && field instanceof ctor) { - return field; - } else { - return undefined; - } + DereferenceT(ctor: { new(): T }): Opt { + return Cast(this.Dereference(), ctor); } - DereferenceToRoot(ctor?: { new(): T }): Opt { - let field = this.DereferenceToRootImpl(); - if (ctor && field instanceof ctor) { - return field; - } else { - return undefined; - } + DereferenceToRootT(ctor: { new(): T }): Opt { + return Cast(this.DereferenceToRoot(), ctor); } - Equals(other: FieldController) : boolean { + Equals(other: FieldController): boolean { return this.id === other.id; } diff --git a/src/controllers/KeyController.ts b/src/controllers/KeyController.ts index ad410d756..68eed3961 100644 --- a/src/controllers/KeyController.ts +++ b/src/controllers/KeyController.ts @@ -27,4 +27,10 @@ export class KeyController extends FieldController { 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 -- cgit v1.2.3-70-g09d2