From ed58ba7dcb2b3cec3c890dc83f75f4ff3d931712 Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Sat, 7 Oct 2023 20:16:36 +0400 Subject: [PATCH] Trigger `component:styleUpdate` on `component.addStyle/setStyle`. Closes #5424 --- src/commands/view/SelectComponent.ts | 6 +----- src/dom_components/model/Component.ts | 16 ++++++++++++++++ src/domain_abstract/model/StyleableModel.ts | 2 ++ src/selector_manager/view/ClassTagsView.ts | 2 +- src/style_manager/index.ts | 19 +++++++++---------- 5 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/commands/view/SelectComponent.ts b/src/commands/view/SelectComponent.ts index 14d44ea18..919622c3c 100644 --- a/src/commands/view/SelectComponent.ts +++ b/src/commands/view/SelectComponent.ts @@ -89,11 +89,7 @@ export default { methods[method](listenToEl, 'scroll', this.onContainerChange); em[method]('component:toggled component:update undo redo', this.onSelect, this); em[method]('change:componentHovered', this.onHovered, this); - em[method]( - 'component:resize styleable:change component:input', // component:styleUpdate - this.updateGlobalPos, - this - ); + em[method]('component:resize styleable:change component:input', this.updateGlobalPos, this); em[method]('component:update:toolbar', this._upToolbar, this); em[method]('change:canvasOffset', this.updateAttached, this); em[method]('frame:updated', this.onFrameUpdated, this); diff --git a/src/dom_components/model/Component.ts b/src/dom_components/model/Component.ts index 5c72aa8d9..5b3e073b3 100644 --- a/src/dom_components/model/Component.ts +++ b/src/dom_components/model/Component.ts @@ -318,6 +318,18 @@ export default class Component extends StyleableModel { } } + __onStyleChange(newStyles: StyleProps) { + const { em } = this; + if (!em) return; + + const event = 'component:styleUpdate'; + const styleKeys = keys(newStyles); + const pros = { style: newStyles }; + + em.trigger(event, this, pros); + styleKeys.forEach(key => em.trigger(`${event}:${key}`, this, pros)); + } + __changesUp(opts: any) { const { em, frame } = this; [frame, em].forEach(md => md && md.changesUp(opts)); @@ -619,6 +631,10 @@ export default class Component extends StyleableModel { prop = super.setStyle.apply(this, arguments as any); } + if (!opt.temporary) { + this.__onStyleChange(opts.addStyle || prop); + } + return prop; } diff --git a/src/domain_abstract/model/StyleableModel.ts b/src/domain_abstract/model/StyleableModel.ts index 9b14ac364..a6b450860 100644 --- a/src/domain_abstract/model/StyleableModel.ts +++ b/src/domain_abstract/model/StyleableModel.ts @@ -8,6 +8,7 @@ export type StyleProps = Record; export type UpdateStyleOptions = ObjectAny & { partial?: boolean; + addStyle?: StyleProps; }; const parserHtml = ParserHtml(); @@ -109,6 +110,7 @@ export default class StyleableModel extends Model opts = value || {}; } + opts.addStyle = prop; prop = this.extendStyle(prop); this.setStyle(prop, opts); } diff --git a/src/selector_manager/view/ClassTagsView.ts b/src/selector_manager/view/ClassTagsView.ts index bd1f40eaa..21c727f8a 100644 --- a/src/selector_manager/view/ClassTagsView.ts +++ b/src/selector_manager/view/ClassTagsView.ts @@ -88,7 +88,7 @@ export default class ClassTagsView extends View { this.listenTo(em, toList, this.componentChanged); this.listenTo(em, 'styleManager:update', this.componentChanged); this.listenTo(em, toListCls, this.__handleStateChange); - this.listenTo(em, 'styleable:change change:device', this.checkSync); // component:styleUpdate + this.listenTo(em, 'styleable:change change:device', this.checkSync); this.listenTo(coll, 'add', this.addNew); this.listenTo(coll, 'reset', this.renderClasses); this.listenTo(coll, 'remove', this.tagRemoved); diff --git a/src/style_manager/index.ts b/src/style_manager/index.ts index 0fdcc88e5..148027453 100644 --- a/src/style_manager/index.ts +++ b/src/style_manager/index.ts @@ -725,21 +725,20 @@ export default class StyleManager extends ItemManagerModule< __emitCmpStyleUpdate(style: StyleProps, opts: { components?: Component | Component[] } = {}) { const { em } = this; - const event = 'component:styleUpdate'; // Ignore partial updates if (!style.__p) { + const allSel = this.getSelectedAll(); const cmp = opts.components || em.getSelectedAll(); const cmps = Array.isArray(cmp) ? cmp : [cmp]; - const newStyle = { ...style }; - delete newStyle.__p; - const styleKeys = Object.keys(newStyle); - const optsToPass = { style: newStyle }; - - cmps.forEach(component => { - em.trigger(event, component, optsToPass); - styleKeys.forEach(key => em.trigger(`${event}:${key}`, component, optsToPass)); - }); + const newStyles = { ...style }; + delete newStyles.__p; + + cmps.forEach( + cmp => + // if cmp is part of selected, the event should already been triggered + !allSel.includes(cmp as any) && cmp.__onStyleChange(newStyles) + ); } }