SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

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

デスクトップアプリのメニュー機能を作ろう!「Rust」を使ってバックエンドを動かす方法

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

「開く」を実行したら三角形を描画する

 このページでは、バックエンドで開くメニューを実行したらフロントエンドにファイルを開くメッセージを送り、フロントエンドからバックエンドにファイルを開くように指示する方法を解説します。その後、バックエンドから三角形のベジェ曲線データを受け取って描画する方法も解説します。

フロントエンドでファイルを開くメッセージを待機する

 フロントエンドの「main.js」ファイルで、バックエンドのRustからファイルを開くメッセージが送られてくるのを待機します。「listen」は意訳すれば聞き耳を立てることです。

 ファイルを開くメッセージを受け取ったら、またバックエンドのRustにベジェ曲線データを読み込むメッセージを送ってTAURIコマンド「load」関数を呼び出し、返されたベジェ曲線データを「pos」変数に受け取ります。「TAURIコマンド関数」と言うのはフロントエンドから呼び出せるバックエンドのRustで書いた関数のことです。

サンプルコード「src」→「main.js」
// TAURI
const { invoke } = window.__TAURI__.core;
// 変数
let _canvas = document.querySelector('canvas');
let _context = _canvas.getContext('2d');
let _click = false;
let _pos = [];
let _current = 0;
let _saved = "";
// 読み込み関数
async function setOpen() {
  await window.__TAURI__.event.listen('event-open', async () => {
    let pos = await invoke("load", {saved: _saved});
    if (pos.length > 0) {
      _pos = pos;
      _current = _pos.length/4;
      line();
    }
 });
}
// 全てのDOMが読み込み完了したら
window.addEventListener("DOMContentLoaded", () => {
  setOpen();
(中略)
});
(後略)

サンプルコードの解説

 TAURIのイベントのlistenメソッドで'event-open'メッセージを待機し、それを受け取ったら"load"メッセージをバックエンドに呼び出します。「invoke」は「呼び出す」という意味です。まだ使いませんが「saved」引数はファイルを保存した際のディレクトリを取得するためにファイル名を渡します。

 ベジェ曲線データの要素が1個以上ある場合に「_pos」配列にpos配列を代入し、現在の頂点数(_current)を計算し、line関数でベジェ曲線を描画します。

バックエンドでファイルを開くと暫定的に三角形のベジェ曲線データを返す

 以下のサンプルコード[2]を追記して、プロジェクトをデバッグビルドして実行します。「ファイル」→「開く」メニューが実行されたら、TAURIコマンドload関数が呼ばれて三角形が描画されます。次のページでは、TAURIコマンドload関数を呼び出し、ファイルを開くダイアログを開いて.bezier曲線データを読み込む方法を解説します。暫定的には、三角形のベジェ曲線データを返すだけです。

開くメニューで三角形を描画する
開くメニューで三角形を描画する
[2] サンプルコード「src-tauri」→「src」→「lib.rs」
// クレート
use tauri::{menu::*, AppHandle, Wry, Error, State, Manager, App, path::BaseDirectory};
use std::path::Path;
// 読み込み書き込みパス構造体
struct LoadSavePath {
  data_path: String,
}
impl LoadSavePath {
  fn new(app:&mut App) -> Self {
    LoadSavePath {
      data_path: "".to_string(),
    }
  }
}
// データ読み込みTAURIコマンド関数
#[tauri::command]
fn load(saved: &str,loadsave: State<'_, LoadSavePath>) -> Vec<isize> {
  let data = vec![150,100,150,100,200,200,200,200,100,200,100,200,150,100,150,100];
  data
}
// エントリーポイント
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
  tauri::Builder::default()
  .plugin(tauri_plugin_shell::init())
  // TAURIコマンド関数の登録
  .invoke_handler(tauri::generate_handler![load])
  .setup(|app| {
    let _ = app.set_menu(get_menu(app.handle())?);
    // 
    let path = LoadSavePath::new(app);
    app.manage(path);
    app.on_menu_event(|handle, event| { run_menu_process(handle, event.id().as_ref()) });
    Ok(())
  })
  .run(tauri::generate_context!())
  .expect("error while running tauri application");
}
(後略)

サンプルコードの解説

 パスを扱う「std::path::Path」クレートを使えるようにします。

 「LoadSavePath」構造体でファイルを開いたり保存したりするディレクトリの情報を管理し、コンストラクタの「new」メソッドで空のパスを「data_path」プロパティに代入します。

 TAURIコマンドload関数が呼ばれたら単純に三角形のベジェ曲線の配列データを返します。

 run関数で、TAURIビルダーのinvoke_handlerメソッドでTAURIコマンドload関数を登録します。

次のページ
ファイルを開くダイアログ

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

フロントエンジニアのためのTauri 2.0ではじめるRustプログラミング連載記事一覧

もっと読む

この記事の著者

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

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

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

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

CodeZineは、株式会社翔泳社が運営する開発者のための情報メディアです。日々の開発に取り組むエンジニアやテクノロジーを学びたい方に向けて、プログラミングやAI活用、開発ツール、エンジニアの学びとキャリアに関する記事をお届けしています。

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/21138 2025/04/17 11:00

イベント

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

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

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

メールバックナンバー