プロジェクト

全般

プロフィール

機能 #722

機能追加:ユーザスキンの適用

Satoshi Okunoほぼ3年前に追加. 2年以上前に更新.

ステータス:
進行中
優先度:
通常
担当者:
対象バージョン:
開始日:
2014-10-19
期日:
進捗率:

0%

プラグイン名:
skin

説明

TLで言っていた件です。
下記仕様のユーザスキンの仕組みを提案します。

(1)ユーザースキンディレクトリ
ユーザースキンは~/.mikutter/skin/のサブディレクトリに格納する事にします。

ユーザースキンディレクトリはUserConfig[:skin_dir]に相対パスで指定する事とします。

(2)設定画面
設定画面はプラグインとして実装します。
肝は前述のUserConfig[:skin_dir]の設定です。

設定画面は複数インストールされたスキンから1つを選ぶI/Fを持ちます。
現状は*.pngのあるディレクトリをユーザースキンディレクトリ候補としています。

これは最近出てきたスキン「miq」をそのまま展開して使える様にと言うポリシーです。
(miq/darkgray/64/*.pngとかそんな階層になってるので)

でも、これだとWebでのプレビュー用pngを置いているディレクトリもピックアップされるのでイマイチです。

ディレクトリ構成を決めてしまってもいいかも知れません。

ユーザースキンの変更は再起動にて反映される様にします。

(3)画像ファイルの優先度
ユーザースキンは全画像を用意する必要は無く、存在しない画像はデフォルトのスキンが適用されます。
それでもダメならデフォルトの画像(後述)を表示します。

(4)プラグインへのSkinの解放
miqでは一部のプラグインのアイコンも提供してくれています。
折角なのでプラグインもスキンの恩恵を受けられる様にしたいです。

具体的にはSkin::get()にデフォルト画像を渡せる様にします。

プラグインからはこんな感じに使います。第二引数がデフォルトの画像のパスです。

Skin.get(“hoge.png”, "プラグイン自前のhoge.png”))

ユーザースキンもしくはデフォルトスキンに該当する名前の画像があればそれを採用し、無ければプラグイン内蔵の画像を返す様にしたいなと。

なお、Skin.getの第二引数を省略した場合、従来通り、デフォルトスキンのnotfound.pngが適用されます。

こんな感じで実働する物を作ってみましたので添付します。
ぜひ一度揉んで頂ければと思います。

skin.rb 表示 - Skin魔改造 (707 Bytes) Satoshi Okuno, 2014-10-20 00:35

mikutter_skin_manager_beta.rb 表示 - 設定画面 (503 Bytes) Satoshi Okuno, 2014-10-20 00:36

0001-DSL.patch 表示 (2.15 KB) Satoshi Okuno, 2014-10-26 22:30

0001-.patch 表示 - パッチ (3.26 KB) Satoshi Okuno, 2014-11-01 21:47

スクリーンショット 2014-11-01 20.47.41.png 表示 - イメージ (144 KB) Satoshi Okuno, 2014-11-01 21:48

関係しているリビジョン

リビジョン d902ca9f (差分)
toshi_a 初音ほぼ3年前に追加

サードパーティスキン refs #722

リビジョン 7f1238ca (差分)
toshi_a 初音2年以上前に追加

スキンのパスを得るプラグインDSL refs #722

リビジョン c28135a4 (差分)
toshi_a 初音2年以上前に追加

設定画面のブラッシュアップ refs #722

履歴

#1 toshi_a 初音ほぼ3年前に更新

  • ステータス新規 から 進行中 に変更
  • 担当者Satoshi Okuno にセット
  • 対象バージョン3.2 にセット
  • プラグイン名skin.rb から skin に変更

ありがとうございます。実際に検証して、topicブランチを作成してみました。ちょっとバグがあったので修正しています。
実装時期は、早くて3.2 (12/25リリース予定)にしましょう。
コードと実際の挙動を見せてもらったうえで、簡単に思いを書いておきます。

一行で言うと、(4)だけもう少しクオリティを高めたいと思いました。

(1)ユーザースキンディレクトリ

現状のスキン構造は外部提供を想定できていないので、別のディレクトリを作ることには賛成です。

(2)設定画面

概ね賛成ですが、なんとか再起動無しに反映させたいなぁと思っています。策は一応あって、Gdk::Pixbufを書き換えてから、それを表示しているウィジェット(Gtk::Image等)に再描画イベントを送ってやると、表示されている画像が変わります。
タイムラインに表示されるものは、上記の方法では更新できません。レンダリングが自前だからです。故にこれに関しては特に難しいことはありません。
ダイナミックにスキンを変更するのは、まだ技術的な検証が不足しているけれど是非やりたいところです。この点に関しては俺がやりたいことなのでちょっとやってみます。もぐのさんもよかったら検証してみてもらえると有難いです(これに限りませんが、3.1リリース作業を優先しているので…)。

また、ディレクトリ構造については、miqのあれは若干都合が悪いですね。なので以下を提案します。この構造が良いと思った理由は(4)を参照してください。スキンはまだ恐らく1例しか作成されていないので、こちらが決めて従ってもらうというスタンスで良いかと思います。

+ skin
  +- (skin_slug)
  |  +- (.mikutter.yml的な何か)
  |  +- loading.png等
     +- (plugin_slug)
     |  `- (image.png)

標準プラグインが提供してるものをこれに併せて、例えばhome_timeline以下に入れるようなことはしようとは思いません。理由は、互換性のためです(抽出タブのアイコンに設定されているかもしれない)。

(3)画像ファイルの優先度

賛成です。

(4)プラグインへのSkinの解放

これは素晴らしいですね。是非やりましょう。
しかし、Skin.getにフォールバック先の画像を指定するのはあまり美しくないと思いました。第一引数も第二引数も、「表示する画像」という、本質的には同じものを指定しているからです。スキン画像のフォールバック機能があるので、これを拡張して対応できたらより良いと思います。

具体的には、サードパーティプラグインでは、例えば以下のように画像を呼び出し

Skin.get("plugin_slug/image.png")

画像の探索順序としては、「(ユーザが指定したスキン)→プラグインの提供するスキン→バニラ→(notfound)」という順番です。
このAPIを実現するために、プラグインのスキンファイルの配置を以下のようにして:

+ plugin_slug
  +- plugin_slug.rb
  `- skin
     `- image.png

サードパーティスキンは、以下のようなファイルの配置でこれをオーバーライド出来るようにしてはどうでしょうか。
+ shiitake
  `- plugin_slug
     `- image.png

いかがでしょうか。

一点補足しておくと、上記構造では、プラグインが提供するスキンは、バニラや他のプラグインのスキンを書き換えることは想定してません。それができると、プラグインとしてスキンを配布できるようになりますが、一方でスキンの設定画面が大変なことになると思ったからです。プラグインはプラグイン、スキンはスキンという方針で考えています。

まとめ

  • プラグインのスキンは気に入りましたが、APIを前述のようにできたらと思いました
  • 伴って、ディレクトリ構成を見なおしてはどうでしょう。
  • スキンのダイナミックな入れ替えは、主に私がやってみたいと思います。

#2 Satoshi Okunoほぼ3年前に更新

  • 担当者Satoshi Okuno から toshi_a 初音 に変更

検討有り難うございます。概ね賛同頂けた様で安心しました。
(4)のプラグインに対するスキンへのコメントをふまえ、私の意見を述べます。

(1)ユーザスキンのディレクトリ構成のうち、プラグイン毎のディレクトリについて
思いとしてはプラグイン特化のアイコンも標準機能のアイコンと同一階層に置きたいです。

shiitake
|-close.png
|-image.png(某プラグインを想定したアイコン)

実は拙作mikutter-datasource-searchとmikutter-search-utilsは共に「再読み込みボタン」を持っており、そのアイコンに同じ名前(reload.pngだっけ)を使っています。

プラグインごとにディレクトリを分けた場合、スキン側で両方のプラグインに対してreload.pngを提供して貰う必要が生じます。
また、新たに何かを再読み込みするプラグインを作った時にも対応が必要です。

他のプラグインを想定したアイコンに便乗出来る仕組みであれば、UIの統一が図れて都合がいいと考えてます。

(2)プラグインでのアイコンの取得について
プラグインアイコンのフォールバック先はほぼ100%自分自身だと思うので、指定を不要にしたいですね。
でも、そうするとスキンを取得する際に、呼び出し元のプラグインを特定する必要が出てきます。
提案として、PluginにDSLを追加するのはどうでしょう。

Plugin.create :test do
icon = get_skin("teokure.png")
end

こうすればget_skin()は呼び出し元プラグインのスラッグが取得出来るので、スキンディレクトリの特定が可能かと。
実装は、としぁさん提案のSkin.getを呼び出す形になると思います。

coreでは従来通りSkin.get()を使う感じです。

以上、どないでしょう。

#3 Satoshi Okunoほぼ3年前に更新

暇だったのでプラグインのDSL部分を書いてみました。

Skin.get()にはプラグインスラッグを渡すのではなく、フォールバック用の画像ファイルのあるディレクトリを渡す様にしました。
プラグインスラッグ->プラグインのスキンディレクトリの変換はPlugin.skin_get()にやらせてます。

併せて意図確認頂ければと思います。

#4 toshi_a 初音ほぼ3年前に更新

  • 担当者toshi_a 初音 から Satoshi Okuno に変更

プラグインの画像を解決するDSLメソッド、素晴らしいですね。これでいきましょう。ただ、名前はget_skinよりskinのほうが好みです。最近、Rubyらしくない名前をつけてることが多いなと個人的に反省しているところなので…(ゲッタにget_とつけるのはあまりRubyらしくないですよね)。
それで、今言うべきことではないですが、そもそも「スキン」より「テーマ」とか「リソース」のほうが響きが良い気がしているので、それに合わせてこのメソッド名も変えたいかなと思っています(Skin.getは互換性のために残します)。

(1)ユーザスキンのディレクトリ構成のうち、プラグイン毎のディレクトリについて
思いとしてはプラグイン特化のアイコンも標準機能のアイコンと同一階層に置きたいです。
実は拙作mikutter-datasource-searchとmikutter-search-utilsは共に「再読み込みボタン」を持っており、そのアイコンに同じ名前(reload.pngだっけ)を使っています。

もともと、名前の衝突は問題でしかないと思っていて、意図せず別の画像ファイルを上書きする可能性を懸念していました。
しかし一方でreloadのように、標準で存在しないが、スキンで提供されていると便利なものもありそうですね。そういったメリットがあるなら、異なる画像ファイルが採用される危険性にはひとまず目を瞑っても良いかなと思いました(プラグイン開発者に、ファイル名にプレフィックスをつけてもらったりして回避してもらいましょう)。

それで、ディレクトリ構成はやっぱりどんな構成でも再帰的に探索するというのは、無駄も多いし探索順序も判りづらいので、単一のディレクトリの中に入れることにしたいですね。

#5 Satoshi Okunoほぼ3年前に更新

諸々賛同ありがとうございます。

メソッド名について異論ありません。(ゲッターと言うよりは動詞_名詞のstaticおじさん的発想でした。)
スキンに新しい名前が振られる時についでに変更頂ければ。

一先ずコア部分はこんな感じとして、次は設定画面の方をもうちょいマシにして行こうと思います。
 ・スキンディレクトリの構造固定
 ・「再起動がいるよ」ラベルの削除(実験成功期待しますv)
 ・アイコンのプレビュー表示とか出来んかな

出来次第このIssueに登録する感じで良いでしょうか。

#6 Satoshi Okunoほぼ3年前に更新

三連休の景気付けに設定画面改造してみました。
どないでしょうか。ご意見お願いします。

#7 toshi_a 初音2年以上前に更新

  • 担当者toshi_a 初音 から Satoshi Okuno に変更

長いこと手を付けられていなくて申し訳ないです。
パッチは全て取り込みました。
確認してみたのですが、miqスキンを取り込む方法がわかりませんでした。ちゃんと読んで調べる余裕が無いので、教えてもらっていいですか。
miqの中身を以下のように展開しました。ソースの内容はpushしてるとおりです。

~/.mikutter/skin/
   |-- darkgray
   |    |-- 64
   |    |    |-- activity.png
   |    |    |-- arrow_followed.png
   |    |    |-- arrow_following.png
   |    |    |-- ...
   |    |    |-- plugin
   |    |    |    |-- aclog.png
   |    |    |    |-- bookmark-view.png
   |    |    |    |-- chitanda.png
   |    |    |    |-- ...
   |-- default
   |    |-- 256
   |    |    |-- activity.png
   |    |    |-- arrow_followed.png
   |    |    |-- arrow_following.png
   |    |    |-- ...

#8 Satoshi Okuno2年以上前に更新

  • 担当者Satoshi Okuno から toshi_a 初音 に変更

いえいえ、お疲れ様です。

ディレクトリの階層は1段しかサポートしていないので、darkgrayやdefaultの直下にpngファイルを移動してみて下さい。
(darkgray/64やdarkgray/64/pluginの*.pngファイルが読めない。)

あまりmiqのディレクトリ構成は尊重してない状況です。

#9 toshi_a 初音2年以上前に更新

うまくいきました。最終どっちになったか混乱してました。

3.2ではこの機能をexperimentalみたいな感じで取り込もうと思っています(多分大丈夫ですが深く検証できてません、ごめんなさい)。
要は、このリリース後にドラスティックな変更をしてもよいということです。大体固まってはいるので大丈夫だと思いますが、APIなどを変更できる余地は残しておきましょう。
こちらのこの後の作業としては、全標準プラグインを新しいプラグインDSLに置き換えていこうと思っています。再起動なしのリロードは又時間が取れたらやってみます(いつになることやら…)。

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