Skip to content

Commit c320e07

Browse files
committed
feat: 支持 cue 和 movie 设置了单独的 id 的情况
1 parent 8b11f02 commit c320e07

File tree

6 files changed

+61
-14
lines changed

6 files changed

+61
-14
lines changed

MaiChartManager/Front/src/client/apiGen.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,10 @@ export interface MusicXmlWithABJacket {
250250
assetDir?: string | null;
251251
hasJacket?: boolean;
252252
isAcbAwbExist?: boolean;
253+
/** @format int32 */
254+
cueId?: number;
255+
/** @format int32 */
256+
movieId?: number;
253257
problems?: string[] | null;
254258
}
255259

MaiChartManager/Front/src/components/MusicEdit/AcbAwb.tsx

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { computed, defineComponent, PropType, ref } from "vue";
22
import { HttpResponse, MusicXmlWithABJacket } from "@/client/apiGen";
3-
import { NButton, NDrawer, NDrawerContent, NFlex, NForm, NFormItem, NInputNumber, NModal, NRadio, useDialog } from "naive-ui";
3+
import { NButton, NDrawer, NDrawerContent, NFlex, NForm, NFormItem, NInputNumber, NModal, NPopover, NRadio, useDialog } from "naive-ui";
44
import noJacket from "@/assets/noJacket.webp";
55
import { globalCapture, selectedADir } from "@/store/refs";
66
import FileTypeIcon from "@/components/FileTypeIcon";
@@ -12,11 +12,11 @@ import SetMovieButton from "@/components/MusicEdit/SetMovieButton";
1212

