+
@@ -27,6 +45,7 @@
import { computed, ref, watch } from "vue";
import ToolBar from "./ToolBar/ToolBar.vue";
import ScoreSequencer from "./ScoreSequencer.vue";
+import SideBar from "./SideBar/SideBar.vue";
import EngineStartupOverlay from "@/components/EngineStartupOverlay.vue";
import { useStore } from "@/store";
import onetimeWatch from "@/helpers/onetimeWatch";
@@ -42,7 +61,19 @@ const props = defineProps<{
}>();
const store = useStore();
-//const $q = useQuasar();
+
+const isSidebarOpen = computed(
+ () =>
+ store.state.experimentalSetting.enableMultiTrack &&
+ store.state.isSongSidebarOpen,
+);
+const sidebarWidth = ref(300);
+
+const setSidebarWidth = (width: number) => {
+ if (isSidebarOpen.value) {
+ sidebarWidth.value = width;
+ }
+};
const nowRendering = computed(() => {
return store.state.nowRendering;
@@ -80,11 +111,15 @@ onetimeWatch(
await store.dispatch("SET_TIME_SIGNATURES", {
timeSignatures: [createDefaultTimeSignature(1)],
});
- await store.dispatch("SET_NOTES", { notes: [] });
+ const trackId = store.state.trackOrder[0];
+ await store.dispatch("SET_NOTES", { notes: [], trackId });
// CI上のe2eテストのNemoエンジンには歌手がいないためエラーになるのでワークアラウンド
// FIXME: 歌手をいると見せかけるmock APIを作り、ここのtry catchを削除する
try {
- await store.dispatch("SET_SINGER", { withRelated: true });
+ await store.dispatch("SET_SINGER", {
+ trackId,
+ withRelated: true,
+ });
} catch (e) {
window.backend.logError(e);
}
diff --git a/src/components/Sing/SingerIcon.vue b/src/components/Sing/SingerIcon.vue
new file mode 100644
index 0000000000..f2c3dbe702
--- /dev/null
+++ b/src/components/Sing/SingerIcon.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/Sing/ToolBar/ToolBar.vue b/src/components/Sing/ToolBar/ToolBar.vue
index ef6edf207a..1f8a50dea6 100644
--- a/src/components/Sing/ToolBar/ToolBar.vue
+++ b/src/components/Sing/ToolBar/ToolBar.vue
@@ -2,6 +2,14 @@
+
store.getters.CAN_UNDO(editor));
const canRedo = computed(() => store.getters.CAN_REDO(editor));
+const multiTrackEnabled = computed(
+ () => store.state.experimentalSetting.enableMultiTrack,
+);
+
const { registerHotkeyWithCleanup } = useHotkeyManager();
registerHotkeyWithCleanup({
editor,
@@ -210,6 +222,13 @@ const changeEditTarget = (editTarget: SequencerEditTarget) => {
store.dispatch("SET_EDIT_TARGET", { editTarget });
};
+const isSidebarOpen = computed(() => store.state.isSongSidebarOpen);
+const toggleSidebar = () => {
+ store.dispatch("SET_SONG_SIDEBAR_OPEN", {
+ isSongSidebarOpen: !isSidebarOpen.value,
+ });
+};
+
const tempos = computed(() => store.state.tempos);
const timeSignatures = computed(() => store.state.timeSignatures);
const keyRangeAdjustment = computed(
@@ -218,6 +237,7 @@ const keyRangeAdjustment = computed(
const volumeRangeAdjustment = computed(
() => store.getters.SELECTED_TRACK.volumeRangeAdjustment,
);
+const selectedTrackId = computed(() => store.getters.SELECTED_TRACK_ID);
const bpmInputBuffer = ref(120);
const beatsInputBuffer = ref(4);
@@ -326,13 +346,17 @@ const setTimeSignature = () => {
const setKeyRangeAdjustment = () => {
const keyRangeAdjustment = keyRangeAdjustmentInputBuffer.value;
- store.dispatch("COMMAND_SET_KEY_RANGE_ADJUSTMENT", { keyRangeAdjustment });
+ store.dispatch("COMMAND_SET_KEY_RANGE_ADJUSTMENT", {
+ keyRangeAdjustment,
+ trackId: selectedTrackId.value,
+ });
};
const setVolumeRangeAdjustment = () => {
const volumeRangeAdjustment = volumeRangeAdjustmentInputBuffer.value;
store.dispatch("COMMAND_SET_VOLUME_RANGE_ADJUSTMENT", {
volumeRangeAdjustment,
+ trackId: selectedTrackId.value,
});
};
diff --git a/src/components/Sing/menuBarData.ts b/src/components/Sing/menuBarData.ts
index b13733822e..962afdf9aa 100644
--- a/src/components/Sing/menuBarData.ts
+++ b/src/components/Sing/menuBarData.ts
@@ -5,7 +5,9 @@ import { MenuItemData } from "@/components/Menu/type";
export const useMenuBarData = () => {
const store = useStore();
const uiLocked = computed(() => store.getters.UI_LOCKED);
- const isNotesSelected = computed(() => store.state.selectedNoteIds.size > 0);
+ const isNotesSelected = computed(
+ () => store.getters.SELECTED_NOTE_IDS.size > 0,
+ );
const importExternalSongProject = async () => {
if (uiLocked.value) return;
@@ -76,7 +78,9 @@ export const useMenuBarData = () => {
label: "すべて選択",
onClick: () => {
if (uiLocked.value) return;
- store.dispatch("SELECT_ALL_NOTES");
+ store.dispatch("SELECT_ALL_NOTES_IN_TRACK", {
+ trackId: store.getters.SELECTED_TRACK_ID,
+ });
},
disableWhenUiLocked: true,
},
diff --git a/src/composables/useLyricInput.ts b/src/composables/useLyricInput.ts
index ffaf85c144..dca9052743 100644
--- a/src/composables/useLyricInput.ts
+++ b/src/composables/useLyricInput.ts
@@ -12,8 +12,8 @@ export const useLyricInput = () => {
const previewLyrics = ref