JScript PanelのInterfaces.txt和訳(ver.1.1.3)



追記:2017/02/22 ver.1.2.0に対応
追記:2020/06/13 以前に付属していたPBOButton(Menu).txtのリンク記載


一覧としてはfoobar2000のwsh panel modのサンプルコード番外編-資料1 インターフェイス {+ foobar2000::資料}の方が見やすいかもしれない。

・用語
メソッド(引数); (返り値)

boolean - trueかfalseのどちらか
string - 文字列
float - 小数点含めた数値
double - floatより精度の高い数値
idx - indexの省略形、整数値
uint - 正の整数値
null - 何も入っていない、空の値
void - そもそも値が返ってこない


/*
fb.trace(...)を使ってConsoleに変数/文字列/プロパティを出力できる。
そして、それが下記のいくつかの例で使われている。
[]内のパラメータはオプションであり、省略できる。

特に説明されていない"handle"は、一つのプレイリストの中の一つのアイテムを指す。(次のような)
fb.GetFocusItem();
fb.GetNowPlaying();
plman.GetPlaylistItems(plman.ActivePlaylist).Item(0) //アクティブなプレイリストの最初のアイテム

特に説明されていない"handle_list"は、複数のプレイリスト/ライブラリからの複数のアイテムを指す。(次のような)
plman.GetPlaylistSelectedItems(plman.ActivePlaylist);
fb.GetLibraryItems();
*/

interface IFbUtils {
プロパティ:
fb.ComponentPath; (string) (read)
// foobar2000のコンポーネントのあるフォルダパスを示す。
// 例: fb.trace(fb.ComponentPath);
// C:\Users\User\AppData\Roaming\foobar2000\user-components\foo_jscript_panel\

fb.CursorFollowPlayback; (boolean) (read, write)

fb.FoobarPath; (string) (read)
//foobar2000.exeのあるフォルダパス

fb.IsPaused; (boolean) (read)
//ポーズ中か否か

fb.IsPlaying; (boolean) (read)
//再生中か否か

fb.PlaybackLength; (double) (read)
/*
トラックの秒数(曲の長さ)
例1: fb.trace(fb.PlaybackLength);
322.843414966166
例2: fb.trace(Math.round(fb.PlaybackLength));
323
*/

fb.PlaybackFollowCursor; (boolean) (read, write)

fb.PlaybackTime; (double) (read, write)
// 再生した秒数
// 例: fb.PlaybackTime = 60;
// 曲の最初から1分の時点に飛ぶ

fb.ProfilePath; (string) (read)
// 設定等が置いてあるフォルダ

fb.StopAfterCurrent; (boolean) (read, write)
// 聴いている曲が終わったら停止
// 例: fb.StopAfterCurrent = !fb.StopAfterCurrent;
// 現在の設定をトグルさせる

fb.Volume; (float) (read, write);
// ボリューム値
// 例: fb.Volume = 0;
// 最大にセット。-100が最小

メソッド:
fb.AcquireUiSelectionHolder(); (IFbUiSelectionHolder)

interface IFbUiSelectionHolder {
メソッド:
Dispose(); (void)
SetSelection(handle_list); (void)
// 選択中のアイテムをセット

SetPlaylistSelectionTracking(); (void)
/*
選択されたアイテムを選択済みプレイリストにセットして、trackingを可能にする。
選択済みプレイリストが変化する時、保存された選択は自動的に更新される。
セットするメソッドがui_selection_holderで呼ばれた時、
またはui_selection_holderがリリースされた時にtrackingは終了する。
*/

SetPlaylistTracking(); (void)
/*
選択されたアイテムをアクティブなプレイリストにセットして、trackingを可能にする。
アクティブなプレイリストやその要素が変化する時、保存された選択は自動的に更新される。
セットするメソッドがui_selection_holderで呼ばれた時、
またはui_selection_holderがリリースされた時にtrackingは終了する。
*/
}

fb.AddDirectory(); (void)
// フォルダを追加。フォルダ選択ダイアログが開く。

fb.AddFiles(); (void)
// ファイルを追加する。ファイル選択ダイアログが開く。

fb.ClearPlaylist(); (void)
// アクティブなプレイリストをクリアする。
// 特定のプレイリストをクリアしたいなら、plman.ClearPlaylist(playlistIndex)を使う。

fb.CreateContextMenuManager(); (IContextMenuManager)
// コンテキストメニューの管理
interface IContextMenuManager {
// samples\MainMenuManager All-In-One, samples\Menu Sample.txtを見よ。

メソッド:
BuildMenu(IMenuObj, base_id, max_id); (void)
// メニューを作る

Dispose(); (void)
// 破棄

ExecuteByID(id); (boolean)
// idの項目を実行

InitContext(handle_or_handle_list); (void)

InitNowPlaying(); (void)
}

fb.CreateMainMenuManager(); (IMainMenuManager)

interface IMainMenuManager {
// samples\MainMenuManager All-In-One, samples\Menu Sample.txtを見よ。

メソッド:
BuildMenu(IMenuObj, base_id, count); (void)
// メニューを作る

Dispose(); (void)
// 破棄

ExecuteByID(id); (boolean)
// idの項目を実行

Init(root_name); (void)
}

fb.CreateProfiler([name]); (IFbProfiler)
//パフォーマンスを図るタイマーっぽいもの。プロファイラ。

interface IFbProfiler {
プロパティ:
Time; (int) // ミリセカンド

メソッド:
Reset(); (void)
Print(); (void)
}

/*
例:
var test = fb.CreateProfiler();
// do something very time consuming
fb.trace(test.Time);
*/

fb.Exit(); (void)
// foobar2000終了

fb.GetFocusItem([force]); (IFbMetadbHandle)
// force: boolean, デフォルトは true。trueならフォーカスのあるアイテムが取れなかった場合、アクティブなプレイリストの最初のアイテムが使われる。

fb.GetLibraryItems(); (IFbMetadbHandleList)
// メディアライブラリにあるすべてのアイテムがhandle listで返される。

fb.GetLibraryRelativePath(handle); (string)
/*
メディアライブラリが使うパスとトラックのパスが重複する部分が空になった文字列が返される。
要するに、メディアライブラリからの相対パス。

例:
foobar2000 Media Library が"D:\Music"を監視していて、
現在再生しているアイテムのパス"D:\Music\Albums\Artist\Some Album\Some Song.flac"の場合

var handle = fb.GetNowPlaying();
fb.trace(fb.GetLibraryRelativePath(handle));

出力:"Albums\Artist\Some Album\Some Song.flac"

ノート:もし大きなhandle listをループしようとしていて、かつバックグラウンドで起こっていることの制御をしないなら、
メディアライブラリのセッティング/内容が変化してエラーが発生する場合がある。try/catchを使うことを考えよう。
*/

fb.GetNowPlaying(); (IFbMetadbHandle)
// 再生しているアイテムのhandleを収得する。

fb.GetQueryItems(handle_list, query); (IFbMetadbHandleList)
クエリを使ったhandle listの収得
/*
例1: var fav_playlist_items = fb.GetQueryItems(plman.GetPlaylistItems(plman.ActivePlaylist), "rating IS 5");
例2: var fav_library_items = fb.GetQueryItems(fb.GetLibraryItems(), "rating IS 5");
結果はソートされていない。

ノート:無効なクエリをも扱うために、try/catchを使おう。
クエリが有効であるならば空のhandle listが返されることもあるが、それは「一致する結果がない」ということだ。
*/

fb.GetSelection(); (IFbMetadbHandle)
// 再生中または選択しているアイテムを収得する。値は"File>Preferences>Display>Selection viewers"に依存する。
// nullが返る場合もある。

fb.GetSelections([flags]); (IFbMetadbHandleList)
/*
flags: 0 デフォルト, 1 再生していない
GetSelection()と似ているが、こちらはhandle listを返す。
常にnullの代わりに有効なhandle listを返す。
*/

fb.GetSelectionType(); (uint)
/*
選択がどのようなものか調べる。
0 undefined (アイテムなし)
1 active_playlist_selection
2 caller_active_playlist
3 playlist_manager
4 now_playing
5 keyboard_shortcut_list
6 media_library_viewer
*/

fb.IsLibraryEnabled(); (boolean)
// ライブラリが有効か否か

fb.IsMetadbInMediaLibrary(handle); (boolean)
// 再生している曲がライブラリにあるか否か
// 例: fb.trace(fb.IsMetadbInMediaLibrary(fb.GetNowplaying()));
// もしfalseなら、再生しているトラックはメディアライブラりの中にはない。

fb.LoadPlaylist(); (void)
// プレイリストをロードする。ファイル選択ダイアログが開く。

fb.Next(); (void)
//次の曲を再生

fb.Pause(); (void)
//一時停止(ポーズ)

fb.Play(); (void)
//再生

fb.PlayOrPause(); (void)
//再生とポーズをトグル

fb.Stop(); (void)
//停止

fb.Prev(); (void)
//前の曲を再生

fb.Random(); (void)
//プレイリスト内ランダム再生

fb.RunContextCommand(command, [flags]); (boolean)
/*
コンテキストメニューのコマンドを実行
再生中のファイルのみ
flags:
0 デフォルト (flag_view_reduced か flag_view_full is selected、シフトキーが押されているかどうかに依存する)
4 flag_view_reduced
8 flag_view_full. これはユーザーが"File>Preferences>Display>Context Menu"で隠したコマンドを実行したい時に役立つ。
例: fb.RunContextCommand("Properties");
*/

fb.RunContextCommandWithMetadb(command, handle_or_handle_list[, flags]); (boolean)
// flagsはfb.RunContextCommandと同じ。
// handle_or_handle_listはfb.GetFocusItem()やplman.GetPlaylistSelectedItems(plman.ActivePlaylist)のようなもの。

fb.RunMainMenuCommand(command); (boolean)
// foobar2000のメニューコマンドを実行する。
// 例: fb.RunMainMenuCommand("File/Add Location...");

fb.SavePlaylist(); (void)
// プレイリストを保存する。

fb.ShowConsole(); (void)
// Consoleウィンドウを開く。

fb.ShowLibrarySearchUI(query); (void)
//Library>Searchウィンドウを開き、セットしたクエリの結果を出す。

fb.ShowPopupMessage(msg[, title][, iconid]); (void)
// title: デフォルトは "JScript Panel"
// iconid: デフォルトは0。その他はflags.txt > IconIdを見よ。

fb.ShowPreferences(); (void)
// Preferencesウィンドウを開く。

fb.TitleFormat(expression); (IFbTitleFormat)
// TFでの問い合わせに使う

interface IFbTitleFormat {
// これは下の例のように使う。
// var tfo = fb.TitleFormat("%artist%");

メソッド:
Dispose();
// オブジェクトを破棄してメモリを開放する。
// 例: tfo.Dispose();

Eval([force]);
/*
force: boolean, デフォルトはfalse。
もしtrueなら、foobar2000が再生中でも再生していないときでも、title formattingを含まないテキストを処理することができる。
あなたは常に結果を得なければならない。
常にダイナミックな情報(例えば%playback_time%、%bitrate%、その他)が欲しいときは、evalを使う。
EvalWithMetadb(fb.GetNowplaying())はあなたが望む結果をもたらさない。
例: fb.trace(tfo.Eval());
*/

EvalWithMetadb(handle);
// 例: fb.trace(tfo.EvalWithMetadb(fb.GetFocusItem()));
}

fb.trace(message); (void)
// Consoleに出力する。

fb.VolumeDown(); (void)
//ボリュームを下げる

fb.VolumeMute(); (void)
// ボリュームのミュート

fb.VolumeUp(); (void)
// ボリュームを上げる
}

