feat: 支持 Panel / Widget / PanelDock 等类型的面板 disable / enable 方法, 以及相应的事件触发

This commit is contained in:
力皓 2021-01-11 15:47:38 +08:00
parent 125ecae33a
commit 06d2f43117
6 changed files with 74 additions and 4 deletions

View File

@ -5,4 +5,10 @@
&.hidden { &.hidden {
display: none; display: none;
} }
}
.lc-widget-disabled {
pointer-events: none;
opacity: 0.4;
} }

View File

@ -73,7 +73,6 @@ export class PanelDockView extends Component<DockProps & { dock: PanelDock }> {
...props, ...props,
className: classNames(className, { className: classNames(className, {
actived: dock.actived, actived: dock.actived,
disabled: dock.disabled,
}), }),
onClick: () => { onClick: () => {
onClick && onClick(); onClick && onClick();
@ -260,13 +259,16 @@ export class WidgetView extends Component<{ widget: IWidget }> {
componentDidMount() { componentDidMount() {
this.checkVisible(); this.checkVisible();
this.checkDisabled();
} }
componentDidUpdate() { componentDidUpdate() {
this.checkVisible(); this.checkVisible();
this.checkDisabled();
} }
private lastVisible = false; private lastVisible = false;
private lastDisabled = false;
checkVisible() { checkVisible() {
const { widget } = this.props; const { widget } = this.props;
@ -281,11 +283,31 @@ export class WidgetView extends Component<{ widget: IWidget }> {
} }
} }
checkDisabled() {
const { widget } = this.props;
const currentDisabled = widget.disabled;
if (currentDisabled !== this.lastDisabled) {
this.lastDisabled = currentDisabled;
if (this.lastDisabled) {
widget.skeleton.postEvent(SkeletonEvents.WIDGET_DISABLE, widget.name, widget);
} else {
widget.skeleton.postEvent(SkeletonEvents.WIDGET_ENABLE, widget.name, widget);
}
}
}
render() { render() {
const { widget } = this.props; const { widget } = this.props;
if (!widget.visible) { if (!widget.visible) {
return null; return null;
} }
if (widget.disabled) {
return (
<div className="lc-widget-disabled">
{widget.body}
</div>
);
}
return widget.body; return widget.body;
} }
} }

View File

@ -31,6 +31,8 @@ export enum SkeletonEvents {
PANEL_HIDE = 'skeleton.panel.hide', PANEL_HIDE = 'skeleton.panel.hide',
WIDGET_SHOW = 'skeleton.widget.show', WIDGET_SHOW = 'skeleton.widget.show',
WIDGET_HIDE = 'skeleton.widget.hide', WIDGET_HIDE = 'skeleton.widget.hide',
WIDGET_DISABLE = 'skeleton.widget.disable',
WIDGET_ENABLE = 'skeleton.widget.enable',
} }
export class Skeleton { export class Skeleton {

View File

@ -24,6 +24,8 @@ export default class Dock implements IWidget {
return this._visible; return this._visible;
} }
@obx.ref private _disabled = false;
get content(): ReactNode { get content(): ReactNode {
return createElement(WidgetView, { return createElement(WidgetView, {
widget: this, widget: this,
@ -76,6 +78,23 @@ export default class Dock implements IWidget {
} }
} }
private setDisabled(flag: boolean) {
if (this._disabled === flag) return;
this._disabled = flag;
}
disable() {
this.setDisabled(true);
}
enable() {
this.setDisabled(false);
}
get disabled(): boolean {
return this._disabled;
}
getContent() { getContent() {
return this.content; return this.content;
} }

View File

@ -125,6 +125,7 @@ export default class PanelDock implements IWidget {
} }
private setDisabled(flag: boolean) { private setDisabled(flag: boolean) {
if (this._disabled === flag) return;
this._disabled = flag; this._disabled = flag;
} }
@ -141,10 +142,8 @@ export default class PanelDock implements IWidget {
} }
togglePanel() { togglePanel() {
if (!this._disabled) {
this.panel?.toggle(); this.panel?.toggle();
} }
}
getName() { getName() {
return this.name; return this.name;

View File

@ -12,6 +12,7 @@ export interface IWidget {
readonly align?: string; readonly align?: string;
readonly isWidget: true; readonly isWidget: true;
readonly visible: boolean; readonly visible: boolean;
readonly disabled: boolean;
readonly body: ReactNode; readonly body: ReactNode;
readonly skeleton: Skeleton; readonly skeleton: Skeleton;
readonly config: IWidgetBaseConfig; readonly config: IWidgetBaseConfig;
@ -21,6 +22,8 @@ export interface IWidget {
show(): void; show(): void;
hide(): void; hide(): void;
toggle(): void; toggle(): void;
enable?(): void;
disable?(): void;
} }
export default class Widget implements IWidget { export default class Widget implements IWidget {
@ -40,6 +43,8 @@ export default class Widget implements IWidget {
@obx.ref inited = false; @obx.ref inited = false;
@obx.ref private _disabled = false;
private _body: ReactNode; private _body: ReactNode;
get body() { get body() {
@ -109,6 +114,23 @@ export default class Widget implements IWidget {
toggle() { toggle() {
this.setVisible(!this._visible); this.setVisible(!this._visible);
} }
private setDisabled(flag: boolean) {
if (this._disabled === flag) return;
this._disabled = flag;
}
disable() {
this.setDisabled(true);
}
enable() {
this.setDisabled(false);
}
get disabled(): boolean {
return this._disabled;
}
} }
export function isWidget(obj: any): obj is IWidget { export function isWidget(obj: any): obj is IWidget {