目次
- オブジェクトの種類
- ウィンドウの種類
- ウィンドウのイベント
- 共通イベント
- On Init
- On Quit
- On Playback Starting
- On Playback New Track
- On Playback Stop
- On Playback Seek
- On Playback Pause
- On Playback Edited
- On Playback Time (Per Second)
- On Playback Order Changed
- On Playlist Activate
- On Playlist Created
- On Playlist Removed
- On Playlist Renamed
- On Playlist Reordered
- On Playlist Item Selection Change
- On Playlist Item Focus Change
- On Playlist Item Added
- On Playlist Item Removed
- On Playlist Item Modified
- On Playlist Item Modified
- On Playlist Item Reordered
- On Volume Change
- On Timer
- User Custom Script機能
- オプションの説明
- 留意点
- 機能追加予定
- バグ情報
- ●タスクトレイクリックで非表示時、Media Library Searchなどのポップアップが表示されたままになる。
- ●TFエディタでIME制御した時に化けることがある
- ○glowオプション指定時にleftとtopにある程度の余白がないと正常にglow効果がかからない。
- ○glowオプションのexpandパラメータに4以上の値を設定すると左端が切れることがある。
- △Resizeで$movepanel→$updatewindow(%_id%,event:resize)でELPLが非表示になることがある。
- △On playback New TrackでWindowを表示・非表示すると表示できなくなることがある。
- △$gp_imageで5x10→800x10のように極端なストレッチを行うと右端のほうが透明になる。
- ×コンボボックスのサイズ変更ができない。
- <解決済み>
オブジェクトの種類
大きく分類して4種類あります。
●上級オブジェクト
ウィンドウ、パネル
●中級オブジェクト
コントロール
●一般オブジェクト
文字や図形や画像
●特殊オブジェクト
クリックマップ、メインメニュー等
中級・一般オブジェクトの作成
$textや$gp_~、$button関数などで生成します。
主にウィンドウのLoadイベントで生成します。
基本的にオブジェクトは削除しない限り関数をコールするたびに増え続けます。
例えばResizeイベントに$gp_text(...)と記述した場合、ウィンドウをリサイズする度に$gp_textオブジェクトが増えます。
Resizeイベントなどでオブジェクト作成関数を使う場合は
\t$removeobject(%FOO%)
$gp_text(%_id%,Foo,10,10)
$hash(FOO,%_result%)
$updatewindow(%_id%)
のように先に削除してから作成して下さい。
または、
$clearobject(%_id%,event:resize)
$gp_text(%_id%,Foo,10,10)
$updatewindow(%_id%)
ウィンドウの種類
メインウィンドウ、親ウィンドウ、子ウィンドウ、埋め込みウィンドウの4種類があります。
メインウィンドウ
メインウィンドウとはFunc UIインストール時に最初からあるウィンドウのことです。メインウィンドウを閉じるとfoobar2000は終了します。
親ウィンドウと子ウィンドウ
親ウィンドウとは最小化や閉じる時に一緒に子ウィンドウを最小化や閉じることができるウィンドウです。メニューや設定画面からウィンドウを表示させた場合は全て親ウィンドウとして表示されます。$window関数を使ってparentオプションを指定した場合に限り子ウィンドウとして表示することができます。
埋め込みウィンドウ
他のウィンドウの中に表示するウィンドウです。
$window関数でparentオプション、embed:trueオプションを指定することにより埋め込むことができます。
ウィンドウのイベント
ウィンドウ起動時にはLoad→(Resize,Move,Activate)→Openの順でイベントが発生します。
Resize
サイズ変更時に発生します。最小化、最大化時にも発生します。
●ウィンドウのサイズに合わせて背景を描画する場合のテクニック
$removeobject(%BG%)
$gp_rect(%_id%,0,0,%_cwidth%,%_cheight%,grad:0-0-%_cwidth%-%_cheight%-0-0-0-0-255-50-50-50)
$hash(BG,%_result%)
$setobjectzorder(%BG%,bottom)
$updatewindow(%_id%)
●曲名などを描画する場合は?
$removeobject(%SONG%,redraw:true)
$gp_text(%mainid%,%artist% / %title%,10,10,,,font-size:30,pen:255-255-255-255)
$hash(SONG,%_result%)
$updateobject(%SONG%)
$clearobject(%_id%,event:resize)
$gp_text(%mainid%,%artist% / %title%,10,10,,,font-size:30,pen:255-255-255-255)
$updatewindow(%_id%)
Move
ウィンドウ位置変更時に発生します。
Activate
ウィンドウがアクティブまたは非アクティブになった時または、
非アクティブ化された後に発生します。
このイベント内に限り%_activate%,%_activateid%変数が使えます。
共通イベント
On Init
foobar2000起動時に発生します。
metaデータ:×参照不可
On Quit
foobar2000終了時に発生します。
metaデータ:×参照不可
On Playback Starting
再生開始時に発生します。
metaデータ:×参照不可
<使用可能なプライベート変数>
%_track_command% 再生開始時に実行されたコマンド
0 : デフォルト 1 : Playback/Play 2 : Playback/Next 3 : Playback/Previous 4 : Set Track 5 : Playback/Random 6 : Resume
%_starting_paused% ポーズ状態(flag)
On Playback New Track
新しい曲が開始した時に発生します。
metaデータ:○再生中のアイテム
On Playback Stop
再生を停止した時に発生します。
metaデータ:×参照不可
<使用可能なプライベート変数>
%_stop_reason% 再生停止理由
0 : ユーザによる停止 1 : EOF 2 : 他の曲が開始したため 3 : foobar2000の終了
On Playback Seek
曲をシークした時に発生します。
metaデータ:○再生中のアイテム
<使用可能なプライベート変数>
%_seek_time% シークタイム
On Playback Pause
一時停止した時に発生します。
metaデータ:○再生中のアイテム
<使用可能なプライベート変数>
%_pause_state% ポーズ状態(flag)
On Playback Edited
自動データ更新時に発生します。
metaデータ:○再生中のアイテム
On Playback Time (Per Second)
再生中に1秒間隔で発生します。
metaデータ:○再生中のアイテム
<使用可能なプライベート変数>
%_playback_time% 再生位置
On Playback Order Changed
Playback Order変更時に発生します。
metaデータ:×参照不可
<使用可能なプライベート変数>
%_order_index% プレイバックオーダーインデックス
On Playlist Activate
プレイリスト変更時に発生します。
metaデータ:×参照不可
<使用可能なプライベート変数>
%_pl_old_index% 変更前プレイリストインデックス
%_pl_new_index% 変更後プレイリストインデックス
On Playlist Created
プレイリスト新規作成時に発生します。
metaデータ:×参照不可
<使用可能なプライベート変数>
%_pl_index% プレイリストインデックス
%_pl_name% プレイリスト名
On Playlist Removed
プレイリスト削除時に発生します。
metaデータ:×参照不可
<使用可能なプライベート変数>
%_pl_old_count% 削除前プレイリスト件数
%_pl_new_count% 削除後プレイリスト件数
On Playlist Renamed
プレイリスト名変更時に発生します。
metaデータ:×参照不可
<使用可能なプライベート変数>
%_pl_index% プレイリストインデックス
%_pl_name% プレイリスト名
On Playlist Reordered
プレイリスト並び替え時に発生します。
metaデータ:×参照不可
On Playlist Item Selection Change
プレイリストアイテム選択状態変更時に発生します。
<使用可能なプライベート変数>
%_pl_index% プレイリストインデックス
metaデータ:×参照不可
On Playlist Item Focus Change
プレイリストアイテム選択時に発生します。
<使用可能なプライベート変数>
%_pl_index% プレイリストインデックス
%_pi_from_index% フォーカス変更前アイテムインデックス
%_pi_to_index% フォーカス変更後アイテムインデックス
metaデータ:○アクティブプレイリストのアクティブアイテム
On Playlist Item Added
プレイリストにアイテム追加時に発生します。
metaデータ:×参照不可
<使用可能なプライベート変数>
%_pl_index% 追加先プレイリストインデックス
%_pi_index% 追加先プレイリストアイテムインデックス
%_pi_count% 追加アイテム数
On Playlist Item Removed
アイテム削除時に発生します。
metaデータ:×参照不可
<使用可能なプライベート変数>
%_pl_index% プレイリストインデックス
On Playlist Item Modified
アイテム情報変更時に発生します。
metaデータ:×参照不可
<使用可能なプライベート変数>
%_pl_index% プレイリストインデックス
On Playlist Item Modified
アイテム情報変更時に発生します。
metaデータ:×参照不可
<使用可能なプライベート変数>
%_pl_index% プレイリストインデックス
On Playlist Item Reordered
アイテムを並び替えた時に発生します。
metaデータ:×参照不可
<使用可能なプライベート変数>
%_pl_index% プレイリストインデックス
On Volume Change
ボリュームを変更した時に発生します。
metaデータ:×参照不可
<使用可能なプライベート変数>
%_volume% ボリューム
On Timer
$settimer関数で設定した間隔毎に発生します。
metaデータ:×参照不可
<使用可能なプライベート変数>
%_timerid% $settimerで指定したタイマーID
User Custom Script機能
ConfigurationダイアログのScriptタブでEvent=(User)のページで定義します。
編集後、入力フォーカスがテキストボックス以外に移ると自動的にコンパイルします。
foobar2000起動時にもコンパイルしています。
コンパイルエラーが発生した場合はコンソールにCompile errorと出力されます。
コメント(//)
// で始まる行はコメント扱いになります。
#function
ユーザ関数を定義します。
【書式】
#function <name> <scripts> #end
【使用可能なプライベート変数】
%_param<n>% - 引数
%_param_count% - 引数の数
【補足】
nameに使用できる文字は英数字と _ (アンダーバー)
【使用例】
#function myfunction $gp_text(%_id%,foobar2000,%_param1%,%_param2%) #end
↓
$myfunction(100,120)
#define
ユーザ定数を定義します。
【書式】
#define <name> <value> #end
【補足】
'で区切られた箇所は置換しません。
nameに使用できる文字は英数字と _ (アンダーバー)
【使用例】
#define foo ABC #end
↓
// コンソールには「ABC」の文字が出力されます
$console(#foo#)
// コンソールには「#foo#」の文字が出力されます
$console('#foo#')
#functionと#defineの違い
#define
(イベントスクリプトはコンパイル時に置換)
#function
#define
オプションの説明
Tasktray
タスクトレイアイコンの振る舞いを設定します。
●No control - 何も制御しません。(デフォルト)
●Display always icon - 常にアイコン表示します。
●When the main window... - メインウィンドウ最小化時にアイコン表示しタスクトレイに常駐します。
Script
●Effective safe mode
全てのスクリプトの実行を停止します。(デフォルト:OFF)
●Trim mode
スクリプト中の半角スペース、タブ、改行を全て取り除いた後に実行します。(デフォルト:OFF)
ONにすると下記のような記述ができるようになります。
$ g p _ text(%_id% , 'foobar 2000' , 0, 0)
文字列出力など空白が必要な箇所は''で括ります。
その中は置換しません。
Backup
●Autobackup
設定の自動バックアップ機能です。
foobar2000本体の設定ではなくFuncUIの設定とパネルの設定をバックアップします。
ファイル名にはTFが使用できます。TF適応後に文字列長が0になるとバックアップしません。
<使用可能なプライベート変数>
%_timing% タイミング(start|exit|every)
○Stattup - foobar2000起動時(デフォルト:OFF)
○Exit - foobar2000終了時(デフォルト:OFF)
○Every - 指定した間隔毎(デフォルト:OFF)
TFエディタ
オプションには無いですが付属のtfeditor.iniをfoobar2000のProfileパスに置くことで配色やフォントを変更することができます。ファイルが存在しなければデフォルト設定が適用されます。また設定ファイルの中にある項目だけをデフォルト設定と置き換えるのでフォント以外変更したくない場合等は該当項目以外の記述を消して下さい。
●tfeditor.ini
必ず[editor]セクションに記述して下さい。
色の指定はr-g-bまたはrrggbbで指定できます。
limit_text_size = テキスト最大サイズ(文字数)
font_face_name = フォント名
font_size = フォントサイズ(pt)
base_fg = デフォルト 文字色
base_bg = デフォルト 背景色(=エディタ全体の背景色)
selected_fg = 選択 文字色
selected_bg = 選択 背景色
pare_fg = 括弧 文字色
pare_bg = 括弧 背景色
pare_check_ok_fg = 括弧番いチェックOK時 文字色
pare_check_ok_bg = 括弧番いチェックOK時 背景色
pare_check_err_fg = 括弧番いチェックエラー時 文字色
pare_check_err_bg = 括弧番いチェックエラー時 背景色
symbol_fg = 記号(,等) 文字色
symbol_bg = 記号(,等) 背景色
func_fg = $関数名 文字色
func_bg = $関数名 背景色
var_fg = %変数名% 文字色
var_bg = %変数名% 背景色
comment_fg = コメント 文字色
comment_bg = コメント 背景色
quot_fg = 文字列(') 文字色
quot_bg = 文字列(') 背景色
留意点
metaデータの参照
基本的にOn Playbackの一部のイベント以外からは参照できません。他のイベントで情報が必要な場合はOn Playback New Trackイベントで$hash(G_TITLE,%title%)のようにしてグローバル変数に格納して使うか$pl_getmeta関数を使用して下さい。
このパレットについて
このパレットで項目をダブルクリックするとScriptページのカーソル位置に挿入できます。
※そのページを開いていなくても挿入されるので注意して下さい。
画面描画について
処理性能向上のためTFの途中では$updatewindowや$updateobjectを実行した場合を除いて中級・一般オブジェクトの画面描画は行いません。
$updatewindowと$updateobjectの違い
$updatewindowはウィンドウ全体を再描画します。
$updateobjectは画面上はオブジェクトが現在存在する位置、内部的には少しでも重なっているオブジェクトは内部領域で再描画します。
対象オブジェクトが重い画像と重なっている場合、内部的にはその画像も内部領域で再描画してしまうため結果的にウィンドウ全体を再描画するのと大差なくなるかもしれません。処理の途中で何度も$updateobjectをコールするぐらいなら$updatewindowで一発再描画の方が軽いという場合もあります。なので臨機応変に使い分けて下さい。
同一イベント内の描画優先順位
1. 上級オブジェクト(ウィンドウやパネル)
2. 中級・一般オブジェクト(コントロール・文字や図形や画像)
という順番に描画します。
※中級・一般オブジェクトはLoadイベント以外では$updatewindowや$updateobject,$updatectrlを実行しない限り描画されません。それらの関数を使用した場合は即座に描画されるため優先順位が変わるので注意が必要です。
$hash(BTN1,$buttons(%_id%,...))
$panel(%_id%,A)
%panel(%_id%,B)
$hash(BTN2,$buttons(%_id%,...))
$hash(IMG1,$gp_image(%_id%,...))
と記述した場合は、パネルA・Bを描画した後にIMG1,BTN1,BTN2という順序で描画します。
またオブジェクトの重ね合わせは、上級オブジェクトに対して中級オブジェクトを重ね合わせることはできますが、一般オブジェクトは最背面に描画されます。
※種類によっては重ね合わせ出来ない場合があります。
同一階級のオブジェクト同士の重ね合わせは後に記述した方が上に描画されますが、上級・中級オブジェクトのZORDERの制御は各オブジェクトで行うためそれを保証するものではありません。
設定画面について
Preferencesからも表示できますが一部機能に制限があるので、メインメニューのFunc->Configurationからポップアップ表示した方がいいです。
仮想画面と実画面
FuncUIでは内部的に使用する仮想画面というものが存在します。Windowsの制御でウィンドウの再描画が必要な場合(例えば隠れていた箇所が表示された場合やウィンドウサイズが変更になった場合など)は仮想画面から実画面へ転送しています。これは無駄にTFが評価されないようにするための仕様です。
通常の$gp_textなどの関数はオブジェクトを生成するだけで画面描画は一切行いません。Loadイベント終了後または$updatewindow関数コール時(level:1またはlevel:3以上)に初めてオブジェクトを仮想画面に描画します。
それを踏まえた上で、$gp_text(...,dmode:mem)は関数コール時に即座に仮想画面に描画します(オブジェクトの生成は行いません)。その後、Windowsの制御で画面の再描画が必要な場合は仮想画面から実画面へ転送されます。また$updatewindow(%_id%,level:0)を使用することで明示的に仮想画面から実画面へ転送することができます。
dmode:memの使いどころは?
Loadイベント後に仮想画面が初期化されるためLoadイベントで使っても意味がありません。
故に通常はOpenイベントなどで使用します。
また$updatewindow関数(level:3(デフォルト)以上)を使うと画面が初期化されます。
$updatewindow(%_id%,level:0)
仮想画面から実画面への転送のみ
$updatewindow(%_id%,level:1)
全てのオブジェクトを仮想画面に描画
$updatewindow(%_id%,level:2)
仮想画面を背景色または透過で初期化
$updatewindow(%_id%,level:3) or $updatewindow(%_id%) (デフォルト)
仮想画面を初期化
↓
全てのオブジェクトを仮想画面に描画
↓
仮想画面から実画面への転送
という仕組みになっています。
// (A)画面を初期化 $bgcolor(%_id%,255-255-255) $updatewindow(level:2)
// (B)オブジェクトを仮想画面へ描画 $gp_text(...,dmode:object) $hash(TEXT,%_result%) $updatewindow(level:1)
// (C)仮想画面へ直接描画 $gp_text(...,dmode:mem)
// (D)仮想画面から実画面へ転送 $updatewindow(level:0)
オブジェクトの生成や管理が面倒な人は(B)の処理を消して下さい。
まあ、普通に
// Resize $clearobject(%_id%,event:resize) $gp_text(...) // dmode:object(デフォルト) $updatewindow(%_id%)
の方が簡単ですが。
数百の図形を描画したい場合などはオブジェクトが増えすぎて重くなるのでdmode:memを使用すると効果的です。
機能追加予定
●TFエディタに検索、置換などの機能を付ける
●コントロールの種類を増やす。(テキストボックスなど)
●関数の増強。
●リストの並び替え。
<追加する予定のない機能>
×$mapに$gp_rect等を追加できるようにする。
→ $gp_rectなどはglowやアンチエイリアスでサイズが曖昧なため無理。
できなくはないが結局は細かい設定が必要になってくるので無駄になると思う。
端の辺のぼかした部分の処理をどうするのかユーザ側で許容範囲を決める必要がある。
×NextAlbumやPrevAlbumのような関数
→ Playback Orderで変わってくるので無理。
プレイリスト上の前後は$pl_getmetaを使えば取得できます。
バグ情報
大半の関数を作り直したのでバグがてんこ盛りだと思われます。
バグ情報どしどしお待ちしております。
●タスクトレイクリックで非表示時、Media Library Searchなどのポップアップが表示されたままになる。
●TFエディタでIME制御した時に化けることがある
○glowオプション指定時にleftとtopにある程度の余白がないと正常にglow効果がかからない。
○glowオプションのexpandパラメータに4以上の値を設定すると左端が切れることがある。
△Resizeで$movepanel→$updatewindow(%_id%,event:resize)でELPLが非表示になることがある。
→ 親ウィンドウ最小化時に消える?
→ v0.1.7で大幅に修正したので結果報告待ち。
△On playback New TrackでWindowを表示・非表示すると表示できなくなることがある。
→ 再現せず。再現待ち。
→ v0.1.7で大幅に修正したので結果報告待ち。
△$gp_imageで5x10→800x10のように極端なストレッチを行うと右端のほうが透明になる。
→ GDI+の問題?
×コンボボックスのサイズ変更ができない。
→ 仕様。
<解決済み>
TFエディタでCTRL+A後の挙動がおかしいとの報告あり。
→ (v0.1.8)当方の環境では再現しなかったけど修正したつもり。
Activateイベントで自ウィンドウを閉じると落ちることが多々ある。
→ (v0.1.8)$closewindowを修正。
ウィンドウのサイズいっぱいに$map領域のあるウィンドウから別のウィンドウへマウスポイントを移動させた場合に、
$mapのキャプチャが解除されないことがある。
→ (v0.1.7b)左クリックしていない時の処理を修正。
非表示ウィンドウがある状態で終了した場合に再起動したら表示される。
→ (v0.1.5)非表示ウィンドウは復元しないようにした。
メニューバーを表示すると終了時にエラーを吐くことがある。
→ (v0.1.7)メニューバーを廃止してメニューバーコントロールに変更して対応。
メニューバー表示状態でfoo_request_http.dllを使うと落ちる。
→ (v0.1.7)メニューバーを廃止してメニューバーコントロールに変更して対応。
Biographyパネルでスクロール機能が機能しない。
→ Preference->General->Mouse whellにチェックを入れると機能する。