-
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
UPDATE: コンテキストメニューの内部処理の変更 #1364
Conversation
今後の機能追加などをしやすいように、ユーザー視点の見た目・機能が変わらないように実装を変更 mainブランチを使っていたので更新箇所を別ブランチへ切り出し。
src/electron/contextMenu.ts
Outdated
label: "全選択", | ||
role: "selectAll", | ||
}, | ||
] as ContextMenuItemConstructorOptions<TextEditContextMenuAction>[], |
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.
ここの as ~ はデフォルト設定を追加する際にtypoなどの判定をさせたくてあえて追加しました。
うまく実装すればこの場所に書かなくても同じことをできそうですが、良いアイディアが思いつきませんでした。
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.
PRありがとうございます!!
ちょっと確認なのですが、このあと雰囲気的に将来レンダラープロセス側(src/store
内とか*.vue
内など)からtemplateをsrc/electron/contextMenu.ts
に渡してMenu.buildFromTemplate
でカスタマイズ可能にするといった感じでしょうか 👀
この場合、もしかしたらContextMenuClickCallback
でレンダラープロセス側から実行したい関数を渡すことができないかもです。(ipc通信でコールバック関数を渡せないため)
把握されていたら余計なお世話なのですみません 🙇♂️
src/background.ts
Outdated
@@ -735,8 +735,8 @@ ipcMainHandle("SHOW_IMPORT_FILE_DIALOG", (_, { title }) => { | |||
})?.[0]; | |||
}); | |||
|
|||
ipcMainHandle("OPEN_TEXT_EDIT_CONTEXT_MENU", () => { | |||
textEditContextMenu.popup({ window: win }); | |||
ipcMainHandle("OPEN_CONTEXT_MENU", (_, { type }) => { |
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は予約語なので避けても良いかもとちょっとだけ思いました!
menuType
とかkind
とか。
(ちょっと気になった程度なのでそのままでもOKです!)
src/type/contextMenu.ts
Outdated
import { z } from "zod"; | ||
|
||
export const textEditContextMenuActionSchema = z.enum([ | ||
"切り取り", | ||
"コピー", | ||
"貼り付け", | ||
"全選択", | ||
]); | ||
export type TextEditContextMenuAction = z.infer< | ||
typeof textEditContextMenuActionSchema | ||
>; | ||
|
||
// 新たに追加したい場合はここに & で繋げる | ||
export type ContextMenuAction = TextEditContextMenuAction; | ||
|
||
export const ContextMenuTypeShema = z.object({ | ||
TEXT_EDIT: textEditContextMenuActionSchema, | ||
}); | ||
const ContextMenuTypes = ContextMenuTypeShema.keyof(); | ||
export type ContextMenuType = z.infer<typeof ContextMenuTypes>; |
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.
あ、こんな感じで実行時にjsonからparseしたりする予定がなければzodは使わなくてもOKです!
Line 279 in 6ff3a95
const parsedProjectData = projectSchema.parse(projectData); |
zod使わなければこんな感じのすっきりした型宣言が書けるはず。まあ、どちらでも!
export type TextEditContextMenuAction =
| "切り取り"
| "コピー"
| "貼り付け"
| "全選択";
// 新たに追加したい場合はここに & で繋げる
export type ContextMenuAction = TextEditContextMenuAction;
export type ContextMenuType = "TEXT_EDIT";
src/electron/contextMenu.ts
Outdated
// 返り値の型は Electron.Menu | undefined ではなく Electron.Menu 確定のはずですがどうすればいいか分かりません | ||
const checkOrBuildContextMenu = (type: ContextMenuType) => { | ||
if (menus.has(type)) return menus.get(type); |
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.
まあhasがtrueならgetがundefinedにならないのはプログラマ的には明確なので、こうとかでしょうか。
// 返り値の型は Electron.Menu | undefined ではなく Electron.Menu 確定のはずですがどうすればいいか分かりません | |
const checkOrBuildContextMenu = (type: ContextMenuType) => { | |
if (menus.has(type)) return menus.get(type); | |
const checkOrBuildContextMenu = (type: ContextMenuType) => { | |
if (menus.has(type)) { | |
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion | |
return menus.get(type)!; | |
} |
厳密にいうと別スレッドなどでdeleteされる可能性はなくもないので、より正確にはthrowするほうが合ってるかもです。
// 返り値の型は Electron.Menu | undefined ではなく Electron.Menu 確定のはずですがどうすればいいか分かりません | |
const checkOrBuildContextMenu = (type: ContextMenuType) => { | |
if (menus.has(type)) return menus.get(type); | |
const checkOrBuildContextMenu = (type: ContextMenuType) => { | |
if (menus.has(type)) { | |
const menu = menus.get(type); | |
if (menu == undefined) throw new Error("menu is undefined"); | |
return menu; | |
} |
Discordの方での議論の結果をこちらにもまとめておきます。 そもそもelectronから ということでひとまずは、コピー・ペースト・切り取り・全選択をピュアに近い実装でやってみてはどうか、という流れになりました。 |
レビューありがとうございます。
上記のようにelectron依存から脱却し、.vueファイル化するなどすれば色々やりようはある気がするのですが、もしかしたらまずいかもしれません。検討してみます。 この先も試作してみてはいたのですが、ちょうど謎のエラーで引っかかっていました! |
説明が不足していました 🙇♂️
定義し直した場合はelectronの依存から外せているので、一応方針としては大丈夫ではあったりします。(interfaceが同じなだけ)
なるほどです・・・! このPRの提案ですが、汎用的になった |
俯瞰的に見た設計について知識不足なところがあり、正直あまり正しく受け取れてないかもです。こちらこそすみません。 例えば、メニューバーと同じ感じで
にすれば、
のではと考えました。動作変更の実装は まあ、ひとまず「"TEXT_EDIT"を引数として切り出す」に留めてcloseなりが良さそうですね!思ったより奥が深い問題でした… |
今気づいたのですが、ネガティブな面はない気がしてきました!! ただ、electronに依存していてもネガティブな面は無いのですが、逆にポジティブな面も消えているのが課題かもです。 他にも右クリックに実装したい機能がちらほらあったりして、それらの実装に近づけるというのも利点だと思います! なので、もしよければ |
[追記]
この4.から5.の間、なぜか以前の選択範囲が表示され続けると思います。これがバグの根本原因のようです。
[追記2ここまで]
[追記3ここまで]
|
ご報告ありがとうございます!! 結構レアなケースなのでいったんパスでも良いかもと思いました!! |
.vue化、八割がた完成したのですが、1つ、UX的に良くない挙動が生まれてしまいました。 挙動の詳細: 設計の概要: 調査したことなど:
しても、直りませんでした。
よろしくお願いします。 |
@thiramisu 調査のご報告ありがとうございます!!! デモ版のQuasarなら正しく動きそうということでしたら、もしかしたらQuasarのバージョンを上げれば解決するのかもとちょっと期待しています。 また、挙動を見ると僕含め誰か何かわかるかもなので、お手数おかけしちゃうのですがプルリクエストの作成をお願いしてもよいでしょうか 🙇 |
内容
今後の機能追加などをしやすいように、ユーザー視点の見た目・機能が変わらないように内部実装だけを変更しました。
また、AudioCell(テキスト欄)上での操作しか想定されていなかったため、他の場所での操作を追加したくなった時のために、拡張性を高めました。
関連 Issue
上記の機能をコンテキストメニューに追加した方が良いのではという意見が出たため、それのための部分実装です。
その他
初PRのため、以下の点をどうするべきか分かりませんでした。実際の実装含め、酷い場合はPRをご却下ください…お手数をおかけします。
PRを送る前に清書をしてgithub側のコメントに移す形をとるべきでしたでしょうか?
src/type/contextMenu.ts
内に将来実装のために書いた部分がコメントアウトされていない状態で存在します。