mikutter Advent Calendar 7日目 プラグイン書くの楽しいです( º﹃º` )
mikutter Advent Calendar 2013(http://www.adventar.org/calendars/120)7日目でございます。
早いもので、後少し寝れば 年末の納期がぁぁ!あの機能まだ人のアサイン決まって無いprz... 2013年も終わりですね。
思い返せば、2013年も色々ありました。
- MacBook Air買ってmikutterを動かしたら組織から命を狙われたり。
- 仕事の合間を縫ってOSCに薄い本を買いに行くも京都駅で遭難して夢潰えたり。
- mikutterのプラグインを猿の様に書きまくったり。
こんな充実した(?)mikutterライフの結果、僕の愛娘は現在こんな感じになってます。
はい、「シンプル」の意味を完全に取り違えてます。我ながらておいっす。
今回はこんな重病に至る過程で見つけた、ちょっとしたプラグイン作成Tipsをご紹介します。
メッセージをageる。
Messageにはcreatedとmodifiedって言う2つの日時を格納するフィールドがあります。
createdは投稿日時表示に使われる物で、modifiedはメッセージの並びを制御する物になります。
このmodifiedにnowを設定すると、メッセージをTLの一番上に持ってくる事が出来ます。
modifiedには未来の日時を設定する事も出来ます。
この場合は、TL上部にメッセージを一定時間張り付ける事が出来ます。
通知領域みたいに使えますね。
def pin(msg, pinning) if pinning then # メッセージを5分間TL上部に張り付ける msg[:modified] = Time.new + 5 * 60 msg[:pinned] = "pinned" # (※1) else msg[:modified] = Time.new msg[:pinned] = nil end # メッセージ変更をコアに通知する。 Plugin::call(:message_modified, msg) msg end
ちなみに、Messageには任意のフィールドを追加する事が出来ます(※1)
後続のフィルタで自プラグインが処理したメッセージの背景色を変えたいときとかの目印に使えて便利です。
filter_message_background_color { |message, color| if message.message[:pinned] then # ※1のフィールドが存在するなら背景色変更 color = UserConfig[:gosunkugi_background_color] end [message, color] }
ステータスバーにボタンを追加する
バージョンアップの度に季節感のあるメッセージが表示されるステータスバー。
実はここ。ツールバーになっていて、デフォルトのネギレンチの他にもボタンを追加する事が出来ます。
やり方は簡単。
roleが:windowなCommandを作るだけです。
command(:open_my_profile, name: 'プロフィール', condition: lambda{ |opt| true }, visible: true, icon: Service.primary.user_obj[:profile_image_url], role: :window) do |opt| Plugin.call(:show_profile, Service.primary, Service.primary.user_obj) end
GTKプラグインを操作する。
mikutterは0.2辺りからUIとコア部分の明確な分離が提唱されました。
それにより、UIプラグインの実装はコアから隠匿され、コアとUIは抽象化されたAPIで会話するようになりました。
その結果、標準のGTKプラグイン以外のUIプラグインが生まれてきました。
現在ではmikutter デーモンモードの様なUI不要な使い方や、Luna等の今となっては非力なワークステーションでも動作するCUIなインターフェースなどが登場しています。
一方、別のプラグインがGTKプラグインのオブジェクトを直接操作する事は出来なくなった・・・と思ってたら、ひっそりとインターフェースが存在してました。
:gui_get_gtk_widgetフィルタを使えば、抽象化GUIオブジェクトi_window、i_tab、i_timelineなどを引数にして、対応したGTKオブジェクトが取得出来ます。
on_window_created do |i_window| begin # メインウインドウを取得 window_tmp = Plugin.filtering(:gui_get_gtk_widget,i_window) if (window_tmp == nil) || (window_tmp[0] == nil) then next end # windowはGtk::Windowのインスタンス window = window_tmp[0] # 後はお好きに。