interface IGdiUtils {
メソッド:
gdi.CreateImage(w, h); (IGdiBitmap)
// 画像オブジェクトを作る

gdi.CreateStyleTextRender([pngmode]); (IStyleTextRender)
// テキスト描画用のオブジェクトを作る
// pngmode: boolean,デフォルトはfalse。
// samples\Glow Text Sample.txtを見よ。

interface IStyleTextRender {
メソッド:
// - アウトラインモード -
OutLineText(text_color, outline_color, outline_width);
DoubleOutLineText(text_color, outline_color1, outline_color2, outline_width1, outline_width2);
GlowText(text_color, glow_color, glow_width);

// - シャドウ -
EnableShadow(enable);
ResetShadow();
// EnableShadow()のすぐ後にResetShadow()を呼ぶことを推奨
Shadow(color, thickness, offset_x, offset_y);
// デフォルトはshadow、単一の色を使う。
DiffusedShadow(colour, thickness, offset_x, offset_y);
// - ソフトシャドウ -

// DiffusedShadow()を使っている間、下の2つのメソッドが使える。
SetShadowBackgroundColor(colour, width, height);
SetShadowBackgroundImage(img);

// - Render -
// flagsが"center"のようなものを含んでいたら、お勧めできない。
// 幅と高さ情報の不足のため、きちんと働かないだろう。
RenderStringPoint(g, str, font, x, y[, flags]);
RenderStringRect(g, str, font, x, y, w, h[, flags]);
SetPngImage(IGdiBitmap);
// pngmodeでのみ, gdi.CreateImage()で作った画像は透過画像になる。
}

gdi.Font(name, size px, [style]); (IGdiFont)
// フォントオブジェクトを作る。
// size px: helpers.txt > Point2Pixel関数を使って変換する。
// style: デフォルトは0。flags.txt > FontStyleを見よ。

gdi.Image(path); (IGdiBitmap)
// 画像オブジェクトを作る。
// 例: var img = "e:\\images folder\\my_image.png";
// バックスラッシュ("\")をクォートの中ではエスケープしなければならない点に注意。

gdi.LoadImageAsync(window_id, path); (uint)
// 別スレッドで画像をロードする。
// ユニークidを返す。samples\LoadImageAsync.txtを見よ。
}

