Skip to content
anmitsu edited this page Dec 2, 2012 · 3 revisions

メニュー

1 はじめに

pyful は,コマンドをグループ化して管理する機能をもったメニューを実装しています。

メニューは,一般的なGUIアプリケーションのメニューバーのようにグループごとに定義され,階層的構造も表現することが可能です。実際にメニューを使用する際は,画面左下にメニューウィンドウが表示され,それぞれのコマンド項目をカーソル選択とショートカットキーによって実行します。また,メニューの項目は,設定ファイルを編集することによって自由にカスタマイズすることが可能です。pyful では,Windowsエクスプローラの「送る」のような機能やアプリケーションランチャーの機能を,メニューを利用することによって直感的に提供しています。

2 メニュー項目の登録

メニュー項目の実態は,Python におけるデータ構造の1つである辞書であり, pyful.menu モジュール の クラス変数 Menu.items によって定義されています。

実際に,メニュー項目を設定ファイル rc.py で登録する際には, pyful.menu.define_menu 関数を用います。メニュー項目の登録の書式を以下に示します。

pyful.menu.define_menu("メニュー名", (
    ("項目1の表示名", "ショートカットキー", 呼び出し可能オブジェクト),
    ("項目2の表示名", "ショートカットキー", 呼び出し可能オブジェクト),
    ("項目3の表示名", "ショートカットキー", 呼び出し可能オブジェクト),
    .
    .
    .
    ("項目nの表示名", "ショートカットキー", 呼び出し可能オブジェクト),
    )

ここで,メニュー名は登録されるメニューの名前でありメニューウィンドウのタイトル,項目nの表示名はメニューウィンドに表示されるメニュー項目の名前,ショートカットキーは項目nを実行するためのキー,呼び出し可能オブジェクトは項目nが実行された時にコールバックされるコマンドを表しています。

設定ファイル rc.py で登録されているいくつかのメニュー項目を以下に示します。

  • ファイル情報の表示・非表示のトグルメニュー
    pyful.menu.define_menu("fileinfo", (
        ("toggle extension" , "e", command.query("toggle_draw_ext")),
        ("toggle permission", "p", command.query("toggle_draw_permission")),
        ("toggle nlink"     , "l", command.query("toggle_draw_nlink")),
        ("toggle user"      , "u", command.query("toggle_draw_user")),
        ("toggle group"     , "g", command.query("toggle_draw_group")),
        ("toggle size"      , "s", command.query("toggle_draw_size")),
        ("toggle mtime"     , "t", command.query("toggle_draw_mtime")),
        )
  • ワークスペースのレイアウト変更メニュー
    pyful.menu.define_menu("layout", (
        ("tile"        , "t", command.query("layout_tile")),
        ("tileLeft"    , "L", command.query("layout_tileleft")),
        ("tileTop"     , "T", command.query("layout_tiletop")),
        ("tileBottom"  , "B", command.query("layout_tilebottom")),
        ("oneline"     , "l", command.query("layout_oneline")),
        ("onecolumn"   , "c", command.query("layout_onecolumn")),
        ("magnifier"   , "m", command.query("layout_magnifier")),
        ("fullscreen"  , "f", command.query("layout_fullscreen")),
        )

ここで, command.query(name) は pyful で定義されている引数 name のコマンドの呼び出し可能オブジェクトを返す関数です。

3 メニューの呼び出し

登録されたメニューは, M-x menu コマンドによって呼び出すことができます。また,デフォルトで登録されているメニューの実行は, widgets.filer のキーマップに登録されています。 widgets.filer のキーマップへのメニュー実行の登録は,以下のコードで行います。

# Update the filer keymap.
  pyful.widget.define_key(widgets.filer, {
      "V": lambda: widgets.menu.show("fileinfo"),
      "L": lambda: widgets.menu.show("layout"),
      })

ここで, widgets.menu.show(name) は登録されているメニュー name を呼び出します。これにより,ファイラー画面において, V キーを入力することで簡単に filer メニューを呼び出すことができます。

このファイラーウィジットのキーマップ登録とメニューの呼び出しを組み合わせることで,例えば,画像ファイルを開くアプリケーションを複数の画像ビューアからメニューによって選択するといった,Windowsエクスプローラの「送る」のような機能を実現することができます。