-
Notifications
You must be signed in to change notification settings - Fork 308
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
Conversation
レビュー中です! バグっぽい挙動に気づいたので先にコメントだけ。 ノート追加の判定がノート長の半分左にずれてるかもです。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!!!
正直なところ結構リファクタリングしがいのあるコードだなと感じたのですが、たぶんあえて今はこんな感じにして、いろいろ実装しきったあとにリファクタリングを考えられてるのかなと思いました!
なのでほとんどそのままにさせていただきつつ、コメント追加とかだけこちらでさせていただこうと思います!!
const selectedNoteIds = new Set(state.selectedNoteIds); | ||
for (const noteId of noteIds) { | ||
selectedNoteIds.add(noteId); | ||
} | ||
state.selectedNoteIds = selectedNoteIds; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
もともとselectedNoteIdsはsetなので、こうで良いかと!
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); | |
} |
const selectedNoteIds = new Set(state.selectedNoteIds); | ||
for (const noteId of noteIds) { | ||
selectedNoteIds.delete(noteId); | ||
} | ||
state.selectedNoteIds = selectedNoteIds; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ここもこうできそう?
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); | |
} |
const selectedNoteIds = new Set(state.selectedNoteIds); | ||
for (const noteId of noteIds) { | ||
selectedNoteIds.add(noteId); | ||
} | ||
state.selectedNoteIds = selectedNoteIds; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ここも。
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]; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
結構大きなコンポーネントなので、ダブルクリック判定用だとわかる変数名にしておくと安心かもと思いました!
あと型をtupleにしておけば要素数が2つだということも明示できます!
const clickedNoteIds: (string | undefined)[] = [undefined, undefined]; | |
const clickedNoteIdsForDoubleClick: [string | undefined, string | undefined] = [ | |
undefined, | |
undefined, | |
]; |
if (editedNotes.length === 0) { | ||
return; | ||
} | ||
store.dispatch("UPDATE_NOTES", { notes: editedNotes }); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
UPDATE_NOTES
にとっての例外処理だと思うので、UPDATE_NOTES
内に書いてあげたほうがシンプルかなと思いました!
const noteNumber = baseYToNoteNumber(eventOffsetBaseY); | ||
if (noteNumber < 0) { | ||
return; | ||
// プレビュー |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ちょっとここにFIXMEコメントだけ書かせていただけると・・・!
// プレビュー | |
// プレビュー | |
// FIXME: 関連する値を1つのobjectにまとめる |
let currentCursorY = 0; | ||
let dragStartTicks = 0; | ||
let dragStartNoteNumber = 0; | ||
let draggingNoteId = ""; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
やっぱり型で異常かどうか判別できる方が良いかなと思います。
let draggingNoteId = ""; | |
let draggingNoteId = ""; // FIXME: 無効状態はstring以外の型にする |
たぶんPreviewMode
もundefinedになれるようにして、PreviewModeがundefinedじゃなければdraggingNoteId
も型として現れる形が良いかなと。
こんな感じを想像してます。
const previewValue: {
mode: undefined;
} | {
mode: PreviewMode;
draggingNoteId: string;
// 他変数いろいろ
}
const onMouseMove = (event: MouseEvent) => { | ||
if (!nowPreviewing.value) { | ||
return; | ||
} |
There was a problem hiding this comment.
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); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
再レンダリングが必要なくてもpreviewが呼ばれ続けるなと思いました!
onMouseMoveしたときにこの関数が呼ばれる形でも良いかも?
マージさせていただきます!!! |
レビューありがとうございます!
他のソフトではfloorではなくroundになっていたので、それに合わせました! |
おっとなるほどです! VOICEVOX.-.Ver.999.999.999.2023-12-29.13-49-15.mp4 |
内容
以下を行います。
cursor: auto
にする(カーソルのちらつきが発生しないように)dblclick
イベントをノートではなくsequencerBody
で受け取るようにするkeydown
イベントをノートではなくdocument
で受け取るようにするstate.selectedNoteIds
とstate.overlappingNoteIds
の型をSetに変更state.sequencerScrollX
とstate.sequencerScrollY
を削除関連 Issue
VOICEVOX/voicevox_project#15
その他