やること: チケット
https://dev.mikutter.hachune.net/
https://dev.mikutter.hachune.net/favicon.ico?1619448608
2022-01-16T03:51:58Z
やること
Redmine
mikutter - 提案 #1581 (分類待ち): Color Model
https://dev.mikutter.hachune.net/issues/1581
2022-01-16T03:51:58Z
toshi_a 初音
toshi.alternative@gmail.com
<p>mikutter上で色を表現するデータオブジェクトを標準提供する。</p>
<a name="やりたいこと"></a>
<h1 >やりたいこと<a href="#やりたいこと" class="wiki-anchor">¶</a></h1>
現在、色情報を利用する場面は以下のとおりだが、色の表現方法が異なる:
<table>
<tr>
<th>名前</th>
<th>形式</th>
<th>値の範囲</th>
</tr>
<tr>
<td> UserConfig </td>
<td> RGB </td>
<td> 0..0xffff </td>
</tr>
<tr>
<td> Cairo::Color::RGB </td>
<td> RGBA </td>
<td> 0..1 (Float) </td>
</tr>
<tr>
<td> Gtk::Color </td>
<td> RGB </td>
<td> 0..0xffff </td>
</tr>
<tr>
<td> Gdk::RGBA </td>
<td> RGBA </td>
<td> 0..1 (Float) </td>
</tr>
<tr>
<td> CSS </td>
<td> RGB </td>
<td> 0..0xff </td>
</tr>
</table>
<p>現状だと、色をどこで利用するかによって適切に変換しなければならない。<br />異なるクラスなのは仕方ないにしても、UserConfigからCairoに変換するために、各要素を0xffffで割るみたいな処理を毎回実装しなければならない。</p>
<p>レンダリングを行う層以外ではそういった詳細には立ち入りたくないし、現にGtk3移行のときに変換処理がバグっていたことがあった。</p>
<p>mikutterプラグインの共通の色の表現があると、こういった問題を解決できる。</p>
<a name="インターフェイス"></a>
<h1 >インターフェイス<a href="#インターフェイス" class="wiki-anchor">¶</a></h1>
<p>RGBAの要素のみを要求する。<br />精度は、各要素を8bitで返すインターフェイスと、0-1のFloatやRationalで返すインターフェイスが考えられる。<br />アルファブレンド値自体は、無いと困るケースがあるので、このデータオブジェクトで表現に対応する。</p>
<p>ディスプレイは1677万色の表現能力しか持っておらず、24bit (0-255)で十分表現できる。したがって、現在採用しているほとんどの表現形式が過剰である。<br />また、これは人間の識別精度を十分超えているらしく、mikutterのユーザは今のところ地球人のみであると考えているので、これ以上の精度は不要である。</p>
<p>以上のことから、各8bitでも十分である。</p>
<p>一方で、0-1で表現すると、計算が楽で、何をやっているのかわかりやすいというメリットがある。<br /><pre><code class="c++ syntaxhl"><span class="kt">uint16_t</span> <span class="nf">conv</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="n">c</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="n">c</span> <span class="o">*</span> <span class="mh">0x101</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">uint16_t</span> <span class="nf">conv</span><span class="p">(</span><span class="kt">float</span> <span class="n">c</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="n">c</span> <span class="o">*</span> <span class="mh">0xffff</span><span class="p">;</span>
<span class="p">}</span>
</code></pre><br />ん〜どうしよっかな〜</p>
<a name="永続化について"></a>
<h1 >永続化について<a href="#永続化について" class="wiki-anchor">¶</a></h1>
<p>UserConfigは古いバージョンとの互換性のために現在の形式を維持しなければならない。</p>
<a name="表現"></a>
<h1 >表現<a href="#表現" class="wiki-anchor">¶</a></h1>
<p>各データクラスは、異なる方法でデータを保持するが、同じインターフェイスを持っている。</p>
<p>TrueColor (32bit color)<br /><pre><code class="ruby syntaxhl"><span class="no">Color</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="mi">255</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="c1"># red</span>
<span class="no">Color</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="mi">255</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="c1"># red</span>
<span class="no">Color</span><span class="p">.</span><span class="nf">parse</span><span class="p">(</span><span class="s1">'#FF0000'</span><span class="p">)</span> <span class="c1"># red</span>
</code></pre></p>
<p>ContinuouslyColor<br /><pre><code class="ruby syntaxhl"><span class="no">ContinuouslyColor</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="mf">1.0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="c1"># red</span>
<span class="no">ContinuouslyColor</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="mf">1.0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="c1"># red</span>
</code></pre><br />同じインターフェイスを実装しColor Modelの要件を満たす独自の実装をプラグインが行うことによって、mikutterの色の表現方法を拡張できるように注意する。</p>
<a name="操作"></a>
<h1 >操作<a href="#操作" class="wiki-anchor">¶</a></h1>
<p>spellを使った場合、結果は必ずPromiseを受け取ることになる。色の操作はリアルタイム性が求められることが多く、spellは不適切である。<br />よくありそうな操作についてはColor Pluginで用意する。</p>
<a name="UserConfigの読み込み書き出し"></a>
<h2 >UserConfigの読み込み、書き出し<a href="#UserConfigの読み込み書き出し" class="wiki-anchor">¶</a></h2>
<p>RGBAの各要素は同じ方法で取得できるため、UserConfigに書き出せるはず。<br />現実的には、今の所UserConfigはあらゆるModelを永続化するような機能はもっていないため、別のところに変換ルーチンを実装しなければならない。<br /><pre><code class="ruby syntaxhl"><span class="n">c</span> <span class="o">=</span> <span class="no">Plugin</span><span class="o">::</span><span class="no">Color</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">)</span>
<span class="no">UserConfig</span><span class="p">[</span><span class="ss">:color</span><span class="p">]</span> <span class="o">=</span> <span class="n">c</span> <span class="c1"># 理想</span>
<span class="no">UserConfig</span><span class="p">[</span><span class="ss">:color</span><span class="p">]</span> <span class="o">=</span> <span class="no">Color</span><span class="p">.</span><span class="nf">export_to_user_config</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="c1"># 現実</span>
</code></pre><br />一方、読み込みはColor Modelだったらどんなものに復元しても良いため、もう少し直接的になりそう。<br /><pre><code class="ruby syntaxhl"><span class="n">c</span> <span class="o">=</span> <span class="no">UserConfig</span><span class="p">[</span><span class="ss">:color</span><span class="p">]</span> <span class="c1"># 理想</span>
<span class="no">Plugin</span><span class="o">::</span><span class="no">UserConfigColor</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="ss">:color</span><span class="p">)</span> <span class="c1"># こういうのがあってもよい?</span>
</code></pre></p>
<a name="印字変換"></a>
<h2 >印字、変換<a href="#印字変換" class="wiki-anchor">¶</a></h2>
<p>例えばHTML形式で印字したいなど。すべてのColor Modelに実装を要求すると印字形式が拡張できないが、インターフェイスが統一されているのでどうとでもなる。<br /><pre><code class="ruby syntaxhl"><span class="k">def</span> <span class="nf">html_color</span><span class="p">(</span><span class="n">color</span><span class="p">)</span>
<span class="s1">'#%02f%02f%02f'</span><span class="p">.</span><span class="nf">format</span><span class="p">(</span><span class="n">color</span><span class="p">.</span><span class="nf">r</span><span class="p">,</span> <span class="n">color</span><span class="p">.</span><span class="nf">g</span><span class="p">,</span> <span class="n">color</span><span class="p">.</span><span class="nf">b</span><span class="p">)</span>
<span class="k">end</span>
</code></pre><br />Cairo::Colorに変換するといった処理は、gtk3プラグインなどが各々提供する。<br /><pre><code class="ruby syntaxhl"><span class="no">Plugin</span><span class="o">::</span><span class="no">Gtk3</span><span class="p">.</span><span class="nf">cairo_color</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
</code></pre></p>
<a name="比較"></a>
<h2 >比較<a href="#比較" class="wiki-anchor">¶</a></h2>
<p>==で比較する場合、RGBA各要素を0-255で表現した値が等しければ等しいとする。<br />Color Modelインターフェイスの精度以上で比較する意味がないからである。</p>
<p>同様に、eql?とhashもすべてのColorModelが同じ計算式で値を算出しなければならない。</p>
<p>大小比較は、多分ソートすることがないので別にいいや</p>
<a name="標準色"></a>
<h2 >標準色<a href="#標準色" class="wiki-anchor">¶</a></h2>
<pre><code class="ruby syntaxhl"><span class="n">c</span> <span class="o">=</span> <span class="no">Plugin</span><span class="o">::</span><span class="no">Color</span><span class="o">::</span><span class="no">RED</span>
</code></pre>
<p>16色とか256色とか用意する。</p>
<a name="備考"></a>
<h1 >備考<a href="#備考" class="wiki-anchor">¶</a></h1>
<p><a href="https://github.com/red-data-tools/red-colors" class="external">red-colros gem</a> は採用しない。<br />目的に対してできることが多すぎるため。<br />あと、色に対する複雑な演算をしたいわけじゃないので、その程度の理由で直接依存を増やしたくない。</p>
<p>Diva::Modelのatomic typeとして追加することも考えたが、wellknownではあるけどatomicではないかな</p>
mikutter - 提案 #1566 (分類待ち): mastodonのAPIアクセスにFaradayを使う
https://dev.mikutter.hachune.net/issues/1566
2021-12-31T09:27:32Z
toshi_a 初音
toshi.alternative@gmail.com
<p><a class="issue tracker-12 status-5 priority-4 priority-default closed" title="提案: 起動時、直近のリプライが読み込まれない (終了)" href="https://dev.mikutter.hachune.net/issues/1427">#1427</a> の派生タスク。<br /><a class="issue tracker-1 status-5 priority-4 priority-default closed" title="バグ: Lets EncryptのCA証明書の期限切れ (終了)" href="https://dev.mikutter.hachune.net/issues/1507">#1507</a> Lets EncryptのCA証明書の期限切れ のようなこともあったため、APIアクセスライブラリを <a href="https://github.com/lostisland/faraday" class="external">Faraday</a> に統一する。</p>
mikutter - 提案 #1565 (分類待ち): mastodon_restプラグインとmastodon_sse_streamingプラグインの統合
https://dev.mikutter.hachune.net/issues/1565
2021-12-31T09:21:54Z
toshi_a 初音
toshi.alternative@gmail.com
<p><a class="issue tracker-12 status-5 priority-4 priority-default closed" title="提案: 起動時、直近のリプライが読み込まれない (終了)" href="https://dev.mikutter.hachune.net/issues/1427">#1427</a> の派生タスク。<br />この2つのプラグインは、Mastodonからデータを取ってきてデータソースの更新やイベントの発行を行っている。<br />データソースを使うとき、データの取得方法には関心がないので、別々に制御する必要がない。<br />mastodon_sse_streamingのAPI接続の方法としてREST APIの定期アクセスを実装すればシンプルに収まりそうなので、統合を検討してみる。</p>
mikutter - バグ #1552 (分類待ち): 設定>表示 で拡大率を変えると、拡大率変更前にレンダリングされたMiraclePainterのユーザアイコンサイズが倍率変更前のままになる
https://dev.mikutter.hachune.net/issues/1552
2021-12-09T12:24:21Z
toshi_a 初音
toshi.alternative@gmail.com
mikutter - バグ #1544 (分類待ち): shortcutkey: クリックに割り当てたコマンドがTLで実行されない
https://dev.mikutter.hachune.net/issues/1544
2021-11-20T07:03:12Z
toshi_a 初音
toshi.alternative@gmail.com
<p>クリック、ダブルクリックなどにコマンドを割り当てることができるが、タイムライン上で呼び出すことができない。</p>
mikutter - 提案 #1439 (分類待ち): イベントリスナーを一括で有効・無効にする機能
https://dev.mikutter.hachune.net/issues/1439
2020-03-18T15:23:44Z
toshi_a 初音
toshi.alternative@gmail.com
<p>ストリーミングAPI設定など、特定の条件下でのみ有効になるイベントハンドラ(on_*, filter_*, subscribe, collection, generate)のまとまりを定義したい。</p>
<a name="原案A"></a>
<h1 >原案A<a href="#原案A" class="wiki-anchor">¶</a></h1>
<pre><code class="ruby syntaxhl"><span class="n">userconfig_if</span><span class="p">(</span><span class="ss">:streaming_enable</span><span class="p">)</span> <span class="k">do</span>
<span class="n">subscribe</span><span class="p">(</span><span class="ss">:event</span><span class="p">)</span> <span class="o">...</span>
<span class="n">on_event</span> <span class="o">...</span>
<span class="k">end</span>
</code></pre>
<p><code>UserConfig[:streaming_enable]</code> がfalse→trueになったときにブロックを一度実行。ブロック内で定義されたハンドラに専用のタグを付けておく。<br />false→trueになったとき、そのタグを持ったハンドラを全てdetachする。</p>
<a name="原案B"></a>
<h1 >原案B<a href="#原案B" class="wiki-anchor">¶</a></h1>
<pre><code class="ruby syntaxhl"><span class="n">sw</span> <span class="o">=</span> <span class="n">switch</span> <span class="k">do</span>
<span class="n">subscribe</span><span class="p">(</span><span class="ss">:event</span><span class="p">)</span> <span class="o">...</span>
<span class="n">on_event</span> <span class="o">...</span>
<span class="k">end</span>
<span class="n">on_userconfig_modify</span> <span class="k">do</span> <span class="o">|</span><span class="nb">name</span><span class="p">,</span> <span class="n">val</span><span class="o">|</span>
<span class="n">val</span> <span class="p">?</span> <span class="n">sw</span><span class="p">.</span><span class="nf">on</span> <span class="p">:</span> <span class="n">sw</span><span class="p">.</span><span class="nf">off</span>
<span class="k">end</span>
</code></pre>
<p>汎用的なもの。onとoffメソッドは冪等に振る舞う。</p>
<a name="原案C"></a>
<h1 >原案C<a href="#原案C" class="wiki-anchor">¶</a></h1>
<pre><code class="ruby syntaxhl"><span class="n">tag</span> <span class="o">=</span> <span class="n">handler_tag</span> <span class="k">do</span>
<span class="n">subscribe</span><span class="p">(</span><span class="ss">:event</span><span class="p">)</span> <span class="o">...</span>
<span class="n">on_event</span> <span class="o">...</span>
<span class="k">end</span>
<span class="n">on_userconfig_modify</span> <span class="k">do</span> <span class="o">|</span><span class="nb">name</span><span class="p">,</span> <span class="n">val</span><span class="o">|</span>
<span class="n">val</span> <span class="p">?</span> <span class="n">tag</span><span class="p">.</span><span class="nf">enable</span> <span class="p">:</span> <span class="n">tag</span><span class="p">.</span><span class="nf">disable</span>
<span class="k">end</span>
</code></pre>
<p>原案Bを、既存機能であるhandler_tagに有効化/無効化オプションを付けて実現するもの。<br />ブロックはその中で定義されたハンドラにタグを付与するだけなので、</p>
<p>タグがついているものに有効フラグがつくのはわかりやすいが、ネストされた場合は有効フラグのANDを取りたいので、タグ機能とは相性が悪いかもしれない。</p>
mikutter - 機能 #1393 (新規): FormDSLにコマンド選択ウィジェットを追加
https://dev.mikutter.hachune.net/issues/1393
2019-09-21T01:09:16Z
toshi_a 初音
toshi.alternative@gmail.com
<p>FormDSLで、コマンドを一つ選択するウィジェットを提供する。<br />単にコマンドを列挙するのではなく、以下の機能が必要になるので、しんどそう。</p>
<ul>
<li>ツリー表示</li>
<li>インクリメンタルサーチ</li>
</ul>
<p>抽出タブのデータソース選択もツリービューで選択させるようになっているので、もしかしたら同じウィジェットとして実装できるかもしれない?</p>
mikutter - 機能 #1384 (新規): Extractの設定に、FormDSLのlistviewを使う
https://dev.mikutter.hachune.net/issues/1384
2019-09-21T00:13:54Z
toshi_a 初音
toshi.alternative@gmail.com
<p>設定画面の「抽出タブ」に抽出タブ一覧があるが、これを <a class="issue tracker-2 status-2 priority-4 priority-default" title="機能: Gtk::CRUDに依存しているコードを減らす (実装待ち)" href="https://dev.mikutter.hachune.net/issues/1380">#1380</a> で実装したlistviewメソッドを利用したものに置き換える。</p>
mikutter - 最適化 #1315 (新規): filterの戻り値を加工しない場合、配列よりもアロケートのコストが軽いオブジェクトで代用する
https://dev.mikutter.hachune.net/issues/1315
2019-02-09T17:41:29Z
toshi_a 初音
toshi.alternative@gmail.com
<a name="動機"></a>
<h1 >動機<a href="#動機" class="wiki-anchor">¶</a></h1>
<p>メモリプロファイルを取ったところ、以下のようなコードで作成される配列が大量にあった。フィルタを過剰に呼び出さない工夫も必要だが、大抵のフィルタは値を加工しないので、値を加工しなかったことを示すキーワードを代わりに返すことで、ほとんどのフィルタ呼び出しで配列の作成を1回削減できる。</p>
<a name="対応"></a>
<h1 >対応<a href="#対応" class="wiki-anchor">¶</a></h1>
<p>値を加工しなかったことを示す値には以下の候補がある:</p>
<p>- <code>nil</code> : やりやすいが見慣れていないと何のことかわからない<br />- <strong>何らかのSymbolや定数:</strong> オブジェクトを作成しない。意図が明確になる。<br />- <strong>何らかのメソッド:</strong> 今もフィルタを強制的にキャンセルするために <code>Filter.cancel</code> とか書いてるので、 <code>Filter.pass</code> とか書いたら帯域脱出した上でパスできると良いかも。<br />- <strong>filter_xxxの引数に加工しないという宣言を与える:</strong> 戻り値が偶然衝突することはないが融通は効かない</p>
mikutter - 機能 #1203 (新規): Gdk::Cursorのインスタンスを得る方法を変更する
https://dev.mikutter.hachune.net/issues/1203
2018-04-08T17:30:41Z
toshi_a 初音
toshi.alternative@gmail.com
<p>マウスカーソルを変更するときに使う <code>Gdk::Cursor</code> を得る時、現在はGdk::Displayとカーソルの名前を使って参照するのが良いとされていると教えてもらった( <a class="issue tracker-2 status-5 priority-4 priority-default closed behind-schedule" title="機能: MiraclePainter上でマウスを動かしたときにカーソル形状を適切に変更して欲しい (終了)" href="https://dev.mikutter.hachune.net/issues/1197#note-2">#1197-2</a> )。<br />mikutterの標準プラグインで <code>Gdk::Cursor.new</code> を呼び出している部分を全てこの方法に変更し、 Gdk::Tooltip と同じように、mikutter内で種類ごとに単一のGdk::Cursorを使いまわすようにしたい。</p>
mikutter - バグ #1138 (新規): activityプラグインがデフォルトで提供しているactivityが、Twitterに依存している
https://dev.mikutter.hachune.net/issues/1138
2017-12-25T09:16:06Z
toshi_a 初音
toshi.alternative@gmail.com
<p>favorite、retweetなどのアクティビティが、activityプラグインで定義されているが、これはTwitterのものなので、twitterプラグインで行われるべき。</p>
<p>また、slugもtwitter_favorite、twitter_retweetにそれぞれ変更したほうが良い。ただしその場合、今まで設定したアクティビティの通知先の設定が引き継がれず、ユーザは再設定することになる。この他にどういう影響があるか調査し、slugを変更するか判断する</p>
mikutter - バグ #1078 (新規): Gtk::TreeIter が指す行の存在を確認していない箇所がある
https://dev.mikutter.hachune.net/issues/1078
2017-11-04T20:26:38Z
toshi_a 初音
toshi.alternative@gmail.com
<p>Gtk::TreeIter が指し示す行が存在しない場合を考慮していないため、 <a class="issue tracker-5 status-5 priority-4 priority-default closed" title="致命的: Gtk-CRITICAL **: IA__gtk_list_store_set_value の出力を繰り返した後、特定の行でクラッシュする。 (終了)" href="https://dev.mikutter.hachune.net/issues/1077">#1077</a> のような問題が発生した。<br />Gtk::TreeIterインスタンスの作成後に行が削除される可能性がある場合は、存在をチェックしなければならない。</p>
<p>潜在的には、Photo Modelのload_pixbufメソッドのような振る舞いをするメソッドを利用する箇所すべてを見直す必要がある。</p>
<p><a class="source" href="https://dev.mikutter.hachune.net/projects/mikutter/repository/main/entry/core/mui/gtk_inneruserlist.rb#L37">source:core/mui/gtk_inneruserlist.rb#L37</a><br /><pre><code class="ruby syntaxhl"> <span class="n">iter</span><span class="p">[</span><span class="no">COL_ICON</span><span class="p">]</span> <span class="o">=</span> <span class="n">user</span><span class="p">.</span><span class="nf">icon</span><span class="p">.</span><span class="nf">load_pixbuf</span><span class="p">(</span><span class="ss">width: </span><span class="mi">24</span><span class="p">,</span> <span class="ss">height: </span><span class="mi">24</span><span class="p">){</span><span class="o">|</span><span class="n">pixbuf</span><span class="o">|</span>
<span class="n">iter</span><span class="p">[</span><span class="no">COL_ICON</span><span class="p">]</span> <span class="o">=</span> <span class="n">pixbuf</span> <span class="k">unless</span> <span class="n">destroyed?</span>
<span class="p">}</span>
</code></pre></p>
<p><a class="source" href="https://dev.mikutter.hachune.net/projects/mikutter/repository/main/entry/core/plugin/activity/model_selector.rb#L22">source:core/plugin/activity/model_selector.rb#L22</a><br /><pre><code class="ruby syntaxhl"> <span class="n">iter</span><span class="p">[</span><span class="no">ICON</span><span class="p">]</span> <span class="o">=</span> <span class="n">record</span><span class="p">.</span><span class="nf">icon</span><span class="p">.</span><span class="nf">load_pixbuf</span><span class="p">(</span><span class="ss">width: </span><span class="mi">24</span><span class="p">,</span> <span class="ss">height: </span><span class="mi">24</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">loaded_icon</span><span class="o">|</span>
<span class="n">iter</span><span class="p">[</span><span class="no">ICON</span><span class="p">]</span> <span class="o">=</span> <span class="n">loaded_icon</span>
<span class="k">end</span>
</code></pre></p>
<p><a class="source" href="https://dev.mikutter.hachune.net/projects/mikutter/repository/main/entry/core/plugin/shortcutkey/shortcutkey_listview.rb#L39">source:core/plugin/shortcutkey/shortcutkey_listview.rb#L39</a><br /><pre><code class="ruby syntaxhl"> <span class="n">iter</span><span class="p">[</span><span class="no">COLUMN_COMMAND_ICON</span><span class="p">]</span> <span class="o">=</span> <span class="n">icon</span><span class="p">.</span><span class="nf">load_pixbuf</span><span class="p">(</span><span class="ss">width: </span><span class="mi">16</span><span class="p">,</span> <span class="ss">height: </span><span class="mi">16</span><span class="p">){</span> <span class="o">|</span><span class="n">pixbuf</span><span class="o">|</span>
<span class="k">if</span> <span class="n">not</span> <span class="n">destroyed?</span>
<span class="n">iter</span><span class="p">[</span><span class="no">COLUMN_COMMAND_ICON</span><span class="p">]</span> <span class="o">=</span> <span class="n">pixbuf</span> <span class="k">end</span> <span class="p">}</span> <span class="k">end</span> <span class="k">end</span> <span class="p">}</span> <span class="k">end</span>
</code></pre></p>
<p><a class="source" href="https://dev.mikutter.hachune.net/projects/mikutter/repository/main/entry/core/plugin/shortcutkey/shortcutkey_listview.rb#L192">source:core/plugin/shortcutkey/shortcutkey_listview.rb#L192</a><br /><pre><code class="ruby syntaxhl"> <span class="n">iter</span><span class="p">[</span><span class="no">COL_ICON</span><span class="p">]</span> <span class="o">=</span> <span class="n">icon</span><span class="p">.</span><span class="nf">load_pixbuf</span><span class="p">(</span><span class="ss">width: </span><span class="mi">16</span><span class="p">,</span> <span class="ss">height: </span><span class="mi">16</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">pixbuf</span><span class="o">|</span>
<span class="n">iter</span><span class="p">[</span><span class="no">COL_ICON</span><span class="p">]</span> <span class="o">=</span> <span class="n">pixbuf</span> <span class="k">if</span> <span class="n">not</span> <span class="n">destroyed?</span>
<span class="k">end</span>
</code></pre></p>
<p><a class="source" href="https://dev.mikutter.hachune.net/projects/mikutter/repository/main/entry/core/plugin/change_account/account_control.rb%2324">source:core/plugin/change_account/account_control.rb#24</a><br /><pre><code class="ruby syntaxhl"> <span class="n">iter</span><span class="p">[</span><span class="no">COL_ICON</span><span class="p">]</span> <span class="o">=</span> <span class="n">service</span><span class="p">.</span><span class="nf">user_obj</span><span class="p">.</span><span class="nf">icon</span><span class="p">.</span><span class="nf">load_pixbuf</span><span class="p">(</span><span class="ss">width: </span><span class="mi">16</span><span class="p">,</span> <span class="ss">height: </span><span class="mi">16</span><span class="p">)</span> <span class="p">{</span> <span class="o">|</span><span class="n">new_pixbuf</span><span class="o">|</span>
<span class="n">iter</span><span class="p">[</span><span class="no">COL_ICON</span><span class="p">]</span> <span class="o">=</span> <span class="n">new_pixbuf</span> <span class="k">if</span> <span class="n">not</span> <span class="nb">self</span><span class="p">.</span><span class="nf">destroyed?</span> <span class="p">}</span>
</code></pre></p>
mikutter - 機能 #909 (新規): IntentはURIを開く前に、短縮URLの展開を試みる
https://dev.mikutter.hachune.net/issues/909
2016-10-07T17:51:43Z
toshi_a 初音
toshi.alternative@gmail.com
<p>mikutter 3.4のopenimgは、画像を開く前に短縮URLの展開のために、次のようなコードが入っていた。</p>
<pre><code class="ruby syntaxhl"><span class="no">Plugin</span><span class="p">.</span><span class="nf">filtering</span><span class="p">(</span><span class="ss">:expand_url</span><span class="p">,</span> <span class="p">[</span><span class="n">shrinked_url</span><span class="p">])</span>
</code></pre>
<p>実際には、現状だとタイムラインに表示されたらURL展開が行われるため、URLが短縮されているせいで適切なIntentに到達できないということは早々ないので、intentプラグイン側で面倒を見たほうが良さそう。</p>
<p>または、例えばBitlyとかTCoという短縮URLのModelを定義しておいて、展開してopenイベントを発生するというIntentを定義した方がいいかも。この方法ならintentプラグインを触らず、URL展開系のプラグインの方で対応できる。</p>
mikutter - 機能 #876 (新規): Activityの詳細画面
https://dev.mikutter.hachune.net/issues/876
2016-09-02T23:40:45Z
toshi_a 初音
toshi.alternative@gmail.com
<p><a class="issue tracker-2 status-5 priority-4 priority-default closed" title="機能: URIを渡すと適切な方法で開く機能 (終了)" href="https://dev.mikutter.hachune.net/issues/866">#866</a> の方法でActivityが開かれた時のUIを作る。</p>
<a name="ヘッダ部分"></a>
<h1 >ヘッダ部分<a href="#ヘッダ部分" class="wiki-anchor">¶</a></h1>
<p>通知のタイトル</p>
<a name="実装するタブ"></a>
<h1 >実装するタブ<a href="#実装するタブ" class="wiki-anchor">¶</a></h1>
<p>「関係するModel」タブをデフォルトでアクティブにしておく。</p>
<a name="関係するModel"></a>
<h2 >関係するModel<a href="#関係するModel" class="wiki-anchor">¶</a></h2>
<p>通知に関係するModelを詰めたTimeline。タイムラインだからここからいろいろできて最高</p>
<a name="詳細"></a>
<h2 >詳細<a href="#詳細" class="wiki-anchor">¶</a></h2>
<p>descriptionを表示する部分。ツイート詳細の本文みたいなやつ。異様に長い文字列が入る可能性があるので注意する。</p>
mikutter - 提案 #17 (分類待ち): フィルタ条件設定ウィジェットにテスト機能をつける
https://dev.mikutter.hachune.net/issues/17
2010-12-23T09:28:04Z
toshi_a 初音
toshi.alternative@gmail.com
<p>そのフィルタ条件が期待したとおりに動作するかどうかをテストするための機能をもたせる。<br />具体的には、サブフィルタ(条件の集合)ごとに、その下部に「テスト」ボタンを付け、クリックするとタイムラインを含んだポップアップウィンドウを出す。なんらかの方法で選び出されたメッセージ一つひとつに、フィルタの条件に合致したか否かをバッジなどで表示する。<br />タイムラインウィジェットは処理が重いし、そこからリプライなどは必要ないので、リストビューを使うことも検討したほうがいいかも知れない。</p>