Browse Source

Update spacing spot

pull/5337/head
Artur Arseniev 3 years ago
parent
commit
ebe3db51cb
  1. 1
      src/canvas/config/config.ts
  2. 7
      src/canvas/model/CanvasSpot.ts
  3. 4
      src/commands/view/SelectComponent.ts
  4. 22
      src/commands/view/ShowOffset.ts
  5. 13
      src/editor/model/Editor.ts
  6. 6
      src/utils/mixins.ts

1
src/canvas/config/config.ts

@ -93,6 +93,7 @@ const config: CanvasConfig = {
allowExternalDrop: true, allowExternalDrop: true,
customSpots: { customSpots: {
hover: true, hover: true,
spacing: true,
}, },
}; };

7
src/canvas/model/CanvasSpot.ts

@ -8,9 +8,9 @@ import Frame from './Frame';
export enum CanvasSpotBuiltInTypes { export enum CanvasSpotBuiltInTypes {
Select = 'select', Select = 'select',
Hover = 'hover', Hover = 'hover',
Padding = 'padding', Spacing = 'spacing',
Margin = 'margin',
Resize = 'resize', Resize = 'resize',
Target = 'target',
} }
export type CanvasSpotBuiltInType = `${CanvasSpotBuiltInTypes}`; export type CanvasSpotBuiltInType = `${CanvasSpotBuiltInTypes}`;
@ -30,6 +30,9 @@ export interface CanvasSpotBase<T extends CanvasSpotType> {
/** @private */ /** @private */
export interface CanvasSpotProps<T extends CanvasSpotType = CanvasSpotType> extends CanvasSpotBase<T> {} export interface CanvasSpotProps<T extends CanvasSpotType = CanvasSpotType> extends CanvasSpotBase<T> {}
/** @private */
export interface CanvasSpotSpacingProps extends CanvasSpotBase<CanvasSpotBuiltInTypes.Spacing> {}
export default class CanvasSpot<T extends CanvasSpotProps = CanvasSpotProps> extends ModuleModel<CanvasModule, T> { export default class CanvasSpot<T extends CanvasSpotProps = CanvasSpotProps> extends ModuleModel<CanvasModule, T> {
defaults() { defaults() {
return { return {

4
src/commands/view/SelectComponent.ts

@ -229,6 +229,7 @@ export default {
*/ */
showElementOffset(el: HTMLElement, pos: any, opts: any = {}) { showElementOffset(el: HTMLElement, pos: any, opts: any = {}) {
if (!showOffsets) return; if (!showOffsets) return;
console.log('showElementOffset');
this.editor.runCommand('show-offset', { this.editor.runCommand('show-offset', {
el, el,
elPos: pos, elPos: pos,
@ -245,6 +246,7 @@ export default {
* @param {Object} pos * @param {Object} pos
*/ */
hideElementOffset(view: any) { hideElementOffset(view: any) {
console.log('hideElementOffset');
this.editor.stopCommand('show-offset', { this.editor.stopCommand('show-offset', {
view, view,
}); });
@ -256,6 +258,7 @@ export default {
* @param {Object} pos * @param {Object} pos
*/ */
showFixedElementOffset(el: HTMLElement, pos: any) { showFixedElementOffset(el: HTMLElement, pos: any) {
console.log('showFixedElementOffset');
this.editor.runCommand('show-offset', { this.editor.runCommand('show-offset', {
el, el,
elPos: pos, elPos: pos,
@ -269,6 +272,7 @@ export default {
* @param {Object} pos * @param {Object} pos
*/ */
hideFixedElementOffset() { hideFixedElementOffset() {
console.log('hideFixedElementOffset');
if (this.editor) this.editor.stopCommand('show-offset', { state: 'Fixed' }); if (this.editor) this.editor.stopCommand('show-offset', { state: 'Fixed' });
}, },

22
src/commands/view/ShowOffset.ts

@ -1,4 +1,5 @@
import { isUndefined } from 'underscore'; import { isUndefined } from 'underscore';
import { CanvasSpotBuiltInTypes } from '../../canvas/model/CanvasSpot';
import { $ } from '../../common'; import { $ } from '../../common';
import { isTextNode } from '../../utils/dom'; import { isTextNode } from '../../utils/dom';
import { CommandObject } from './CommandAbstract'; import { CommandObject } from './CommandAbstract';
@ -10,18 +11,22 @@ export default {
}, },
run(editor, sender, opts) { run(editor, sender, opts) {
var opt = opts || {}; const { canvas } = this;
var state = opt.state || ''; const opt = opts || {};
var config = editor.getConfig(); const state = opt.state || '';
const config = editor.getConfig();
const zoom = this.em.getZoomDecimal(); const zoom = this.em.getZoomDecimal();
const el = opt.el || ''; const el = opt.el as HTMLElement | undefined;
if (!config.showOffsets || isTextNode(el) || (!config.showOffsetsSelected && state == 'Fixed')) { if (!config.showOffsets || !el || isTextNode(el) || (!config.showOffsetsSelected && state == 'Fixed')) {
editor.stopCommand(`${this.id}`, opts); editor.stopCommand(`${this.id}`, opts);
return; return;
} }
var canvas = editor.Canvas; if (canvas.hasCustomSpot(CanvasSpotBuiltInTypes.Spacing)) {
return;
}
var pos = { ...(opt.elPos || canvas.getElementPos(el)) }; var pos = { ...(opt.elPos || canvas.getElementPos(el)) };
if (!isUndefined(opt.top)) { if (!isUndefined(opt.top)) {
@ -171,9 +176,10 @@ export default {
var opt = opts || {}; var opt = opts || {};
var state = opt.state || ''; var state = opt.state || '';
var method = this.getOffsetMethod(state); var method = this.getOffsetMethod(state);
var canvas = editor.Canvas; const { view } = opts;
const canvas = this.canvas;
// @ts-ignore // @ts-ignore
var offsetViewer = canvas[method](opts.view); var offsetViewer = canvas[method](view);
offsetViewer.style.opacity = 0; offsetViewer.style.opacity = 0;
}, },
} as CommandObject<any, { [k: string]: any }>; } as CommandObject<any, { [k: string]: any }>;

13
src/editor/model/Editor.ts

@ -634,16 +634,23 @@ export default class EditorModel extends Model {
*/ */
setHovered(cmp?: Component | null, opts: any = {}) { setHovered(cmp?: Component | null, opts: any = {}) {
const upHovered = (cmp?: Component, opts?: any) => { const upHovered = (cmp?: Component, opts?: any) => {
const { config } = this;
const current = this.getHovered(); const current = this.getHovered();
const type = CanvasSpotBuiltInTypes.Hover; const selectedAll = this.getSelectedAll();
const typeHover = CanvasSpotBuiltInTypes.Hover;
const typeSpacing = CanvasSpotBuiltInTypes.Spacing;
this.set('componentHovered', cmp || null, opts); this.set('componentHovered', cmp || null, opts);
current?.views.forEach(componentView => { current?.views.forEach(componentView => {
this.Canvas.removeSpot({ type, componentView }); this.Canvas.removeSpot({ type: typeHover, componentView });
this.Canvas.removeSpot({ type: typeSpacing, componentView });
}); });
cmp?.views.forEach(componentView => { cmp?.views.forEach(componentView => {
this.Canvas.setSpot({ type, componentView }); this.Canvas.setSpot({ type: typeHover, componentView });
if (!selectedAll.includes(componentView.model) || config.showOffsetsSelected) {
this.Canvas.setSpot({ type: typeSpacing, componentView });
}
}); });
}; };

6
src/utils/mixins.ts

@ -194,11 +194,11 @@ const capitalize = (str: string = '') => str && str.charAt(0).toUpperCase() + st
const isComponent = (obj: any) => obj && obj.toHTML; const isComponent = (obj: any) => obj && obj.toHTML;
const isRule = (obj: any) => obj && obj.toCSS; const isRule = (obj: any) => obj && obj.toCSS;
const getViewEl = <T extends any>(el: any): T | undefined => el.__gjsv; const getViewEl = <T extends any>(el?: Node): T | undefined => (el as any)?.__gjsv;
export const getComponentView = (el: Node) => getViewEl<ComponentView>(el); export const getComponentView = (el?: Node) => getViewEl<ComponentView>(el);
export const getComponentModel = (el: Node) => getComponentView(el)?.model; export const getComponentModel = (el?: Node) => getComponentView(el)?.model;
const setViewEl = (el: any, view: any) => { const setViewEl = (el: any, view: any) => {
el.__gjsv = view; el.__gjsv = view;

Loading…
Cancel
Save