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

[project-s] ドラッグ周りの整理とプレビュー処理の追加 #1680

Merged
merged 13 commits into from
Dec 28, 2023

Conversation

sigprogramming
Copy link
Contributor

@sigprogramming sigprogramming commented Dec 27, 2023

内容

以下を行います。

  • ドラッグ周りの整理
    • 処理を軽くする
    • クリックでノート追加に変更
      • ドラッグ開始時のノートの長さはスナップの長さ
      • ドラッグでノートの長さを変更できるようにする
    • ルーラークリックでノートの選択を解除できるようにする
    • 選択と移動・リサイズを同時に(1クリックで)行えるようにする
    • ドラッグ中(プレビュー中)はcursor: autoにする(カーソルのちらつきが発生しないように)
  • プレビュー処理を追加
    • いったんノートをコピーし、コピーしたノートに編集が行われたら(ドラッグされたら)適用
  • ダブルクリック周りの変更
    • ノートの移動・リサイズが行われなかった場合にダブルクリック時の処理を実行するように変更
    • dblclickイベントをノートではなくsequencerBodyで受け取るようにする
      • ノート選択時に要素の切り替えが発生するため
  • keydownイベントをノートではなくdocumentで受け取るようにする
    • ノート選択時に要素の切り替えが発生するため
  • ループボタンを削除
  • 最大スナップサイズを32に変更
  • state.selectedNoteIdsstate.overlappingNoteIdsの型をSetに変更
  • state.sequencerScrollXstate.sequencerScrollYを削除
  • action、mutationを整理
  • リファクタリング

関連 Issue

VOICEVOX/voicevox_project#15

その他

@Hiroshiba
Copy link
Member

レビュー中です! バグっぽい挙動に気づいたので先にコメントだけ。

ノート追加の判定がノート長の半分左にずれてるかもです。
1/1で追加しようとするとわかりやすいかもです。

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!!!

正直なところ結構リファクタリングしがいのあるコードだなと感じたのですが、たぶんあえて今はこんな感じにして、いろいろ実装しきったあとにリファクタリングを考えられてるのかなと思いました!
なのでほとんどそのままにさせていただきつつ、コメント追加とかだけこちらでさせていただこうと思います!!

Comment on lines +655 to +659
const selectedNoteIds = new Set(state.selectedNoteIds);
for (const noteId of noteIds) {
selectedNoteIds.add(noteId);
}
state.selectedNoteIds = selectedNoteIds;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

もともとselectedNoteIdsはsetなので、こうで良いかと!

Suggested change
const selectedNoteIds = new Set(state.selectedNoteIds);
for (const noteId of noteIds) {
selectedNoteIds.add(noteId);
}
state.selectedNoteIds = selectedNoteIds;
for (const noteId of noteIds) {
state.selectedNoteIds.add(noteId);
}

Comment on lines +718 to +722
const selectedNoteIds = new Set(state.selectedNoteIds);
for (const noteId of noteIds) {
selectedNoteIds.delete(noteId);
}
state.selectedNoteIds = selectedNoteIds;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここもこうできそう?

Suggested change
const selectedNoteIds = new Set(state.selectedNoteIds);
for (const noteId of noteIds) {
selectedNoteIds.delete(noteId);
}
state.selectedNoteIds = selectedNoteIds;
for (const noteId of noteIds) {
state.selectedNoteIds.delete(noteId);
}

Comment on lines +745 to +749
const selectedNoteIds = new Set(state.selectedNoteIds);
for (const noteId of noteIds) {
selectedNoteIds.add(noteId);
}
state.selectedNoteIds = selectedNoteIds;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここも。

Suggested change
const selectedNoteIds = new Set(state.selectedNoteIds);
for (const noteId of noteIds) {
selectedNoteIds.add(noteId);
}
state.selectedNoteIds = selectedNoteIds;
for (const noteId of noteIds) {
state.selectedNoteIds.add(noteId);
}

let draggingNoteId = "";
let edited = false;
// ダブルクリック
const clickedNoteIds: (string | undefined)[] = [undefined, undefined];
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

結構大きなコンポーネントなので、ダブルクリック判定用だとわかる変数名にしておくと安心かもと思いました!
あと型をtupleにしておけば要素数が2つだということも明示できます!

Suggested change
const clickedNoteIds: (string | undefined)[] = [undefined, undefined];
const clickedNoteIdsForDoubleClick: [string | undefined, string | undefined] = [
undefined,
undefined,
];

Comment on lines 673 to 676
if (editedNotes.length === 0) {
return;
}
store.dispatch("UPDATE_NOTES", { notes: editedNotes });
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

UPDATE_NOTESにとっての例外処理だと思うので、UPDATE_NOTES内に書いてあげたほうがシンプルかなと思いました!

src/components/Sing/ScoreSequencer.vue Outdated Show resolved Hide resolved
const noteNumber = baseYToNoteNumber(eventOffsetBaseY);
if (noteNumber < 0) {
return;
// プレビュー
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ちょっとここにFIXMEコメントだけ書かせていただけると・・・!

Suggested change
// プレビュー
// プレビュー
// FIXME: 関連する値を1つのobjectにまとめる

let currentCursorY = 0;
let dragStartTicks = 0;
let dragStartNoteNumber = 0;
let draggingNoteId = "";
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

やっぱり型で異常かどうか判別できる方が良いかなと思います。

Suggested change
let draggingNoteId = "";
let draggingNoteId = ""; // FIXME: 無効状態はstring以外の型にする

たぶんPreviewModeもundefinedになれるようにして、PreviewModeがundefinedじゃなければdraggingNoteIdも型として現れる形が良いかなと。
こんな感じを想像してます。

const previewValue: {
  mode: undefined;
} | {
  mode: PreviewMode;
  draggingNoteId: string;
  // 他変数いろいろ
}

Comment on lines +582 to +585
const onMouseMove = (event: MouseEvent) => {
if (!nowPreviewing.value) {
return;
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

良い方法か若干自信がないですが、最初からイベントリスナー登録するのではなく、プレビュー開始したらこのイベントをaddする手もあるなと思いました!

if (previewMode === "RESIZE_LEFT") {
previewResizeLeft();
}
previewRequestId = requestAnimationFrame(preview);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

再レンダリングが必要なくてもpreviewが呼ばれ続けるなと思いました!
onMouseMoveしたときにこの関数が呼ばれる形でも良いかも?

@Hiroshiba
Copy link
Member

マージさせていただきます!!!

@Hiroshiba Hiroshiba merged commit 259e8a0 into VOICEVOX:project-s Dec 28, 2023
7 checks passed
@sigprogramming
Copy link
Contributor Author

レビューありがとうございます!

ノート追加の判定がノート長の半分左にずれてるかもです

他のソフトではfloorではなくroundになっていたので、それに合わせました!
この辺り(移動・リサイズ時の挙動も)、また後で議論できればと思っています…!

@Hiroshiba
Copy link
Member

Hiroshiba commented Dec 29, 2023

他のソフトではfloorではなくroundになっていたので、それに合わせました!

おっとなるほどです!
もしかしてもしかしたら認識がずれているかもなので、ちょっと動画撮ってみました!
(クリックした場所にノートが作られない例)

VOICEVOX.-.Ver.999.999.999.2023-12-29.13-49-15.mp4

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants