JScript Panel間の通知



Lyric Show ModokiでAutoSearchがオンになってるときにインジケータがあるといいかなあなんて思って考えてみた。

Image_computer/indicator.png


他にどうも思いつかなくてsplugin_AutoSearch.jsのonCommand:の中に
window.NotifyOthers("AutoSearch",arguments.callee.AutoSearch);
の一行追加。
ここで切り替えたときに通知を出すことにした。
アップデートを考えると極力手を入れたくなかったんだけれども、他にいいやり方あります?


他のJScript Panelで作ったボタンで

function on_notify_data(name, info) {
if (name == "AutoSearch")
IsAutoSearch = info;
window.Repaint();
}


on_notify_data()で受け取ってon_paint()へ投げる。

IsAutoSearchの初期値をfalseに決め打ちして通知を受け取った時に変えるだけなので、スクリプト開始時にリアルタイムで追随しない。
用は足りるからいいじゃん。


追記(2016/05/05):Tomato様からコメント頂きました。お読みいただくとわかると思いますが、既にこのエントリの内容は古くなっております。
ご了承ください。
 
 

更新に影響しないプラグインを使って、追加したい処理をフックするように書くという手があります。

以下、サンプル( の前にLyric Show Modoki 1.6.3を落とし直して下さい。フックと相性の悪い arguments.callee を別の表現に一部書き換えています )

pl = {
name: 'xplugin_test_Hook',
label: 'test_Hook',
author: '',
onStartUp: function () { // 最初に一度だけ呼び出される関数
this.menuitem.Flag = MF_DISABLED;

// splugin_AutoSearch の onCommand にフック
var orig_autosearch_onCommand = plugins['splugin_AutoSearch'].onCommand;
plugins['splugin_AutoSearch'].onCommand = function () {

orig_autosearch_onCommand.apply(this, arguments);
window.NotifyOthers("AutoSearch", this.onCommand.AutoSearch);

};


// NotifyOthersで要求されたものを送る、といった処理を追加するなら
// コールバック関数 on_notify_data にもフック
var orig_on_notify_data = on_notify_data;
on_notify_data = function (name, info) {

fb.trace('ここで何か処理 /hook before call');
orig_on_notify_data.apply(this, arguments);
fb.trace('ここで何か処理 /hook after call');

};
}
};

Posted by Tomato at 2016/05/04 (Wed) 20:27:05

>作者様来ちゃった

いつもスクリプト使わせてもらっています。
なるほど、そういうフックの仕方OKなんですね。
勉強になります。

今回Notifyっていうお題があったからこうなるんでしょうけど、
ただ表示できればいいっていうだけならぶっちゃけ

pl = {
name: 'xplugin_AutoSearch_Indicator',
label: prop.Panel.Lang == 'ja' ? 'テスト: AutoSearchの状態表示' : 'Test: Auto Search Indicator',
author: '',
onStartUp: function () { // 最初に一度だけ呼び出される関数
this.menuitem.Flag = MF_DISABLED;
},
onPaint: function (gr){
//右上隅に三角形を描く
Indicator_color = plugins['splugin_AutoSearch'].onCommand.AutoSearch ? RGBA(43,215,0,250) : RGBA(220,0,0,250);
var p_points = new Array(window.width-10,0,window.width,0,window.width,10);
gr.FillPolygon(Indicator_color, 0, p_points);
}
};

とかでもいいのかなあ。

Posted by 連野 at 2016/05/04 (Wed) 22:48:29

そうですね、パネルに被る形で表現しても問題ない場合はそれが一番簡単だと思います。
onPaintで余程重い処理をしない限りはスクロール動作にも影響は出ないはずです。

わざわざ他のパネルと連携するメリットは、例えばパネルが非表示でもIndicatorで状態の確認ができて、さらにそれをクリックで検索の有効/無効を切り替えるというのもできるくらいでしょうか。

値のやり取りはすべて window.NotifyOthers で済ませるか、または専用のtxtファイルに状態を書き出して更新したら NotifyOthers で知らせるか、
といった具合に結構手間が掛かるのでん~やりたい事次第ですね。


ちなみにフックというより既存の処理の一部を変えたい場合などはreplaceを使って書き換えるというのもあります。結構何でもありです。
onStartUp: function () {
this.menuitem.Flag = MF_DISABLED;

var currentFuncStr = plugins['splugin_AutoSearch'].onCommand.toString();
var newFuncStr = currentFuncStr.replace(
/}$/,
'window.NotifyOthers("AutoSearch", arguments.callee.AutoSearch); }'
);

eval('plugins["splugin_AutoSearch"].onCommand = ' + newFuncStr);
}
};

Posted by Tomato at 2016/05/04 (Wed) 23:46:10

>さすが

まあわざわざtxtに書くほどの処理なんて、する予定もないのです。
Lyric show Modokiのパネルから追い出せればデザイン上の幅が出るかなと思った程度のことで。
特にFragrant Oliveスキンは「角を丸くしたい」というその一点で透明度の扱いがややこしくなってるので、あまり重ねられないという事情もあります。

もう少し検討してみます。



Posted by 連野 at 2016/05/05 (Thu) 00:51:21

コメントは日本語でお願いします。(URLは入力禁止:Do not URL writing.) :System message: コメントを受けつけています。