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

feat: [project-sequencer-statemachine] 調整 #2526

Conversation

sigprogramming
Copy link
Contributor

内容

以下を行います。

  • editNotesToolIdleStateのupdateCursorStateを修正( aa0b5bd
  • executeNotesSelectionProcessを、selectNotesInRangetoggleNoteSelectionselectOnlyThisNoteAndPlayPreviewSoundに分割( 016265a
  • SequencerStateIdを追加し、ステート遷移時にコールバックを呼び出すようにする( a64fb0c
  • InputのtargetAreaを修正( 472da41
  • refsにpreviewNoteIdsを追加( eeb8041
  • onEnterでもsetNextStateできるようにして、ノートの追加をすぐに適用できるようにする( e34808d

関連 Issue

その他

@sigprogramming sigprogramming requested a review from a team as a code owner February 10, 2025 14:32
@sigprogramming sigprogramming requested review from Hiroshiba and removed request for a team February 10, 2025 14:32
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.

SequencerStateIdを追加し、ステート遷移時にコールバックを呼び出すようにする

こちら何に使う予定か目的が知りたいです!

というのも、この変更で状態遷移に応じてコンテキストを変えるのを、ステートマシンの中で実装するパターンと、外で実装するパターンが選べるようになった(なってしまった)と思います。
どういう時にどっちを実装するべきなのかの指針をコメントに書いて送って良さそう!
簡単に実装するのはステートマシーンの外なので、プルリクエストでの実装がそちらに偏りそうだなーと。

なので可能なら避けれると良さそうだなと思い、一旦理由を聞いてみたいなと!

InputのtargetAreaを修正

こちらは疑問というよりは提案です!

targetArea: "Document" にする等の実装がされてますが、これはおそらく今のmainブランチの実装と違うんじゃないかなと思ってます。
mainブランチと異なる実装は、1回ステートマシンをmainブランチにマージしてからの
方が結果的に良さそうかなーと。
挙動が変わりうるので、もしバグが発生した場合に原因を探しづらくなるはず。

目的はステートマシンへの置き換えだと思うので、まずそこに注力できると!
(改善策を思いついたときはTODOコメントを書くと良いかも)

previewNoteIdsを追加

こちらは何に利用する想定でしょうか 👀

onEnterでもsetNextStateできるようにして、ノートの追加をすぐに適用できるようにする

こちらも何に利用するか知りたみです!
ペースト処理あたりかもですが、であればちょっと危ない実装だなーと・・・!


いくつもの変更が1つになっていますが、小分けにしてプルリクエストいただけた方が結果的に早いかもです・・・!
(まあ結構面倒だとは思うのですが、その分手戻りを減らせ、より良い設計ができ、バグが減らせる・・・・・・かも!)

@sigprogramming
Copy link
Contributor Author

sigprogramming commented Feb 12, 2025

@Hiroshiba

SequencerStateIdを追加し、ステート遷移時にコールバックを呼び出すようにする

こちら何に使う予定か目的が知りたいです!

currentStateIdからPreviewMode(SequencerNoteで必要)に変換する目的でonStateChangedを追加しましたが、
各ステートでPreviewModeを更新する形でも良いかもしれません。
(StateMachine自体にonStateChangedを追加すること自体は問題ないという認識です)

targetArea: "Document" にする等の実装がされてますが、これはおそらく今のmainブランチの実装と違うんじゃないかなと思ってます。

今のmainブランチの実装と同じです。(documentとwindowにイベントリスナーを登録しています)

// リスナー登録
onActivated(() => {
document.addEventListener("keydown", handleKeydown);
window.addEventListener("mousemove", onMouseMove);
window.addEventListener("mouseup", onMouseUp);
});

previewNoteIdsを追加

こちらは何に利用する想定でしょうか 👀

以下のようなpreviewNotesからpreviewNoteIdsを算出する形

const previewNoteIds = computed(() => {
  return new Set(previewNotes.value.map((note) => note.id));
};

だと、previewNotesが更新されるたびにpreviewNoteIdsのcomputedの処理が走ってしまうので、プレビュー開始時に1回だけ設定(更新)されるpreviewNoteIdsを追加しました。
(previewNoteIdsはScoreSequencer.vueで必要です)

onEnterでもsetNextStateできるようにして、ノートの追加をすぐに適用できるようにする

こちらも何に利用するか知りたみです!
ペースト処理あたりかもですが、であればちょっと危ない実装だなーと・・・!

ノート編集の選択優先ツールでダブルクリックしたときはノート追加になりますが、このノート追加では「ドラッグでノートの長さを決める」というのは行わずに、すぐにノートの追加を適用させる必要があります。

case "ADD_NOTE": {
startPreview(event, "ADD_NOTE");
// ダブルクリックで追加した場合はプレビューを即終了しノートを追加する
// mouseDownとの二重状態を避けるため
endPreview();
return;
}

それ専用のステートを新たに作っても良いですが、コードの重複が発生しそうだったので、ひとまずAddNoteStateにapplyImmediatelyAndExitを渡して切り替える形にしました。
(重複するのはactionを順次呼び出す等の処理で、共通化の必要はあまりなさそうなので、専用のステートを作っても良いかもしれません)

いくつもの変更が1つになっていますが、小分けにしてプルリクエストいただけた方が結果的に早いかもです・・・!
(まあ結構面倒だとは思うのですが、その分手戻りを減らせ、より良い設計ができ、バグが減らせる・・・・・・かも!)

承知しました、こちらのPRはひとまずcloseして、上から順に一つずつPRしていこうと思います…!

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