interface IFbPlaylistManager {
プロパティ:
plman.ActivePlaylist; (uint) (read, write)
/*
例1: fb.trace(plman.ActivePlaylist);
0 が最初のプレイリスト。(数字で返される。名前を知りたい場合、plman.GetPlaylistName(plman.ActivePlaylist))のようにする。)
例2: plman.ActivePlaylist = 1;
2つ目のプレイリストに切り替える。
*/

plman.PlaybackOrder; (uint) (read, write)
// Playback Order(リピート・シャッフルなど)を切り替える。
/*
0 Default
1 Repeat (Playlist)
2 Repeat (Track)
3 Random
4 Shuffle (tracks)
5 Shuffle (albums)
6 Shuffle (folders)
samples\PBOButton(Menu).txtを見よ。
*/

plman.PlayingPlaylist; (uint) (read, write)
// 再生中のプレイリスト

plman.PlaylistCount; (uint) (read)
// プレイリストの数を数える

plman.PlaylistItemCount(playlistIndex); (uint) (read)
// プレイリストの中にあるアイテム(トラック)の数を数える
// 例: fb.trace(plman.PlaylistItemCount(plman.PlayingPlaylist));
// 12

plman.PlaylistRecyclerManager; (IFbPlaylistRecyclerManager) (read)
//プレイリスト用ゴミ箱
interface PlaylistRecyclerManager {
プロパティ:
Count; (uint) (read)
Name(index); (string) (read)
Content(index); (IFbMetadbHandleList) (read)
Id(index); (uint) (read)

メソッド:
FindById(id); (uint)
Purge(affectedItems); (void)
// affectedItems: array like [1, 3, 5]

Restore(index); (void)
RestoreById(id); (void)
//returns the index
}

メソッド:
plman.AddLocations(playlistIndex, paths[, select]); (void)
// プレイリストにファイル/URLを追加
/*
paths: ファイル/URLsの配列
select: boolean, デフォルトはfalse
例: plman.AddLocations(plman.ActivePlaylist, ["e:\\1.mp3"]);
アクティブなプレイリストにファイルを追加
*/

plman.ClearPlaylist(playlistIndex); (void)
// fb.ClearPlaylistはアクティブなプレイリストをクリアするが、このメソッドには"playlistIndex"引数が必要。
// 例: plman.ClearPlaylist(0);

plman.ClearPlaylistSelection(playlistIndex); (void)
// 例: plman.ClearPlaylistSelection(plman.ActivePlaylist);

plman.CreateAutoPlaylist(playlistIndex, name, query[, sort][, flags]); (uint)
// AutoPlaylistを作る。
// sort: デフォルトは "". title formattingパターン。
// flags: デフォルト 0, 強制ソート 1

plman.CreatePlaylist(playlistIndex, name); (uint)
// 新しいプレイリストを作る
/*
例1: plman.CreatePlaylist(0, "");
リストの最初に"New playlist"という名前の新しいプレイリストを作成する。
番号は、それぞれ名前なしのプレイリストに+1で付け直される。
(A,Bという2つのプレイリストがあるとする。番号はA=0,B=1だが、上の例1を実行するとNew playlist=0,A=1,B=2のように番号が順送りされる。)
例2: plman.CreatePlaylist(plman.PlaylistCount, "my favourites");
この例では現在のプレイリストの最後に"my favourites"が追加される。
*/

plman.DuplicatePlaylist(playlistIndex, name); (uint)
// プレイリストを複製する
/*
playlistIndex: コピー元のプレイリスト番号。複製されたプレイリストはコピー元のすぐ後に挿入される。
namを空文字列""にすると、名前はコピー元のものが使われる。
プレイリストの内容を複製するのであって、Autoplaylistのようなプレイリストのプロパティまではコピーしない。
*/

plman.EnsurePlaylistItemVisible(playlistIndex, itemIndex); (void)
// プレイリストのアイテムが確実に見えるようにする。Cursor follows playbackみたいな感じ。

plman.ExecutePlaylistDefaultAction(playlistIndex, playlistItemIndex); (boolean)
// ダブルクリック/enter のアクションで再生を始める。
// 他の何かをするためにロックするように上書きされていない限りにおいて。

plman.GetPlayingItemLocation(); (IFbPlayingItemLocation)
// 現在再生しているアイテムの、プレイリストとその中の位置を返す。
// 位置を見つけるのに失敗すると、IFbPlayingItemLocationインターフェースのプロパティ"IsValid"にfalseがセットされる。

interface IFbPlayingItemLocation {
プロパティ:
IsValid; (boolean) (read)
PlaylistIndex; (uint) (read)
PlaylistItemIndex; (uint) (read)
}

/*
例:プレイリストの番号と何曲目かをConsoleに出力
var playing_item_location = plman.GetPlayingItemLocation();
if (playing_item_location.IsValid) {
fb.trace(playing_item_location.PlaylistIndex);
fb.trace(playing_item_location.PlaylistItemIndex);
}
*/

plman.GetPlaylistFocusItemIndex(playlistIndex); (int)
// フォーカスしているアイテムの、プレイリストの中の位置を返す。
// 例: var focus_item_index = plman.GetPlaylistFocusItemIndex(plman.ActivePlaylist); // 0から始まる
// 選択されていない場合、 -1を返す。

plman.GetPlaylistItems(playlistIndex); (IFbMetadbHandleList)
// 指定したプレイリストのhandle_listを返す。
// 例: var handle_list = plman.GetPlaylistItems(plman.PlayingPlaylist);

plman.GetPlaylistName(playlistIndex); (string)
// 指定したプレイリストの名前を返す。
// 例: fb.trace(plman.GetPlaylistName(plman.ActivePlaylist));

plman.GetPlaylistSelectedItems(playlistIndex); (IFbMetadbHandleList)
// 指定したプレイリストの、選択されているアイテムのhandle_listを返す。
// 例: var selected_items = plman.GetPlaylistSelectedItems(plman.ActivePlaylist);

plman.InsertPlaylistItems(playlistIndex, base, handle_list), [select]); (uint)
// 指定したプレイリストに、曲を挿入する。
/*
select: boolean, デフォルトはfalse。
指定された位置で、新しいアイテムを指定されたプレイリストに挿入する。
例1: plman.InsertPlaylistItems(plman.ActivePlaylist, 0, fb.GetLibraryItems());
ライブラリにある全てのトラックをアクティブなプレイリストの最初に加える。
例2: plman.InsertPlaylistItems(plman.ActivePlaylist, plman.PlaylistItemCount(plman.ActivePlaylist), fb.GetLibraryItems());
ライブラリにある全てのトラックをアクティブなプレイリストの最後に加える。
*/

plman.InsertPlaylistItemsFilter(playlistIndex, base, handle_list, select = false); (uint)
// handle_listに含まれる重複が取り除かれること以外は、上記に同じ。

plman.IsAutoPlaylist(playlistIndex); (boolean)
// AutoPlaylistか否か。

plman.IsPlaylistItemSelected(playlistIndex, itemIndex); (boolean)
// 指定したアイテムが選択されているか否か。
// true/falseが返る。

plman.MovePlaylist(from, to); (boolean)
// プレイリストの順番を入れ替える。

plman.MovePlaylistSelection(playlistIndex, delta); (void)
// プレイリストの中で、選択したアイテムの順番を移動させる。
// 例: plman.MovePlaylistSelection(plman.ActivePlaylist, plman.PlaylistItemCount(plman.ActivePlaylist));
// 選択したアイテムをプレイリストの最後に送る。

plman.RemovePlaylist(playlistIndex); (boolean)
// プレイリストを削除する。

plman.RemovePlaylistSelection(playlistIndex[, crop]); (boolean)
/*
crop: boolean, デフォルトはfalse.
例1: plman.RemovePlaylistSelection(plman.ActivePlaylist);
選択したアイテムをプレイリストから削除する。
例2: plman.RemovePlaylistSelection(plman.ActivePlaylist, true);
選択したアイテム<以外>を削除する。
*/

plman.RenamePlaylist(playlistIndex, name); (boolean)
// プレイリストをリネームする。

plman.SetActivePlaylistContext(); (void)
// プレイリストにフォーカスしていなくても、fb.RunMainMenuCommand()でEditメニューを実行するための回避策

plman.SetPlaylistFocusItem(playlistIndex, itemIndex); (void)
// プレイリストにフォーカスさせる。
// 例: plman.SetPlaylistFocusItem(plman.ActivePlaylist, 0);

plman.SetPlaylistFocusItemByHandle(playlistIndex, handle); (void)
// 上と同じだが、順番ではなくhandleを使う。
/*
例:プレイリストの上から2番目にフォーカスする
var ap = plman.ActivePlaylist;
var handle = plman.GetPlaylistItems(ap).Item(1); //2nd item in playlist
plman.SetPlaylistFocusItemByHandle(ap, handle);
*/

