Project

General

Profile

機能 #1200

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

Added by toshi_a 初音 over 1 year ago. Updated 7 months ago.

Status:
終了
Priority:
通常
Target version:
Start date:
2018-04-05
Due date:
% Done:

0%

プラグイン名:

Description

現在、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プラグインのモジュール空間に他のプラグインからアクセスするというダーティな方法を取らなくて良くなる。

Associated revisions

Revision d4bb0913 (diff)
Added by toshi_a 初音 8 months ago

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

Revision 3339351b (diff)
Added by toshi_a 初音 8 months ago

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

Revision 49f65fbb (diff)
Added by toshi_a 初音 8 months ago

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

Revision 5aea34db (diff)
Added by toshi_a 初音 8 months ago

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

Revision 3a59464b (diff)
Added by toshi_a 初音 8 months ago

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

Revision 5da16346 (diff)
Added by toshi_a 初音 8 months ago

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

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

Revision 55efb021 (diff)
Added by toshi_a 初音 8 months ago

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

Revision b72f83a2 (diff)
Added by toshi_a 初音 7 months ago

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

Revision 8aaf9163 (diff)
Added by toshi_a 初音 7 months ago

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

History

#1

Updated by toshi_a 初音 8 months ago

  • Target version changed from 3.7 to 3.9

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

#2

Updated by toshi_a 初音 8 months ago

  • Status changed from 新規 to 実装待ち

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

Updated by toshi_a 初音 8 months ago

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

#4

Updated by toshi_a 初音 8 months ago

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

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

Updated by toshi_a 初音 7 months ago

  • Status changed from 実装待ち to 終了

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

Also available in: Atom PDF