-
Notifications
You must be signed in to change notification settings - Fork 305
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
コンテキストメニューのVue化 #1374
コンテキストメニューのVue化 #1374
Conversation
src/components/ContextMenu.vue
Outdated
@@ -0,0 +1,32 @@ | |||
<template> | |||
<q-menu touch-position context-menu> |
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.
ここに no-focus
をつけると行けそうでした!
フォーカスが外れて(blurされて)選択状態が解除され、選択範囲のレンダリングが消えるのが原因かなと思いました。
ちなみにgoogle documentとかは右クリックしても選択範囲消えないんですよね。
なにかinput要素に対して特別なことをやってるのかなと思って調べてみたら、canvasでした 😇
↓ google documentで右クリックしている時の例
アクセシビリティに詳しそうな @yncat さんにお聞きしたいことが 🙇♂️
no-focusをつけると右クリックのメニューにフォーカスされないので、キーボードのみの方は右クリックメニューを実行するのが大変になりそうです。
これって結構不便だったりされますか・・・?
なんとなく、そもそも右クリックメニューはほぼ使わず、ショートカットキーで操作される方が多いのかなと想像しています。
一般的な右クリックとアクセシビリティのことをご存知でしたらご教示いただきたく・・・!!
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.
正解がこんな足元に転がっているとは思っていませんでした…難しく考えすぎていました。
代わりに原因究明&解決までしていただき、ありがとうございます!🙇♂️🙇♂️🙇♂️
フォーカスされないことで一部実装が変わりそうなので、その辺はまた考えます。
とりあえずno-focus
はつけておきました!
google document
canvas消したら見た目からは文字とか選択範囲とか消えたんですが、見えない文字がコピペできる…?!一体どうなってるんでしょう…
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.
まだ試してないですが、たぶんno-focus付けてしまうとキーボードでコンテキストメニュー使えなくなる気がする...
要動作検証
アクセシビリティ周りに関して、見解を共有します。 まずは、正直な話をします。 ただ、それをやらないでくださいというのは本末転倒だと思うので、前向きな方向で考えると。 最終的には、実際に動作を確認してみて、操作できるかできないか、ということになると思います。 このPRをローカルに持って来て実行しようとしたら、 error? warning? で実行できませんでした。この部分の修正いただくことってしゅっと可能でしょうか? もしかしたら warning で、ウィンドウを消せば使えるかもしれないのですが、 click outside (ダイアログの外側をクリック) の操作が画面見ないとできないので、自分ではこの画面を dismiss できず先に進めない状況です。
|
src/components/AudioCell.vue
Outdated
@paste="pasteOnAudioCell" | ||
@focus="setActiveAudioKey()" | ||
@keydown.prevent.up.exact="moveUpCell" | ||
@keydown.prevent.down.exact="moveDownCell" | ||
@mouseup.right="onRightClickTextField" | ||
@keydown.prevent.enter.exact="pushAudioTextIfNeeded()" | ||
:aria-label="`${textLineNumberIndex}行目`" |
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.
なんか私が入れたやつが怒られてますね
Attribute ":aria-label" should go before "@keydown.prevent.enter.exact"
ほんとに順番入れ替えれば治る問題なんだろうかw
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箇所エラー吐いてました!多分直りました。よろしくお願いします。 |
やっぱり、no-focusがついていることによって、スクリーンリーダーでコンテキストメニューに触ることが絶対に不可能になってしまいました。 |
確認ありがとうございます!
選択肢はこんな感じで、3番目を最初に検討すべきでしょうか? google documentはしっかり選択範囲を表示しつつTabキーとかで操作できてたので、謎のcanvasとかはそこら辺も考慮しての実装なのかもですね。 |
@yncat さんありがとうございます!! これは流石にだいぶ課題だなと感じました。 @thiramisu 3つの迂回策、同意見です。 google doctumentほんとにすごいですね。。。 そういえばニコ動も右クリックコンテキストメニューがあったので見てみたところ、クリックしたコメントがコンテキストメニューの一番上に表示される形になっていました! |
選択範囲が残る挙動の変更、アプリ全体に適用されるようにしてみました。 理由1. const on =
//*/ この行先頭の/の付け外しで切り替え
"focusout"; // eslint-disable-next-line prettier/prettier
/*/
"focusin"; // eslint-disable-next-line prettier/prettier
//*/
document.addEventListener(
on,
(event: FocusEvent) => {
if (event.target instanceof HTMLInputElement) {
event.target.selectionEnd = event.target.selectionStart;
console.log(
"to empty: ",
event.target.selectionStart,
",",
event.target.selectionEnd
);
console.log(event);
}
},
{ capture: true }
); 発火自体はしていて、代入もされているんですが、なぜか効果がありません… event.target.selectionEnd = -999; とすると正常な値に補正されているのが分かると思います。) 理由2. ちなみに、willDispatchFocusOrBlurも理由2により消せそうで消せません…回避のために開く際に手動でダミーエレメントをフォーカスすると、閉じる際に再フォーカスが必要になり、逆に処理が複雑になったりします。 |
なるほどです、よくわかりました!! 一旦issue化してみました。
なるほどです、今試してみたらたしかに問題が発生していそうでした!(ワークアラウンド適用後のコードで試していたかもしれません) 一旦ワークアラウンドなしでマージし、その後に修正を多角的に検討して試みるのはどうでしょう?
あーー全要素への適用は副作用が怖いので慎重になりたいかもしれません。 |
コード変更ありがとうございます! |
とりあえずマージを目指す、了解です!加減が分かっておらず、すいません。止めていただけて助かります。
ありがとうございます。こちらは一応の確認をしたまでで、挙動はほぼ以前のままなので、マージ的な面では大丈夫だと思います。
以下の実装を参考にして、ある程度妥当な実装にはできました。
確かにそうですね、AudioCellのみの版に戻しておきました。 一応全てResolvedにはなっているので、他にやり残していることなどもあれば教えていただけると助かります。 |
あーーーーなるほどです!!!! |
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です!!!
1点アニメーションをなくす提案をしていて、これがもしかしたら結構変更を必要とするかもしれません。
その場合は申し訳ないです。。。
Co-authored-by: Hiroshiba <hihokaruta@gmail.com>
Co-authored-by: Hiroshiba <hihokaruta@gmail.com>
Co-authored-by: Hiroshiba <hihokaruta@gmail.com>
イベント名だけそのまま
LGTM!!!!!!!!!!!!!!! いや~~~~~~~~~かなり手強かったですね!!!!!!! (@yncat さんもありがとうございました!) これでもともとのモチベーションであった「見た目上のテキストだけを編集」する機能の追加 じつは右クリックメニューに関してもう1つあったりします。こちらはこちらでどうやってダイアログに文字を渡すのかという課題がありそうですが、もしご興味あればぜひ・・・!!!! |
内容
コンテキストメニューの実装を Electron から Vue + Quasar に変更します。
設計の概要
既存の
components/MenuItem.vue
をコンポーネントとして使用し、<q-menu touch-position context-menu><q-list dense>
で囲いました。コピーなどのアクションはpure javascript寄りでゴリゴリ書きました。
AudioCell.vueの
// コピペしたときに句点と改行で区切る
(175~213行目)のあたりは貼り付け処理を書きやすいようにリファクタリングをしただけです。PR作成前からの不具合
その1: 以前の選択範囲が残る
詳細: #1364 (comment)
範囲選択状態からフォーカスを外し、そこからコンテキストメニューを開くと、なぜか以前の選択範囲が残ったままになる不具合です。以前の選択範囲を復元するのは
input.focus()
時のデフォルトの動作のようです。調査に時間がかかりそうです。その2: 特定条件下で貼り付け時にエラーが出る
空セルに実テキストが一行で末尾が
\n
の繰り返しで終わるテキスト(追記: 精確には改行を含むがAudioCellの数は増えないようなテキスト、でした)をCtrl+vで貼り付けようとすると開発者ツール上でエラーが出る不具合です。その動作を流用したためコンテキストメニューを使った貼り付けでも同じエラーが出ます。フォーカスに失敗してるだけで致命的ではなさそうなので、直せたら別PRとして送ろうと思います。
関連 Issue / PR
この機能の格納先としてコンテキルトメニューに動作を追加しようとしたのですが、
実装に失敗し、.vue試作の提案へのとりあえずの承諾を得られたため、今に至ります。
スクリーンショット・動画など
その他
将来的な話:
新たに発生する不具合[追記: 解消の目途が立ちました]
コンテキストメニューを開いている間、テキスト選択範囲 (青の反転) などが表示されなくなります。
原因不明で、現在調査中です。詳細: #1364 (comment)
報告後に気付いた調査の抜け:
<div>
内にテキストを追加して試したのですが、<input>
内の選択範囲は通常の選択範囲とは別の実装で操作する必要があるのを考慮すると、<q-input>
内では別の結果になる可能性があります。まだ試してないこと:
[追記: ここまで解消の目途が立ちました]