1313
export default defineComponent({
1414
props: {
15-
song: {type: Object as PropType<MusicXmlWithABJacket>, required: true},
15+
song: { type: Object as PropType<MusicXmlWithABJacket>, required: true },
1616
},
1717
setup(props) {
1818
const updateTime = ref(0)
19-
const url = computed(() => getUrl(`GetMusicWavApi/${selectedADir.value}/${props.song.id}?${updateTime.value}`))
19+
const url = computed(() => getUrl(`GetMusicWavApi/${selectedADir.value}/${props.song.cueId}?${updateTime.value}`))
2020
const tipShow = ref(false)
2121
const tipSelectAwbShow = ref(false)
2222
const setOffsetShow = ref(false)
@@ -25,6 +25,8 @@ export default defineComponent({
2525
const okResolve = ref<Function>(() => {
2626
})
2727
const dialog = useDialog();
28+
const cueIdNotMatch = computed(() => props.song.nonDxId !== props.song.cueId)
29+
const movieIdNotMatch = computed(() => props.song.nonDxId !== props.song.movieId)
2830

2931
const uploadFlow = async () => {
3032
tipShow.value = true
@@ -65,7 +67,7 @@ export default defineComponent({
6567

6668
load.value = true;
6769
const awb = await fileHandle.getFile() as File;
68-
res = await api.SetAudio(props.song.id!, selectedADir.value, {file, awb, padding: 0});
70+
res = await api.SetAudio(props.song.id!, selectedADir.value, { file, awb, padding: 0 });
6971
} else {
7072
offset.value = 0;
7173
setOffsetShow.value = true;
@@ -74,11 +76,11 @@ export default defineComponent({
7476
});
7577
load.value = true;
7678
setOffsetShow.value = false;
77-
res = await api.SetAudio(props.song.id!, selectedADir.value, {file, padding: offset.value});
79+
res = await api.SetAudio(props.song.id!, selectedADir.value, { file, padding: offset.value });
7880
}
7981
if (res.error) {
8082
const error = res.error as any;
81-
dialog.warning({title: '设置失败', content: error.message || error});
83+
dialog.warning({ title: '设置失败', content: error.message || error });
8284
return;
8385
}
8486
updateTime.value = Date.now()
@@ -97,9 +99,24 @@ export default defineComponent({
9799

98100
return () => <NFlex align="center">
99101
{props.song.isAcbAwbExist && <audio controls src={url.value} class="w-0 grow"/>}
100-
{selectedADir.value !== 'A000' && <NButton secondary class={`${!props.song.isAcbAwbExist && "w-full"}`} onClick={uploadFlow} loading={load.value}>{props.song.isAcbAwbExist ? '替换' : '设置'}音频</NButton>}
101-
{selectedADir.value !== 'A000' && props.song.isAcbAwbExist && <AudioPreviewEditorButton/>}
102-
{selectedADir.value !== 'A000' && props.song.isAcbAwbExist && <SetMovieButton song={props.song}/>}
102+
{selectedADir.value !== 'A000' &&
103+
<NPopover trigger="hover" disabled={!cueIdNotMatch.value}>{{
104+
trigger: () => <NButton secondary class={`${!props.song.isAcbAwbExist && "w-full"}`} onClick={uploadFlow} loading={load.value} disabled={cueIdNotMatch.value}>{props.song.isAcbAwbExist ? '替换' : '设置'}音频</NButton>,
105+
default: () => '由于 XML 内自行设置了不同的 CueID,不支持在这里替换音频'
106+
}}</NPopover>
107+
}
108+
{selectedADir.value !== 'A000' && props.song.isAcbAwbExist &&
109+
<NPopover trigger="hover" disabled={!cueIdNotMatch.value}>{{
110+
trigger: () => <AudioPreviewEditorButton disabled={cueIdNotMatch.value}/>,
111+
default: () => '由于 XML 内自行设置了不同的 CueID,不支持在这里修改设置'
112+
}}</NPopover>
113+
}
114+
{selectedADir.value !== 'A000' && props.song.isAcbAwbExist &&
115+
<NPopover trigger="hover" disabled={!movieIdNotMatch.value}>{{
116+
trigger: () => <SetMovieButton song={props.song} disabled={movieIdNotMatch.value}/>,
117+
default: () => '由于 XML 内自行设置了不同的 MovieID,不支持在这里替换 PV'
118+
}}</NPopover>
119+
}
103120

104121
{/* 打开文件对话框一般在左上角,所以在下边显示一个 Drawer */}
105122
<NDrawer v-model:show={tipShow.value} height={200} placement="bottom">

MaiChartManager/Front/src/components/MusicEdit/AudioPreviewEditorButton.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ import AudioPreviewEditor from "@/components/MusicEdit/AudioPreviewEditor";
44
import { showNeedPurchaseDialog, version } from "@/store/refs";
55

66
export default defineComponent({
7+
props: {
8+
disabled: Boolean,
9+
},
710
setup(props) {
811
const show = ref(false)
912

@@ -15,7 +18,7 @@ export default defineComponent({
1518
show.value = true
1619
}
1720

18-
return () => <NButton secondary onClick={handleClick}>
21+
return () => <NButton secondary onClick={handleClick} disabled={props.disabled}>
1922
编辑预览
2023

2124
<NModal

MaiChartManager/Front/src/components/MusicEdit/SetMovieButton.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ enum STEP {
1717

1818
export default defineComponent({
1919
props: {
20+
disabled: Boolean,
2021
song: { type: Object as PropType<MusicXmlWithABJacket>, required: true },
2122
},
2223
setup(props) {
@@ -131,7 +132,7 @@ export default defineComponent({
131132
}
132133
}
133134

134-
return () => <NButton secondary onClick={uploadFlow} loading={load.value}>
135+
return () => <NButton secondary onClick={uploadFlow} loading={load.value} disabled={props.disabled}>
135136
设置 PV
136137

137138
<NDrawer show={step.value === STEP.Select} height={250} placement="bottom">

MaiChartManager/Models/MusicXmlWithABJacket.cs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public override void Refresh()
3838
}
3939
}
4040

41-
public bool isAcbAwbExist => StaticSettings.AcbAwb.ContainsKey($"music{NonDxId:000000}.acb") && StaticSettings.AcbAwb.ContainsKey($"music{NonDxId:000000}.awb");
41+
public bool isAcbAwbExist => StaticSettings.AcbAwb.ContainsKey($"music{CueId:000000}.acb") && StaticSettings.AcbAwb.ContainsKey($"music{CueId:000000}.awb");
4242

4343
public XmlDocument GetInnerXmlClone()
4444
{
@@ -60,6 +60,28 @@ public XmlDocument GetXmlWithoutEventsAndRights()
6060
return clone;
6161
}
6262

63+
public int CueId
64+
{
65+
get => int.Parse(RootNode.SelectSingleNode("cueName/id")?.InnerText);
66+
set
67+
{
68+
Modified = true;
69+
var nonDxId = value % 10000;
70+
RootNode.SelectSingleNode("cueName/id").InnerText = nonDxId.ToString();
71+
}
72+
}
73+
74+
public int MovieId
75+
{
76+
get => int.Parse(RootNode.SelectSingleNode("movieName/id")?.InnerText);
77+
set
78+
{
79+
Modified = true;
80+
var nonDxId = value % 10000;
81+
RootNode.SelectSingleNode("movieName/id").InnerText = nonDxId.ToString();
82+
}
83+
}
84+
6385
public List<string> Problems
6486
{
6587
get

Sitreamai/Models/MusicXml.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ public static MusicXml CreateNew(int dxId, string gamePath, string assetDir)
210210
return new MusicXml(Path.Combine(path, "Music.xml"), gamePath);
211211
}
212212

213-
private XmlNode RootNode => xmlDoc.SelectSingleNode("/MusicData");
213+
protected XmlNode RootNode => xmlDoc.SelectSingleNode("/MusicData");
214214

215215
public int Id
216216
{
@@ -228,7 +228,7 @@ public int Id
228228

229229
public int NonDxId => Id % 10000;
230230

231-
public bool Modified { get; private set; }
231+
public bool Modified { get; protected set; }
232232

233233
// netOpenName 和 releaseTagName 游戏里看起来没有用到
234234

0 commit comments

Comments
 (0)