From 48341020906ac71ca24ee968bc25a77b821aecd6 Mon Sep 17 00:00:00 2001
From: Lingxi <2863878907@qq.com>
Date: Tue, 26 Nov 2024 22:10:09 +0800
Subject: [PATCH 01/15] =?UTF-8?q?"=E6=A0=87=E9=A2=98"=EF=BC=8C=20"?=
=?UTF-8?q?=E6=96=87=E6=9C=AC=E6=A1=86"=EF=BC=8C=20"=E9=80=89=E9=A1=B9"=20?=
=?UTF-8?q?backToTitle=EF=BC=8C=20sendSyncCommand=EF=BC=8C=20sendSyncComma?=
=?UTF-8?q?nd?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../ComponentTree/ComponentNode.tsx | 23 +++++++++++++-----
packages/origine2/src/types/debugProtocol.ts | 2 ++
packages/origine2/src/utils/wsUtil.ts | 24 ++++++++++++++++++-
.../WebGAL_Template/game/scene/start.txt | 8 +++++++
4 files changed, 50 insertions(+), 7 deletions(-)
diff --git a/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx b/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx
index ae8f25151..ec82314c5 100644
--- a/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx
+++ b/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx
@@ -3,6 +3,7 @@ import styles from './componentNode.module.scss';
import { ChevronDownFilled, ChevronDownRegular, ChevronUpFilled, ChevronUpRegular, bundleIcon } from "@fluentui/react-icons";
import { useTemplateEditorContext } from "@/store/useTemplateEditorStore";
import { ITab } from "@/types/templateEditor";
+import { WsUtil } from "@/utils/wsUtil";
const ChevronDownIcon = bundleIcon(ChevronDownFilled, ChevronDownRegular);
const ChevronUpIcon = bundleIcon(ChevronUpFilled, ChevronUpRegular);
@@ -24,7 +25,7 @@ export default function ComponentNode({ componentNode }: { componentNode: ICompo
expand
? updateExpandNode(expandNode.filter(path => path !== getFileName(componentNode.path)))
: updateExpandNode([...expandNode, getFileName(componentNode.path)]);
- const handleClassNodeClick = (classNode: IClassNode, path: string) => {
+ const handleClassNodeClick = (classNode: IClassNode, titleName: string, path: string) => {
const newTab: ITab = {
name: classNode.name,
path: path,
@@ -33,6 +34,15 @@ export default function ComponentNode({ componentNode }: { componentNode: ICompo
if (!tabs.some(tab => tab.path === newTab.path && tab.class === newTab.class)) {
updateTabs([...tabs, newTab]);
}
+ if (titleName === "标题") {
+ WsUtil.backToTitle();
+ }
+ else if (titleName === "文本框") {
+ WsUtil.sendSyncCommand("games/新的游戏/game/scene/start.txt", 5, "choose:可选项:选择场景文件|不可选项:start.txt;", true);
+ }
+ else if (titleName === "选项") {
+ WsUtil.sendSyncCommand("", 4, "2", true);
+ }
updateCurrentTab(newTab);
};
@@ -46,22 +56,23 @@ export default function ComponentNode({ componentNode }: { componentNode: ICompo
expand &&
{
- componentNode.nodes?.map((classNode) =>
-
{
+ return (
handleClassNodeClick(classNode, componentNode.path)}
+ onClick={() => handleClassNodeClick(classNode, componentNode.name, componentNode.path)}
>
{classNode.name}
-
+
);
+ }
)
}
}
>
);
-}
\ No newline at end of file
+}
diff --git a/packages/origine2/src/types/debugProtocol.ts b/packages/origine2/src/types/debugProtocol.ts
index 1f7802713..7fd96e120 100644
--- a/packages/origine2/src/types/debugProtocol.ts
+++ b/packages/origine2/src/types/debugProtocol.ts
@@ -11,6 +11,8 @@ export enum DebugCommand {
EXE_COMMAND,
// 重新拉取模板样式文件
REFETCH_TEMPLATE_FILES,
+ // 返回主界面
+ BACK_TO_TITLE,
}
export interface IDebugMessage {
diff --git a/packages/origine2/src/utils/wsUtil.ts b/packages/origine2/src/utils/wsUtil.ts
index e61180945..bd32ecee8 100644
--- a/packages/origine2/src/utils/wsUtil.ts
+++ b/packages/origine2/src/utils/wsUtil.ts
@@ -3,6 +3,28 @@ import {DebugCommand, IDebugMessage} from "@/types/debugProtocol";
import useEditorStore from "@/store/useEditorStore";
export class WsUtil {
+
+ public static backToTitle(){
+ // @ts-ignore
+ if (window["currentWs"]) { // @ts-ignore
+ logger.debug("编辑器开始发送同步数据");
+ const message: IDebugMessage = {
+ event: 'message', data: {
+ command: DebugCommand.BACK_TO_TITLE,
+ sceneMsg: {
+ scene: "",
+ sentence: 0
+ },// @ts-ignore
+ stageSyncMsg: {},
+ message: useEditorStore.getState().isUseExpFastSync? 'exp':'Sync',
+ }
+ };
+ // @ts-ignore
+
+ window["currentWs"].send(JSON.stringify(message));
+ }
+ }
+
// eslint-disable-next-line max-params
public static sendSyncCommand(scenePath: string, lineNumber: number, lineCommandString: string, force?: boolean) {
function extractPathAfterScene(scenePath: string): string {
@@ -41,8 +63,8 @@ export class WsUtil {
message: useEditorStore.getState().isUseExpFastSync? 'exp':'Sync',
}
};
+ console.log(scenePath, lineNumber, lineCommandString);
// @ts-ignore
-
window["currentWs"].send(JSON.stringify(message));
}
}
diff --git a/packages/terre2/assets/templates/WebGAL_Template/game/scene/start.txt b/packages/terre2/assets/templates/WebGAL_Template/game/scene/start.txt
index e2ab92dd4..d6b2d5972 100644
--- a/packages/terre2/assets/templates/WebGAL_Template/game/scene/start.txt
+++ b/packages/terre2/assets/templates/WebGAL_Template/game/scene/start.txt
@@ -7,3 +7,11 @@ unlockCg:bg.png -name=良夜; // 解锁CG并赋予名称
changeFigure:stand.png -left -next;
setAnimation:enter-from-left -target=fig-left -next;
WebGAL:欢迎使用 WebGAL!这是一款全新的网页端视觉小说引擎。 -v1.wav;
+; 模版修改演示
+WebGAL:普通对话框 -v1.wav -fontSize=large;
+miniAvatar:stand.png;
+带有小头像的对话框 -fontSize=default;
+setTextbox:hide;
+changeFigure:stand.png;
+changeFigure:none -next;
+choose:选项:选择场景文件|选项2:选择场景文件;
\ No newline at end of file
From 78c1b518270627c84e746a8291a9a8833fb913e1 Mon Sep 17 00:00:00 2001
From: Lingxi <2863878907@qq.com>
Date: Thu, 28 Nov 2024 21:20:15 +0800
Subject: [PATCH 02/15] feat: Template Editor Tabs Sync Action
---
.../pages/templateEditor/TemplateEditor.tsx | 19 +++-
.../TemplateEditorMainAria/TabsManager.tsx | 4 +-
.../ComponentTree/ComponentNode.tsx | 16 +---
.../ComponentTree/ComponentTree.tsx | 91 ++++++++++---------
packages/origine2/src/types/debugProtocol.ts | 2 +
packages/origine2/src/utils/wsUtil.ts | 21 +++++
6 files changed, 94 insertions(+), 59 deletions(-)
diff --git a/packages/origine2/src/pages/templateEditor/TemplateEditor.tsx b/packages/origine2/src/pages/templateEditor/TemplateEditor.tsx
index f6f62f069..28f007049 100644
--- a/packages/origine2/src/pages/templateEditor/TemplateEditor.tsx
+++ b/packages/origine2/src/pages/templateEditor/TemplateEditor.tsx
@@ -3,6 +3,9 @@ import TemplateEditorSidebar from "./TemplateEditorSidebar/TemplateEditorSidebar
import TemplateEditorMainAria from "./TemplateEditorMainAria/TemplateEditorMainAria";
import styles from "./templateEditor.module.scss";
import { useTemplateEditorContext } from "@/store/useTemplateEditorStore";
+import { WsUtil } from "@/utils/wsUtil";
+import { ComponentTreeChoose, ComponentTreeTextbox, ComponentTreeTitle}
+ from "@/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree";
export default function TemplateEditor() {
return (
@@ -14,6 +17,20 @@ export default function TemplateEditor() {
);
}
+export const tabsSyncAction = (nodePath: string, nodeName: string)=> {
+ console.log(nodePath, nodeName);
+ if (nodePath.includes(ComponentTreeTitle.path)) {
+ WsUtil.backToTitle();
+ }
+ else if (nodePath.includes(ComponentTreeTextbox.path)) {
+ const miniAvatar = !nodeName.includes("小头像关闭时") ? "stand.png" : "";
+ WsUtil.createTempScene(`changeBg:bg.png -next;\nminiAvatar:${miniAvatar} -next;\nWebGal:这里对话框文字 -fontSize=default;`);
+ }
+ else if (nodePath.includes(ComponentTreeChoose.path)) {
+ WsUtil.createTempScene("changeBg:bg.png -next;\nchoose:可选项:|不可选项:;");
+ }
+};
+
function SideberResizer() {
const sidebarWidth = useTemplateEditorContext((state) => state.sidebarWidth);
const updateSidebarWidth = useTemplateEditorContext((state) => state.updateSidebarWidth);
@@ -87,4 +104,4 @@ function SideberResizer() {
);
-};
\ No newline at end of file
+};
diff --git a/packages/origine2/src/pages/templateEditor/TemplateEditorMainAria/TabsManager.tsx b/packages/origine2/src/pages/templateEditor/TemplateEditorMainAria/TabsManager.tsx
index d132ef378..ce52d955b 100644
--- a/packages/origine2/src/pages/templateEditor/TemplateEditorMainAria/TabsManager.tsx
+++ b/packages/origine2/src/pages/templateEditor/TemplateEditorMainAria/TabsManager.tsx
@@ -7,6 +7,7 @@ import { useTemplateEditorContext } from '@/store/useTemplateEditorStore';
import { ITab } from '@/types/templateEditor';
import { cloneDeep } from 'lodash';
import IconWrapper from '@/components/iconWrapper/IconWrapper';
+import {tabsSyncAction} from "@/pages/templateEditor/TemplateEditor";
export default function TabsManager() {
@@ -36,6 +37,7 @@ export default function TabsManager() {
}
function selectTab(tab: ITab) {
+ tabsSyncAction(tab.path, tab.name);
updateCurrentTab(tab);
}
@@ -129,4 +131,4 @@ export default function TabsManager() {
}
>
);
-}
\ No newline at end of file
+}
diff --git a/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx b/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx
index ec82314c5..67616ae21 100644
--- a/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx
+++ b/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx
@@ -3,7 +3,7 @@ import styles from './componentNode.module.scss';
import { ChevronDownFilled, ChevronDownRegular, ChevronUpFilled, ChevronUpRegular, bundleIcon } from "@fluentui/react-icons";
import { useTemplateEditorContext } from "@/store/useTemplateEditorStore";
import { ITab } from "@/types/templateEditor";
-import { WsUtil } from "@/utils/wsUtil";
+import {tabsSyncAction} from "@/pages/templateEditor/TemplateEditor";
const ChevronDownIcon = bundleIcon(ChevronDownFilled, ChevronDownRegular);
const ChevronUpIcon = bundleIcon(ChevronUpFilled, ChevronUpRegular);
@@ -25,7 +25,7 @@ export default function ComponentNode({ componentNode }: { componentNode: ICompo
expand
? updateExpandNode(expandNode.filter(path => path !== getFileName(componentNode.path)))
: updateExpandNode([...expandNode, getFileName(componentNode.path)]);
- const handleClassNodeClick = (classNode: IClassNode, titleName: string, path: string) => {
+ const handleClassNodeClick = (classNode: IClassNode, path: string) => {
const newTab: ITab = {
name: classNode.name,
path: path,
@@ -34,16 +34,8 @@ export default function ComponentNode({ componentNode }: { componentNode: ICompo
if (!tabs.some(tab => tab.path === newTab.path && tab.class === newTab.class)) {
updateTabs([...tabs, newTab]);
}
- if (titleName === "标题") {
- WsUtil.backToTitle();
- }
- else if (titleName === "文本框") {
- WsUtil.sendSyncCommand("games/新的游戏/game/scene/start.txt", 5, "choose:可选项:选择场景文件|不可选项:start.txt;", true);
- }
- else if (titleName === "选项") {
- WsUtil.sendSyncCommand("", 4, "2", true);
- }
updateCurrentTab(newTab);
+ tabsSyncAction(newTab.path, newTab.name);
};
return (
@@ -64,7 +56,7 @@ export default function ComponentNode({ componentNode }: { componentNode: ICompo
? `${styles.classNode} ${styles.classNodeActive}`
: styles.classNode
}
- onClick={() => handleClassNodeClick(classNode, componentNode.name, componentNode.path)}
+ onClick={() => handleClassNodeClick(classNode, componentNode.path)}
>
{classNode.name}
);
diff --git a/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx b/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx
index 20dbebb32..35412289f 100644
--- a/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx
+++ b/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx
@@ -15,58 +15,59 @@ export interface IClassNode {
class: string,
}
+export const ComponentTreeTextbox = {
+ name: t`文本框`,
+ path: `Stage/TextBox/textbox.scss`,
+ nodes: [
+ { name: t`文本框`, class: 'TextBox_main' },
+ { name: t`文本框(小头像关闭时)`, class: 'TextBox_main_miniavatarOff' },
+ { name: t`文本框背景`, class: 'TextBox_Background' },
+ { name: t`外层文本`, class: 'outer' },
+ { name: t`内层文本`, class: 'inner' },
+ { name: t`角色名文本框`, class: 'TextBox_showName' },
+ { name: t`角色名文本框背景`, class: 'TextBox_ShowName_Background' },
+ { name: t`小头像容器`, class: 'miniAvatarContainer' },
+ { name: t`小头像图像`, class: 'miniAvatarImg' },
+ { name: t`角色名容器`, class: 'nameContainer' },
+ { name: t`角色名外层文本`, class: 'outerName' },
+ { name: t`角色名内层文本`, class: 'innerName' },
+ { name: t`文本框文本`, class: 'text' },
+ ],
+};
+
+export const ComponentTreeChoose = {
+ name: t`选项`,
+ path: `Stage/Choose/choose.scss`,
+ nodes: [
+ {name: t`选项列表`, class: 'Choose_Main'},
+ {name: t`选项按钮`, class: 'Choose_item'},
+ {name: t`选项按钮(禁用)`, class: 'Choose_item_disabled'},
+ {name: t`选项按钮外层`, class: 'Choose_item_outer'},
+ ],
+};
+
+export const ComponentTreeTitle = {
+ name: t`标题`,
+ path: `UI/Title/title.scss`,
+ nodes: [
+ { name: t`标题`, class: 'Title_main' },
+ { name: t`标题按钮列表`, class: 'Title_buttonList' },
+ { name: t`标题按钮`, class: 'Title_button' },
+ { name: t`标题按钮文字`, class: 'Title_button_text' },
+ { name: t`标题备用背景`, class: 'Title_backup_background' },
+ ],
+};
+
export default function ComponentTree() {
/**
* Component Tree
* 不知道为啥,不写到这打包会有问题
*/
- const textbox = {
- name: t`文本框`,
- path: `Stage/TextBox/textbox.scss`,
- nodes: [
- { name: t`文本框`, class: 'TextBox_main' },
- { name: t`文本框(小头像关闭时)`, class: 'TextBox_main_miniavatarOff' },
- { name: t`文本框背景`, class: 'TextBox_Background' },
- { name: t`外层文本`, class: 'outer' },
- { name: t`内层文本`, class: 'inner' },
- { name: t`角色名文本框`, class: 'TextBox_showName' },
- { name: t`角色名文本框背景`, class: 'TextBox_ShowName_Background' },
- { name: t`小头像容器`, class: 'miniAvatarContainer' },
- { name: t`小头像图像`, class: 'miniAvatarImg' },
- { name: t`角色名容器`, class: 'nameContainer' },
- { name: t`角色名外层文本`, class: 'outerName' },
- { name: t`角色名内层文本`, class: 'innerName' },
- { name: t`文本框文本`, class: 'text' },
- ],
- };
-
- const choose = {
- name: t`选项`,
- path: `Stage/Choose/choose.scss`,
- nodes: [
- {name: t`选项列表`, class: 'Choose_Main'},
- {name: t`选项按钮`, class: 'Choose_item'},
- {name: t`选项按钮(禁用)`, class: 'Choose_item_disabled'},
- {name: t`选项按钮外层`, class: 'Choose_item_outer'},
- ],
- };
-
- const title = {
- name: t`标题`,
- path: `UI/Title/title.scss`,
- nodes: [
- { name: t`标题`, class: 'Title_main' },
- { name: t`标题按钮列表`, class: 'Title_buttonList' },
- { name: t`标题按钮`, class: 'Title_button' },
- { name: t`标题按钮文字`, class: 'Title_button_text' },
- { name: t`标题备用背景`, class: 'Title_backup_background' },
- ],
- };
const componentTree: IComponentNode[] = [
- title,
- textbox,
- choose
+ ComponentTreeTitle,
+ ComponentTreeTextbox,
+ ComponentTreeChoose
];
const templateName = useEditorStore.use.subPage();
diff --git a/packages/origine2/src/types/debugProtocol.ts b/packages/origine2/src/types/debugProtocol.ts
index 7fd96e120..e2881f7a2 100644
--- a/packages/origine2/src/types/debugProtocol.ts
+++ b/packages/origine2/src/types/debugProtocol.ts
@@ -13,6 +13,8 @@ export enum DebugCommand {
REFETCH_TEMPLATE_FILES,
// 返回主界面
BACK_TO_TITLE,
+ // 临时场景
+ TEMP_SCENE,
}
export interface IDebugMessage {
diff --git a/packages/origine2/src/utils/wsUtil.ts b/packages/origine2/src/utils/wsUtil.ts
index bd32ecee8..5ff604ca2 100644
--- a/packages/origine2/src/utils/wsUtil.ts
+++ b/packages/origine2/src/utils/wsUtil.ts
@@ -25,6 +25,27 @@ export class WsUtil {
}
}
+ public static createTempScene(command: string) {
+ // @ts-ignore
+ if (window["currentWs"]) { // @ts-ignore
+ logger.debug("编辑器开始发送同步数据");
+ const message: IDebugMessage = {
+ event: 'message', data: {
+ command: DebugCommand.TEMP_SCENE,
+ sceneMsg: {
+ scene: "",
+ sentence: 0
+ },// @ts-ignore
+ stageSyncMsg: {},
+ message: command,
+ }
+ };
+ // @ts-ignore
+
+ window["currentWs"].send(JSON.stringify(message));
+ }
+ }
+
// eslint-disable-next-line max-params
public static sendSyncCommand(scenePath: string, lineNumber: number, lineCommandString: string, force?: boolean) {
function extractPathAfterScene(scenePath: string): string {
From 515ed46219010aa0f5fc83d8371bd85def4d0088 Mon Sep 17 00:00:00 2001
From: Lingxi <2863878907@qq.com>
Date: Fri, 6 Dec 2024 22:16:57 +0800
Subject: [PATCH 03/15] feat: i18nfix and ws setComponentVisibility tool
---
packages/origine2/src/locales/en.po | 62 ++++---
packages/origine2/src/locales/ja.po | 62 ++++---
packages/origine2/src/locales/zhCn.po | 62 ++++---
.../pages/templateEditor/TemplateEditor.tsx | 29 +--
.../ComponentTree/ComponentNode.tsx | 2 +-
.../ComponentTree/ComponentTree.tsx | 97 +++++-----
packages/origine2/src/types/debugProtocol.ts | 2 +-
packages/origine2/src/utils/wsUtil.ts | 165 +++++++++---------
8 files changed, 270 insertions(+), 211 deletions(-)
diff --git a/packages/origine2/src/locales/en.po b/packages/origine2/src/locales/en.po
index b735281a5..69f6ec18a 100644
--- a/packages/origine2/src/locales/en.po
+++ b/packages/origine2/src/locales/en.po
@@ -201,6 +201,10 @@ msgstr "Rain"
msgid "下雪"
msgstr "Snow"
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:59
+msgid "不可选项"
+msgstr ""
+
#: src/pages/editor/GraphicalEditor/SentenceEditor/Say.tsx:130
msgid "不显示角色名"
msgstr "Hide the role name"
@@ -385,7 +389,7 @@ msgstr "Hide the figure"
msgid "关闭背景"
msgstr "Hide the background"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:31
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:42
msgid "内层文本"
msgstr "Inner Text"
@@ -543,6 +547,10 @@ msgstr "Cancel"
msgid "变换"
msgstr "Transform"
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:59
+msgid "可选项"
+msgstr ""
+
#: src/pages/editor/GraphicalEditor/SentenceEditor/ChangeFigure.tsx:52
msgid "右侧"
msgstr "Right"
@@ -623,7 +631,7 @@ msgstr "Scenes and branches"
msgid "场景文件"
msgstr "Scene file"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:30
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:41
msgid "外层文本"
msgstr "Outer Text"
@@ -687,6 +695,10 @@ msgstr "Width"
msgid "对话"
msgstr "Dialogue"
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:58
+msgid "对话框文字"
+msgstr ""
+
#: src/pages/editor/GraphicalEditor/SentenceEditor/GetUserInput.tsx:32
msgid "对话框标题"
msgstr "Dialog title"
@@ -717,11 +729,11 @@ msgstr "Apply the current template to selected games"
msgid "小"
msgstr "Small"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:35
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:46
msgid "小头像图像"
msgstr "Mini avatar image"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:34
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:45
msgid "小头像容器"
msgstr "Mini avatar container"
@@ -1002,20 +1014,20 @@ msgstr "Text alignment"
msgid "文本显示"
msgstr "Text display"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:24
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:27
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:34
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:37
msgid "文本框"
msgstr "Text Box"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:28
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:39
msgid "文本框(小头像关闭时)"
msgstr "Textbox (when avatar is closed)"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:39
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:50
msgid "文本框文本"
msgstr "Text Box Text"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:29
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:40
msgid "文本框背景"
msgstr "Text Box Background"
@@ -1163,24 +1175,24 @@ msgstr "Execute next sentence after this"
msgid "本句执行后等待"
msgstr "Wait after this sentence"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:55
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:58
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:20
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:23
msgid "标题"
msgstr "Title"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:62
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:27
msgid "标题备用背景"
msgstr "Title Alternate Background"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:60
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:25
msgid "标题按钮"
msgstr "Title Button"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:59
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:24
msgid "标题按钮列表"
msgstr "Title Button List"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:61
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:26
msgid "标题按钮文字"
msgstr "Title Button Text"
@@ -1589,23 +1601,23 @@ msgstr "Role name, leave blank to inherit from previous sentence"
msgid "角色名,留空以继承上句:对话;"
msgstr "Role name, leave blank to inherit from previous sentence: Dialogue;"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:38
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:49
msgid "角色名内层文本"
msgstr "Role Name Inner Text"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:37
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:48
msgid "角色名外层文本"
msgstr "Role Name Outer Text"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:36
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:47
msgid "角色名容器"
msgstr "Role Name Container"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:32
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:43
msgid "角色名文本框"
msgstr "Role Name Text Box"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:33
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:44
msgid "角色名文本框背景"
msgstr "Role Name Text Box Background"
@@ -1776,11 +1788,11 @@ msgid "选择预设目标"
msgstr "Choose Preset Target"
#: src/pages/editor/GraphicalEditor/SentenceEditor/Choose.tsx:59
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:44
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:65
msgid "选项"
msgstr "Option"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:47
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:68
msgid "选项列表"
msgstr "Selection List"
@@ -1788,15 +1800,15 @@ msgstr "Selection List"
msgid "选项名称"
msgstr "Option Name"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:48
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:69
msgid "选项按钮"
msgstr "Selection Button"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:49
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:70
msgid "选项按钮(禁用)"
msgstr "Selection Button (disabled)"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:50
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:71
msgid "选项按钮外层"
msgstr "Selection Button Wrapper"
diff --git a/packages/origine2/src/locales/ja.po b/packages/origine2/src/locales/ja.po
index 061ddb1d3..af6627849 100644
--- a/packages/origine2/src/locales/ja.po
+++ b/packages/origine2/src/locales/ja.po
@@ -201,6 +201,10 @@ msgstr "雨"
msgid "下雪"
msgstr "雪"
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:59
+msgid "不可选项"
+msgstr ""
+
#: src/pages/editor/GraphicalEditor/SentenceEditor/Say.tsx:130
msgid "不显示角色名"
msgstr "キャラクター名は設定不可"
@@ -385,7 +389,7 @@ msgstr "立ち絵を非表示"
msgid "关闭背景"
msgstr "背景画像を非表示"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:31
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:42
msgid "内层文本"
msgstr "内側テキスト"
@@ -543,6 +547,10 @@ msgstr "キャンセル"
msgid "变换"
msgstr "トランスフォーム"
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:59
+msgid "可选项"
+msgstr ""
+
#: src/pages/editor/GraphicalEditor/SentenceEditor/ChangeFigure.tsx:52
msgid "右侧"
msgstr "右"
@@ -623,7 +631,7 @@ msgstr "シーンとブランチ"
msgid "场景文件"
msgstr "シーンファイル"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:30
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:41
msgid "外层文本"
msgstr "外側テキスト"
@@ -687,6 +695,10 @@ msgstr "幅"
msgid "对话"
msgstr "ダイアログ"
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:58
+msgid "对话框文字"
+msgstr ""
+
#: src/pages/editor/GraphicalEditor/SentenceEditor/GetUserInput.tsx:32
msgid "对话框标题"
msgstr "ダイアログタイトル"
@@ -717,11 +729,11 @@ msgstr "選択したゲームに現在のテンプレートを適用する"
msgid "小"
msgstr "小さい"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:35
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:46
msgid "小头像图像"
msgstr "アバター画像"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:34
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:45
msgid "小头像容器"
msgstr "アバターコンテナ"
@@ -1002,20 +1014,20 @@ msgstr "テキストの配置"
msgid "文本显示"
msgstr "テキストボックス"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:24
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:27
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:34
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:37
msgid "文本框"
msgstr "テキストボックス"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:28
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:39
msgid "文本框(小头像关闭时)"
msgstr "テキストボックス(アバターが閉じている場合)"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:39
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:50
msgid "文本框文本"
msgstr "テキストボックスのテキスト"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:29
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:40
msgid "文本框背景"
msgstr "テキストボックスの背景"
@@ -1163,24 +1175,24 @@ msgstr "この文が実行された後、次の文を実行"
msgid "本句执行后等待"
msgstr "この文が実行されるのを待つ"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:55
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:58
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:20
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:23
msgid "标题"
msgstr "タイトル"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:62
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:27
msgid "标题备用背景"
msgstr "タイトル代替背景"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:60
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:25
msgid "标题按钮"
msgstr "タイトルボタン"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:59
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:24
msgid "标题按钮列表"
msgstr "タイトルボタンリスト"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:61
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:26
msgid "标题按钮文字"
msgstr "タイトルボタンテキスト"
@@ -1589,23 +1601,23 @@ msgstr "キャラクター名を空白のままにすると前の文から継承
msgid "角色名,留空以继承上句:对话;"
msgstr "キャラクター名を空白のままにすると前の文から継承;ダイアログ;"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:38
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:49
msgid "角色名内层文本"
msgstr "キャラクター名内側テキスト"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:37
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:48
msgid "角色名外层文本"
msgstr "キャラクター名外側テキスト"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:36
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:47
msgid "角色名容器"
msgstr "キャラクター名コンテナ"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:32
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:43
msgid "角色名文本框"
msgstr "キャラクター名テキストボックス"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:33
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:44
msgid "角色名文本框背景"
msgstr "キャラクター名テキストボックスの背景"
@@ -1776,11 +1788,11 @@ msgid "选择预设目标"
msgstr "事前設定されたターゲットを選択"
#: src/pages/editor/GraphicalEditor/SentenceEditor/Choose.tsx:59
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:44
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:65
msgid "选项"
msgstr "選択肢を設定"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:47
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:68
msgid "选项列表"
msgstr "選択肢リスト"
@@ -1788,15 +1800,15 @@ msgstr "選択肢リスト"
msgid "选项名称"
msgstr "選択肢を設定"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:48
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:69
msgid "选项按钮"
msgstr "選択肢ボタン"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:49
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:70
msgid "选项按钮(禁用)"
msgstr "選択肢ボタン(無効状態)"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:50
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:71
msgid "选项按钮外层"
msgstr "選択肢ボタン外層"
diff --git a/packages/origine2/src/locales/zhCn.po b/packages/origine2/src/locales/zhCn.po
index 88b657a8b..d7cf60ac7 100644
--- a/packages/origine2/src/locales/zhCn.po
+++ b/packages/origine2/src/locales/zhCn.po
@@ -217,6 +217,10 @@ msgstr "下雨"
msgid "下雪"
msgstr "下雪"
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:59
+msgid "不可选项"
+msgstr "不可选项"
+
#: src/pages/editor/GraphicalEditor/SentenceEditor/Say.tsx:130
msgid "不显示角色名"
msgstr "不显示角色名"
@@ -405,7 +409,7 @@ msgstr "关闭立绘"
msgid "关闭背景"
msgstr "关闭背景"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:31
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:42
msgid "内层文本"
msgstr "内层文本"
@@ -563,6 +567,10 @@ msgstr "取消"
msgid "变换"
msgstr "变换"
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:59
+msgid "可选项"
+msgstr "可选项"
+
#: src/pages/editor/GraphicalEditor/SentenceEditor/ChangeFigure.tsx:52
msgid "右侧"
msgstr "右侧"
@@ -643,7 +651,7 @@ msgstr "场景与分支"
msgid "场景文件"
msgstr "场景文件"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:30
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:41
msgid "外层文本"
msgstr "外层文本"
@@ -707,6 +715,10 @@ msgstr "宽度"
msgid "对话"
msgstr "对话"
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:58
+msgid "对话框文字"
+msgstr "对话框文字"
+
#: src/pages/editor/GraphicalEditor/SentenceEditor/GetUserInput.tsx:32
msgid "对话框标题"
msgstr "对话框标题"
@@ -737,11 +749,11 @@ msgstr "将当前模板应用到选定的游戏"
msgid "小"
msgstr "小"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:35
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:46
msgid "小头像图像"
msgstr "小头像图像"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:34
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:45
msgid "小头像容器"
msgstr "小头像容器"
@@ -1022,20 +1034,20 @@ msgstr "文本对齐"
msgid "文本显示"
msgstr "文本显示"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:24
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:27
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:34
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:37
msgid "文本框"
msgstr "文本框"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:28
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:39
msgid "文本框(小头像关闭时)"
msgstr "文本框(小头像关闭时)"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:39
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:50
msgid "文本框文本"
msgstr "文本框文本"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:29
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:40
msgid "文本框背景"
msgstr "文本框背景"
@@ -1183,24 +1195,24 @@ msgstr "本句执行后执行下一句"
msgid "本句执行后等待"
msgstr "本句执行后等待"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:55
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:58
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:20
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:23
msgid "标题"
msgstr "标题"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:62
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:27
msgid "标题备用背景"
msgstr "标题备用背景"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:60
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:25
msgid "标题按钮"
msgstr "标题按钮"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:59
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:24
msgid "标题按钮列表"
msgstr "标题按钮列表"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:61
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:26
msgid "标题按钮文字"
msgstr "标题按钮文字"
@@ -1609,23 +1621,23 @@ msgstr "角色名,留空以继承上句"
msgid "角色名,留空以继承上句:对话;"
msgstr "角色名,留空以继承上句:对话;"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:38
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:49
msgid "角色名内层文本"
msgstr "角色名内层文本"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:37
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:48
msgid "角色名外层文本"
msgstr "角色名外层文本"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:36
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:47
msgid "角色名容器"
msgstr "角色名容器"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:32
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:43
msgid "角色名文本框"
msgstr "角色名文本框"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:33
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:44
msgid "角色名文本框背景"
msgstr "角色名文本框背景"
@@ -1796,11 +1808,11 @@ msgid "选择预设目标"
msgstr "选择预设目标"
#: src/pages/editor/GraphicalEditor/SentenceEditor/Choose.tsx:59
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:44
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:65
msgid "选项"
msgstr "选项"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:47
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:68
msgid "选项列表"
msgstr "选项列表"
@@ -1808,15 +1820,15 @@ msgstr "选项列表"
msgid "选项名称"
msgstr "选项名称"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:48
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:69
msgid "选项按钮"
msgstr "选项按钮"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:49
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:70
msgid "选项按钮(禁用)"
msgstr "选项按钮(禁用)"
-#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:50
+#: src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx:71
msgid "选项按钮外层"
msgstr "选项按钮外层"
diff --git a/packages/origine2/src/pages/templateEditor/TemplateEditor.tsx b/packages/origine2/src/pages/templateEditor/TemplateEditor.tsx
index 28f007049..e6adc3ef5 100644
--- a/packages/origine2/src/pages/templateEditor/TemplateEditor.tsx
+++ b/packages/origine2/src/pages/templateEditor/TemplateEditor.tsx
@@ -4,7 +4,12 @@ import TemplateEditorMainAria from "./TemplateEditorMainAria/TemplateEditorMainA
import styles from "./templateEditor.module.scss";
import { useTemplateEditorContext } from "@/store/useTemplateEditorStore";
import { WsUtil } from "@/utils/wsUtil";
-import { ComponentTreeChoose, ComponentTreeTextbox, ComponentTreeTitle}
+import {
+ TemplateGraphicComponentTreeChoose,
+ TemplateGraphicComponentTreeTextbox,
+ TemplateGraphicComponentTreeTitle,
+ TemplateTempScene
+}
from "@/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree";
export default function TemplateEditor() {
@@ -17,17 +22,21 @@ export default function TemplateEditor() {
);
}
-export const tabsSyncAction = (nodePath: string, nodeName: string)=> {
- console.log(nodePath, nodeName);
- if (nodePath.includes(ComponentTreeTitle.path)) {
- WsUtil.backToTitle();
+export const tabsSyncAction = (nodePath: string, nodeClass: string)=> {
+ console.debug(nodePath, nodeClass);
+ if (nodePath.includes(TemplateGraphicComponentTreeTitle().path)) {
+ // set scene to title
+ WsUtil.setComponentVisibility([
+ { component: "showTitle", visibility: true },
+ { component: "showPanicOverlay", visibility: false },
+ ]);
}
- else if (nodePath.includes(ComponentTreeTextbox.path)) {
- const miniAvatar = !nodeName.includes("小头像关闭时") ? "stand.png" : "";
- WsUtil.createTempScene(`changeBg:bg.png -next;\nminiAvatar:${miniAvatar} -next;\nWebGal:这里对话框文字 -fontSize=default;`);
+ else if (nodePath.includes(TemplateGraphicComponentTreeTextbox().path)) {
+ const miniAvatar = !nodeClass.toLowerCase().includes("miniavataroff") ? "stand.png" : "";
+ WsUtil.createTempScene(`changeBg:bg.png -next;\nminiAvatar:${miniAvatar} -next;\n${TemplateTempScene().textbox}`);
}
- else if (nodePath.includes(ComponentTreeChoose.path)) {
- WsUtil.createTempScene("changeBg:bg.png -next;\nchoose:可选项:|不可选项:;");
+ else if (nodePath.includes(TemplateGraphicComponentTreeChoose().path)) {
+ WsUtil.createTempScene(`changeBg:bg.png -next;${TemplateTempScene().choose}`);
}
};
diff --git a/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx b/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx
index 67616ae21..ec1c94710 100644
--- a/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx
+++ b/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx
@@ -35,7 +35,7 @@ export default function ComponentNode({ componentNode }: { componentNode: ICompo
updateTabs([...tabs, newTab]);
}
updateCurrentTab(newTab);
- tabsSyncAction(newTab.path, newTab.name);
+ tabsSyncAction(newTab.path, classNode.class);
};
return (
diff --git a/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx b/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx
index 35412289f..ee67685c0 100644
--- a/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx
+++ b/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx
@@ -15,59 +15,74 @@ export interface IClassNode {
class: string,
}
-export const ComponentTreeTextbox = {
- name: t`文本框`,
- path: `Stage/TextBox/textbox.scss`,
- nodes: [
- { name: t`文本框`, class: 'TextBox_main' },
- { name: t`文本框(小头像关闭时)`, class: 'TextBox_main_miniavatarOff' },
- { name: t`文本框背景`, class: 'TextBox_Background' },
- { name: t`外层文本`, class: 'outer' },
- { name: t`内层文本`, class: 'inner' },
- { name: t`角色名文本框`, class: 'TextBox_showName' },
- { name: t`角色名文本框背景`, class: 'TextBox_ShowName_Background' },
- { name: t`小头像容器`, class: 'miniAvatarContainer' },
- { name: t`小头像图像`, class: 'miniAvatarImg' },
- { name: t`角色名容器`, class: 'nameContainer' },
- { name: t`角色名外层文本`, class: 'outerName' },
- { name: t`角色名内层文本`, class: 'innerName' },
- { name: t`文本框文本`, class: 'text' },
- ],
+export const TemplateGraphicComponentTreeTitle = () => {
+ return {
+ name: t`标题`,
+ path: `UI/Title/title.scss`,
+ nodes: [
+ { name: t`标题`, class: 'Title_main' },
+ { name: t`标题按钮列表`, class: 'Title_buttonList' },
+ { name: t`标题按钮`, class: 'Title_button' },
+ { name: t`标题按钮文字`, class: 'Title_button_text' },
+ { name: t`标题备用背景`, class: 'Title_backup_background' },
+ ],
+ };
};
-export const ComponentTreeChoose = {
- name: t`选项`,
- path: `Stage/Choose/choose.scss`,
- nodes: [
- {name: t`选项列表`, class: 'Choose_Main'},
- {name: t`选项按钮`, class: 'Choose_item'},
- {name: t`选项按钮(禁用)`, class: 'Choose_item_disabled'},
- {name: t`选项按钮外层`, class: 'Choose_item_outer'},
- ],
+export const TemplateGraphicComponentTreeTextbox = () => {
+ return {
+ name: t`文本框`,
+ path: `Stage/TextBox/textbox.scss`,
+ nodes: [
+ { name: t`文本框`, class: 'TextBox_main' },
+ // string 'miniavatarOff' is used by tabsSyncAction function in TemplateEditor.tsx
+ { name: t`文本框(小头像关闭时)`, class: 'TextBox_main_miniavatarOff' },
+ { name: t`文本框背景`, class: 'TextBox_Background' },
+ { name: t`外层文本`, class: 'outer' },
+ { name: t`内层文本`, class: 'inner' },
+ { name: t`角色名文本框`, class: 'TextBox_showName' },
+ { name: t`角色名文本框背景`, class: 'TextBox_ShowName_Background' },
+ { name: t`小头像容器`, class: 'miniAvatarContainer' },
+ { name: t`小头像图像`, class: 'miniAvatarImg' },
+ { name: t`角色名容器`, class: 'nameContainer' },
+ { name: t`角色名外层文本`, class: 'outerName' },
+ { name: t`角色名内层文本`, class: 'innerName' },
+ { name: t`文本框文本`, class: 'text' },
+ ],
+ };
};
-export const ComponentTreeTitle = {
- name: t`标题`,
- path: `UI/Title/title.scss`,
- nodes: [
- { name: t`标题`, class: 'Title_main' },
- { name: t`标题按钮列表`, class: 'Title_buttonList' },
- { name: t`标题按钮`, class: 'Title_button' },
- { name: t`标题按钮文字`, class: 'Title_button_text' },
- { name: t`标题备用背景`, class: 'Title_backup_background' },
- ],
+export const TemplateTempScene = () => {
+ // useLingui(); 不清楚是否需要加这个
+ return {
+ textbox: `WebGal:${t`对话框文字`} -fontSize=default;`,
+ choose: `choose:${t`可选项`}:|${t`不可选项`}:;`
+ };
+};
+
+export const TemplateGraphicComponentTreeChoose = () => {
+ return {
+ name: t`选项`,
+ path: `Stage/Choose/choose.scss`,
+ nodes: [
+ {name: t`选项列表`, class: 'Choose_Main'},
+ {name: t`选项按钮`, class: 'Choose_item'},
+ {name: t`选项按钮(禁用)`, class: 'Choose_item_disabled'},
+ {name: t`选项按钮外层`, class: 'Choose_item_outer'},
+ ],
+ };
};
export default function ComponentTree() {
/**
* Component Tree
- * 不知道为啥,不写到这打包会有问题
+ * 通过函数形式延迟加载字符,以便适应useLingui();
*/
const componentTree: IComponentNode[] = [
- ComponentTreeTitle,
- ComponentTreeTextbox,
- ComponentTreeChoose
+ TemplateGraphicComponentTreeTitle(),
+ TemplateGraphicComponentTreeTextbox(),
+ TemplateGraphicComponentTreeChoose(),
];
const templateName = useEditorStore.use.subPage();
diff --git a/packages/origine2/src/types/debugProtocol.ts b/packages/origine2/src/types/debugProtocol.ts
index e2881f7a2..ff9932637 100644
--- a/packages/origine2/src/types/debugProtocol.ts
+++ b/packages/origine2/src/types/debugProtocol.ts
@@ -12,7 +12,7 @@ export enum DebugCommand {
// 重新拉取模板样式文件
REFETCH_TEMPLATE_FILES,
// 返回主界面
- BACK_TO_TITLE,
+ SET_COMPONENT_VISIBILITY,
// 临时场景
TEMP_SCENE,
}
diff --git a/packages/origine2/src/utils/wsUtil.ts b/packages/origine2/src/utils/wsUtil.ts
index 5ff604ca2..2a2b3b008 100644
--- a/packages/origine2/src/utils/wsUtil.ts
+++ b/packages/origine2/src/utils/wsUtil.ts
@@ -1,49 +1,71 @@
import {logger} from "./logger";
import {DebugCommand, IDebugMessage} from "@/types/debugProtocol";
import useEditorStore from "@/store/useEditorStore";
+import {isArray} from "lodash";
+
+export interface componentsVisibility {
+ showStarter: boolean; // 是否显示初始界面(用于使得bgm可以播放)
+ showTitle: boolean; // 是否显示标题界面
+ showMenuPanel: boolean; // 是否显示Menu界面
+ showTextBox: boolean;
+ showControls: boolean;
+ controlsVisibility: boolean;
+ showBacklog: boolean;
+ showExtra: boolean;
+ showGlobalDialog: boolean;
+ showPanicOverlay: boolean;
+ isEnterGame: boolean;
+ isShowLogo: boolean;
+}
+
+interface componentVisibilityCommandInterface {
+ component: keyof componentsVisibility;
+ visibility: boolean;
+}
export class WsUtil {
- public static backToTitle(){
+ public static sentMessageToCurrentWs(data: IDebugMessage['data'], event?: IDebugMessage['event'] | undefined){
// @ts-ignore
- if (window["currentWs"]) { // @ts-ignore
+ if (window["currentWs"]) {
logger.debug("编辑器开始发送同步数据");
- const message: IDebugMessage = {
- event: 'message', data: {
- command: DebugCommand.BACK_TO_TITLE,
- sceneMsg: {
- scene: "",
- sentence: 0
- },// @ts-ignore
- stageSyncMsg: {},
- message: useEditorStore.getState().isUseExpFastSync? 'exp':'Sync',
- }
+ const sendMessage: IDebugMessage = {
+ event: (event === undefined) ? "message" : event,
+ data: data
};
// @ts-ignore
-
- window["currentWs"].send(JSON.stringify(message));
+ window["currentWs"].send(JSON.stringify(sendMessage));
}
}
- public static createTempScene(command: string) {
- // @ts-ignore
- if (window["currentWs"]) { // @ts-ignore
- logger.debug("编辑器开始发送同步数据");
- const message: IDebugMessage = {
- event: 'message', data: {
- command: DebugCommand.TEMP_SCENE,
- sceneMsg: {
- scene: "",
- sentence: 0
- },// @ts-ignore
- stageSyncMsg: {},
- message: command,
- }
- };
- // @ts-ignore
+ public static setComponentVisibility(message: componentVisibilityCommandInterface | componentVisibilityCommandInterface[]) {
+ const compose = (message: componentVisibilityCommandInterface[]) => {
+ return message.map((item) => {
+ return `${item.component}:${item.visibility}`;
+ }).join('\n');
+ };
+ const sendMessage = !isArray(message) ? `${message.component}:${message.visibility}` : compose(message);
+ this.sentMessageToCurrentWs({
+ command: DebugCommand.SET_COMPONENT_VISIBILITY,
+ sceneMsg: {
+ scene: "",
+ sentence: 0
+ },// @ts-ignore
+ stageSyncMsg: {},
+ message: sendMessage,
+ });
+ }
- window["currentWs"].send(JSON.stringify(message));
- }
+ public static createTempScene(command: string) {
+ this.sentMessageToCurrentWs({
+ command: DebugCommand.TEMP_SCENE,
+ sceneMsg: {
+ scene: "",
+ sentence: 0
+ },// @ts-ignore
+ stageSyncMsg: {},
+ message: command,
+ });
}
// eslint-disable-next-line max-params
@@ -71,64 +93,41 @@ export class WsUtil {
}
// @ts-ignore
- if (window["currentWs"] && this.getIsCurrentLineJump(lineCommandString)) { // @ts-ignore
- logger.debug("编辑器开始发送同步数据");
- const message: IDebugMessage = {
- event: 'message', data: {
- command: DebugCommand.JUMP,
- sceneMsg: {
- scene: sceneName,
- sentence: lineNumber
- },// @ts-ignore
- stageSyncMsg: {},
- message: useEditorStore.getState().isUseExpFastSync? 'exp':'Sync',
- }
- };
- console.log(scenePath, lineNumber, lineCommandString);
- // @ts-ignore
- window["currentWs"].send(JSON.stringify(message));
+ if (this.getIsCurrentLineJump(lineCommandString)) {
+ this.sentMessageToCurrentWs({
+ command: DebugCommand.JUMP,
+ sceneMsg: {
+ scene: sceneName,
+ sentence: lineNumber
+ },// @ts-ignore
+ stageSyncMsg: {},
+ message: useEditorStore.getState().isUseExpFastSync? 'exp':'Sync',
+ });
}
}
public static sendExeCommand(command: string) {
-
- // @ts-ignore
- if (window["currentWs"]) { // @ts-ignore
- logger.debug("编辑器开始发送同步数据");
- const message: IDebugMessage = {
- event: 'message', data: {
- command: DebugCommand.EXE_COMMAND,
- sceneMsg: {
- scene: 'temp',
- sentence: 0
- },// @ts-ignore
- stageSyncMsg: {},
- message: command
- }
- };
- // @ts-ignore
- window["currentWs"].send(JSON.stringify(message));
- }
+ this.sentMessageToCurrentWs({
+ command: DebugCommand.EXE_COMMAND,
+ sceneMsg: {
+ scene: 'temp',
+ sentence: 0
+ },// @ts-ignore
+ stageSyncMsg: {},
+ message: command
+ });
}
public static sendTemplateRefetchCommand(){
- // @ts-ignore
- if (window["currentWs"]) { // @ts-ignore
- logger.debug("编辑器开始发送同步数据");
- const message: IDebugMessage = {
- event: 'message', data: {
- command: DebugCommand.REFETCH_TEMPLATE_FILES,
- sceneMsg: {
- scene: 'temp',
- sentence: 0
- },// @ts-ignore
- stageSyncMsg: {},
- message: ''
- }
- };
- // @ts-ignore
- window["currentWs"].send(JSON.stringify(message));
- }
+ this.sentMessageToCurrentWs({
+ command: DebugCommand.REFETCH_TEMPLATE_FILES,
+ sceneMsg: {
+ scene: 'temp',
+ sentence: 0
+ },// @ts-ignore
+ stageSyncMsg: {},
+ message: ''
+ });
};
private static getIsCurrentLineJump(currentLineValue: string | null): boolean {
From 650cf9476b47c713f5a0c85355216f31933c2a54 Mon Sep 17 00:00:00 2001
From: Lingxi <2863878907@qq.com>
Date: Tue, 26 Nov 2024 22:10:09 +0800
Subject: [PATCH 04/15] =?UTF-8?q?"=E6=A0=87=E9=A2=98"=EF=BC=8C=20"?=
=?UTF-8?q?=E6=96=87=E6=9C=AC=E6=A1=86"=EF=BC=8C=20"=E9=80=89=E9=A1=B9"=20?=
=?UTF-8?q?backToTitle=EF=BC=8C=20sendSyncCommand=EF=BC=8C=20sendSyncComma?=
=?UTF-8?q?nd?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../TemplateEditorSidebar/ComponentTree/ComponentNode.tsx | 4 ++--
packages/origine2/src/types/debugProtocol.ts | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx b/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx
index ec1c94710..8e6106edd 100644
--- a/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx
+++ b/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx
@@ -25,7 +25,7 @@ export default function ComponentNode({ componentNode }: { componentNode: ICompo
expand
? updateExpandNode(expandNode.filter(path => path !== getFileName(componentNode.path)))
: updateExpandNode([...expandNode, getFileName(componentNode.path)]);
- const handleClassNodeClick = (classNode: IClassNode, path: string) => {
+ const handleClassNodeClick = (classNode: IClassNode, titleName: string, path: string) => {
const newTab: ITab = {
name: classNode.name,
path: path,
@@ -56,7 +56,7 @@ export default function ComponentNode({ componentNode }: { componentNode: ICompo
? `${styles.classNode} ${styles.classNodeActive}`
: styles.classNode
}
- onClick={() => handleClassNodeClick(classNode, componentNode.path)}
+ onClick={() => handleClassNodeClick(classNode, componentNode.name, componentNode.path)}
>
{classNode.name}
);
diff --git a/packages/origine2/src/types/debugProtocol.ts b/packages/origine2/src/types/debugProtocol.ts
index ff9932637..fbf050d54 100644
--- a/packages/origine2/src/types/debugProtocol.ts
+++ b/packages/origine2/src/types/debugProtocol.ts
@@ -11,7 +11,7 @@ export enum DebugCommand {
EXE_COMMAND,
// 重新拉取模板样式文件
REFETCH_TEMPLATE_FILES,
- // 返回主界面
+ // 设置指定控件是否可见
SET_COMPONENT_VISIBILITY,
// 临时场景
TEMP_SCENE,
From 488ce4e5248efff34a21fb6b1081864361e217aa Mon Sep 17 00:00:00 2001
From: Lingxi <2863878907@qq.com>
Date: Thu, 28 Nov 2024 21:20:15 +0800
Subject: [PATCH 05/15] feat: Template Editor Tabs Sync Action
---
.../TemplateEditorSidebar/ComponentTree/ComponentNode.tsx | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx b/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx
index 8e6106edd..67616ae21 100644
--- a/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx
+++ b/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx
@@ -25,7 +25,7 @@ export default function ComponentNode({ componentNode }: { componentNode: ICompo
expand
? updateExpandNode(expandNode.filter(path => path !== getFileName(componentNode.path)))
: updateExpandNode([...expandNode, getFileName(componentNode.path)]);
- const handleClassNodeClick = (classNode: IClassNode, titleName: string, path: string) => {
+ const handleClassNodeClick = (classNode: IClassNode, path: string) => {
const newTab: ITab = {
name: classNode.name,
path: path,
@@ -35,7 +35,7 @@ export default function ComponentNode({ componentNode }: { componentNode: ICompo
updateTabs([...tabs, newTab]);
}
updateCurrentTab(newTab);
- tabsSyncAction(newTab.path, classNode.class);
+ tabsSyncAction(newTab.path, newTab.name);
};
return (
@@ -56,7 +56,7 @@ export default function ComponentNode({ componentNode }: { componentNode: ICompo
? `${styles.classNode} ${styles.classNodeActive}`
: styles.classNode
}
- onClick={() => handleClassNodeClick(classNode, componentNode.name, componentNode.path)}
+ onClick={() => handleClassNodeClick(classNode, componentNode.path)}
>
{classNode.name}
);
From 8667c6c13f613a07661d8132e24adb609cc3dcf6 Mon Sep 17 00:00:00 2001
From: Lingxi <2863878907@qq.com>
Date: Fri, 6 Dec 2024 22:16:57 +0800
Subject: [PATCH 06/15] feat: i18nfix and ws setComponentVisibility tool
---
.../TemplateEditorSidebar/ComponentTree/ComponentNode.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx b/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx
index 67616ae21..ec1c94710 100644
--- a/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx
+++ b/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx
@@ -35,7 +35,7 @@ export default function ComponentNode({ componentNode }: { componentNode: ICompo
updateTabs([...tabs, newTab]);
}
updateCurrentTab(newTab);
- tabsSyncAction(newTab.path, newTab.name);
+ tabsSyncAction(newTab.path, classNode.class);
};
return (
From 6d1ce748314ca9516876c37f29c1532888812bab Mon Sep 17 00:00:00 2001
From: Mahiru
Date: Tue, 10 Dec 2024 21:13:03 +0800
Subject: [PATCH 07/15] fix typo and null handle
---
packages/origine2/src/utils/wsUtil.ts | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/packages/origine2/src/utils/wsUtil.ts b/packages/origine2/src/utils/wsUtil.ts
index 2a2b3b008..97a062a1e 100644
--- a/packages/origine2/src/utils/wsUtil.ts
+++ b/packages/origine2/src/utils/wsUtil.ts
@@ -25,12 +25,12 @@ interface componentVisibilityCommandInterface {
export class WsUtil {
- public static sentMessageToCurrentWs(data: IDebugMessage['data'], event?: IDebugMessage['event'] | undefined){
+ public static sendMessageToCurrentWs(data: IDebugMessage['data'], event?: IDebugMessage['event']){
// @ts-ignore
if (window["currentWs"]) {
logger.debug("编辑器开始发送同步数据");
const sendMessage: IDebugMessage = {
- event: (event === undefined) ? "message" : event,
+ event: event ?? "message",
data: data
};
// @ts-ignore
@@ -45,7 +45,7 @@ export class WsUtil {
}).join('\n');
};
const sendMessage = !isArray(message) ? `${message.component}:${message.visibility}` : compose(message);
- this.sentMessageToCurrentWs({
+ this.sendMessageToCurrentWs({
command: DebugCommand.SET_COMPONENT_VISIBILITY,
sceneMsg: {
scene: "",
@@ -57,7 +57,7 @@ export class WsUtil {
}
public static createTempScene(command: string) {
- this.sentMessageToCurrentWs({
+ this.sendMessageToCurrentWs({
command: DebugCommand.TEMP_SCENE,
sceneMsg: {
scene: "",
@@ -94,7 +94,7 @@ export class WsUtil {
// @ts-ignore
if (this.getIsCurrentLineJump(lineCommandString)) {
- this.sentMessageToCurrentWs({
+ this.sendMessageToCurrentWs({
command: DebugCommand.JUMP,
sceneMsg: {
scene: sceneName,
@@ -107,7 +107,7 @@ export class WsUtil {
}
public static sendExeCommand(command: string) {
- this.sentMessageToCurrentWs({
+ this.sendMessageToCurrentWs({
command: DebugCommand.EXE_COMMAND,
sceneMsg: {
scene: 'temp',
@@ -119,7 +119,7 @@ export class WsUtil {
}
public static sendTemplateRefetchCommand(){
- this.sentMessageToCurrentWs({
+ this.sendMessageToCurrentWs({
command: DebugCommand.REFETCH_TEMPLATE_FILES,
sceneMsg: {
scene: 'temp',
From 1d0e8a1c27f3cf400722bf200edb3167d3ca3ff7 Mon Sep 17 00:00:00 2001
From: Mahiru
Date: Sat, 14 Dec 2024 11:13:23 +0800
Subject: [PATCH 08/15] fix: refactor message send
---
.../pages/templateEditor/TemplateEditor.tsx | 24 +++++++++----------
.../TemplateEditorMainAria/TabsManager.tsx | 4 ++--
.../ComponentTree/ComponentNode.tsx | 4 ++--
.../ComponentTree/ComponentTree.tsx | 19 ++++++++-------
packages/origine2/src/utils/wsUtil.ts | 15 ++++--------
5 files changed, 31 insertions(+), 35 deletions(-)
diff --git a/packages/origine2/src/pages/templateEditor/TemplateEditor.tsx b/packages/origine2/src/pages/templateEditor/TemplateEditor.tsx
index e6adc3ef5..8d1543973 100644
--- a/packages/origine2/src/pages/templateEditor/TemplateEditor.tsx
+++ b/packages/origine2/src/pages/templateEditor/TemplateEditor.tsx
@@ -5,10 +5,10 @@ import styles from "./templateEditor.module.scss";
import { useTemplateEditorContext } from "@/store/useTemplateEditorStore";
import { WsUtil } from "@/utils/wsUtil";
import {
- TemplateGraphicComponentTreeChoose,
- TemplateGraphicComponentTreeTextbox,
- TemplateGraphicComponentTreeTitle,
- TemplateTempScene
+ useComponentTreeChoose,
+ useComponentTreeTextbox,
+ useComponentTreeTitle,
+ useTemplateTempScene
}
from "@/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree";
@@ -22,21 +22,21 @@ export default function TemplateEditor() {
);
}
-export const tabsSyncAction = (nodePath: string, nodeClass: string)=> {
- console.debug(nodePath, nodeClass);
- if (nodePath.includes(TemplateGraphicComponentTreeTitle().path)) {
+export const sendComponentPreviewMessage = (componentPath: string, componentClass: string)=> {
+ console.debug(componentPath, componentClass);
+ if (componentPath.includes(useComponentTreeTitle().path)) {
// set scene to title
WsUtil.setComponentVisibility([
{ component: "showTitle", visibility: true },
{ component: "showPanicOverlay", visibility: false },
]);
}
- else if (nodePath.includes(TemplateGraphicComponentTreeTextbox().path)) {
- const miniAvatar = !nodeClass.toLowerCase().includes("miniavataroff") ? "stand.png" : "";
- WsUtil.createTempScene(`changeBg:bg.png -next;\nminiAvatar:${miniAvatar} -next;\n${TemplateTempScene().textbox}`);
+ else if (componentPath.includes(useComponentTreeTextbox().path)) {
+ const miniAvatar = !componentClass.toLowerCase().includes("miniavataroff") ? "stand.png" : "";
+ WsUtil.createTempScene(`changeBg:bg.png -next;\nminiAvatar:${miniAvatar} -next;\n${useTemplateTempScene().textbox}`);
}
- else if (nodePath.includes(TemplateGraphicComponentTreeChoose().path)) {
- WsUtil.createTempScene(`changeBg:bg.png -next;${TemplateTempScene().choose}`);
+ else if (componentPath.includes(useComponentTreeChoose().path)) {
+ WsUtil.createTempScene(`changeBg:bg.png -next;${useTemplateTempScene().choose}`);
}
};
diff --git a/packages/origine2/src/pages/templateEditor/TemplateEditorMainAria/TabsManager.tsx b/packages/origine2/src/pages/templateEditor/TemplateEditorMainAria/TabsManager.tsx
index ce52d955b..3d6eb87f7 100644
--- a/packages/origine2/src/pages/templateEditor/TemplateEditorMainAria/TabsManager.tsx
+++ b/packages/origine2/src/pages/templateEditor/TemplateEditorMainAria/TabsManager.tsx
@@ -7,7 +7,7 @@ import { useTemplateEditorContext } from '@/store/useTemplateEditorStore';
import { ITab } from '@/types/templateEditor';
import { cloneDeep } from 'lodash';
import IconWrapper from '@/components/iconWrapper/IconWrapper';
-import {tabsSyncAction} from "@/pages/templateEditor/TemplateEditor";
+import {sendComponentPreviewMessage} from "@/pages/templateEditor/TemplateEditor";
export default function TabsManager() {
@@ -37,7 +37,7 @@ export default function TabsManager() {
}
function selectTab(tab: ITab) {
- tabsSyncAction(tab.path, tab.name);
+ sendComponentPreviewMessage(tab.path, tab.name);
updateCurrentTab(tab);
}
diff --git a/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx b/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx
index ec1c94710..5ed3d000d 100644
--- a/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx
+++ b/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentNode.tsx
@@ -3,7 +3,7 @@ import styles from './componentNode.module.scss';
import { ChevronDownFilled, ChevronDownRegular, ChevronUpFilled, ChevronUpRegular, bundleIcon } from "@fluentui/react-icons";
import { useTemplateEditorContext } from "@/store/useTemplateEditorStore";
import { ITab } from "@/types/templateEditor";
-import {tabsSyncAction} from "@/pages/templateEditor/TemplateEditor";
+import {sendComponentPreviewMessage} from "@/pages/templateEditor/TemplateEditor";
const ChevronDownIcon = bundleIcon(ChevronDownFilled, ChevronDownRegular);
const ChevronUpIcon = bundleIcon(ChevronUpFilled, ChevronUpRegular);
@@ -35,7 +35,7 @@ export default function ComponentNode({ componentNode }: { componentNode: ICompo
updateTabs([...tabs, newTab]);
}
updateCurrentTab(newTab);
- tabsSyncAction(newTab.path, classNode.class);
+ sendComponentPreviewMessage(newTab.path, classNode.class);
};
return (
diff --git a/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx b/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx
index ee67685c0..423816d0b 100644
--- a/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx
+++ b/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx
@@ -15,7 +15,7 @@ export interface IClassNode {
class: string,
}
-export const TemplateGraphicComponentTreeTitle = () => {
+export const useComponentTreeTitle = () => {
return {
name: t`标题`,
path: `UI/Title/title.scss`,
@@ -29,7 +29,7 @@ export const TemplateGraphicComponentTreeTitle = () => {
};
};
-export const TemplateGraphicComponentTreeTextbox = () => {
+export const useComponentTreeTextbox = () => {
return {
name: t`文本框`,
path: `Stage/TextBox/textbox.scss`,
@@ -52,15 +52,14 @@ export const TemplateGraphicComponentTreeTextbox = () => {
};
};
-export const TemplateTempScene = () => {
- // useLingui(); 不清楚是否需要加这个
+export const useTemplateTempScene = () => {
return {
textbox: `WebGal:${t`对话框文字`} -fontSize=default;`,
choose: `choose:${t`可选项`}:|${t`不可选项`}:;`
};
};
-export const TemplateGraphicComponentTreeChoose = () => {
+export const useComponentTreeChoose = () => {
return {
name: t`选项`,
path: `Stage/Choose/choose.scss`,
@@ -74,21 +73,23 @@ export const TemplateGraphicComponentTreeChoose = () => {
};
export default function ComponentTree() {
+
+ useLingui();
+
/**
* Component Tree
* 通过函数形式延迟加载字符,以便适应useLingui();
*/
const componentTree: IComponentNode[] = [
- TemplateGraphicComponentTreeTitle(),
- TemplateGraphicComponentTreeTextbox(),
- TemplateGraphicComponentTreeChoose(),
+ useComponentTreeTitle(),
+ useComponentTreeTextbox(),
+ useComponentTreeChoose(),
];
const templateName = useEditorStore.use.subPage();
const basePath = `templates/${templateName}`;
const tree = componentTree.map(e => ({...e, path: `${basePath}/${e.path}`}));
- useLingui();
return (
diff --git a/packages/origine2/src/utils/wsUtil.ts b/packages/origine2/src/utils/wsUtil.ts
index 97a062a1e..deffdf00a 100644
--- a/packages/origine2/src/utils/wsUtil.ts
+++ b/packages/origine2/src/utils/wsUtil.ts
@@ -3,7 +3,7 @@ import {DebugCommand, IDebugMessage} from "@/types/debugProtocol";
import useEditorStore from "@/store/useEditorStore";
import {isArray} from "lodash";
-export interface componentsVisibility {
+export interface IComponentsVisibility {
showStarter: boolean; // 是否显示初始界面(用于使得bgm可以播放)
showTitle: boolean; // 是否显示标题界面
showMenuPanel: boolean; // 是否显示Menu界面
@@ -18,8 +18,8 @@ export interface componentsVisibility {
isShowLogo: boolean;
}
-interface componentVisibilityCommandInterface {
- component: keyof componentsVisibility;
+interface IComponentVisibilityCommand {
+ component: keyof IComponentsVisibility;
visibility: boolean;
}
@@ -38,13 +38,8 @@ export class WsUtil {
}
}
- public static setComponentVisibility(message: componentVisibilityCommandInterface | componentVisibilityCommandInterface[]) {
- const compose = (message: componentVisibilityCommandInterface[]) => {
- return message.map((item) => {
- return `${item.component}:${item.visibility}`;
- }).join('\n');
- };
- const sendMessage = !isArray(message) ? `${message.component}:${message.visibility}` : compose(message);
+ public static setComponentVisibility(message: IComponentVisibilityCommand[]) {
+ const sendMessage = JSON.stringify(message);
this.sendMessageToCurrentWs({
command: DebugCommand.SET_COMPONENT_VISIBILITY,
sceneMsg: {
From bd3696f75752c6517493a2db0f5bc4b6f9b9a9a2 Mon Sep 17 00:00:00 2001
From: Mahiru
Date: Sat, 14 Dec 2024 11:16:32 +0800
Subject: [PATCH 09/15] fix: move some types to debug protocol
---
packages/origine2/src/types/debugProtocol.ts | 20 +++++++++++++++++
packages/origine2/src/utils/wsUtil.ts | 23 +-------------------
2 files changed, 21 insertions(+), 22 deletions(-)
diff --git a/packages/origine2/src/types/debugProtocol.ts b/packages/origine2/src/types/debugProtocol.ts
index fbf050d54..b0a7951aa 100644
--- a/packages/origine2/src/types/debugProtocol.ts
+++ b/packages/origine2/src/types/debugProtocol.ts
@@ -29,3 +29,23 @@ export interface IDebugMessage {
stageSyncMsg: IStageState;
};
}
+
+export interface IComponentsVisibility {
+ showStarter: boolean; // 是否显示初始界面(用于使得bgm可以播放)
+ showTitle: boolean; // 是否显示标题界面
+ showMenuPanel: boolean; // 是否显示Menu界面
+ showTextBox: boolean;
+ showControls: boolean;
+ controlsVisibility: boolean;
+ showBacklog: boolean;
+ showExtra: boolean;
+ showGlobalDialog: boolean;
+ showPanicOverlay: boolean;
+ isEnterGame: boolean;
+ isShowLogo: boolean;
+}
+
+export interface IComponentVisibilityCommand {
+ component: keyof IComponentsVisibility;
+ visibility: boolean;
+}
diff --git a/packages/origine2/src/utils/wsUtil.ts b/packages/origine2/src/utils/wsUtil.ts
index deffdf00a..088feaf57 100644
--- a/packages/origine2/src/utils/wsUtil.ts
+++ b/packages/origine2/src/utils/wsUtil.ts
@@ -1,27 +1,6 @@
import {logger} from "./logger";
-import {DebugCommand, IDebugMessage} from "@/types/debugProtocol";
+import {DebugCommand, IComponentVisibilityCommand, IDebugMessage} from "@/types/debugProtocol";
import useEditorStore from "@/store/useEditorStore";
-import {isArray} from "lodash";
-
-export interface IComponentsVisibility {
- showStarter: boolean; // 是否显示初始界面(用于使得bgm可以播放)
- showTitle: boolean; // 是否显示标题界面
- showMenuPanel: boolean; // 是否显示Menu界面
- showTextBox: boolean;
- showControls: boolean;
- controlsVisibility: boolean;
- showBacklog: boolean;
- showExtra: boolean;
- showGlobalDialog: boolean;
- showPanicOverlay: boolean;
- isEnterGame: boolean;
- isShowLogo: boolean;
-}
-
-interface IComponentVisibilityCommand {
- component: keyof IComponentsVisibility;
- visibility: boolean;
-}
export class WsUtil {
From 0d211366c8902ce90d905ddaa959195795da3edc Mon Sep 17 00:00:00 2001
From: Mahiru
Date: Sat, 14 Dec 2024 11:38:11 +0800
Subject: [PATCH 10/15] rename function
---
packages/origine2/src/utils/wsUtil.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/origine2/src/utils/wsUtil.ts b/packages/origine2/src/utils/wsUtil.ts
index 088feaf57..25c675249 100644
--- a/packages/origine2/src/utils/wsUtil.ts
+++ b/packages/origine2/src/utils/wsUtil.ts
@@ -30,7 +30,7 @@ export class WsUtil {
});
}
- public static createTempScene(command: string) {
+ public static runTempScene(command: string) {
this.sendMessageToCurrentWs({
command: DebugCommand.TEMP_SCENE,
sceneMsg: {
From d29fe3926915697df9e18fba035d806a6d12d898 Mon Sep 17 00:00:00 2001
From: Lingxi <2863878907@qq.com>
Date: Sun, 22 Dec 2024 00:00:06 +0800
Subject: [PATCH 11/15] bug: fix
---
.../origine2/src/pages/templateEditor/TemplateEditor.tsx | 6 +++---
.../TemplateEditorSidebar/ComponentTree/ComponentTree.tsx | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/packages/origine2/src/pages/templateEditor/TemplateEditor.tsx b/packages/origine2/src/pages/templateEditor/TemplateEditor.tsx
index 8d1543973..bfa28a86d 100644
--- a/packages/origine2/src/pages/templateEditor/TemplateEditor.tsx
+++ b/packages/origine2/src/pages/templateEditor/TemplateEditor.tsx
@@ -32,11 +32,11 @@ export const sendComponentPreviewMessage = (componentPath: string, componentClas
]);
}
else if (componentPath.includes(useComponentTreeTextbox().path)) {
- const miniAvatar = !componentClass.toLowerCase().includes("miniavataroff") ? "stand.png" : "";
- WsUtil.createTempScene(`changeBg:bg.png -next;\nminiAvatar:${miniAvatar} -next;\n${useTemplateTempScene().textbox}`);
+ const miniAvatar = !componentClass.toLowerCase().includes("miniavataroff") ? "miniavatar.png" : "";
+ WsUtil.runTempScene(`changeBg:bg.png -next;\nminiAvatar:${miniAvatar} -next;\n${useTemplateTempScene().textbox}`);
}
else if (componentPath.includes(useComponentTreeChoose().path)) {
- WsUtil.createTempScene(`changeBg:bg.png -next;${useTemplateTempScene().choose}`);
+ WsUtil.runTempScene(`changeBg:bg.png -next;\n${useTemplateTempScene().choose}`);
}
};
diff --git a/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx b/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx
index 423816d0b..d9c177ab7 100644
--- a/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx
+++ b/packages/origine2/src/pages/templateEditor/TemplateEditorSidebar/ComponentTree/ComponentTree.tsx
@@ -55,7 +55,7 @@ export const useComponentTreeTextbox = () => {
export const useTemplateTempScene = () => {
return {
textbox: `WebGal:${t`对话框文字`} -fontSize=default;`,
- choose: `choose:${t`可选项`}:|${t`不可选项`}:;`
+ choose: `choose:${t`可选项`}:|[false]->${t`不可选项`}:;`
};
};
From 32cf84461859231546bfe0552c4b0aab4809782e Mon Sep 17 00:00:00 2001
From: Mahiru
Date: Sun, 22 Dec 2024 12:22:52 +0800
Subject: [PATCH 12/15] fix: miniavatar template preview function
---
.../pages/templateEditor/TemplateEditor.tsx | 1 -
.../TemplateEditorMainAria/TabsManager.tsx | 2 +-
.../WebGAL_Template/game/figure/miniavatar.png | Bin 0 -> 669575 bytes
3 files changed, 1 insertion(+), 2 deletions(-)
create mode 100644 packages/terre2/assets/templates/WebGAL_Template/game/figure/miniavatar.png
diff --git a/packages/origine2/src/pages/templateEditor/TemplateEditor.tsx b/packages/origine2/src/pages/templateEditor/TemplateEditor.tsx
index bfa28a86d..bf33958bd 100644
--- a/packages/origine2/src/pages/templateEditor/TemplateEditor.tsx
+++ b/packages/origine2/src/pages/templateEditor/TemplateEditor.tsx
@@ -23,7 +23,6 @@ export default function TemplateEditor() {
}
export const sendComponentPreviewMessage = (componentPath: string, componentClass: string)=> {
- console.debug(componentPath, componentClass);
if (componentPath.includes(useComponentTreeTitle().path)) {
// set scene to title
WsUtil.setComponentVisibility([
diff --git a/packages/origine2/src/pages/templateEditor/TemplateEditorMainAria/TabsManager.tsx b/packages/origine2/src/pages/templateEditor/TemplateEditorMainAria/TabsManager.tsx
index 3d6eb87f7..5094a4e38 100644
--- a/packages/origine2/src/pages/templateEditor/TemplateEditorMainAria/TabsManager.tsx
+++ b/packages/origine2/src/pages/templateEditor/TemplateEditorMainAria/TabsManager.tsx
@@ -37,7 +37,7 @@ export default function TabsManager() {
}
function selectTab(tab: ITab) {
- sendComponentPreviewMessage(tab.path, tab.name);
+ sendComponentPreviewMessage(tab.path, tab.class ?? "");
updateCurrentTab(tab);
}
diff --git a/packages/terre2/assets/templates/WebGAL_Template/game/figure/miniavatar.png b/packages/terre2/assets/templates/WebGAL_Template/game/figure/miniavatar.png
new file mode 100644
index 0000000000000000000000000000000000000000..fc5d484e4363e061f04d16b136449b9cc443e3f1
GIT binary patch
literal 669575
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%0D#%;)J#i9ol7FD5Y^YTd}n}
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