plman.SetPlaylistSelection(playlistIndex, affectedItems, state); (void)
// 指定したプレイリストのアイテムを配列で選択する。
/*
affectedItems: アイテム番号の配列
state: boolean.(true=選択、false=選択解除)
例: plman.SetPlaylistSelection(plman.ActivePlaylist, [0, 2, 4], true);
プレイリストの最初、3番目、5番目のトラックを選択する。
既に選択されているアイテムには影響しない点に注意。
*/

plman.SetPlaylistSelectionSingle(playlistIndex, itemIndex, state); (void)
// 指定したプレイリストのアイテムを一つだけ選択する。
/*
state: boolean(true=選択、false=選択解除)
例1: plman.SetPlaylistSelectionSingle(plman.ActivePlaylist, 0, false);
プレイリストの最初のアイテムの選択を解除する。 当然、それが既に選択されている場合にのみ機能する。(トグルしない)
例2: plman.SetPlaylistSelectionSingle(plman.ActivePlaylist, plman.PlaylistItemCount(plman.ActivePlaylist) - 1, true);
プレイリストの最後のアイテムを選択する。
既に選択されているアイテムには影響しない点に注意。
*/

plman.ShowAutoPlaylistUI(playlistIndex); (boolean)
/*
指定のAutoplaylistプロパティを編集するウィンドウをポップアップする。
例: fb.ShowAutoPlaylistUI(plman.ActivePlaylist);
これを使用する前に、それがAutoplaylistかどうかplman.IsAutoPlaylist(...)を使って調べておくこと。
*/

plman.SortByFormat(playlistIndex, pattern[, selected_items_only]); (boolean)
// プレイリストをソートする。
/*
playlistIndex: 対象のプレイリスト番号
pattern: ソートするtitle formattingパターン。""をセットするとランダムな並びになる。
selected_items_only: boolean, デフォルトはfalse。
成功すればtrue、失敗した時(プレイリストがロックされていた等)はfalseが返る。
*/

plman.SortByFormatV2(playlistIndex, pattern[, direction]); (boolean)
// 昇/降順付き
// direction: デフォルト 1 (昇順)、-1 (降順).

plman.UndoBackup(playlistIndex); (void)
//プレイリスト用アンドゥの用意
// Editメニューで履歴のようなものを使いたい場合、他のメソッドでプレイリストにadd/remove/reorderを加える前に呼び出さなければならない。。

Queue Methods:

plman.AddItemToPlaybackQueue(handle); (void)
//アイテムをキューに追加する。

plman.AddPlaylistItemToPlaybackQueue(playlistIndex, playlistItemIndex); (void)
// プレイリストの順番を指定してアイテムをキューに追加する。

plman.CreatePlaybackQueueItem(); (IFbPlaybackQueueItem)

interface IFbPlaybackQueueItem {
プロパティ:
Handle; (IFbMetadbHandle) (read, write)
PlaylistIndex; (uint) (read, write)
PlaylistItemIndex; (uint) (read, write)

メソッド:
Equals(item); (boolean)
// item: IFbPlaybackQueueItemのインスタンス。

Dispose(); (void)
}

plman.FindPlaybackQueueItemIndex(handle, playlistIndex, playlistItemIndex); (int)
// 成功しなかったら -1を返す

plman.FlushPlaybackQueue(); (void)

plman.GetPlaybackQueueContents(); (VBArray)
//VBArrayを返すので、必要なら.toArray()を使う。

plman.GetPlaybackQueueCount(); (uint)
//キューのカウント

plman.IsPlaybackQueueActive(); (boolean)
// キューがアクティブか否か

plman.RemoveItemFromPlaybackQueue(index); (void)
// 順番で指定したアイテムをキューから削除

plman.RemoveItemsFromPlaybackQueue(affectedItems); (void)
// affectedItems: [1, 3, 5]のような配列で指定
}

interface IJSUtils {
  プロパティ:
    utils.Version (uint) (read)
/* v1.2.0.からは、バージョンに応じた4桁の数字を返す。

v1.2.0 -> 1200
v1.2.1 -> 1210

古いコンポーネントでこれを使おうとするとスクリプトがクラッシュするので、こんなチェックをすると良い。

if (!("Version" in utils)) {
fb.ShowPopupMessage("Current component version is less than v1.2.0. This script requires vX.X.X");
} else {
//check the actual version
}
*/
メソッド:
utils.CheckComponent(name[, is_dll]); (boolean)
// コンポーネントがインストールされているかチェックする。
// is_dll: boolean, デフォルトはfalse。もしtrueなら、このメソッドは,モジュール名からファイル名をチェックする。
// 例: fb.trace(utils.CheckComponent("foo_jscript_panel", true));

utils.CheckFont(name); (boolean)
// フォントをチェック。
// name: 英語名、OSでのローカル名どちらにも対応。

utils.FileTest(path, mode); (VARIANT)
// ファイルテスト
/*
mode:
"chardet": ファイルのcharsetを推測して、codepageを返す。正確でない場合があるし、エラーが起こった場合は0を返す。
"e": パスが存在しているなら、trueを返す。
"s": バイトの単位でサイズを返す。
"d": パスがフォルダなら、trueを返す。
"split": パスをフォルダ名、ファイル名、拡張子などに分割。VBArrayを返すので、必要なら.toArray()を使う。
例: var arr = utils.FileTest("D:\\Somdir\\Somefile.txt", "split").toArray();
arr[0] <= "D:\\Somedir\\" (always includes backslash at the end)
arr[1] <= "Somefile"
arr[2] <= ".txt"
*/

utils.FormatDuration(seconds) (string)
// 曲の時間を文字列に整形して返す。
// 例: fb.trace(utils.FormatDuration(plman.GetPlaylistItems(plman.ActivePlaylist).CalcTotalDuration()));
// 1wk 1d 17:25:30

utils.FormatFileSize(bytes) (string)
// バイト単位でファイルサイズを返す。
// 例: fb.trace(utils.FormatFileSize(plman.GetPlaylistItems(plman.ActivePlaylist).CalcTotalSize()));
// 7.9 GB

utils.GetAlbumArtAsync(window_id, handle[, art_id][, need_stub][, only_embed][, no_load]); (uint)
// 非同期でアルバムアートを取りに行く。
/*
window_id: window.ID
art_id: デフォルトは0。flags.txt > AlbumArtIdを見よ。
need_stub: boolean, デフォルトはtrue。
only_embed: boolean, デフォルトはfalse
no_load: boolean, デフォルトはfalse。もしtrueなら、on_get_album_art_doneコールバックの"image"パラメータはnullになる。
samples\GetAlbumArtAsync.txtを見よ。
*/

utils.GetAlbumArtEmbedded(rawpath[, art_id]); (IGdiBitmap)
// 音楽ファイルの埋め込み画像を取りに行く。
// art_id: デフォルトは0。flags.txt > AlbumArtIdを見よ。
// 例: var img = utils.GetAlbumArtEmbedded(fb.GetNowPlaying().RawPath, 0);

utils.GetAlbumArtV2(handle[, art_id][, need_stub]); (IGdiBitmap)
// 総合的なアルバムアートを取りに行くメソッド。
/*
art_id: デフォルトは0。flags.txt > AlbumArtIdを見よ。
need stub: boolean, デフォルトはtrue。
samples\GetAlbumArtV2.txtを見よ。
*/

utils.GetSysColor(index); (uint)
//システムカラーを返す
/*
index: http://msdn.microsoft.com/en-us/library/ms724371%28VS.85%29.aspx
例: var splitter_colour = utils.GetSysColor(15);
失敗したら0を返す。
*/

utils.GetSystemMetrics(index); (int)
// システムのウィンドウ幅etcのシステムメトリックの値を取りに行く。
// index: http://msdn.microsoft.com/en-us/library/ms724385%28VS.85%29.aspx
// 失敗したら0を返す。

utils.Glob(pattern[, exc_mask][, inc_mask]); (VBArray)
// パスの検索
/*exc_mask: デフォルトはFILE_ATTRIBUTE_DIRECTORY。 flags.txt > Used in utils.Glob()を見よ。
inc_mask: デフォルトは0xffffffff
VBArrayを返すので、必要なら.toArray()を使う。
例: var arr = utils.Glob("C:\\*.*").toArray();
*/

utils.IsKeyPressed(vkey); (boolean)
// 特定のキーが押されたか否か
// vkey: http://msdn.microsoft.com/en-us/library/ms927178.aspx

utils.MapString(text, lcid, flags); (string)

utils.PathWildcardMatch(pattern, str); (boolean)
// MS-DOS風ワイルドカードが使える検索
// using Microsoft MS-DOS wildcards match type. eg "*.txt", "abc?.tx?"

utils.ReadTextFile(filename[,codepage]); (string)
// テキストファイル読み込み

/*codepage: デフォルトは0。codepages.txtを見よ。
if codepage is 0, text file can be either UTF-16 with BOM or UTF-8 with BOM and ANSI.
例: var text = utils.ReadTextFile("E:\\some text file.txt");
*/

utils.ReadINI(filename, section, key[, defaultval]); (string)
// 設定用INIファイル読み込み
/*
INIファイルの構成:

[セクション]
キー=値

一つの値につき最高255文字を返す。
例: var username = utils.ReadINI("e:\\my_file.ini", "Last.fm", "username");
*/

utils.WriteINI(filename, section, key, val); (boolean)
// 設定用INIファイル書き込み
// 例: utils.WriteINI("e:\\my_file.ini", "Last.fm", "username", "Bob");
}

