menus.xmlではmenuitem要素にdynamic属性を指定することで動的なメニューが作れます。例えば、
<menuitem dynamic="MessageCreate"/>
とするとcreate_*.templateをリストアップして、見つかった数のメニューを生成します。実行するとそれぞれのテンプレートを使ってメッセージを作成します。
dynamic属性にはいくつかの決まった名前しか指定できなかったのですが、引数付きの任意のアクションを指定できるようにしました。その場合には、さらにparam属性にマクロを指定する必要があります。メニューを表示するときにはここで指定したマクロが実行され、その結果からメニューが動的に作られます。
マクロからは以下のような値を返す必要があります。
例えば、
<menuitem dynamic="MessageCreate" param="'新規\tnew\n返信\treply'"/>
のようにすると、MessageCreateアクションを使って新規と返信の二つのメニューが作成され、それぞれnewとreplyがアクションの引数として渡されます。
上の例ではスタティックな文字列なので動的に生成する意味がありませんが、以下の例ではqmail.xmlのLabel/HistoryXのエントリに登録されているラベルを追加するためにメニューを動的に生成しています。
<menuitem dynamic="MessageLabel" param=" @Progn(@Defun('Labels', @Progn(@Set('x', @Profile('', 'Label', @Concat('History', $1))), @If($x, @Concat($x, '\t+', $x, '\n', @Labels(@Add($1, 1))), ''))), @Labels(0))"/>
動的メニューの仕組みありがとうございます。<br>MesssageCreate でうまく動作することを確認しました。<br><br>○汎用的な仕組み<br><br>ところでもう少し汎用的な仕組みの実装の予定はありませんか?<br>といいますのも、直近の実現したいこととしてテンプレートとラベルについてを例として上げさせていただいたのですが、今後も動的メニューを作りたい場合が出てくると思うのです。<br>そのたびにアクションの拡張をお願いするものなんなので、より汎用的な仕組みがあればなぁと思ってます。<br><br>例えば…<br><br><menuitem dynamic="MenuCreateItems" param="@Script(....)" /><br><br>ようにし、@Script が <menuitem .... /> の文字列を返すのです。MenuCreateItems アクションが @Script の文字列の通りにメニューを生成するとかいかがでしょう。<br><br>たぶん BTS に書き込むよりもこちらで先に調整したほうがいいのかなぁと思いましたので、ツッコミとして書かせていただきました。<br><br>宜しくお願いします。
どちらの仕組みでもできることは変わりないと思います。任意のアクションを動的メニューで生成したい場合には、ToolInvokeActionアクションを使えると思います。<br><br>内部的にはXMLをパースする部分とメニューを作る部分は独立しているので、動的にメニューを生成するときにXMLを生成するというのはあまり好きになれません。
例えば、<br><br><menuitem dynamic="ToolInvokeAction" param="<br>'Test\tFileExit\nTest2\tMessageLabel +foo|MessageMarkSeen'"/><br><br>のようにすると、FileExitアクションを実行するTestという項目と、fooというラベルを追加して既読にするTest2という項目が作られることになります。
ToolInvokeAction を使うのは気づきませんでした。<br>というか、アクションの勉強不足でした。<br>こちらで何とかなりそうです。<br>ありがとうございました。