diff --git a/package.json b/package.json index 6a32e0595..645170dab 100644 --- a/package.json +++ b/package.json @@ -101,6 +101,7 @@ "dependencies": { "@blueprintjs/core": "^3.54.0", "@blueprintjs/popover2": "^0.12.9", + "@blueprintjs/select": "^3.19.1", "@blueprintjs/table": "^3.10.0", "@epicgames-ps/lib-pixelstreamingfrontend-ue5.2": "^0.5.1", "@jscad/modeling": "^2.12.2", diff --git a/src/Add-on/DrawViewport.ts b/src/Add-on/DrawViewport.ts index ba3a98809..767c8445d 100644 --- a/src/Add-on/DrawViewport.ts +++ b/src/Add-on/DrawViewport.ts @@ -8,7 +8,9 @@ import { Board } from "../DatabaseServices/Entity/Board"; import { Curve } from "../DatabaseServices/Entity/Curve"; import { Entity } from "../DatabaseServices/Entity/Entity"; import { HardwareCompositeEntity } from "../DatabaseServices/Hardware/HardwareCompositeEntity"; +import { LayerTableRecord } from "../DatabaseServices/LayerTableRecord"; import { ObjectId } from "../DatabaseServices/ObjectId"; +import { LayerNode } from "../DatabaseServices/Tables/LayerTable"; import { ViewportEntity } from "../DatabaseServices/ViewportEntity"; import { Command } from "../Editor/CommandMachine"; import { PromptStatus } from "../Editor/PromptResult"; @@ -538,6 +540,8 @@ export interface ICustomViewportInfo height: number; position: Vector3; hideTypes: string[]; + hideLayer: Set; + showLayer: Set; } export function DrawCustomViewports(infos: ICustomViewportInfo[], ens: Entity[], hideEntitys: Entity[], isRevertRotate: boolean) @@ -591,11 +595,56 @@ export function DrawCustomViewports(infos: ICustomViewportInfo[], ens: Entity[], vp.AppendHideObjects(modelIds); } } + + //只显示图层优先级较大 + if (info.showLayer?.size) + OnlyShowLayer(app.Database.LayerTable.Root.children, info.showLayer, vp); + else if (info.hideLayer?.size) + OnlyHideLayer(app.Database.LayerTable.Root.children, info.hideLayer, vp); + vps.push(vp); } return vps; } +//只显示的图层 +function OnlyShowLayer(layerNodes: LayerNode[], showLayerList: Set, vp: ViewportEntity) +{ + for (let node of layerNodes) + { + if (!node.children?.length) + { + if (!showLayerList.has(node.name)) + { + let layer = app.Database.LayerTable.Symbols.get(node.name) as LayerTableRecord; + if (layer?.Id) + vp.AddFreezeLayer(layer.Id); + } + } + else + OnlyShowLayer(node.children, showLayerList, vp); + } +} + +//只隐藏的图层 +function OnlyHideLayer(layerNodes: LayerNode[], hideLayerList: Set, vp: ViewportEntity, hideChildren = false) +{ + for (let node of layerNodes) + { + if (hideChildren || hideLayerList.has(node.name)) + { + if (node.children?.length) + OnlyHideLayer(node.children, hideLayerList, vp, hideChildren); + else + { + let layer = app.Database.LayerTable.Symbols.get(node.name) as LayerTableRecord; + if (layer?.Id) + vp.AddFreezeLayer(layer.Id); + } + } + } +} + /** * 获取相机所在视图角度朝向 */ diff --git a/src/Add-on/ViewortConfig/EditFrame.ts b/src/Add-on/ViewortConfig/EditFrame.ts index d43a8d3a1..8c60192b9 100644 --- a/src/Add-on/ViewortConfig/EditFrame.ts +++ b/src/Add-on/ViewortConfig/EditFrame.ts @@ -1,4 +1,3 @@ -import { observable } from "mobx"; import { Matrix4, Vector3 } from "three"; import { app } from "../../ApplicationServices/Application"; import { LogType } from "../../Common/Log"; @@ -10,14 +9,8 @@ import { BoardModalType } from "../../UI/Components/Board/BoardModalType"; import { ModalState } from "../../UI/Components/Modal/ModalInterface"; import { userConfigStore } from "../../UI/Store/UserConfigStore"; import { EditFrameModal } from "./EditFrameModal"; -import { EditViewSettingStore } from "./EditViewport"; - -export class EditFrameStore -{ - @observable HideOptions: [string, boolean][] = [["隐藏门板", false], ["隐藏抽屉", false], ["隐藏标注", false], ["隐藏曲线", false], ["隐藏模型", false]]; - @observable BoardInfoOptions: [string, boolean][] = [["房间名", false], ["柜名", false], ["板材名", false], ["材料", false], ["颜色", false], ["页码", false], ["日期/时间", false], ["设计师", false], ["图纸名称", false]]; - @observable ViewAndVisionOption: [string, boolean][] = [["左视图", false], ["概念", false]]; -} +import { EditViewOptionKey } from "./EditViewOption"; +import { EditViewSettingStore } from "./EditViewSettingStore"; export class EditFrame implements Command { @@ -33,56 +26,87 @@ export class EditFrame implements Command await userConfigStore.UpdateBoardOption(this.store.configName, BoardModalType.EditViewSetting, this.store); } - let store = new EditFrameStore(); - app.Editor.ModalManage.RenderModal(EditFrameModal, { store }); + app.Editor.ModalManage.RenderModal(EditFrameModal, { store: this.store }); let state = await app.Editor.ModalManage.Wait(); if (state.Status !== ModalState.Ok) return; + this._TextColor = app.Viewer.isLayout ? 0 : 7; let mtx = new Matrix4(); - let nens = []; + let lables: Text[] = []; this._Texts = []; + const m_Option = this.store.m_Option; + + for (let [key, lable] of this.store.ViewAndVisionOption) + { + if (m_Option[key]) + { + let t = new Text; + if (key === EditViewOptionKey.viewDir) + t.TextString = "@" + m_Option[EditViewOptionKey.viewDirValue]; + else if (key === EditViewOptionKey.renderType) + t.TextString = "@@" + m_Option[EditViewOptionKey.renderTypeValue]; + t.ColorIndex = this._TextColor; + t.Height = m_Option.hight; + this._Texts.push(t); + lables.push(JigUtils.Draw(t)); + } + } - for (let i = 0; i < store.ViewAndVisionOption.length; i++) + for (let [key, lable] of this.store.HideOptions) { - if (store.ViewAndVisionOption[i][1]) + if (m_Option[key]) { let t = new Text; - if (i == 0) - t.TextString = "@" + store.ViewAndVisionOption[i][0]; - else if (i == 1) - t.TextString = "@@" + store.ViewAndVisionOption[i][0]; + t.TextString = "@@@" + lable; t.ColorIndex = this._TextColor; - t.Height = this.store.config.option.hight; + t.Height = m_Option.hight; this._Texts.push(t); - nens.push(JigUtils.Draw(t)); + lables.push(JigUtils.Draw(t)); } } - for (let i = 0; i < store.HideOptions.length; i++) + + for (let [key, lable] of this.store.BoardInfoOptions) { - if (store.HideOptions[i][1]) + if (m_Option[key]) { let t = new Text; - t.TextString = "@@@" + store.HideOptions[i][0]; + t.TextString = "$" + lable; t.ColorIndex = this._TextColor; - t.Height = this.store.config.option.hight; + t.Height = m_Option.hight; this._Texts.push(t); - nens.push(JigUtils.Draw(t)); + lables.push(JigUtils.Draw(t)); } } - for (let i = 0; i < store.BoardInfoOptions.length; i++) + + if (m_Option[EditViewOptionKey.showLayer]) { - if (store.BoardInfoOptions[i][1]) + let showLayerList = m_Option[EditViewOptionKey.showLayerValue].split(" ").filter((str) => str && str !== " "); + for (let layerName of showLayerList) { let t = new Text; - t.TextString = "$" + store.BoardInfoOptions[i][0]; + t.TextString = "#" + layerName; t.ColorIndex = this._TextColor; - t.Height = this.store.config.option.hight; + t.Height = m_Option.hight; this._Texts.push(t); - nens.push(JigUtils.Draw(t)); + lables.push(JigUtils.Draw(t)); } } - if (nens.length === 0) return; + else if (m_Option[EditViewOptionKey.hideLayer]) + { + let hideLayerList = m_Option[EditViewOptionKey.hideLayerValue].split(" ").filter((str) => str && str !== " "); + for (let layerName of hideLayerList) + { + let t = new Text; + t.TextString = "##" + layerName; + t.ColorIndex = this._TextColor; + t.Height = m_Option.hight; + this._Texts.push(t); + lables.push(JigUtils.Draw(t)); + } + } + + if (lables.length === 0) return; while (true) { @@ -92,11 +116,11 @@ export class EditFrame implements Command Callback: (p: Vector3) => { mtx.setPosition(p); - for (let i = 0; i < nens.length; i++) + for (let i = 0; i < lables.length; i++) { let pox = p.clone(); - pox.y += (nens.length - 1 - i) * this.store.config.option.hight * 1.35; - nens[i].ApplyMatrix(mtx); + pox.y += (lables.length - 1 - i) * m_Option.hight * 1.35; + lables[i].ApplyMatrix(mtx); this._Texts[i].Position = pox; } } @@ -105,7 +129,7 @@ export class EditFrame implements Command { if (ptRes.StringResult === "H") { - let ret = await app.Editor.GetDistance({ Msg: "当前文字大小为:", Default: this.store.config.option.hight }); + let ret = await app.Editor.GetDistance({ Msg: "当前文字大小为:", Default: m_Option.hight }); if (ret.Status === PromptStatus.OK) { if (ret.Distance <= 0 || isNaN(ret.Distance)) @@ -116,7 +140,7 @@ export class EditFrame implements Command { for (let t of this._Texts) t.Height = Math.abs(ret.Distance); - this.store.config.option.hight = Math.abs(ret.Distance); + m_Option.hight = Math.abs(ret.Distance); userConfigStore.SaveConfig(BoardModalType.EditViewSetting, this.store, { toaster: false }); } } diff --git a/src/Add-on/ViewortConfig/EditFrameModal.tsx b/src/Add-on/ViewortConfig/EditFrameModal.tsx index b73ceff7b..6c8aa8504 100644 --- a/src/Add-on/ViewortConfig/EditFrameModal.tsx +++ b/src/Add-on/ViewortConfig/EditFrameModal.tsx @@ -1,11 +1,18 @@ -import { Button, Checkbox, Classes, HTMLSelect, Icon } from "@blueprintjs/core"; +import { Button, Checkbox, Classes, HTMLSelect, Icon, Tooltip } from "@blueprintjs/core"; +import { observable } from "mobx"; import { observer } from "mobx-react"; import React from "react"; import * as xaop from 'xaop'; import { app } from "../../ApplicationServices/Application"; import { KeyBoard } from "../../Common/KeyEnum"; +import { LayerNode } from "../../DatabaseServices/Tables/LayerTable"; +import { BoardModalType } from "../../UI/Components/Board/BoardModalType"; +import { Config_ModalType, UserConfigComponent } from "../../UI/Components/Board/UserConfigComponent"; import { ModalState } from "../../UI/Components/Modal/ModalInterface"; -import { EditFrameStore } from "./EditFrame"; +import "./EditFrameModalStyle.less"; +import { EditViewOptionKey } from "./EditViewOption"; +import { EditViewSettingStore } from "./EditViewSettingStore"; +import { LayerInfo, LayerSelect } from "./LayerSelectModal"; const ViewAndVisionOptions = [[ { label: "左视图", value: "左视图" }, @@ -26,12 +33,15 @@ const ViewAndVisionOptions = [[ ]]; @observer -export class EditFrameModal extends React.Component<{ store: EditFrameStore; }> +export class EditFrameModal extends React.Component<{ store: EditViewSettingStore; }> { _Event: Function; + LayerInfoItem: LayerInfo[] = []; + @observable ShowLayerInput: React.RefObject = React.createRef(); + @observable HideLayerInput: React.RefObject = React.createRef(); + registerEvent() { - this._Event = xaop.begin(app.Editor.ModalManage, app.Editor.ModalManage.OnKeyDown, (e: KeyboardEvent) => { if (e.keyCode === KeyBoard.Enter || @@ -44,10 +54,13 @@ export class EditFrameModal extends React.Component<{ store: EditFrameStore; }> e.stopPropagation(); }); } + UNSAFE_componentWillMount() { //注册事件 this.registerEvent(); + this.LayerInfoItem = []; + this.GetLayerAllItem(app.Database.LayerTable.Root.children); } componentWillUnmount() { @@ -55,9 +68,67 @@ export class EditFrameModal extends React.Component<{ store: EditFrameStore; }> this._Event = null; } + GetLayerAllItem(nodeList: LayerNode[], stratNum = 1, parentName = "") + { + for (let node of nodeList) + { + this.LayerInfoItem.push({ title: node.name, stratNum, parentName }); + if (node.children?.length) + { + let childrenStratNum = stratNum + 1; + this.GetLayerAllItem(node.children, childrenStratNum, node.name); + } + } + } + + LayerInput = (key: EditViewOptionKey, inputRef: React.LegacyRef) => + { + return + + { + switch (e.keyCode) + { + case KeyBoard.Escape: + case KeyBoard.Enter: + e.currentTarget.blur(); + e.stopPropagation(); + break; + case KeyBoard.Space: + e.stopPropagation(); + break; + default: + break; + } + }} + onChange={(e) => + { + let value = e.target.value; + value = value.trimStart(); + + if (value.endsWith(" ")) + value = value.substring(0, value.length - 1); + + (this.props.store.m_Option[key] as string) = value; + }} + onBlur={(e) => + { + (this.props.store.m_Option[key] as string) = e.currentTarget.value; + }} + /> + ; + }; + render() { - const { BoardInfoOptions, HideOptions, ViewAndVisionOption } = this.props.store; + const { BoardInfoOptions, HideOptions, ViewAndVisionOption, LayerOption, m_Option } = this.props.store; return (
@@ -74,24 +145,24 @@ export class EditFrameModal extends React.Component<{ store: EditFrameStore; }>
{ - ViewAndVisionOption.map((opt, i) => + Array.from(ViewAndVisionOption).map(([key, label], i) => { return ( -
+
{ - opt[1] = !opt[1]; + m_Option[key] = !m_Option[key]; event.currentTarget.blur(); app.Editor.ModalManage.ChangeFoucus(); }} > { opt[0] = e.target.value; }} + onChange={(e) => { m_Option[key + "Value"] = e.target.value; }} />
@@ -100,29 +171,97 @@ export class EditFrameModal extends React.Component<{ store: EditFrameStore; }> }
- { - new Array(BoardInfoOptions, HideOptions).map((opts, i) => +
{ - return ( -
- { - opts.map(opt => + Array.from(BoardInfoOptions).map(([key, lable]) => + { + return ( + { - return ( - - { - opt[1] = !opt[1]; - event.currentTarget.blur(); - app.Editor.ModalManage.ChangeFoucus(); - }} - />); - })} -
); - })} + m_Option[key] = !m_Option[key]; + event.currentTarget.blur(); + app.Editor.ModalManage.ChangeFoucus(); + }} + />); + }) + } +
+
+
+ { + Array.from(HideOptions).map(([key, lable]) => + { + return ( + + { + m_Option[key] = !m_Option[key]; + event.currentTarget.blur(); + app.Editor.ModalManage.ChangeFoucus(); + }} + />); + }) + } +
+
+
+
+ + { + m_Option[EditViewOptionKey.showLayer] = !m_Option[EditViewOptionKey.showLayer]; + event.currentTarget.blur(); + app.Editor.ModalManage.ChangeFoucus(); + }} + /> + +
+
+ {this.LayerInput(EditViewOptionKey.showLayerValue, this.ShowLayerInput)} +
+
+
+
+ + { + m_Option[EditViewOptionKey.hideLayer] = !m_Option[EditViewOptionKey.hideLayer]; + event.currentTarget.blur(); + app.Editor.ModalManage.ChangeFoucus(); + }} + /> + +
+
+ {this.LayerInput(EditViewOptionKey.hideLayerValue, this.HideLayerInput)} +
+
+
+
label={"全选/反选"} onChange={(e) => { - for (let name of [...HideOptions, ...BoardInfoOptions, ...ViewAndVisionOption]) - { - name[1] = e.currentTarget.checked; - } + for (let [key, label] of [...HideOptions, ...BoardInfoOptions, ...ViewAndVisionOption]) + m_Option[key] = e.currentTarget.checked; }} />
-
-
-
-
+
+ +
+
-
+
); } } diff --git a/src/Add-on/ViewortConfig/EditFrameModalStyle.less b/src/Add-on/ViewortConfig/EditFrameModalStyle.less new file mode 100644 index 000000000..82b0f8c6a --- /dev/null +++ b/src/Add-on/ViewortConfig/EditFrameModalStyle.less @@ -0,0 +1,83 @@ +#EditFrameModal { + font-size: 14px; + + .bp3-dialog-body { + width: 430px; + padding: 15px 25px 10px 27px; + } + + .frame-view { + display: flex; + justify-content: space-around; + margin-bottom: 10px; + + &>:nth-child(1) { + margin-right: 40px; + } + + .bp3-html-select .bp3-icon { + top: 6px; + } + } + + .frame-options { + display: flex; + flex-direction: row; + justify-content: flex-start; + + margin-left: 12px; + + &>:nth-child(1) { + margin-right: 40px; + } + + .hideOptions { + width: 220px; + + .hide1 { + display: flex; + flex-wrap: wrap; + align-content: stretch; + + .bp3-checkbox { + margin-right: 20px; + } + } + + .layer { + margin-top: 10px; + + label { + width: 85px; + } + + .hideLayer { + margin-top: 18px; + } + } + + .showLayer .showLayerSelect { + display: flex; + } + + .hideLayer .hideLayerSelect { + display: flex; + } + + .bp3-button { + margin: -6px 0 0 5px; + } + } + } + + .bp3-dialog-footer { + height: 45px; + display: flex; + + .foot-right { + :nth-child(2) { + margin-left: 3px; + } + } + } +} diff --git a/src/Add-on/ViewortConfig/EditViewOption.ts b/src/Add-on/ViewortConfig/EditViewOption.ts new file mode 100644 index 000000000..a3f07c0cb --- /dev/null +++ b/src/Add-on/ViewortConfig/EditViewOption.ts @@ -0,0 +1,55 @@ +import { IBaseOption } from "../../UI/Store/OptionInterface/IOptionInterface"; + +export enum EditViewOptionKey +{ + hight = "hight", //文字高度 + renderType = "renderType", //视图 + renderTypeValue = "renderTypeValue", //视图值 + viewDir = "viewDir", //视角 + viewDirValue = "viewDirValue", //视角值 + roomName = "roomName",//房间名 + cabinetName = "cabinetName",//柜名 + boardMaterialName = "boardMaterialName", //板材名 + material = "material", //材料 + color = "color",//颜色 + page = "page",//页码 + date = "date",//时间 + designer = "designer",//设计师 + sheetName = "sheetName",//图纸名称 + hideDoor = "hideDoor",//隐藏门板 + hideDrawer = "hideDrawer",//隐藏抽屉 + hideDim = "hideDim",//隐藏标注 + hideCurve = "hideCurve",//隐藏曲线 + hideModel = "hideModel",//隐藏模型 + hideLayer = "hideLayer",//隐藏图层 + hideLayerValue = "hideLayerValue",//隐藏图层值 + showLayer = "showLayer",//显示图层 + showLayerValue = "showLayerValue",//显示图层值 +} + +export interface EditViewOption extends IBaseOption +{ + [EditViewOptionKey.hight]: number;//文字大小 + [EditViewOptionKey.renderType]: boolean; + [EditViewOptionKey.renderTypeValue]: string; + [EditViewOptionKey.viewDir]: boolean; + [EditViewOptionKey.viewDirValue]: string; + [EditViewOptionKey.roomName]: boolean; + [EditViewOptionKey.cabinetName]: boolean; + [EditViewOptionKey.boardMaterialName]: boolean; + [EditViewOptionKey.material]: boolean; + [EditViewOptionKey.color]: boolean; + [EditViewOptionKey.page]: boolean; + [EditViewOptionKey.date]: boolean; + [EditViewOptionKey.designer]: boolean; + [EditViewOptionKey.sheetName]: boolean; //图纸名称 + [EditViewOptionKey.hideDoor]: boolean; + [EditViewOptionKey.hideDrawer]: boolean; + [EditViewOptionKey.hideDim]: boolean; + [EditViewOptionKey.hideCurve]: boolean; + [EditViewOptionKey.hideModel]: boolean; + [EditViewOptionKey.hideLayer]: boolean; + [EditViewOptionKey.hideLayerValue]: string; + [EditViewOptionKey.showLayer]: boolean; + [EditViewOptionKey.showLayerValue]: string; +} diff --git a/src/Add-on/ViewortConfig/EditViewSettingStore.ts b/src/Add-on/ViewortConfig/EditViewSettingStore.ts new file mode 100644 index 000000000..f1d420066 --- /dev/null +++ b/src/Add-on/ViewortConfig/EditViewSettingStore.ts @@ -0,0 +1,69 @@ +import { observable, toJS } from "mobx"; +import { DefaultEditViewOption } from "../../Editor/DefaultConfig"; +import { IConfigOption } from "../../UI/Components/Board/UserConfigComponent"; +import { IConfigStore } from "../../UI/Store/BoardStore"; +import { EditViewOption, EditViewOptionKey } from "./EditViewOption"; + +export class EditViewSettingStore implements IConfigStore +{ + @observable configName = "默认"; + @observable configsNames = []; + @observable m_Option: EditViewOption = { ...DefaultEditViewOption }; + HideOptions: Map = new Map([ + [EditViewOptionKey.hideDoor, "隐藏门板"], + [EditViewOptionKey.hideDrawer, "隐藏抽屉"], + [EditViewOptionKey.hideDim, "隐藏标注"], + [EditViewOptionKey.hideCurve, "隐藏曲线"], + [EditViewOptionKey.hideModel, "隐藏模型"] + ]); + BoardInfoOptions: Map = new Map([ + [EditViewOptionKey.roomName, "房间名"], + [EditViewOptionKey.cabinetName, "柜名"], + [EditViewOptionKey.boardMaterialName, "板材名"], + [EditViewOptionKey.material, "材料"], + [EditViewOptionKey.color, "颜色"], + [EditViewOptionKey.page, "页码"], + [EditViewOptionKey.date, "日期/时间"], + [EditViewOptionKey.designer, "设计师"], + [EditViewOptionKey.sheetName, "图纸名称"] + ]); + ViewAndVisionOption: Map = new Map([ + [EditViewOptionKey.viewDir, "视图"], + [EditViewOptionKey.renderType, "视觉样式"] + ]); + LayerOption: Map = new Map([ + [EditViewOptionKey.hideLayer, "隐藏图层"], + [EditViewOptionKey.showLayer, "显示图层"] + ]); + + InitOption() + { + Object.assign(this.m_Option, DefaultEditViewOption); + } + + SaveConfig() + { + let newConfig: IConfigOption = {}; + newConfig.option = toJS(this.m_Option); + return newConfig; + } + + UpdateOption(conf: IConfigOption) + { + if (!conf.option.version) + { + this.InitOption(); + this.m_Option.hight = conf.option.hight; + return; + } + + Object.assign(this.m_Option, conf.option); + } +} +export class EditFrameStore +{ + @observable HideOptions: [string, boolean][] = [["隐藏门板", false], ["隐藏抽屉", false], ["隐藏标注", false], ["隐藏曲线", false], ["隐藏模型", false]]; + @observable BoardInfoOptions: [string, boolean][] = [["房间名", false], ["柜名", false], ["板材名", false], ["材料", false], ["颜色", false], ["页码", false], ["日期/时间", false], ["设计师", false], ["图纸名称", false]]; + @observable ViewAndVisionOption: [string, boolean][] = [["左视图", false], ["概念", false]]; + @observable LayerOption: [string, boolean][] = [["隐藏图层", false]]; +} diff --git a/src/Add-on/ViewortConfig/EditViewport.ts b/src/Add-on/ViewortConfig/EditViewport.ts index 0ec67c1d5..21d53c7d1 100644 --- a/src/Add-on/ViewortConfig/EditViewport.ts +++ b/src/Add-on/ViewortConfig/EditViewport.ts @@ -12,12 +12,11 @@ import { JigUtils } from "../../Editor/JigUtils"; import { PromptStatus } from "../../Editor/PromptResult"; import { TempEditor } from "../../Editor/TempEditor"; import { BoardModalType } from "../../UI/Components/Board/BoardModalType"; -import { IConfigOption } from "../../UI/Components/Board/UserConfigComponent"; import { ModalState } from "../../UI/Components/Modal/ModalInterface"; import { AppToaster } from "../../UI/Components/Toaster"; -import { IConfigStore } from "../../UI/Store/BoardStore"; import { DownPanelStore } from "../../UI/Store/DownPanelStore"; import { userConfigStore } from "../../UI/Store/UserConfigStore"; +import { EditViewSettingStore } from "./EditViewSettingStore"; import { EditViewportModal } from "./EditViewportModal"; export class EditViewportStore @@ -83,7 +82,7 @@ export class EditViewport implements Command let t = new Text; t.TextString = this.HandleTextMetaData(store.cName[i][0], board); t.ColorIndex = 0; - t.Height = this.store.config.option.hight; + t.Height = this.store.m_Option.hight; this._Texts.push(t); nens.push(JigUtils.Draw(t)); } @@ -115,7 +114,7 @@ export class EditViewport implements Command for (let i = 0; i < this._Texts.length; i++) { let pox = p.clone(); - pox.y += (this._Texts.length - 1 - i) * this.store.config.option.hight * 1.35; + pox.y += (this._Texts.length - 1 - i) * this.store.m_Option.hight * 1.35; nens[i].ApplyMatrix(mtx); this._Texts[i].Position = pox; } @@ -126,7 +125,7 @@ export class EditViewport implements Command { if (ptRes.StringResult === "H") { - let ret = await app.Editor.GetDistance({ Msg: "当前文字大小为:", Default: this.store.config.option.hight }); + let ret = await app.Editor.GetDistance({ Msg: "当前文字大小为:", Default: this.store.m_Option.hight }); if (ret.Status === PromptStatus.OK) { if (ret.Distance <= 0 || isNaN(ret.Distance)) @@ -137,7 +136,7 @@ export class EditViewport implements Command { for (let t of this._Texts) t.Height = Math.abs(ret.Distance); - this.store.config.option.hight = Math.abs(ret.Distance); + this.store.m_Option.hight = Math.abs(ret.Distance); userConfigStore.SaveConfig(BoardModalType.EditViewSetting, this.store, { toaster: false }); } } @@ -178,31 +177,3 @@ export class EditViewport implements Command } } } - -//只是用来保存配置 -export class EditViewSettingStore implements IConfigStore -{ - configName = "默认"; - configsNames = ['默认']; - config = { - option: { - hight: 60 - } - }; - InitOption() - { - this.config = { - option: { - hight: 60 - } - }; - } - SaveConfig() - { - return this.config; - } - UpdateOption(conf: IConfigOption) - { - Object.assign(this.config, conf); - } -} diff --git a/src/Add-on/ViewortConfig/LayerSelectModal.tsx b/src/Add-on/ViewortConfig/LayerSelectModal.tsx new file mode 100644 index 000000000..b4cec17af --- /dev/null +++ b/src/Add-on/ViewortConfig/LayerSelectModal.tsx @@ -0,0 +1,93 @@ +import { Button, MenuItem } from "@blueprintjs/core"; +import { ItemPredicate, ItemRenderer, Select } from "@blueprintjs/select"; +import * as React from "react"; +import { RefObject } from "react"; +import { EditViewOption, EditViewOptionKey } from "./EditViewOption"; + +interface LayerSelectProp +{ + inputElement: RefObject; + items: LayerInfo[]; + m_Option: EditViewOption, + editViewOptionKey: EditViewOptionKey, +} + +export interface LayerInfo +{ + title: string; + stratNum: number; + parentName: string; +} + +const FilterLayer: ItemPredicate = (query, film, _index, exactMatch) => +{ + const normalizedTitle = film.title.toLowerCase(); + const normalizedQuery = query.toLowerCase(); + if (exactMatch) + return normalizedTitle === normalizedQuery; + else + return `${normalizedTitle}`.indexOf(normalizedQuery) >= 0; +}; + +const RenderLayer: ItemRenderer = (layer, { handleClick, modifiers, query }) => +{ + if (!modifiers.matchesPredicate) + { + return null; + } + return ( + + ); +}; + +const CheckParent = (alreadyExistsLayer: string[], item: LayerInfo, allItems: LayerInfo[]) => +{ + let parentItem = allItems.find(i => i.title === item.parentName); + if (parentItem) + return alreadyExistsLayer.includes(parentItem.title) || CheckParent(alreadyExistsLayer, parentItem, allItems); + else + return false; +}; + +const DisabledLayer = (item: LayerInfo, allItems: LayerInfo[], text: string) => +{ + let alreadyExistsLayer = text?.split(" ") || []; + ; + return alreadyExistsLayer.includes(item.title) || CheckParent(alreadyExistsLayer, item, allItems); +}; + +const OnItemSelect = (item: LayerInfo, inputElement: React.RefObject, option: EditViewOption, key: EditViewOptionKey) => +{ + let valueList = inputElement.current.value.split(" ").filter((str) => str && str !== " "); + let newStr = valueList.join(" "); + + if (newStr) + inputElement.current.value = newStr + ` ${item.title}`; + else + inputElement.current.value = item.title; + + (option[key] as string) = inputElement.current.value; +}; + +export const LayerSelect: React.FC = (props: LayerSelectProp) => +{ + return ( + + items={props.items} + itemPredicate={FilterLayer} + itemRenderer={RenderLayer} + itemDisabled={(item) => DisabledLayer(item, props.items, props.inputElement?.current?.value)} + noResults={} + onItemSelect={(item) => OnItemSelect(item, props.inputElement, props.m_Option, props.editViewOptionKey)} + > +