interface IFbWindow {
プロパティ:
window.DlgCode(); (int) (read, write)
// flags.txt > With window.DlgCodeを見よ。
// 例: window.DlgCode(DLGC_WANTALLKEYS);

window.ID; (read) (int)
// utils.GetAlbumArtAsync, utils.LoadImageAsyncが必要とする。

window.InstanceType; (int)
// CUI と DUIの判定
// 0 CUI, 1 DUI。両方のインターフェースをサポートしたいなら、どのGetFontXXXとGetColorXXXメソッドを使用するべきか決定するのに必要となる。

window.IsTransparent; (boolean) (read)
// 背景を透過するか否か
// JScript Panel Configurationウィンドウの設定に依存する。通常、背景を描くかどうか決定するために使う。

window.IsVisible; (boolean) (read)
// ウィンドウが見えるか否か

window.Height; (int) (read)
// ウィンドウ(パネル)の高さ

window.MaxHeight; (int) (read, write)
window.MaxWidth; (int) (read, write)
window.MinHeight; (int) (read, write)
window.MinWidth; (int) (read, write)
// この4つのメソッドはパネルのサイズをロックするのに使うことができる。しかしながらパネルがPanel Stack Splitterの中にあるなら、使用しない方が良い。

window.Width; (int) (read)
// ウィンドウの幅

メソッド:
window.ClearTimeout(timerID); (void)
window.ClearInterval(timerID); (void)
window.SetInterval(func, delay); (uint)
window.SetTimeout(func, delay); (uint)
// タイマー関連
// この4つのメソッドについては、samples\timers.txtを見よ。

window.CreatePopupMenu(); (IMenuObj)
//ポップアップメニューオブジェクトを作る。

interface IMenuObj {
// samples\MainMenuManager All-In-One, samples\Menu Sample.txtを見よ

プロパティ:
ID; (uint) (read)

メソッド:
AppendMenuItem(flags, item_id, text); (void)
// メニュー項目の追加。
// flags: flags.txt > Used in AppendMenuItem()を見よ。
// item_id: 0より大きな整数。各項目にユニークidが必要。

AppendMenuSeparator(); (void)
// メニュー中のセパレータを追加する。

AppendTo(parentMenu, flags, text); (void)
// 子メニュー

CheckMenuItem(id_or_pos, check[, bypos]); (void)
// チェック付きメニュー
// check: boolean.
// bypos: boolean, デフォルトはfalse。

CheckMenuRadioItem(first, last, check[, bypos]); (void)
// ラジオボタン形式のチェックメニュー
// check: boolean.
// bypos: boolean, デフォルトはfalse。

Dispose(); (void)
// 破棄

EnableMenuItem(id_or_pos, enable[, bypos]); (void)
//メニュー項目の有効/無効(グレー化)
// enable: boolean.
// bypos: boolean, デフォルトはfalse。

TrackPopupMenu(x, y[, flags]); (int)
// メニューのユニークidが返る。
// flags: default 0, see flags.txt > Used in TrackPopupMenu()
}

window.CreateThemeManager(class_list); (IThemeManager)
// class_list: http://msdn.microsoft.com/en-us/library/bb773210%28VS.85%29.aspx
// samples\SimpleThemedButton.txt, samples\Themed Seek Bar.txtを見よ。

interface IThemeManager {
// samples\SimpleThemedButton, samples\Themed Seekbar.txtを見よ。

メソッド:
DrawThemeBackground(IGdiGraphics, x, y, w, h[, clip_x][, clip_y][, clip_w][, clip_h]); (void)
// clip_x, clip_y, clip_w, clip_h: defaults to 0 if omitted

IsThemePartDefined(partid); (boolean)
SetPartAndStateID(partid, stateid); (void)
// partid, stateid: http://msdn.microsoft.com/en-us/library/bb773210%28VS.85%29.aspx
}

window.CreateTooltip([font_name][, font_size_px][, font_style]); (IFbTooltip)
// ツールチップオブジェクトを作る。
/*
font_name: デフォルトは"Segoe UI"
font_size_px: デフォルトは12
font_style: デフォルトは0。flags.txt > FontStyleを見よ。
*/

interface IFbTooltip {
// これは下の例のように使われる。
// var tooltip = window.CreateTooltip();

プロパティ:
Text; (string) (read, write)
// 例: tooltip.Text = "Whoop";

TrackActivate; (boolean) (write)

メソッド:
Activate(); (void)
// 有効化
/*
テキストが変化した時、こうするだけにしておく。さもなければチラつくかもしれない。
例:
var text = "...";
if (tooltip.Text != text) {
tooltip.Text = text;
tooltip.Activate();
}
*/

Deactivate(); (void)
// 無効化

Dispose(); (void)
// 破棄

GetDelayTime(type); (int)
SetDelayTime(type, time); (void)
// type: flags.txt > Used in IFbTooltip.GetDelayTime() and IFbTooltip.SetDelayTime()を見よ。

SetMaxWidth(width); (void)
// 最大幅
/*
複数行のツールチップが欲しい場合
例:
tooltip.SetMaxWidth(800);
tooltip.Text = "Line1\nLine2";
\nを改行文字として使う
*/

TrackPosition(x, y); (void)
// x、yの座標をチェックして、最後の時と変わっていたらチラつくかもしれない。
}

window.GetBackgroundImage(); (IGdiBitmap)
// pseudo-transparent(疑似透過モード)で背景画像を取り直す。

window.GetColorCUI(type[, client_guid]); (uint)
window.GetColorDUI(type); (uint)

window.GetFontCUI(type[, client_guid]); (IGdiFont)
window.GetFontDUI(type); (IGdiFont)
/*
type: flags.txt > Used in window.GetFontXXX()を見よ。
client_guid: デフォルトは""。flags.txt > Used in GetFontCUI() as client_guidを見よ。
コンポーネントはフォントを決定することができないなら、nullを返す点に注意。
フォントを使うか、そのプロパティにアクセスしようとするとき、
エラーを避けるためにこのようなコードを使用しなければならない...

var font = window.GetFontDUI(0);
if (!font) {
fb.trace("Unable to determine your default font. Using Segoe UI instead.");
font = gdi.Font("Segoe UI", 12);
}
*/

window.NotifyOthers(name, info); (void)
/*
name: 文字列
info: すべての変数/配列/オブジェクトの型をサポートする。
他のパネルが通知を受け取ってから、on_notify_data(name, info) {}を使う。
*/

window.Reload(); (void)
// パネルのリロード

window.Repaint([force]); (void)
// パネルの再描画。
// force: boolean, デフォルトはfalse。

window.RepaintRect(x, y, w, h[, force]); (void)
/*
x, y, w, h は、0以上の整数でなければならない。
force: boolean, デフォルトはfalse。

あなたが計算されたx,y値に自信がもてないならば、このようにしておくとか...
window.RepaintRect(Math.max(0, x), Math.max(0, y), w, h);

これをwindow.Repaintの代わりに使って、ひんぱんに更新される
time, bitrate, seekbar, etcのような領域を描画しよう。そうすればCPU使用を減らせる。
Windowsタスクマネージャを使って再確認してみよう。
*/

window.SetCursor(id); (void)
// id: flags.txt > Used in window.SetCursor()を見よ。

window.GetProperty(name[, defaultval]); (VARIANT)
// nameを使ってプロパティの値を取り出せる。
// 値が存在しないなら、nameと返り値のためにデフォルト値を保存させる。

window.SetProperty(name, val); (void)
// プロパティをセットする。
/*name: 文字列
val: 文字列, 数字, boolean
値をセットする時、nullまたは無効な値だったら、それは除外される。
プロパティの値はパネルごとに保存され、foobar2000がリスタートするまで記憶されている。
*/

window.ShowConfigure(); (void)
// 現在のパネルのconfigurationウィンドウを表示する。

window.ShowProperties(); (void)
// 現在のパネルのプロパティウィンドウを表示する。
}

