[MaxTips_10] 正規表現を使ってファイルブラウズ

こんにちは、首藤です。

音声ファイルや、ムービー、画像等、なんらかの外部ファイルをパッチ中で使うことが多い場合、
いちいちファイル選択ウィンドウを出してファイルを探すのが煩わしいこともあると思います。

maxtips_10-01

そこで便利なのが、folderオブジェクト+umenuオブジェクト等を用いたファイルのリストアップですが、
今回は更に便利になるように、正規表現を使って階層移動もできるようにしてみます。

主要オブジェクト

maxtips_10-03

ファイルとフォルダを区別するために、folderオブジェクトを2つ使います。
valueオブジェクト(v)や、send・receiveオブジェクト(s・r)等、
固有の名前を持つオブジェクトには、始めから#0をつけて、
後々使い回せるようにしています。

maxtips_10-04

今回はファイル・フォルダのリスト表示、選択用に、umenuオブジェクトを使います。
folderオブジェクトの出力を処理したメッセージ等で内容を更新します。

maxtips_10-02

フォルダの選択にはopendialogオブジェクトを使います。
引数をfoldにすることで、フォルダの選択を行えます。

maxtips_10-05

そしてPerl形式の正規表現を使えるregexpオブジェクト。
文字列の抽出等、様々な操作をすることが可能ですが、
今回は主に、選択されたアイテムの判別に使います。

パスを受け取ったときの処理

・パス内のフォルダをリストアップ

maxtips_10-06

folderオブジェクトは、パスを受け取った際、まずclearメッセージを出力して、
その後、パス内のアイテムを出力します。(append アイテム名)
通常はfolderオブジェクトの直下にumenuオブジェクトを入れる事でリストが出て来ますが、
今回はfolderオブジェクトの出力の他に、複数のアイテムを一緒にリストに登録します。

処理の流れ

  1. clearメッセージでリストをクリア
  2. regexpオブジェクトで、現在のパスからフォルダ名を取得し、リストに追加
  3. 親階層へリンクをリストに追加
  4. 仕切り線を入れる
  5. folderオブジェクトが出力したフォルダ名を、「./フォルダ名」にフォーマットし、リストに追加

パス内にフォルダが無い場合も1から4の処理を実行できるように、
folderオブジェクトの第二アウトレットをselect 0に繋いでいます。

・パス内のファイルをリストアップ

maxtips_10-07

処理の流れ

  1. folderオブジェクトが出力するclearメッセージの代わりに、仕切り線を入れる
  2. folderオブジェクトが出力したファイル名を、「- ファイル名」にフォーマットし、リストに追加

ここまでの状態で、#0_updateDirにパスを送ってやると、このような感じで表示されると思います。

maxtips_10-09maxtips_10-10

umenuオブジェクトからアイテムが選択されたときの処理

リスト登録時に追加した、「./」や「- 」を目印に、regexpオブジェクトで処理を分岐します。

maxtips_10-11

処理の流れ

  1. 頭に「../」がつく場合(親階層へのリンク)、現在のパスから親階層のパスを取得し
    (regexpでスラッシュ一個分の文字列を消去)、#0_updateDirに送る
    頭に 「../」がつかない場合は2へ進む
  2. 頭に「./」がつく場合(フォルダ)、現在のパスの後ろにアイテム名つけて、#0_updateDirに送る
    頭に「./」がつかない場合は3へ進む
  3. 頭に「- 」がつく場合(ファイル)、現在のパスの後ろにアイテム名つけて出力
    音声ファイルの場合、この出力をバッファ等に送ることでファイルをロードできます。

folderオブジェクトへ送っているtypesメッセージを目的に応じて変えたり、
他のGUIオブジェクトを用いる事で、いろいろなファイルブラウズ方法が実現できると思います。

サンプルファイルのダウンロード

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>