2009-05-24-01(日)
labelのcreateとdestroyを1アクションで
先日書いたrcには画面右下に時刻表示と
LS-Uのロゴ画像がlabel上に置いてましたが
(これ自体はそれぞれ1つのlabel内にoverlaylabelを配置している)
このロゴ画像をクリックすると
こういうサブパネルのようなものが表示されるようにしてあります
このlabelは単純な1つのlabel内にアプリ起動用のoverlaylabelと
lsxcommandをhookさせたものです
通常は、こういうサブlabel的なものは、!labelToggleで
表示・非表示をコントロールするもんですが
常時ON/OFFするわけでもなく、むしろ通常は表示しない方が多いときは
気分的にhiddenじゃなく、存在そのものを排除しておきたいと思う人も
結構いるんじゃないかと
まあ、GB単位でメモリ積む時代だから、それくらいいいじゃねーかとも思うけどw
!labelToggleだと、基本的に1アクション(1クリックやホットキー1つなど)で
ON/OFFの操作が可能なのだけど
!labelCreateと!labelDestroyでは、通常、2アクション用意しないといけません
コマンド自体が2つに分かれてるから当然ですね
そこで、mzscript.dllを用いて、トグル操作のように1つで済ます
カスタム!bangを書いてみます
*Script Bang !subMenuToggle
*Script Exec !IfExist isSubMenu [!labelDestroy subMenu] [!labelCreate subMenu]
*Script Exec !IfExist isSubMenu [!varRemove isSubMenu] [!varSet isSubMenu 1]
*Script ~Bang
といっても、これだけです
この場合、subMenuというlabel限定となってしまいますが
いくつかそういうlabelがあるのなら
必要なだけ、subMenu部分を書き換えて増やしていけばいいかと
自分はこの作成した「!subMenuToggle」を
先程挙げたLS-UロゴのOnLeftClick動作に割り当てて
クリックしたらバー横にニョーンと現れるようにしてます
ここでいう「isSubMenu」は、mzscript変数で、該当labelが作成されている間(つまり表示中)だけ存在します
labelがCreateされると、isSubmMenuが!varSetで作成され、
次にこのスクリプトを呼んだときに「!IfExist isSubMenu」が成立して
Destroyの作業へ分岐する(そして、不要になるisSubMenuを!varRemoveで破棄する)
こういう流れです
ものすごく単純なんだけど、この手法は、mzscriptで
他のカスタム!bangを書くときにも応用が利きそうなので
紹介しておくことにします
ちなみに、上のサブパネル、label内にlsxcommand.dllをhookしているので
パネルをcreateしている間だけ、lsxcommand.dllが機能しますが
LoadModule自体はずっとしている状態です
いっそのこと、この部分もさっきのmzscriptのコードで
!labelCreate前に!reLoadModuleでlsxcommand.dllをロード
!labelDestroy後に!unLoadModuleでlsxcommand.dllをアンロードしてもいいかと思います
書く順番間違えるとロードしてないのにフックみたいなことになっちゃいますんで
注意が必要ですが
Relay Keyword's Recent Title
- xlabel
- 2009-05-24-01 labelのcreateとdestroyを1アクションで
- 2008-09-22-01 パネル内にアイコンを表示してランチャーっぽいのを作る
- 2008-09-21-01 パネルを前面に出したり、半透明にさせてみたり