interface IGdiFont {
// これは下の例のように使われる。
// var my_font = window.GetFontDUI(0); // flags.txt > FontTypeDUIを見よ。

プロパティ:
Height (int) (read)
// 例: fb.trace(my_font.Height);
// 15

Name (string) (read)
// 例: fb.trace(my_font.Name);
// Segoe UI

Size (float) (read)
// 例: fb.trace(my_font.Size);
// 12

Style (int) (read)
// 例: fb.trace(my_font.Style);
// 0 see flags.txt > FontStyle

メソッド:
Dispose(); (void)
// 破棄する。
// 例: my_font.Dispose();
}

interface IGdiBitmap {
/*
例1: samples\Apply Mask.txt
例2: samples\Box Blur.txt
例3: samples\Glow Text Sample.txt
例4: samples\basic\StackBlur.txt
*/

プロパティ:
Height (int) (read)
Width (int) (read)

メソッド:
ApplyAlpha(alpha); (IGdiBitmap)
// 不透明度を与える
// alpha: 0-255

ApplyMask(img); (boolean)
// 現在のBitmap画像にマスクを適用

BoxBlur(radius, [iteration]); (void)
// iteration: デフォルトは1。

Clone(x, y, w, h); (IGdiBitmap)
// クローン

CreateRawBitmap(); (IGdiRawBitmap)
// DDB bitmapをIGdiBitmapから作成。GdiDrawBitmap()で使う。
interface IGdiRawBitmap {
プロパティ:
Width; (int) (read)
Height; (int) (read)

メソッド:
Dispose(); (void)
// 破棄
}

Dispose(); (void)
// 破棄

GetColorScheme(max_count); (VBArray)
// VBArrayを返すので、必要なら.toArray()を使う。

GetGraphics();
// IGdiGraphicsインターフェースで作業した後、ReleaseGraphics()を使うのを忘れないように。

ReleaseGraphics(IGdiGraphics); (IGdiGraphics)
// 画像データをリリース

Resize(w, h, [mode]); (IGdiBitmap)
// リサイズ
// mode: デフォルトは0。flags.txt > InterpolationModeを見よ。

RotateFlip(mode); (void)
//画像の回転。
// mode: flags.txt > RotateFlipTypeを見よ。

SaveAs(path, [format]); (boolean)
// 画像の保存
/*
path: 拡張子を含むフルパス。親フォルダが既に存在していなければならない。
format:
"image/png" (省略されていた場合)
"image/bmp"
"image/jpeg"
"image/gif"
"image/tiff"

例:
var img = utils.GetAlbumArtEmbedded(fb.GetFocusItem().RawPath, 0);
if (img)
img.SaveAs("D:\\export.jpg", "image/jpeg");
*/
StackBlur(radius); (void)
// radius=ぼかし半径: valid values 2-254
}

