Rustを使って「名前を付けて保存」メニューとファイルを保存する機能を実装しよう!
フロントエンジニアのための「Tauri 2.0」ではじめるRustプログラミング 第7回
ダウンロード 第7回 サンプルファイル (453.9 KB)
本連載では、ベジェ曲線でお絵描きするデスクトップアプリを開発しながら、「Rust」と「Tauri 2.0」について学んでいきます。連載第7回は、「名前を付けて保存」メニューとファイルを保存する機能を実装してお絵描きアプリを完成させます。
はじめに
前回は、「ファイル」と「開く」のメニュー、ファイルを開いてお絵描きデータを読み込む機能を実装しました。
今回でこの「フロントエンジニアのための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の作者しか凄いプログラマーはおらず、身近な周りには誰も詳しくプログラミングできる仲間がいませんでした。だからもしかすると全くコピペせずにプログラミングしている人がたくさんいるのかもしれませんが。
この記事は参考になりましたか?
- フロントエンジニアのためのTauri 2.0ではじめるRustプログラミング連載記事一覧
-
- Rustを使って「名前を付けて保存」メニューとファイルを保存する機能を実装しよう!
- デスクトップアプリのメニュー機能を作ろう!「Rust」を使ってバックエンドを動かす方法
- お絵描きアプリをグレードアップさせよう!Tauri 2.0でアンドゥとリドゥを実装
- この記事の著者
-
大西 武(オオニシ タケシ)
1975年香川県生まれ。大阪大学経済学部経営学科中退。プログラミング入門書などを30冊以上商業出版する作家。ドコモでグランプリなどコンテストに20回以上入賞するアーティスト。オリジナルの間違い探し「3Dクイズ」がTVで約10回出題。プロフィールサイト:https://profile.vixar.jp
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
CodeZine編集部(コードジンヘンシュウブ)
CodeZineは、株式会社翔泳社が運営する開発者のための情報メディアです。日々の開発に取り組むエンジニアやテクノロジーを学びたい方に向けて、プログラミングやAI活用、開発ツール、エンジニアの学びとキャリアに関する記事をお届けしています。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
