プロジェクト

全般

プロフィール

機能 #1200

mikutter CommandのEventオブジェクトにWorldなどをもたせる

toshi_a 初音10ヶ月前に追加. 10日前に更新.

ステータス:
終了
優先度:
通常
担当者:
対象バージョン:
開始日:
2018-04-05
期日:
進捗率:

0%

プラグイン名:

説明

現在、mikutter Commandを呼び出す時には、 command イベントフィルタでmikutter Commandのリストを得て、Commandに与えるパラメータをまとめた Plugin::GUI::Event オブジェクトを引数にCommandを呼ぶ。
Plugin::GUI::Event をModelとして提供し、新たに呼び出し時に注目しているWorldをEventのプロパティに含めるようにすることで、以下の問題の解決を図る。

  • Commandのcondition呼び出し時と本体呼び出し時でCurrent Worldが異なる場合、conditionが成立しないときに本体を呼び出してしまう可能性がある
  • 注目すべきWorldが通知されないために、ほとんどのCommandはCurrent Worldを参照している

Commandの呼び出し側が注目すべきWorldを指定する場合、呼び出し側がCurrent Worldを参照することになり、CommandがCurrent Worldに依存する必要が無くなる。

また、コマンドを呼び出すプラグインは Plugin::GUI::Event のインスタンスを作る必要があるが、これをModelにすることで、GUIプラグインのモジュール空間に他のプラグインからアクセスするというダーティな方法を取らなくて良くなる。

関係しているリビジョン

リビジョン d4bb0913 (差分)
toshi_a 初音27日前に追加

Plugin::GUI::EventをDiva::Modelにする refs #1200

リビジョン 3339351b (差分)
toshi_a 初音27日前に追加

command DSLではcurrent worldを使わず、指定されたWorldを使う refs #1200

リビジョン 49f65fbb (差分)
toshi_a 初音27日前に追加

Plugin::Gtk::ToolbarGeneratorでイベントが発生時に正しいWorldを渡す refs #1200

リビジョン 5aea34db (差分)
toshi_a 初音26日前に追加

[shortcutkey] イベント呼び出し時にcurrent worldを渡す refs #1200

リビジョン 3a59464b (差分)
toshi_a 初音26日前に追加

[shortcutkey] WorldをUIから選べるようにした refs #1200

リビジョン 5da16346 (差分)
toshi_a 初音26日前に追加

[shortcutkey] キー設定時にWorldを選べるようにした refs #1200

- 選択したWorldのURIを保存
- コマンド実行時にURIをもつWorldを探索して渡す

リビジョン 55efb021 (差分)
toshi_a 初音26日前に追加

[command] post_itは、commandで指定されたWorldのcompose spellを呼ぶ refs #1200

リビジョン b72f83a2 (差分)
toshi_a 初音10日前に追加

[command] Plugin::Command::Conditionをdeprecateに refs #1200

リビジョン 8aaf9163 (差分)
toshi_a 初音10日前に追加

ふぁぼれてへんやん refs #1200

履歴

#1 toshi_a 初音約1ヶ月前に更新

  • 対象バージョン3.7 から 3.9 に変更

opt.world みたいに書いたら対象のWorldにアクセスできると良さそう

#2 toshi_a 初音26日前に更新

  • ステータス新規 から 実装待ち に変更

post_itイベントはpostboxの内容を投稿するが、postboxは常にcurrent worldに作用するようになっているので手を入れる必要がある。

また、対応していない、そもそもWorldを選ぶことに意味がないcommandについてもWorldの選択ウィジェットが表示されるので、対策する必要がある。

A) specファイルのバージョンを見る

commandを定義したプラグインがmikutter 3.9以上の場合だけWorldを選べるようにする。
ただし、この仕様にした場合は =opt.world= が存在しないバージョンならcurrent worldを使うといった実装ができなくなる(mikutter 3.9以上をspecファイルで要求すると、3.8以前ではプラグインがロードできなくなるため)。

B) world_filterオプション

今はすべてのWorldが選択肢として表示されているが、候補となるWorldをフィルタする条件をcommand DSLのオプションで指定する。

command(:post_it,
        world_filter: ->w{ w.is_a? Plugin::Twitter::World },

Worldのリストに対してselect(&world_filter)し、残ったWorldをユーザに提示する。
ここに、 =:never= とか入れておくとそもそもWorldをキーコンフィグで設定できないようにすると良さそう。

また、conditionよりも高速であることが期待できるので、 =world_filter === world && condition === Event.new(...)= のような条件にすることもできそう。この挙動を前提にすると、プラグインがconditionにWorldの条件を書かなくて良くなる。

#3 toshi_a 初音26日前に更新

あっ =Plugin::Command::Condition= も =opt.world= みるようにしないと…

#4 toshi_a 初音26日前に更新

優先順位をつけてまとめる。

post_itイベントはpostboxの内容を投稿するが、postboxは常にcurrent worldに作用するようになっているので手を入れる必要がある。

done. pushした。

あっ Plugin::Command::Conditionも opt.world みるようにしないと…

やらずに、今Plugin::Command::Conditionを使っている部分をその場で実装する形に置き換える。

まず、Plugin::Command::Conditionの実装を変更すると、 condition:opt.world を見ているのにブロックは :world_current を見ていることになるので、古いプラグインを使っているユーザにとっては混乱の元になる。

加えて、せっかくなのでPlugin::Command::Conditionをすべてdeprecateにする。

A) specファイルのバージョンを見る

一旦保留。やるかも

B) world_filterオプション

本来はspellが対応するWorldをふるいにかけるために定義してほしいが、特定のslugを持つWorldを指定するのが横行しそう(Twitter専用、とか)。
せいぜい5,6個しかないWorldを1,2個にできるメリットや、ほんの少しパフォーマンスが上がるかもしれない程度だと思うと、実はやらないほうがよいかもしれない。

#5 toshi_a 初音10日前に更新

  • ステータス実装待ち から 終了 に変更

多分動くと思うからmergeした

他の形式にエクスポート: Atom PDF