はじめに
前回は、「ファイル」と「開く」のメニュー、ファイルを開いてお絵描きデータを読み込む機能を実装しました。
今回でこの「フロントエンジニアのためのTauri 2.0ではじめるRustプログラミング」の連載も最後になります。今回も前回に引き続き追記して、「名前を付けて保存」のメニューを実装します。またそのメニューを実行したらファイルに保存する機能も実装します。

「新規作成」「名前を付けて保存」「終了」のメニュー
以下のサンプルコード[1]を追記して、「プロジェクトをデバッグビルド」のコマンドを実行したら「開く」のメニューに加えて、次の図のように「新規作成」と「名前を付けて保存」「終了」の3つのメニューが作られます。
当たり前ですが、メニューを作っただけでは形だけで何も実行されません。ここではバックエンドでメニューを実行したら、フロントエンドにファイルを保存するメッセージを送るだけです。ただし「終了」のメニューは、プログラムをイグジット(exit関数)する命令を書いているのでアプリ終了が実行されます。
$ cargo-tauri dev
(前略)
// メニュー実行
fn run_menu_process(handle: &AppHandle, id: &str) {
use tauri::Emitter;
match id {
"id_new" => { let _ = handle.emit_to("main", "event-new", "New menu process"); },
"id_open" => { let _ = handle.emit_to("main", "event-open", "Open menu process"); },
"id_save" => { let _ = handle.emit_to("main", "event-save", "Save menu process"); },
"id_quit" => {
handle.cleanup_before_exit();
std::process::exit(0);
},
_ => {},
}
}
// メニュー取得
fn get_menu(handle: &AppHandle) -> Result<Menu<Wry>, Error> {
let menu = Menu::new(handle)?;
let _ = menu.append(&get_menu_file(handle)?)?;
Ok(menu)
}
// メニュー項目取得
fn get_menu_file(handle: &AppHandle) -> Result<Submenu<Wry>, Error> {
SubmenuBuilder::new(handle, "ファイル")
.items(&[
&MenuItem::with_id(handle, MenuId::new("id_new"), "新規作成", true, Some("Ctrl+N"))?,
&MenuItem::with_id(handle, MenuId::new("id_open"), "開く", true, Some("Ctrl+O"))?,
&MenuItem::with_id(handle, MenuId::new("id_save"), "名前を付けて保存", true, Some("Ctrl+S"))?,
])
.separator()
.text(MenuId::new("id_quit"), "終了")
.build()
}
サンプルコードの解説
「run_menu_process」関数で、"id_new"は新規作成のメニューIDで、フロントエンドに"event-new"イベントメッセージをエミット(発する)します。
"id_save"は、名前を付けて保存するメニューIDで、フロントエンドに"event-save"イベントメッセージをエミットします。
"id_quit"は終了のメニューIDで、このお絵描きアプリを終了します。
「get_menu_file」関数で、新規作成メニューに"id_new"のメニューIDと、名前を付けて保存メニューに"id_save"のメニューIDと、終了メニューに"id_quit"のメニューIDを登録します。
「separator」メソッドはメニューのセパレータ(区切りの横線)です。
コラム「ソースコードをコピー&ペースト」
筆者は、プログラミング入門などに関する色々な書籍や雑誌記事やWeb記事を書かせてもらっていますが、ソースコードをプログラミングする際に意外とコピペした部分も少なくありません。むしろ皆さんも全くコピペせずにプログラミングすることは珍しいのではないでしょうか?
昔パソコン黎明期は逆に、GUIが発達しておらずCUIだったので、同じ1ファイルの中でしかコピペする機能はなく、全くコピペなしでプログラミングすることは当たり前でした。
筆者はパソコン黎明期からプログラミングをやってきましたが、インターネットが普及してやっとネットでプログラミング仲間ができました。大学生のときに、コンピュータサークルには一時期在籍していましたが、Metasequoia4の作者しか凄いプログラマーはおらず、身近な周りには誰も詳しくプログラミングできる仲間がいませんでした。だからもしかすると全くコピペせずにプログラミングしている人がたくさんいるのかもしれませんが。
