Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ソング: シーケンサ左クリックデフォルトの動作を調整する #2279

Draft
wants to merge 3 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 43 additions & 4 deletions src/components/Sing/ScoreSequencer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -421,6 +421,12 @@ const editingLyricNote = computed(() => {
const showGuideLine = ref(true);
const guideLineX = ref(0);

// ドラッグ中かどうか
const isDragging = ref(false);
// ドラッグ開始位置
const dragStartX = ref(0);
const dragStartY = ref(0);

// プレビュー中でないときの処理
// TODO: ステートパターンにして、この処理をIdleStateに移す
watch([ctrlKey, shiftKey, nowPreviewing, editTarget], () => {
Expand Down Expand Up @@ -925,7 +931,7 @@ const endPreview = () => {
}
const previewPitchEditType = previewPitchEdit.value.type;
if (previewPitchEditType === "draw") {
// カーソルを動かさずにマウスのボタンを離したときに1フレームのみの変更になり
// カーソルを動かさずにマウスのボタンを離したときに1フレーム��みの変更になり
// 1フレームの変更はピッチ編集ラインとして表示されないので、無視する
if (previewPitchEdit.value.data.length >= 2) {
// 平滑化を行う
Expand Down Expand Up @@ -962,7 +968,19 @@ const onNoteBarMouseDown = (event: MouseEvent, note: Note) => {
}
const mouseButton = getButton(event);
if (mouseButton === "LEFT_BUTTON") {
startPreview(event, "MOVE_NOTE", note);
if (event.shiftKey) {
// Shift+左クリックの処理
if (selectedNoteIds.value.has(note.id)) {
// 既に選択されている場合は選択から削除
void store.dispatch("DESELECT_NOTES", { noteIds: [note.id] });
} else {
// 選択されていない場合は選択に追加
void store.dispatch("SELECT_NOTES", { noteIds: [note.id] });
}
} else {
// 移動
startPreview(event, "MOVE_NOTE", note);
}
} else if (!selectedNoteIds.value.has(note.id)) {
selectOnlyThis(note);
}
Expand Down Expand Up @@ -1007,16 +1025,26 @@ const onMouseDown = (event: MouseEvent) => {
return;
}
const mouseButton = getButton(event);
// TODO: メニューが表示されている場合はメニュー非表示のみ行いたい
if (editTarget.value === "NOTE") {
if (mouseButton === "LEFT_BUTTON") {
if (event.shiftKey) {
// 空白部分でのShift+左クリック:矩形選択を開始
isRectSelecting.value = true;
rectSelectStartX.value = cursorX.value;
rectSelectStartY.value = cursorY.value;
setCursorState(CursorState.CROSSHAIR);
} else {
startPreview(event, "ADD_NOTE");
// 通常の左クリック処理
isDragging.value = true;
dragStartX.value = cursorX.value;
dragStartY.value = cursorY.value;
if (selectedNoteIds.value.size === 0) {
// ノート未選択時は新規ノート追加
startPreview(event, "ADD_NOTE");
} else {
// ノート選択中は選択解除
void store.dispatch("DESELECT_ALL_NOTES");
}
}
} else {
void store.dispatch("DESELECT_ALL_NOTES");
Expand Down Expand Up @@ -1044,6 +1072,16 @@ const onMouseMove = (event: MouseEvent) => {

if (nowPreviewing.value) {
executePreviewProcess.value = true;
} else if (isDragging.value && editTarget.value === "NOTE") {
// ドラッグ距離が3px以上の場合はノート追加
const DRAG_THRESHOLD = 3;
const dragDistance = Math.sqrt(
Math.pow(cursorX.value - dragStartX.value, 2) +
Math.pow(cursorY.value - dragStartY.value, 2),
);
if (dragDistance > DRAG_THRESHOLD) {
startPreview(event, "ADD_NOTE");
}
} else {
const scrollLeft = sequencerBodyElement.scrollLeft;
const cursorBaseX = (scrollLeft + cursorX.value) / zoomX.value;
Expand All @@ -1066,6 +1104,7 @@ const onMouseUp = (event: MouseEvent) => {
} else if (nowPreviewing.value) {
endPreview();
}
isDragging.value = false;
};

/**
Expand Down
11 changes: 11 additions & 0 deletions src/store/singing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -787,6 +787,17 @@ export const singingStore = createPartialStore<SingingStoreTypes>({
},
},

DESELECT_NOTES: {
mutation(state, { noteIds }: { noteIds: NoteId[] }) {
for (const noteId of noteIds) {
state._selectedNoteIds.delete(noteId);
}
},
async action({ mutations }, { noteIds }: { noteIds: NoteId[] }) {
mutations.DESELECT_NOTES({ noteIds });
},
},

DESELECT_ALL_NOTES: {
mutation(state) {
state.editingLyricNoteId = undefined;
Expand Down
5 changes: 5 additions & 0 deletions src/store/type.ts
Original file line number Diff line number Diff line change
Expand Up @@ -939,6 +939,11 @@ export type SingingStoreTypes = {
action({ trackId }: { trackId: TrackId }): void;
};

DESELECT_NOTES: {
mutation: { noteIds: NoteId[] };
action(payload: { noteIds: NoteId[] }): void;
};

DESELECT_ALL_NOTES: {
mutation: undefined;
action(): void;
Expand Down
Loading