interface IGdiGraphics {
/*
一般的にon_paint(gr)の中で使われるような色は、多くの違う方法で得られる。。
window.GetColorDUI/window.GetColourCUIを使う。
RGB関数(helpers.txt)を使う。
predefined colour(helpers.txt)を使う。
さらに...。
*/

メソッド:
gr.CalcTextHeight(str, IGdiFont); (uint)
// テキストの高さを計算する。
// これは1行分の高さだけを計算する。

gr.CalcTextWidth(str, IGdiFont); (uint)
// テキストの幅を計算する。

gr.DrawEllipse(x, y, w, h, line_width, color); (void)
// 円を描く。中を塗りつぶすにはFillEllipseを使う。

gr.DrawImage(IGdiBitmap, dstX, dstY, dstW, dstH, srcX, srcY, srcW, srcH, [angle], [alpha]); (void)
// 一般的な画像表示メソッド。
// angle: デフォルトは0。
// alpha: デフォルトは255。 有効範囲は0-255。

gr.DrawLine(x1, y1, x2, y2, line_width, colour); (void)
/// 線を引く。

gr.DrawPolygon(color, line_width, points); (void)
// pointsを頂点とする多角形を描く。
// points: JScript配列。x,yで一組。

gr.DrawString(str, IGdiFont, color, x, y, w, h, [flags]); (void)
// 文字を表示する。GDI+系のメソッドらしい。
// flags: デフォルトは0。flags.txt > StringFormatFlagsを見よ。

gr.DrawRect(x, y, w, h, line_width, colour); (void)
// 長方形を描く。

gr.DrawRoundRect(x, y, w, h, arc_width, arc_height, line_width, color); (void)
// 角丸長方形を描く。

gr.EstimateLineWrap(str, IGdiFont, max_width); (VBArray)
// 文字の折り返し設定。
/*
VBArrayを返すので、必要なら.toArray()を使う。
index | 意味
[0] 1行目のテキスト
[1] 1行目の幅(ピクセル)
[2] 2行目のテキスト
[3] 2行目の幅(ピクセル)
...
[2n + 2] n行目のテキスト
[2n + 3] n行目の幅(ピクセル)
*/

gr.FillEllipse(x, y, w, h, colour); (void)
// 塗りつぶされた円を描く。

gr.FillGradRect(x, y, w, h, angle, colour1, colour2, [focus]); (void)
グラデーション付きの長方形塗りつぶし。
/*
focus: デフォルトは1.0。有効な値は0.0から1.0の間。
色の最も強い中心点をどこに置くか決める。

注意:これは長方形のサイズによっては見にくくなることがある。
最も簡単な修正は"角度"を1~2度ほど調整することだ。
*/

gr.FillPolygon(colour, fillmode, points); (void)
// pointsを頂点とする多角形を描き、塗りつぶす。。
// fillmode: 0 Alternate, 1 Winding.
// points: JScript配列。

gr.FillRoundRect(x, y, w, h, arc_width, arc_height, colour); (void)
// 角丸長方形を描き、塗りつぶす。

gr.FillSolidRect(x, y, w, h, colour); (void)
// 長方形を描き、1色で塗りつぶす。

gr.GdiDrawBitmap(IGdiRawBitmap, dstX, dstY, dstW, dstH, srcX, srcY, srcW, srcH); (void)
// DrawImageよりも速度で勝るが、alphaチャンネルをサポートしない。

gr.GdiDrawText(str, IGdiFont, color, x, y, w, h, [format]); (VBArray)
// 文字を表示する。GDI系のメソッドらしい。
/*
format: デフォルトは0。flags.txt > DT_*を見よ。

VBArrayを返すので、必要なら.toArray()を使う。
index | 意味
[0] left (DT_CALCRECT)
[1] top (DT_CALCRECT)
[2] right (DT_CALCRECT)
[3] bottom (DT_CALCRECT)
[4] characters drawn
*/

gr.MeasureString(str, IGdiFont, x, y, w, h, [flags]); (IMeasureStringInfo)
// 文字列の幅を計算する
// flags: デフォルトは0。flags.txt > StringFormatFlagsを見よ。

interface IMeasureStringInfo {
プロパティ:
chars; (int) (read)
Height; (float) (read)
lines; (int) (read)
x; (float) (read)
y; (float) (read)
Width; (float) (read)

/*
例:
// ==PREPROCESSOR==
// @import "%fb2k_component_path%docs\flags.txt"
// @import "%fb2k_component_path%docs\helpers.txt"
// ==/PREPROCESSOR==

var sf = StringFormat(StringAlignment.Near, StringAlignment.Near);
var text = utils.ReadTextFile(fb.TitleFormat("$directory_path(%path%)").Eval() + "\\cuetools.log");
var font = window.GetFontDUI(0);

function on_paint(gr) {
gr.DrawString(text, font, RGB(255, 0, 0), 0, 0, window.Width, window.Height, sf);
//if we want to calculate height, we must set the height to be far larger than what the text could possibly be.
var temp = gr.MeasureString(text, font, 0, 0, window.Width, 10000, sf);
fb.trace(temp.Height); // 2761.2421875 // far larger than my panel height!
fb.trace(temp.Chars); // 7967
}
*/
}

gr.SetInterpolationMode(mode); (void)
// 画像拡大縮小時の補間アルゴリズムをセットする。
// mode: デフォルトは0。flags.txt > InterpolationModeを見よ。

gr.SetSmoothingMode(mode); (void)
// アンチエイリアスをかける。
// mode: デフォルトは0。flags.txt > SmoothingModeを見よ。

gr.SetTextRenderingHint(mode); (void)
// DrawStringの前に使ってきれいに表示するためのものらしい。
// mode: デフォルトは0。flags.txt > TextRenderingHintを見よ。

gr.GdiAlphaBlend(IGdiRawBitmap, dstX, dstY, dstW, dstH, srcX, srcY, srcW, srcH, [alpha]); (void)
// 画像の透過転送
// alpha:デフォルトは255。有効値は0-255。
}

interface IFbMetadbHandle {
// これは下の例のように使われる。
// var handle = fb.GetFocusItem();

プロパティ:
Path; (string) (read)
// 例: fb.trace(handle.Path);
// D:\some song.flac

RawPath; (string) (read)
// 例: fb.trace(handle.RawPath);
// file://D:\some song.flac

SubSong; (int) (read)

FileSize; (double) (read)

Length; (double) (read)

メソッド:
Compare(handle); (boolean)
/*
IFbMetadbHandleインスタンスをポインタのみで比較する。
例: handle.Compare(handle2);
物理的に比較したいなら"RawPath"プロパティを使う。
*/

Dispose(); (void)
// 破棄
// 例: handle.Dispose();

GetFileInfo(); (IFbFileInfo)

interface IFbFileInfo {
/*
これは下の例のように使われる。
var handle = fb.GetFocusItem();
var f = handle.GetFileInfo();
*/

プロパティ:
MetaCount; (read)
// 例: fb.trace(f.MetaCount);
// 11

InfoCount; (read)
// 例: fb.trace(f.InfoCount);
// 9

メソッド:
Dispose();
// 破棄
// 例: f.Dispose();

InfoFind(name);
// indexを返す

InfoName(idx);

InfoValue(idx);

MetaAdd(name, value);

MetaFind(name);
// returns idx

MetaInsertValue(idx, vidx, value);

MetaName(idx);
/*
例:
var text = "";
for (var i = 0; i < f.MetaCount; i++) {
text += f.MetaName(i).toUpperCase() + " ");
}
fb.trace(text); // ALBUM ARTIST DATE ...
*/

MetaRemoveField(name);

MetaSet(name, value);

MetaValue(idx, vidx);

MetaValueCount(idx);
}

UpdateFileInfoSimple(field1, value1 [, field2, value2 [,...] ] [, multivalue_fields]);
// タグ情報の更新。
// 値が空の文字列なら、削除された複数の値を持つフィールド。セミコロンで区切られたリストは、
// フィールド名が持つ複数の値として処理される必要がある。
// 例: handle.UpdateFileInfoSimple("ARTIST", "Enigma", "GENRE", "Downtempo;Ambient", "GENRE");
// GENREは複数の値を持つフィールドとみなされる。GENRE[0] = "Downtempo", GENRE[1] = "Ambient"。
}

interface IFbMetadbHandleList {
/*
これは下の例のように使われる。
var handle_list = plman.GetPlaylistItems(plman.ActivePlaylist);
もし空のhandle listが欲しければ、こうする:
var handle_list = plman.GetPlaylistItems(-1);
*/

プロパティ:
Count; (uint) (read)
// 例: fb.trace(items.Count);
// 12

Item(idx); (IFbMetadbHandle) (read, write)
// 例: fb.trace(fb.TitleFormat("%artist%").EvalWithMetadb(items.Item(0)));
// アーティストのhandle listの最初のアイテムを出力する。

メソッド:
Sort(); (void)
// ソートして重複を除去する。

Add(handle); (uint)
// アイテムを追加
// 例: handle_list.Add(fb.GetNowPlaying());

AddRange(handle_list); (void)
// 複数のアイテムを追加
// 例: handle_list.AddRange(fb.GetLibraryItems());

BSearch(handle); (uint)
// アイテムを検索
// ソートを行ってから使用する。Find()より速い。

CalcTotalDuration(); (double)
// アイテムの再生時間の合計
// 結果に対してutils.FormatDuration()を使うことを考慮しよう。

CalcTotalSize(); (double)
// アイテムのファイルサイズの合計
// 結果に対してutils.FormatFileSize()を使うことを考慮しよう。

Clone(); (IFbMetadbHandleList)
// クローン作製
// 例: var handle_list2 = handle_list.Clone();

Dispose(); (void)
// 破棄
// 例: handle_list.Dispose();

Find(handle); (uint)
// 検索
// もしソートしてあるなら、BSearchの方を使おう。

Insert(index, handle); (uint)
// 挿入
/*
例1: handle_list.Insert(0, fb.GetNowPlaying());
0に挿入するとhandle listの最初になる。
例2: handle_list.Insert(items.Count, fb.GetNowPlaying());
こちらは最後に追加する例。
*/

InsertRange(index, handle_list); (uint)
// 複数のアイテムの挿入。

MakeDifference(handle_list); (void)
// ソートされていなければならない。

MakeIntersection(handle_list); (void)
// ソートされていなければならない。

MakeUnion(handle_list); (void)
// ソートされていなければならない。

OrderByFormat(tfo, direction); (void)
//TFで指定した順にソートする。
/*
tfo: IFbTitleFormatのインスタンス。
direction: 整数、0より大きければ昇順。
例:
var handle_list = fb.GetLibraryItems();
var tfo = fb.TitleFormat("%album artist%|%date%|%album%|%discnumber%|%tracknumber%");
handle_list.OrderByFormat(tfo, 1);
*/

OrderByPath(); (void)
//path順でソート

OrderByRelativePath(); (void)
//相対パス順でソート

Remove(handle); (void)
// handleを削除

RemoveAll(); (void)
// すべて削除
/*
例:
handle_list.RemoveAll();
fb.trace(handle_list.Count);
0 - 空のhandle listを得るもう一つの方法!
*/

RemoveById(idx); (void)
// 例: handle_list.RemoveById(0);
// プレイリストの最初を削除

RemoveRange(from, num); (void)
// 範囲で削除
// 例: handle_list.RemoveRange(10, 20);

UpdateFileInfoSimple(field1, value1 [, field2, value2 [,...] ] [, multivalue_fields]);
// タグ情報の更新。
// 値が空の文字列なら、削除された複数の値を持つフィールド。セミコロンで区切られたリストは、
// フィールド名が持つ複数の値として処理される必要がある。
// 例: handle.UpdateFileInfoSimple("ARTIST", "Enigma", "GENRE", "Downtempo;Ambient", "GENRE");
// GENREは複数の値を持つフィールドとみなされる。GENRE[0] = "Downtempo", GENRE[1] = "Ambient"。
}

interface IDropTargetAction {
// samples\Drag Drop Basic.txtを見よ。

プロパティ:
Parsable; (boolean) (read, write)

Playlist; (read, write)
// default: -1, アクティブなプレイリスト

ToSelect; (boolean) (read, write)

メソッド:
ToPlaylist(); (void)
}



ここからPBOButton(Menu).txtですけど、今の時点でのJscript Panelはver2.3.6.1のようです。ver2以降はだいぶサンプルや関数に変化がありました。
現時点(2020/06/13)で最新版は
https://kbuffington.github.io/foo_jscript_panel/foo_jscript_panel.html

動くように関数を一部移植してます。
PBOButton(Menu) .txt

また、このサンプルはボタンに画像を必要とするため、画像をファイルをまとめました。
\user-components\foo_jscript_panel\samples\basic\imagesに解凍したやつを入れてください。
images.zip


単純化したやつ(画像なし、文字のみ)

//// ==PREPROCESSOR==
// @name "PlayBack Order Buuton"
// @author "Junya Renno"
// ==/PREPROCESSOR==

//前準備
//メニューに使用する値
var MF_SEPARATOR = 0x00000800;
var MF_ENABLED = 0x00000000;
var MF_GRAYED = 0x00000001;
var MF_DISABLED = 0x00000002;
var MF_UNCHECKED = 0x00000000;
var MF_CHECKED = 0x00000008;
var MF_STRING = 0x00000000;
var MF_MENUBARBREAK = 0x00000020;
var MF_MENUBREAK = 0x00000040;

//RGBを楽に指定するための関数
function RGBA(r, g, b, a) {
return ((a << 24) | (r << 16) | (g << 8) | (b));
}
function RGB(r, g, b) {
return (0xff000000 | (r << 16) | (g << 8) | (b));
}
//ツールチップ
function tt(value) {
if (tooltip.Text != value) {
tooltip.Text = value;
tooltip.Activate();
}
}

//ボタンの中にカーソルがいるかどうかのフラグ
var g_hover = 0;
//フォントの準備
var g_font = gdi.Font("MS 明朝", 16, 1);
//ツールチップの準備
var tooltip = window.CreateTooltip();
//ドロップダウンメニューに表示する文字列
pbo_string = ["Default","Repeat (Playlist)","Repeat (Track)","Random","Shuffle (Tracks)","Shuffle (Albums)","Shuffle (Folders)"];

//==========
function on_mouse_lbtn_down(x, y) {
var _menu = window.CreatePopupMenu(); //メニュー作成
var i = 1;
var max_menu = 7; //メニューの数
var ret;

for (i=1; i<max_menu; i++){
_menu.AppendMenuItem(MF_STRING, i,pbo_string[i - 1]);
}
_menu.CheckMenuRadioItem(1, i, plman.PlayBackOrder + 1); //メニューに今まで選ばれていた印をつける

ret = _menu.TrackPopupMenu(x, y); //マウスで選択したメニューが返ってくるので保持する
//ret=0 なら選択されずにキャンセルされたということなので何もしない。
//メニュー以外の数値が入ってきたらバグの元になるのではじく
if (ret >= 1 && ret <= max_menu)
{
plman.PlayBackOrder = ret - 1; //PBOに新しい数値をセット
}
}


function on_paint(gr){
//表示部分
var PBO = plman.PlayBackOrder;
gr.DrawString(pbo_string[PBO], g_font, RGB(0,0,0), 0, 0, window.Width,window.Height );
//ここでは簡単にするためウィンドウ全体(Jscript panel内)を書き換えているが、
//本来なら範囲を絞って最低限の書き換えにするべき
}

function on_playback_order_changed(new_order_index) {
window.Repaint();
}

function on_mouse_move(){
//ボタンの中にカーソルが入ってきた
g_hover = 1;
tt("再生順");
window.Repaint();
}

function on_mouse_leave(){
//ボタンからカーソルが出た
g_hover = 0;
tt(""); //ツールチップ消去
window.Repaint();
}





 

>samples\PBOButton(Menu).txtがないのです

かなり前の記事にコメントすみません。
現在Jscriptpanlを使って試行錯誤していたところ、こちらを見つけました。
playback orderを変えるボタンのようなものを作りたいなと思っていたのですが、私のダウンロードしたコンポーネントのサンプルにはPBOButton(Menu).txtが入っておらず、また、こちらの構文を使ったサンプルも見つからずお手上げ状態です。
Jscriptの知識どころかプログラミングもしたことないド素人なので、サンプルがないとどうにもならず…
もしよろしければ該当のtxtを見せていただけないでしょうか(二次配布禁止等ルールに抵触していなければ、)
もしくはアドバイス等いただけたら幸いです。

Posted by まー at 2020/06/13 (Sat) 05:30:50

>載っけときました

本質と違うところでメンドクサイのが多いとだけいっときます。
がんばってください。

Posted by 連野 at 2020/06/13 (Sat) 21:47:18

>ありがとうございます

ありがとうございます。とても助かりました。
希望の位置にボタンを実装できたのですが、on_playback_order_changed();が定義されていないというエラーがでてしまい、ここをコメントアウトするとボタンは機能するのですが、画像が切り替わらないです。
もしかしてコレも新しいバージョンになり削除された部分なのでしょうか…

Posted by まー at 2020/06/14 (Sun) 01:33:51

>うーん、こっちは動いてます

私のところでは普通に動作していますので、エラーの正確な文章と、foobarおよびJscript Panelのバージョンを書いていただけると助かります。

Posted by 連野 at 2020/06/14 (Sun) 02:02:52

>ありがとうございます(追記)

function(){ PBO_menu()}の間にon_playback_order_changed記述したらエラーが起きなくなりました。
ただ押下後即反映されないようで、window.reload();を書き加えました。

Posted by まー at 2020/06/14 (Sun) 02:06:21

>まあそれでいいなら

イレギュラーな気はするんだけどなー。

Posted by 連野 at 2020/06/14 (Sun) 02:37:55

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