SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

フロントエンジニアのためのTauri 2.0ではじめるRustプログラミング

Rustを使って「名前を付けて保存」メニューとファイルを保存する機能を実装しよう!

フロントエンジニアのための「Tauri 2.0」ではじめるRustプログラミング 第7回


  • X ポスト
  • このエントリーをはてなブックマークに追加

 本連載では、ベジェ曲線でお絵描きするデスクトップアプリを開発しながら、「Rust」と「Tauri 2.0」について学んでいきます。連載第7回は、「名前を付けて保存」メニューとファイルを保存する機能を実装してお絵描きアプリを完成させます。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 前回は、「ファイル」と「開く」のメニュー、ファイルを開いてお絵描きデータを読み込む機能を実装しました。

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

「新規作成」「名前を付けて保存」「終了」のメニュー

 以下のサンプルコード[1]を追記して、「プロジェクトをデバッグビルド」のコマンドを実行したら「開く」のメニューに加えて、次の図のように「新規作成」と「名前を付けて保存」「終了」の3つのメニューが作られます。

 当たり前ですが、メニューを作っただけでは形だけで何も実行されません。ここではバックエンドでメニューを実行したら、フロンエンドにファイルを保存するメッセージを送るだけです。ただし「終了」のメニューは、プログラムをイグジット(exit関数)する命令を書いているのでアプリ終了が実行されます。

「Tauri 2.0」プロジェクトのデバッグビルドと実行
$ cargo-tauri dev
新規作成メニューと名前を付けて保存メニューと終了メニュー
新規作成メニューと名前を付けて保存メニューと終了メニュー
[1] サンプルコード「src-tauri」→「src」→「lib.rs」
(前略)
// メニュー実行
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の作者しか凄いプログラマーはおらず、身近な周りには誰も詳しくプログラミングできる仲間がいませんでした。だからもしかすると全くコピペせずにプログラミングしている人がたくさんいるのかもしれませんが。

次のページ
ベジェ曲線データをターミナルに表示する

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
フロントエンジニアのためのTauri 2.0ではじめるRustプログラミング連載記事一覧

もっと読む

この記事の著者

大西 武(オオニシ タケシ)

 1975年香川県生まれ。大阪大学経済学部経営学科中退。プログラミング入門書などを30冊以上商業出版する作家。ドコモでグランプリなどコンテストに20回以上入賞するアーティスト。オリジナルの間違い探し「3Dクイズ」がTVで約10回出題。プロフィールサイト:https://profile.vixar.jp

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

CodeZine編集部(コードジンヘンシュウブ)

CodeZineは、株式会社翔泳社が運営するソフトウェア開発者向けのWebメディアです。「デベロッパーの成長と課題解決に貢献するメディア」をコンセプトに、現場で役立つ最新情報を日々お届けします。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/21158 2025/05/12 18:07

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング