Tomblooハックス – UIつきバージョン ポスト先にはてなダイアリーを追加する

前に作ったTomblooハックス – ポスト先にはてなダイアリーを追加するだと、常にtumblrとはてなダイアリーに追加されるようになって、いまだけはてなに、みたいなのができないので、そのへんのUIでできそうなのを探してやってみました。

Shiftを押してるときに動作を変える、というアプローチ。はじめにコンテキストメニューでShiftが押されているときはサブメニューが出て投稿先が選べる、というのにしようと思ったけどコンテキストメニューのpopupshowingではキーの状態が常にfalseでくるようになっていてだめでした(Windows/OSXどっちも)。

それで他にないかなーと思ってたらNoScript :: Firefox Add-onsとかで出てくるXUL:notificationbox – MDCが使えそうなので、試しに作ってみました。

コンテキストメニューから項目を選択するとき(下のscreenshotだとShare – Photoを選ぶとき)にShiftを押して選択すると

Select menu + shift button

ページの一番上にpostする先がボタンで出てくるので、postしたいところを押します。

Notification is popping up

押すと色が変わって押せなくなるので手がふるえてても二重に投稿されません。

Picture 5-11

コンテキストメニューのpopupで投稿先を選ぶ案(技術的な面でボツ)に比べて、同時に複数の投稿先を動的に変更できるのはいいところ。ページの一番上に出るのでマウスを移動させる距離が長いのが面倒だった(下にも出せるはずなんだけどやり方がよくわかんなかった。どっちに出そうが移動距離が長いのは変わらないけど)。notificationを使うのはいまいち。

でもこれでバリバリはてなダイアリーにquoteとかできる。photoはオリジナルへのホットリンクになるのでご注意ください。
あとはてなダイアリーだと当然tumblrみたいにquoteで文字が大きくなったりしないのでかっこわるいです。いちおうtombloo_quote, tombloo_photoというクラス名つきでpostされるので、CSSいじったらかっこよくなるかも。

コード

30_Tombloo.Service.20080405.diff
90_Hatena.20080405.js

愚痴

notificationのボタンのパラメータのcallbackが曲者で、ふつうのDOMイベントと違ってtrueを返したときにアクションがキャンセルされるようになってて、はじめfalse返したら何とかならんのかと思ってfalseにしたけどボタン押したらnotificationが閉じられちゃうので困ったなーと思って調べてたら mozilla/toolkit/content/widgets/notification.xml でコード見つけてこうなっててなんだそれと思った。

      <method name="_doButtonCommand">
        <parameter name="aEvent"/>
        <body>
          < ![CDATA[
            if (!("buttonInfo" in aEvent.target))
              return;
            var button = aEvent.target.buttonInfo;
            if (button.popup) {
              document.popupNode = aEvent.target;
              document.getElementById(button.popup).
                showPopup(aEvent.originalTarget, -1, -1, "popup", "bottomleft", "topleft");
              aEvent.stopPropagation();
            }
            else {
              var callback = button.callback;
              if (callback) {
                var result = callback(this, button);
                if (!result)
                  this.close();
                aEvent.stopPropagation();
              }
            }
          ]]>

なんでわざわざDOMのイベントと逆のtrueだとstopPropagationにしてるんだろう。おかげでそれを知るためだけにgrepかけたよー。

あと Google code search をみてると notification.hideclose = true で閉じるためのXボタンが消せるみたいなんだけど、実際やってみると消えなくて不可解だった。たしかにソースにもhidecloseで消えそうな部分はなかった。


About this entry