mirror of
https://github.com/Tencent/tmagic-editor.git
synced 2025-10-04 17:39:59 +08:00
136 lines
3.3 KiB
TypeScript
136 lines
3.3 KiB
TypeScript
/*
|
|
* Tencent is pleased to support the open source community by making TMagicEditor available.
|
|
*
|
|
* Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
import { reactive, toRaw } from 'vue';
|
|
|
|
import type StageCore from '@tmagic/stage';
|
|
|
|
import editorService from '@editor/services/editor';
|
|
import type { GetColumnWidth, SetColumnWidth, StageRect, UiState } from '@editor/type';
|
|
|
|
import BaseService from './BaseService';
|
|
|
|
const state = reactive<UiState>({
|
|
uiSelectMode: false,
|
|
showSrc: false,
|
|
zoom: 1,
|
|
stageContainerRect: {
|
|
width: 0,
|
|
height: 0,
|
|
},
|
|
stageRect: {
|
|
width: 375,
|
|
height: 817,
|
|
},
|
|
columnWidth: {
|
|
left: 310,
|
|
center: globalThis.document.body.clientWidth - 310 - 400,
|
|
right: 400,
|
|
},
|
|
showGuides: true,
|
|
showRule: true,
|
|
});
|
|
|
|
class Ui extends BaseService {
|
|
constructor() {
|
|
super([]);
|
|
globalThis.addEventListener('resize', () => {
|
|
this.setColumnWidth({
|
|
center: 'auto',
|
|
});
|
|
});
|
|
}
|
|
|
|
public set<T = any>(name: keyof UiState, value: T) {
|
|
const mask = editorService.get<StageCore>('stage')?.mask;
|
|
|
|
if (name === 'columnWidth') {
|
|
this.setColumnWidth(value as unknown as SetColumnWidth);
|
|
return;
|
|
}
|
|
|
|
if (name === 'stageRect') {
|
|
this.setStageRect(value as unknown as StageRect);
|
|
return;
|
|
}
|
|
|
|
if (name === 'showGuides') {
|
|
mask?.showGuides(value as unknown as boolean);
|
|
}
|
|
|
|
if (name === 'showRule') {
|
|
mask?.showRule(value as unknown as boolean);
|
|
}
|
|
|
|
(state as any)[name] = value;
|
|
|
|
if (name === 'stageContainerRect') {
|
|
state.zoom = this.calcZoom();
|
|
}
|
|
}
|
|
|
|
public get<T>(name: keyof typeof state): T {
|
|
return (state as any)[name];
|
|
}
|
|
|
|
private setColumnWidth({ left, center, right }: SetColumnWidth) {
|
|
const columnWidth = {
|
|
...toRaw(this.get<GetColumnWidth>('columnWidth')),
|
|
};
|
|
|
|
if (left) {
|
|
columnWidth.left = left;
|
|
}
|
|
|
|
if (right) {
|
|
columnWidth.right = right;
|
|
}
|
|
|
|
if (!center || center === 'auto') {
|
|
const bodyWidth = globalThis.document.body.clientWidth;
|
|
columnWidth.center = bodyWidth - (columnWidth?.left || 0) - (columnWidth?.right || 0);
|
|
} else {
|
|
columnWidth.center = center;
|
|
}
|
|
|
|
state.columnWidth = columnWidth;
|
|
}
|
|
|
|
private setStageRect(value: StageRect) {
|
|
state.stageRect = {
|
|
...state.stageRect,
|
|
...value,
|
|
};
|
|
state.zoom = this.calcZoom();
|
|
}
|
|
|
|
private calcZoom() {
|
|
const { stageRect, stageContainerRect } = state;
|
|
const { height, width } = stageContainerRect;
|
|
if (!width || !height) return 1;
|
|
if (width > stageRect.width && height > stageRect.height) {
|
|
return 1;
|
|
}
|
|
return Math.min((width - 100) / stageRect.width || 1, (height - 100) / stageRect.height || 1);
|
|
}
|
|
}
|
|
|
|
export type UiService = Ui;
|
|
|
|
export default new Ui();
|