feat: update modular,add mount and unmount action

This commit is contained in:
pengfei.zhou 2021-05-18 11:41:18 +08:00 committed by osborn
parent 6d87ad8433
commit 3ed8628dbb
10 changed files with 604 additions and 62 deletions

View File

@ -1,14 +1,27 @@
import { Module, Color, Gravity, Group, layoutConfig, LayoutSpec, ModularPanel, Panel, scroller, text, vlayout, modal, hlayout, Text, ClassType, HLayout, View, VLayout, Provider, loge } from "doric"; import { Module, Color, Gravity, Group, layoutConfig, LayoutSpec, ModularPanel, scroller, text, vlayout, hlayout, Text, HLayout, View, VLayout, Provider, stack, } from "doric";
import { CounterPage } from "./Counter"; import { CounterPage } from "./Counter";
let moduleId = 0 let moduleId = 0
class ReceivedMessage { class ReceivedMessage {
received: string[] = [] received: string[] = []
mounted: Record<string, boolean> = {}
} }
class SingleModule extends Module { class SingleModule extends Module {
myId = ++moduleId myId = ++moduleId
onCreate() {
super.onCreate()
this.provider?.observe(ReceivedMessage).addObserver((state => {
if (state?.mounted[this.name()] === false) {
this.unmount()
} else {
this.mount()
}
}))
}
name() { name() {
return `${this.constructor.name}#${this.myId}` return `${this.constructor.name}#${this.myId}`
} }
@ -46,6 +59,19 @@ class SingleModule extends Module {
text: this.discription(), text: this.discription(),
textColor: Color.WHITE, textColor: Color.WHITE,
}), }),
text({
text: "Unmount",
textSize: 12,
textColor: Color.WHITE,
onClick: () => {
this.provider?.observe(ReceivedMessage)?.update(state => {
if (state) {
state.mounted[this.name()] = false
}
return state
})
}
}),
...this.buildExtraContent(), ...this.buildExtraContent(),
], ],
{ {
@ -340,6 +366,28 @@ class ScrollableHorizontalModule extends GroupModule {
} }
class ResetModule extends SingleModule {
discription() {
return "This module reset all modules to mounted."
}
buildExtraContent() {
return [
text({
text: "Reset",
textColor: Color.WHITE,
onClick: () => {
this.provider?.observe(ReceivedMessage).update(state => {
if (state) {
state.mounted = {}
}
return state
})
},
})
]
}
}
@Entry @Entry
class ModularDemo extends ModularPanel { class ModularDemo extends ModularPanel {
@ -355,6 +403,7 @@ class ModularDemo extends ModularPanel {
ScrollableVerticalModule, ScrollableVerticalModule,
ScrollableHorizontalModule, ScrollableHorizontalModule,
CounterPage, CounterPage,
ResetModule,
] ]
} }
setupShelf(root: Group) { setupShelf(root: Group) {

View File

@ -3655,7 +3655,9 @@ var __extends = (undefined && undefined.__extends) || (function () {
var Module = /** @class */ (function (_super) { var Module = /** @class */ (function (_super) {
__extends(Module, _super); __extends(Module, _super);
function Module() { function Module() {
return _super !== null && _super.apply(this, arguments) || this; var _this = _super !== null && _super.apply(this, arguments) || this;
_this.unmounted = false;
return _this;
} }
Object.defineProperty(Module.prototype, "provider", { Object.defineProperty(Module.prototype, "provider", {
get: function () { get: function () {
@ -3668,13 +3670,68 @@ var Module = /** @class */ (function (_super) {
enumerable: false, enumerable: false,
configurable: true configurable: true
}); });
Module.prototype.mount = function () {
var _a;
if (this.unmounted) {
this.unmounted = false;
(_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.onStructureChanged(this, true);
this.onMounted();
}
};
Module.prototype.unmount = function () {
var _a;
if (!this.unmounted) {
this.unmounted = true;
(_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.onStructureChanged(this, false);
this.onUnmounted();
}
};
Object.defineProperty(Module.prototype, "mounted", {
get: function () {
return !this.unmounted;
},
enumerable: false,
configurable: true
});
/**
* Dispatch message to other modules.
* @param message which is sent out
*/
Module.prototype.dispatchMessage = function (message) { Module.prototype.dispatchMessage = function (message) {
var _a; var _a;
(_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.dispatchMessage(message); (_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.dispatchMessage(message);
}; };
/**
* Dispatched messages can be received by override this method.
* @param message recevied message
*/
Module.prototype.onMessage = function (message) { }; Module.prototype.onMessage = function (message) { };
/**
* Called when this module is mounted
*/
Module.prototype.onMounted = function () { };
/**
* Called when this module is unmounted
*/
Module.prototype.onUnmounted = function () { };
return Module; return Module;
}(Panel)); }(Panel));
var VMModule = /** @class */ (function (_super) {
__extends(VMModule, _super);
function VMModule() {
return _super !== null && _super.apply(this, arguments) || this;
}
VMModule.prototype.getViewModel = function () {
return this.vm;
};
VMModule.prototype.build = function (root) {
this.vh = new (this.getViewHolderClass());
this.vm = new (this.getViewModelClass())(this.getState(), this.vh);
this.vm.context = this.context;
this.vm.attach(root);
};
return VMModule;
}(Module));
var ModularPanel = /** @class */ (function (_super) { var ModularPanel = /** @class */ (function (_super) {
__extends(ModularPanel, _super); __extends(ModularPanel, _super);
function ModularPanel() { function ModularPanel() {
@ -3696,16 +3753,38 @@ var ModularPanel = /** @class */ (function (_super) {
this.onMessage(message); this.onMessage(message);
} }
}; };
Object.defineProperty(ModularPanel.prototype, "mountedModules", {
get: function () {
return this.modules.filter(function (e) { return !(e instanceof Module) || e.mounted; });
},
enumerable: false,
configurable: true
});
ModularPanel.prototype.onMessage = function (message) { ModularPanel.prototype.onMessage = function (message) {
this.modules.forEach(function (e) { this.mountedModules.forEach(function (e) {
if (e instanceof Module) { if (e instanceof Module) {
e.onMessage(message); e.onMessage(message);
} }
}); });
}; };
ModularPanel.prototype.onStructureChanged = function (module, mounted) {
var _this = this;
if (this.superPanel) {
this.superPanel.onStructureChanged(module, mounted);
}
else {
if (!!!this.scheduledRebuild) {
this.scheduledRebuild = setTimeout(function () {
_this.scheduledRebuild = undefined;
_this.getRootView().children.length = 0;
_this.build(_this.getRootView());
}, 0);
}
}
};
ModularPanel.prototype.build = function (root) { ModularPanel.prototype.build = function (root) {
var groupView = this.setupShelf(root); var groupView = this.setupShelf(root);
this.modules.forEach(function (e) { this.mountedModules.forEach(function (e) {
Reflect.set(e, "__root__", groupView); Reflect.set(e, "__root__", groupView);
e.build(groupView); e.build(groupView);
}); });
@ -3713,32 +3792,32 @@ var ModularPanel = /** @class */ (function (_super) {
ModularPanel.prototype.onCreate = function () { ModularPanel.prototype.onCreate = function () {
var _this = this; var _this = this;
_super.prototype.onCreate.call(this); _super.prototype.onCreate.call(this);
this.modules.forEach(function (e) { this.mountedModules.forEach(function (e) {
e.context = _this.context; e.context = _this.context;
e.onCreate(); e.onCreate();
}); });
}; };
ModularPanel.prototype.onDestroy = function () { ModularPanel.prototype.onDestroy = function () {
_super.prototype.onDestroy.call(this); _super.prototype.onDestroy.call(this);
this.modules.forEach(function (e) { this.mountedModules.forEach(function (e) {
e.onDestroy(); e.onDestroy();
}); });
}; };
ModularPanel.prototype.onShow = function () { ModularPanel.prototype.onShow = function () {
_super.prototype.onShow.call(this); _super.prototype.onShow.call(this);
this.modules.forEach(function (e) { this.mountedModules.forEach(function (e) {
e.onShow(); e.onShow();
}); });
}; };
ModularPanel.prototype.onHidden = function () { ModularPanel.prototype.onHidden = function () {
_super.prototype.onHidden.call(this); _super.prototype.onHidden.call(this);
this.modules.forEach(function (e) { this.mountedModules.forEach(function (e) {
e.onHidden(); e.onHidden();
}); });
}; };
ModularPanel.prototype.onRenderFinished = function () { ModularPanel.prototype.onRenderFinished = function () {
_super.prototype.onRenderFinished.call(this); _super.prototype.onRenderFinished.call(this);
this.modules.forEach(function (e) { this.mountedModules.forEach(function (e) {
e.onRenderFinished(); e.onRenderFinished();
}); });
}; };
@ -3792,6 +3871,7 @@ exports.TOP = TOP;
exports.Text = Text; exports.Text = Text;
exports.TranslationAnimation = TranslationAnimation; exports.TranslationAnimation = TranslationAnimation;
exports.VLayout = VLayout; exports.VLayout = VLayout;
exports.VMModule = VMModule;
exports.VMPanel = VMPanel; exports.VMPanel = VMPanel;
exports.View = View; exports.View = View;
exports.ViewComponent = ViewComponent; exports.ViewComponent = ViewComponent;

View File

@ -2822,6 +2822,10 @@ class VMPanel extends Panel {
} }
class Module extends Panel { class Module extends Panel {
constructor() {
super(...arguments);
this.unmounted = false;
}
get provider() { get provider() {
var _a; var _a;
return this.__provider || ((_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.provider); return this.__provider || ((_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.provider);
@ -2829,11 +2833,57 @@ class Module extends Panel {
set provider(provider) { set provider(provider) {
this.__provider = provider; this.__provider = provider;
} }
mount() {
var _a;
if (this.unmounted) {
this.unmounted = false;
(_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.onStructureChanged(this, true);
this.onMounted();
}
}
unmount() {
var _a;
if (!this.unmounted) {
this.unmounted = true;
(_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.onStructureChanged(this, false);
this.onUnmounted();
}
}
get mounted() {
return !this.unmounted;
}
/**
* Dispatch message to other modules.
* @param message which is sent out
*/
dispatchMessage(message) { dispatchMessage(message) {
var _a; var _a;
(_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.dispatchMessage(message); (_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.dispatchMessage(message);
} }
/**
* Dispatched messages can be received by override this method.
* @param message recevied message
*/
onMessage(message) { } onMessage(message) { }
/**
* Called when this module is mounted
*/
onMounted() { }
/**
* Called when this module is unmounted
*/
onUnmounted() { }
}
class VMModule extends Module {
getViewModel() {
return this.vm;
}
build(root) {
this.vh = new (this.getViewHolderClass());
this.vm = new (this.getViewModelClass())(this.getState(), this.vh);
this.vm.context = this.context;
this.vm.attach(root);
}
} }
class ModularPanel extends Module { class ModularPanel extends Module {
constructor() { constructor() {
@ -2854,48 +2904,65 @@ class ModularPanel extends Module {
this.onMessage(message); this.onMessage(message);
} }
} }
get mountedModules() {
return this.modules.filter(e => !(e instanceof Module) || e.mounted);
}
onMessage(message) { onMessage(message) {
this.modules.forEach(e => { this.mountedModules.forEach(e => {
if (e instanceof Module) { if (e instanceof Module) {
e.onMessage(message); e.onMessage(message);
} }
}); });
} }
onStructureChanged(module, mounted) {
if (this.superPanel) {
this.superPanel.onStructureChanged(module, mounted);
}
else {
if (!!!this.scheduledRebuild) {
this.scheduledRebuild = setTimeout(() => {
this.scheduledRebuild = undefined;
this.getRootView().children.length = 0;
this.build(this.getRootView());
}, 0);
}
}
}
build(root) { build(root) {
const groupView = this.setupShelf(root); const groupView = this.setupShelf(root);
this.modules.forEach(e => { this.mountedModules.forEach(e => {
Reflect.set(e, "__root__", groupView); Reflect.set(e, "__root__", groupView);
e.build(groupView); e.build(groupView);
}); });
} }
onCreate() { onCreate() {
super.onCreate(); super.onCreate();
this.modules.forEach(e => { this.mountedModules.forEach(e => {
e.context = this.context; e.context = this.context;
e.onCreate(); e.onCreate();
}); });
} }
onDestroy() { onDestroy() {
super.onDestroy(); super.onDestroy();
this.modules.forEach(e => { this.mountedModules.forEach(e => {
e.onDestroy(); e.onDestroy();
}); });
} }
onShow() { onShow() {
super.onShow(); super.onShow();
this.modules.forEach(e => { this.mountedModules.forEach(e => {
e.onShow(); e.onShow();
}); });
} }
onHidden() { onHidden() {
super.onHidden(); super.onHidden();
this.modules.forEach(e => { this.mountedModules.forEach(e => {
e.onHidden(); e.onHidden();
}); });
} }
onRenderFinished() { onRenderFinished() {
super.onRenderFinished(); super.onRenderFinished();
this.modules.forEach(e => { this.mountedModules.forEach(e => {
e.onRenderFinished(); e.onRenderFinished();
}); });
} }
@ -2948,6 +3015,7 @@ exports.TOP = TOP;
exports.Text = Text; exports.Text = Text;
exports.TranslationAnimation = TranslationAnimation; exports.TranslationAnimation = TranslationAnimation;
exports.VLayout = VLayout; exports.VLayout = VLayout;
exports.VMModule = VMModule;
exports.VMPanel = VMPanel; exports.VMPanel = VMPanel;
exports.View = View; exports.View = View;
exports.ViewComponent = ViewComponent; exports.ViewComponent = ViewComponent;

View File

@ -4343,6 +4343,10 @@ class VMPanel extends Panel {
} }
class Module extends Panel { class Module extends Panel {
constructor() {
super(...arguments);
this.unmounted = false;
}
get provider() { get provider() {
var _a; var _a;
return this.__provider || ((_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.provider); return this.__provider || ((_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.provider);
@ -4350,11 +4354,57 @@ class Module extends Panel {
set provider(provider) { set provider(provider) {
this.__provider = provider; this.__provider = provider;
} }
mount() {
var _a;
if (this.unmounted) {
this.unmounted = false;
(_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.onStructureChanged(this, true);
this.onMounted();
}
}
unmount() {
var _a;
if (!this.unmounted) {
this.unmounted = true;
(_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.onStructureChanged(this, false);
this.onUnmounted();
}
}
get mounted() {
return !this.unmounted;
}
/**
* Dispatch message to other modules.
* @param message which is sent out
*/
dispatchMessage(message) { dispatchMessage(message) {
var _a; var _a;
(_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.dispatchMessage(message); (_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.dispatchMessage(message);
} }
/**
* Dispatched messages can be received by override this method.
* @param message recevied message
*/
onMessage(message) { } onMessage(message) { }
/**
* Called when this module is mounted
*/
onMounted() { }
/**
* Called when this module is unmounted
*/
onUnmounted() { }
}
class VMModule extends Module {
getViewModel() {
return this.vm;
}
build(root) {
this.vh = new (this.getViewHolderClass());
this.vm = new (this.getViewModelClass())(this.getState(), this.vh);
this.vm.context = this.context;
this.vm.attach(root);
}
} }
class ModularPanel extends Module { class ModularPanel extends Module {
constructor() { constructor() {
@ -4375,48 +4425,65 @@ class ModularPanel extends Module {
this.onMessage(message); this.onMessage(message);
} }
} }
get mountedModules() {
return this.modules.filter(e => !(e instanceof Module) || e.mounted);
}
onMessage(message) { onMessage(message) {
this.modules.forEach(e => { this.mountedModules.forEach(e => {
if (e instanceof Module) { if (e instanceof Module) {
e.onMessage(message); e.onMessage(message);
} }
}); });
} }
onStructureChanged(module, mounted) {
if (this.superPanel) {
this.superPanel.onStructureChanged(module, mounted);
}
else {
if (!!!this.scheduledRebuild) {
this.scheduledRebuild = setTimeout(() => {
this.scheduledRebuild = undefined;
this.getRootView().children.length = 0;
this.build(this.getRootView());
}, 0);
}
}
}
build(root) { build(root) {
const groupView = this.setupShelf(root); const groupView = this.setupShelf(root);
this.modules.forEach(e => { this.mountedModules.forEach(e => {
Reflect.set(e, "__root__", groupView); Reflect.set(e, "__root__", groupView);
e.build(groupView); e.build(groupView);
}); });
} }
onCreate() { onCreate() {
super.onCreate(); super.onCreate();
this.modules.forEach(e => { this.mountedModules.forEach(e => {
e.context = this.context; e.context = this.context;
e.onCreate(); e.onCreate();
}); });
} }
onDestroy() { onDestroy() {
super.onDestroy(); super.onDestroy();
this.modules.forEach(e => { this.mountedModules.forEach(e => {
e.onDestroy(); e.onDestroy();
}); });
} }
onShow() { onShow() {
super.onShow(); super.onShow();
this.modules.forEach(e => { this.mountedModules.forEach(e => {
e.onShow(); e.onShow();
}); });
} }
onHidden() { onHidden() {
super.onHidden(); super.onHidden();
this.modules.forEach(e => { this.mountedModules.forEach(e => {
e.onHidden(); e.onHidden();
}); });
} }
onRenderFinished() { onRenderFinished() {
super.onRenderFinished(); super.onRenderFinished();
this.modules.forEach(e => { this.mountedModules.forEach(e => {
e.onRenderFinished(); e.onRenderFinished();
}); });
} }
@ -4710,6 +4777,7 @@ exports.TOP = TOP;
exports.Text = Text; exports.Text = Text;
exports.TranslationAnimation = TranslationAnimation; exports.TranslationAnimation = TranslationAnimation;
exports.VLayout = VLayout; exports.VLayout = VLayout;
exports.VMModule = VMModule;
exports.VMPanel = VMPanel; exports.VMPanel = VMPanel;
exports.View = View; exports.View = View;
exports.ViewComponent = ViewComponent; exports.ViewComponent = ViewComponent;

63
doric-js/index.d.ts vendored
View File

@ -1423,27 +1423,56 @@ declare module 'doric/lib/src/pattern/modular' {
import { Panel } from "doric/lib/src/ui/panel"; import { Panel } from "doric/lib/src/ui/panel";
import { Group } from "doric/lib/src/ui/view"; import { Group } from "doric/lib/src/ui/view";
import { ClassType } from "doric/lib/src/util/types"; import { ClassType } from "doric/lib/src/util/types";
import { ViewHolder, ViewModel } from "doric/lib/src/pattern/mvvm";
import { Provider } from "doric/lib/src/pattern/provider"; import { Provider } from "doric/lib/src/pattern/provider";
export abstract class Module extends Panel { export abstract class Module extends Panel {
superPanel?: ModularPanel; superPanel?: ModularPanel;
__provider?: Provider; __provider?: Provider;
get provider(): Provider | undefined; get provider(): Provider | undefined;
set provider(provider: Provider | undefined); set provider(provider: Provider | undefined);
dispatchMessage(message: any): void; mount(): void;
onMessage(message: any): void; unmount(): void;
get mounted(): boolean;
/**
* Dispatch message to other modules.
* @param message which is sent out
*/
dispatchMessage(message: any): void;
/**
* Dispatched messages can be received by override this method.
* @param message recevied message
*/
onMessage(message: any): void;
/**
* Called when this module is mounted
*/
onMounted(): void;
/**
* Called when this module is unmounted
*/
onUnmounted(): void;
}
export abstract class VMModule<M extends Object, V extends ViewHolder> extends Module {
abstract getViewModelClass(): ClassType<ViewModel<M, V>>;
abstract getState(): M;
abstract getViewHolderClass(): ClassType<V>;
getViewModel(): ViewModel<M, V> | undefined;
build(root: Group): void;
} }
export abstract class ModularPanel extends Module { export abstract class ModularPanel extends Module {
constructor(); constructor();
abstract setupModules(): ClassType<Panel>[]; abstract setupModules(): ClassType<Panel>[];
abstract setupShelf(root: Group): Group; abstract setupShelf(root: Group): Group;
dispatchMessage(message: any): void; dispatchMessage(message: any): void;
onMessage(message: any): void; get mountedModules(): Panel[];
build(root: Group): void; onMessage(message: any): void;
onCreate(): void; onStructureChanged(module: Module, mounted: boolean): void;
onDestroy(): void; build(root: Group): void;
onShow(): void; onCreate(): void;
onHidden(): void; onDestroy(): void;
onRenderFinished(): void; onShow(): void;
onHidden(): void;
onRenderFinished(): void;
} }
} }

View File

@ -1,22 +1,55 @@
import { Panel } from "../ui/panel"; import { Panel } from "../ui/panel";
import { Group } from "../ui/view"; import { Group } from "../ui/view";
import { ClassType } from "../util/types"; import { ClassType } from "../util/types";
import { ViewHolder, ViewModel } from "./mvvm";
import { Provider } from "./provider"; import { Provider } from "./provider";
export declare abstract class Module extends Panel { export declare abstract class Module extends Panel {
superPanel?: ModularPanel; superPanel?: ModularPanel;
__provider?: Provider; __provider?: Provider;
get provider(): Provider | undefined; get provider(): Provider | undefined;
set provider(provider: Provider | undefined); set provider(provider: Provider | undefined);
private unmounted;
mount(): void;
unmount(): void;
get mounted(): boolean;
/**
* Dispatch message to other modules.
* @param message which is sent out
*/
dispatchMessage(message: any): void; dispatchMessage(message: any): void;
/**
* Dispatched messages can be received by override this method.
* @param message recevied message
*/
onMessage(message: any): void; onMessage(message: any): void;
/**
* Called when this module is mounted
*/
onMounted(): void;
/**
* Called when this module is unmounted
*/
onUnmounted(): void;
}
export declare abstract class VMModule<M extends Object, V extends ViewHolder> extends Module {
private vm?;
private vh?;
abstract getViewModelClass(): ClassType<ViewModel<M, V>>;
abstract getState(): M;
abstract getViewHolderClass(): ClassType<V>;
getViewModel(): ViewModel<M, V> | undefined;
build(root: Group): void;
} }
export declare abstract class ModularPanel extends Module { export declare abstract class ModularPanel extends Module {
private modules; private modules;
private scheduledRebuild?;
constructor(); constructor();
abstract setupModules(): ClassType<Panel>[]; abstract setupModules(): ClassType<Panel>[];
abstract setupShelf(root: Group): Group; abstract setupShelf(root: Group): Group;
dispatchMessage(message: any): void; dispatchMessage(message: any): void;
get mountedModules(): Panel[];
onMessage(message: any): void; onMessage(message: any): void;
onStructureChanged(module: Module, mounted: boolean): void;
build(root: Group): void; build(root: Group): void;
onCreate(): void; onCreate(): void;
onDestroy(): void; onDestroy(): void;

View File

@ -1,5 +1,9 @@
import { Panel } from "../ui/panel"; import { Panel } from "../ui/panel";
export class Module extends Panel { export class Module extends Panel {
constructor() {
super(...arguments);
this.unmounted = false;
}
get provider() { get provider() {
var _a; var _a;
return this.__provider || ((_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.provider); return this.__provider || ((_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.provider);
@ -7,11 +11,57 @@ export class Module extends Panel {
set provider(provider) { set provider(provider) {
this.__provider = provider; this.__provider = provider;
} }
mount() {
var _a;
if (this.unmounted) {
this.unmounted = false;
(_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.onStructureChanged(this, true);
this.onMounted();
}
}
unmount() {
var _a;
if (!this.unmounted) {
this.unmounted = true;
(_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.onStructureChanged(this, false);
this.onUnmounted();
}
}
get mounted() {
return !this.unmounted;
}
/**
* Dispatch message to other modules.
* @param message which is sent out
*/
dispatchMessage(message) { dispatchMessage(message) {
var _a; var _a;
(_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.dispatchMessage(message); (_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.dispatchMessage(message);
} }
/**
* Dispatched messages can be received by override this method.
* @param message recevied message
*/
onMessage(message) { } onMessage(message) { }
/**
* Called when this module is mounted
*/
onMounted() { }
/**
* Called when this module is unmounted
*/
onUnmounted() { }
}
export class VMModule extends Module {
getViewModel() {
return this.vm;
}
build(root) {
this.vh = new (this.getViewHolderClass());
this.vm = new (this.getViewModelClass())(this.getState(), this.vh);
this.vm.context = this.context;
this.vm.attach(root);
}
} }
export class ModularPanel extends Module { export class ModularPanel extends Module {
constructor() { constructor() {
@ -32,48 +82,65 @@ export class ModularPanel extends Module {
this.onMessage(message); this.onMessage(message);
} }
} }
get mountedModules() {
return this.modules.filter(e => !(e instanceof Module) || e.mounted);
}
onMessage(message) { onMessage(message) {
this.modules.forEach(e => { this.mountedModules.forEach(e => {
if (e instanceof Module) { if (e instanceof Module) {
e.onMessage(message); e.onMessage(message);
} }
}); });
} }
onStructureChanged(module, mounted) {
if (this.superPanel) {
this.superPanel.onStructureChanged(module, mounted);
}
else {
if (!!!this.scheduledRebuild) {
this.scheduledRebuild = setTimeout(() => {
this.scheduledRebuild = undefined;
this.getRootView().children.length = 0;
this.build(this.getRootView());
}, 0);
}
}
}
build(root) { build(root) {
const groupView = this.setupShelf(root); const groupView = this.setupShelf(root);
this.modules.forEach(e => { this.mountedModules.forEach(e => {
Reflect.set(e, "__root__", groupView); Reflect.set(e, "__root__", groupView);
e.build(groupView); e.build(groupView);
}); });
} }
onCreate() { onCreate() {
super.onCreate(); super.onCreate();
this.modules.forEach(e => { this.mountedModules.forEach(e => {
e.context = this.context; e.context = this.context;
e.onCreate(); e.onCreate();
}); });
} }
onDestroy() { onDestroy() {
super.onDestroy(); super.onDestroy();
this.modules.forEach(e => { this.mountedModules.forEach(e => {
e.onDestroy(); e.onDestroy();
}); });
} }
onShow() { onShow() {
super.onShow(); super.onShow();
this.modules.forEach(e => { this.mountedModules.forEach(e => {
e.onShow(); e.onShow();
}); });
} }
onHidden() { onHidden() {
super.onHidden(); super.onHidden();
this.modules.forEach(e => { this.mountedModules.forEach(e => {
e.onHidden(); e.onHidden();
}); });
} }
onRenderFinished() { onRenderFinished() {
super.onRenderFinished(); super.onRenderFinished();
this.modules.forEach(e => { this.mountedModules.forEach(e => {
e.onRenderFinished(); e.onRenderFinished();
}); });
} }

View File

@ -1,6 +1,7 @@
import { Panel } from "../ui/panel" import { Panel } from "../ui/panel"
import { Group } from "../ui/view" import { Group } from "../ui/view"
import { ClassType } from "../util/types" import { ClassType } from "../util/types"
import { ViewHolder, ViewModel } from "./mvvm"
import { Provider } from "./provider" import { Provider } from "./provider"
export abstract class Module extends Panel { export abstract class Module extends Panel {
@ -16,15 +17,77 @@ export abstract class Module extends Panel {
this.__provider = provider this.__provider = provider
} }
private unmounted = false
mount() {
if (this.unmounted) {
this.unmounted = false
this.superPanel?.onStructureChanged(this, true)
this.onMounted()
}
}
unmount() {
if (!this.unmounted) {
this.unmounted = true
this.superPanel?.onStructureChanged(this, false)
this.onUnmounted()
}
}
get mounted() {
return !this.unmounted
}
/**
* Dispatch message to other modules.
* @param message which is sent out
*/
dispatchMessage(message: any) { dispatchMessage(message: any) {
this.superPanel?.dispatchMessage(message) this.superPanel?.dispatchMessage(message)
} }
/**
* Dispatched messages can be received by override this method.
* @param message recevied message
*/
onMessage(message: any) { } onMessage(message: any) { }
/**
* Called when this module is mounted
*/
onMounted() { }
/**
* Called when this module is unmounted
*/
onUnmounted() { }
}
export abstract class VMModule<M extends Object, V extends ViewHolder> extends Module {
private vm?: ViewModel<M, V>
private vh?: V
abstract getViewModelClass(): ClassType<ViewModel<M, V>>
abstract getState(): M
abstract getViewHolderClass(): ClassType<V>
getViewModel() {
return this.vm
}
build(root: Group): void {
this.vh = new (this.getViewHolderClass())
this.vm = new (this.getViewModelClass())(this.getState(), this.vh)
this.vm.context = this.context
this.vm.attach(root)
}
} }
export abstract class ModularPanel extends Module { export abstract class ModularPanel extends Module {
private modules: Panel[] private modules: Panel[]
private scheduledRebuild?: NodeJS.Timeout
constructor() { constructor() {
super() super()
@ -49,18 +112,35 @@ export abstract class ModularPanel extends Module {
} }
} }
get mountedModules() {
return this.modules.filter(e => !(e instanceof Module) || e.mounted)
}
onMessage(message: any) { onMessage(message: any) {
this.modules.forEach(e => { this.mountedModules.forEach(e => {
if (e instanceof Module) { if (e instanceof Module) {
e.onMessage(message) e.onMessage(message)
} }
}) })
} }
onStructureChanged(module: Module, mounted: boolean) {
if (this.superPanel) {
this.superPanel.onStructureChanged(module, mounted)
} else {
if (!!!this.scheduledRebuild) {
this.scheduledRebuild = setTimeout(() => {
this.scheduledRebuild = undefined
this.getRootView().children.length = 0
this.build(this.getRootView())
}, 0)
}
}
}
build(root: Group) { build(root: Group) {
const groupView = this.setupShelf(root) const groupView = this.setupShelf(root)
this.modules.forEach(e => { this.mountedModules.forEach(e => {
Reflect.set(e, "__root__", groupView) Reflect.set(e, "__root__", groupView)
e.build(groupView) e.build(groupView)
}) })
@ -68,7 +148,7 @@ export abstract class ModularPanel extends Module {
onCreate() { onCreate() {
super.onCreate() super.onCreate()
this.modules.forEach(e => { this.mountedModules.forEach(e => {
e.context = this.context e.context = this.context
e.onCreate() e.onCreate()
}) })
@ -76,28 +156,28 @@ export abstract class ModularPanel extends Module {
onDestroy() { onDestroy() {
super.onDestroy() super.onDestroy()
this.modules.forEach(e => { this.mountedModules.forEach(e => {
e.onDestroy() e.onDestroy()
}) })
} }
onShow() { onShow() {
super.onShow() super.onShow()
this.modules.forEach(e => { this.mountedModules.forEach(e => {
e.onShow() e.onShow()
}) })
} }
onHidden() { onHidden() {
super.onHidden() super.onHidden()
this.modules.forEach(e => { this.mountedModules.forEach(e => {
e.onHidden() e.onHidden()
}) })
} }
onRenderFinished() { onRenderFinished() {
super.onRenderFinished() super.onRenderFinished()
this.modules.forEach(e => { this.mountedModules.forEach(e => {
e.onRenderFinished() e.onRenderFinished()
}) })
} }

View File

@ -4397,6 +4397,10 @@ class VMPanel extends Panel {
} }
class Module extends Panel { class Module extends Panel {
constructor() {
super(...arguments);
this.unmounted = false;
}
get provider() { get provider() {
var _a; var _a;
return this.__provider || ((_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.provider); return this.__provider || ((_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.provider);
@ -4404,11 +4408,57 @@ class Module extends Panel {
set provider(provider) { set provider(provider) {
this.__provider = provider; this.__provider = provider;
} }
mount() {
var _a;
if (this.unmounted) {
this.unmounted = false;
(_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.onStructureChanged(this, true);
this.onMounted();
}
}
unmount() {
var _a;
if (!this.unmounted) {
this.unmounted = true;
(_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.onStructureChanged(this, false);
this.onUnmounted();
}
}
get mounted() {
return !this.unmounted;
}
/**
* Dispatch message to other modules.
* @param message which is sent out
*/
dispatchMessage(message) { dispatchMessage(message) {
var _a; var _a;
(_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.dispatchMessage(message); (_a = this.superPanel) === null || _a === void 0 ? void 0 : _a.dispatchMessage(message);
} }
/**
* Dispatched messages can be received by override this method.
* @param message recevied message
*/
onMessage(message) { } onMessage(message) { }
/**
* Called when this module is mounted
*/
onMounted() { }
/**
* Called when this module is unmounted
*/
onUnmounted() { }
}
class VMModule extends Module {
getViewModel() {
return this.vm;
}
build(root) {
this.vh = new (this.getViewHolderClass());
this.vm = new (this.getViewModelClass())(this.getState(), this.vh);
this.vm.context = this.context;
this.vm.attach(root);
}
} }
class ModularPanel extends Module { class ModularPanel extends Module {
constructor() { constructor() {
@ -4429,48 +4479,65 @@ class ModularPanel extends Module {
this.onMessage(message); this.onMessage(message);
} }
} }
get mountedModules() {
return this.modules.filter(e => !(e instanceof Module) || e.mounted);
}
onMessage(message) { onMessage(message) {
this.modules.forEach(e => { this.mountedModules.forEach(e => {
if (e instanceof Module) { if (e instanceof Module) {
e.onMessage(message); e.onMessage(message);
} }
}); });
} }
onStructureChanged(module, mounted) {
if (this.superPanel) {
this.superPanel.onStructureChanged(module, mounted);
}
else {
if (!!!this.scheduledRebuild) {
this.scheduledRebuild = setTimeout(() => {
this.scheduledRebuild = undefined;
this.getRootView().children.length = 0;
this.build(this.getRootView());
}, 0);
}
}
}
build(root) { build(root) {
const groupView = this.setupShelf(root); const groupView = this.setupShelf(root);
this.modules.forEach(e => { this.mountedModules.forEach(e => {
Reflect.set(e, "__root__", groupView); Reflect.set(e, "__root__", groupView);
e.build(groupView); e.build(groupView);
}); });
} }
onCreate() { onCreate() {
super.onCreate(); super.onCreate();
this.modules.forEach(e => { this.mountedModules.forEach(e => {
e.context = this.context; e.context = this.context;
e.onCreate(); e.onCreate();
}); });
} }
onDestroy() { onDestroy() {
super.onDestroy(); super.onDestroy();
this.modules.forEach(e => { this.mountedModules.forEach(e => {
e.onDestroy(); e.onDestroy();
}); });
} }
onShow() { onShow() {
super.onShow(); super.onShow();
this.modules.forEach(e => { this.mountedModules.forEach(e => {
e.onShow(); e.onShow();
}); });
} }
onHidden() { onHidden() {
super.onHidden(); super.onHidden();
this.modules.forEach(e => { this.mountedModules.forEach(e => {
e.onHidden(); e.onHidden();
}); });
} }
onRenderFinished() { onRenderFinished() {
super.onRenderFinished(); super.onRenderFinished();
this.modules.forEach(e => { this.mountedModules.forEach(e => {
e.onRenderFinished(); e.onRenderFinished();
}); });
} }
@ -4523,6 +4590,7 @@ exports.TOP = TOP;
exports.Text = Text; exports.Text = Text;
exports.TranslationAnimation = TranslationAnimation; exports.TranslationAnimation = TranslationAnimation;
exports.VLayout = VLayout; exports.VLayout = VLayout;
exports.VMModule = VMModule;
exports.VMPanel = VMPanel; exports.VMPanel = VMPanel;
exports.View = View; exports.View = View;
exports.ViewComponent = ViewComponent; exports.ViewComponent = ViewComponent;

File diff suppressed because one or more lines are too long