-
Notifications
You must be signed in to change notification settings - Fork 309
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
#1877 ソング: 編集メニューの追加とノートのコピー&ペーストの実装 #1903
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です!!
コメントいっぱい書いてますが軽い提案が多いです!
src/store/singing.ts
のコードは @sigprogramming さんにもレビューいただけると心強いかもです!
src/store/singing.ts
Outdated
// クリップボードのテキストをJSONとしてパースする(失敗した場合は何もしない) | ||
const notesJson = JSON.parse(text); |
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.
ここはzodを使うと型サポート受けられるようにも出来たりします!(noteSchema
のimportが必要)
// クリップボードのテキストをJSONとしてパースする(失敗した場合は何もしない) | |
const notesJson = JSON.parse(text); | |
// クリップボードのテキストをJSONとしてパースする(失敗した場合は何もしない) | |
const notes = noteSchema.array().parse(JSON.parse(text)); |
copy元でidを除外してる場合はこんな感じかなと!
// クリップボードのテキストをJSONとしてパースする(失敗した場合は何もしない) | |
const notesJson = JSON.parse(text); | |
// クリップボードのテキストをJSONとしてパースする(失敗した場合は何もしない) | |
const notes = noteSchema | |
.omit({ id: true }) | |
.array() | |
.parse(JSON.parse(text)); |
src/store/singing.ts
Outdated
const notesToPaste: Note[] = notesJson.map((note) => { | ||
// 新しい位置を現在の再生位置に合わせて計算する | ||
const pastePosition = | ||
Number(note.position) - firstNotePosition + currentPlayheadPosition; | ||
return { | ||
id: uuidv4(), | ||
position: Number(pastePosition), | ||
duration: Number(note.duration), | ||
noteNumber: Number(note.noteNumber), | ||
lyric: String(note.lyric), | ||
}; | ||
}); |
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 notesToPaste: Note[] = notesJson.map((note) => { | |
// 新しい位置を現在の再生位置に合わせて計算する | |
const pastePosition = | |
Number(note.position) - firstNotePosition + currentPlayheadPosition; | |
return { | |
id: uuidv4(), | |
position: Number(pastePosition), | |
duration: Number(note.duration), | |
noteNumber: Number(note.noteNumber), | |
lyric: String(note.lyric), | |
}; | |
}); | |
notes.forEach((note) => { | |
// 新しい位置を現在の再生位置に合わせて計算する | |
note.position = | |
note.position - firstNotePosition + currentPlayheadPosition; | |
note.id = uuidv4(); | |
}); |
あ、あとスクリーンショットテストが落ちてるので更新していただければ! 詳しくはこちら |
Co-authored-by: Hiroshiba <[email protected]>
Co-authored-by: Hiroshiba <[email protected]>
Co-authored-by: Hiroshiba <[email protected]>
Co-authored-by: Hiroshiba <[email protected]>
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.
コピー&ペーストの実装ありがとうございます!!
いったん指摘点修正済み・クオンタイズ追加(一応動いているように見える) |
// OSXの場合、Ctrl+クリックが右クリックのため、その場合はノートを追加しない | ||
if (event.ctrlKey && event.button === 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.
なるほどです!!
ここにisMacがあるのでそれも加えるといいかも?
あっ スクショテストがまた落ちてますね。。 |
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です!!!! ありがとうございます!!!
src/components/Talk/MenuBar.vue
Outdated
{ | ||
type: "button", | ||
label: "元に戻す", | ||
onClick: () => { | ||
if (uiLocked.value) return; | ||
store.dispatch("UNDO", { editor }); | ||
}, | ||
disableWhenUiLocked: true, | ||
disabled: !canUndo.value, | ||
}, | ||
{ | ||
type: "button", | ||
label: "やり直す", | ||
onClick: () => { | ||
if (uiLocked.value) return; | ||
store.dispatch("REDO", { editor }); | ||
}, | ||
disableWhenUiLocked: true, | ||
disabled: !canRedo.value, | ||
}, |
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.
この2つはsingとtalkで同じなので統一できそうですね!!
実際に「プロジェクト上書き保存」とかはBaseMenuBar
内で統一されてるので、書き方を真似れば統一できると思います!
voicevox/src/components/Menu/MenuBar/BaseMenuBar.vue
Lines 299 to 307 in 0c3bafb
{ | |
type: "button", | |
label: "プロジェクトを上書き保存", | |
onClick: async () => { | |
await saveProject(); | |
}, | |
disableWhenUiLocked: true, | |
}, | |
{ |
分からなかったら後でプルリクエスト出させていただきます!
いったん指摘点修正済み |
おっとテストが回ってないかもですね! VOICEVOXリポジトリへの自動pushだからかな、謎です。 |
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!!!
いろいろコメントしているのですが、細々としているのでこっちでちゃちゃっと変えてマージさせていただきます!
(変な変更してしまったらすみません 🙇 )
return; | ||
} | ||
|
||
// TODO: メニューが表示されている場合はメニュー非表示のみ行いたい |
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.
ちょっと考えたのですが同意見です!
よくある挙動だとコンテキストメニュー開いた後のクリックも普通のクリックと同じ扱いにする(ボタンを押すなど)のですが、どこをクリックしても何かが発動するシーケンサーの場合は話は別なのかなぁと思いました。
{ type: "separator" }, | ||
{ | ||
type: "button", | ||
label: "クオンタイズ", |
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.
ここの名称、初心者にはかなり難しそうですね。。。。
まあこれを必要とする人はわりと玄人だと思うので大丈夫そうではありますが・・・
ちょっと初心者向けのワードを考えてみました。
やることは「ノートをリズムに合わせる」ですが、それだと長いので、「ノート整列」とか「整列」とか「タイミング合わせ」とか「タイミング調整」とかでしょうか。
長いけど「タイミング調整(クオンタイズ)」とか・・・・?
うーん、とりあえずクオンタイズのままで!
src/store/singing.ts
Outdated
dispatch("COPY_NOTES_TO_CLIPBOARD"); | ||
dispatch("COMMAND_REMOVE_SELECTED_NOTES"); |
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.
一応await挟んでおくと安心かも?
内容
機能追加
メニューの追加と変更
メインメニュー: 編集メニューの追加
トーク: 元に戻す/やり直す
ソング: 元に戻す/やり直す/コピー/切り取り/貼り付け/すべて選択/選択解除
シーケンサ右クリックメニューの追加
選択中を削除/コピー/切り取り/貼り付け/すべて選択/選択解除
ノート右クリックメニューの調整
コピー/切り取りを追加
関連 Issue
ref #1877
close #1877
スクリーンショット・動画など
その他
そこまで難易度高そうではなかったため、コピペもあわせて実装いたしました。