aboutsummaryrefslogtreecommitdiff
path: root/src/controllers
diff options
context:
space:
mode:
Diffstat (limited to 'src/controllers')
-rw-r--r--src/controllers/BasicFieldController.ts22
-rw-r--r--src/controllers/DocumentController.ts73
-rw-r--r--src/controllers/DocumentReferenceController.ts8
-rw-r--r--src/controllers/FieldController.ts26
-rw-r--r--src/controllers/KeyController.ts6
5 files changed, 38 insertions, 97 deletions
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<T> 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<T> 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<DocumentUpdatedArgs> } = {};
+ private fields: ObservableMap<KeyController, FieldController> = new ObservableMap();
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;
+ if (this.fields.has(key)) {
+ field = this.fields.get(key);
}
} else {
let doc: Opt<DocumentController> = 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<FieldController>): void {
- let oldField: Opt<FieldController>;
- 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<T extends FieldController>(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<DocumentUpdatedArgs>): Disposable {
- if (!(key.Id in this.fieldUpdateHandlers)) {
- this.fieldUpdateHandlers[key.Id] = new TypedEvent<DocumentUpdatedArgs>();
- }
-
- return this.fieldUpdateHandlers[key.Id].on(listener);
- }
-
- RemoveFieldUpdatedHandler(key: KeyController, listener: Listener<DocumentUpdatedArgs>) {
- 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<FieldController> {
+ Dereference() : Opt<FieldController> {
return this.document.GetField(this.key);
}
- protected DereferenceToRootImpl(): Opt<FieldController> {
+ DereferenceToRoot(): Opt<FieldController> {
let field: Opt<FieldController> = 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<T extends FieldController>(field: Opt<FieldController>, cto
export type Opt<T> = T | undefined;
export abstract class FieldController {
- FieldUpdated: TypedEvent<Opt<FieldUpdatedArgs>> = new TypedEvent<Opt<FieldUpdatedArgs>>();
+ //FieldUpdated: TypedEvent<Opt<FieldUpdatedArgs>> = new TypedEvent<Opt<FieldUpdatedArgs>>();
private id: string;
get Id(): string {
@@ -26,32 +26,22 @@ export abstract class FieldController {
this.id = id || Utils.GenerateGuid();
}
- protected DereferenceImpl(): Opt<FieldController> {
+ Dereference(): Opt<FieldController> {
return this;
}
- protected DereferenceToRootImpl(): Opt<FieldController> {
+ DereferenceToRoot(): Opt<FieldController> {
return this;
}
- Dereference<T extends FieldController = FieldController>(ctor?: { new(): T }): Opt<T> {
- let field = this.DereferenceImpl();
- if (ctor && field instanceof ctor) {
- return field;
- } else {
- return undefined;
- }
+ DereferenceT<T extends FieldController = FieldController>(ctor: { new(): T }): Opt<T> {
+ return Cast(this.Dereference(), ctor);
}
- DereferenceToRoot<T extends FieldController = FieldController>(ctor?: { new(): T }): Opt<T> {
- let field = this.DereferenceToRootImpl();
- if (ctor && field instanceof ctor) {
- return field;
- } else {
- return undefined;
- }
+ DereferenceToRootT<T extends FieldController = FieldController>(ctor: { new(): T }): Opt<T> {
+ 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