使用 Rust Tauri 創建一個啓動欄應用程序

在這篇文章中我們使用 Rust Tauri 來構建一個類似的 “啓動欄” 類型的應用程序。

搭建一個基本的 Tauri 應用程序

我們將使用 tauri 和 create-tauri-app 工具來快速搭建項目。使用 cargo 安裝 create-tauri-app,並使用以下命令選項運行它:

cargo install create-tauri-app

> cargo create-tauri-app

✔ Project name · tauri-launch
✔ Choose your package manager · cargo
✔ Choose your UI template · vanilla

運行後,應該在當前目錄中看到一個新文件夾 tauri-launch,這就是我們的項目目錄。

爲了確保一切都正確設置,應該能夠在項目目錄中運行以下命令。

cargo tauri dev

你會看到下面這些:

啓用我們需要的模塊

Tauri 包含大量可以爲應用程序提供更多功能的特性。對於啓動欄類型的應用程序,我們需要啓用全局快捷方式,顧名思義,它將允許我們爲窗口分配全局快捷方式。

在你的 src-tauri/Cargo.toml 文件中,修改 tauri 依賴項,現在應該是這樣的:

tauri = {
    version = "1.2",
    features = ["shell-open""global-shortcut"]
}

從快捷方式啓動

啓用快捷方式後,我們需要添加一些代碼來註冊快捷方式並在調用時顯示 / 隱藏窗口。

首先,我們將修改 src-tauri/tauri.config.json 文件,給我們的窗口一個標籤,我們可以用它來獲取窗口的句柄。

在文件的底部,你會發現一個 windows 列表。修改這裏的窗口項,添加 label 項。可以使用任何字母數字字符串,在這種情況下,我們將其稱爲 “launcher”。

"windows"[
    {
    "label""launcher",
    ... // 其他窗口選項
    }
]

接下來,我們將修改 src-tauri/src/main.rs 文件,以便它註冊快捷方式並顯示 / 隱藏我們的窗口。

// 我們想要註冊爲快捷鍵的組合鍵
const SHORTCUT: &str = "Ctrl+f";

fn register_shortcut(app: &mut App) -> Result<(), tauri::Error>  {
    let app_handle = app.app_handle();
    let mut shortcuts = app_handle.global_shortcut_manager();
    
    if !shortcuts.is_registered(SHORTCUT){
        shortcuts.register(
            SHORTCUT,
            move || toggle_launchbar(&app_handle)
        )?;
    }

    Ok(())
}
// 這應該與你的“tauri.config.json”中的“label”匹配。
const WINDOW: &str = "launcher";

fn toggle_launchbar(app: &AppHandle) {
    // Grab a handle to the window
    let window = app.get_window(WINDOW)
        .expect("Did you label your window?");

    // 檢查當前是否可見,如果可見則隱藏。
    if let Ok(true) = window.is_visible() {
        let _ = window.hide();
    } else {
        let _ = window.show();
    }
}
fn main() {
    tauri::Builder::default()
        .invoke_handler(tauri::generate_handler![greet])
        .setup(move |app: &mut App| {
            if let Err(err) = register_shortcut(app) {
                eprintln!("Unable to register shortcut: {err}");
            }

            Ok(())
        })
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

現在運行應用程序。一旦窗口彈出,嘗試我們在代碼中分配的 Ctrl+f 快捷鍵。你應該能夠在顯示或隱藏主窗口。

這是一個很好的開始,但是這個窗口太大了,對我們光滑的啓動條來說太笨重了。

窗口美學

"windows"[
    {
    "label""launcher",
    "height": 128,
    "width": 640,
    ... 
    }
]

調整尺寸後,我們的窗戶有點皺了。讓我們做一點拋光,給我們的啓動欄一個漂亮的新外觀,首先,我們把窗戶上的裝飾品拿掉。如果你花了一些時間研究窗口配置的文檔,將注意到幾個有用的選項,即透明、裝飾、中心和可見。

將這些添加到窗口配置中並運行應用程序,看看會發生什麼。你可以隨意使用其他窗口配置選項,看看它們是如何影響窗口的。

如果你熟悉 Spotlight 或其他啓動欄類型的應用程序,我們將需要圓角化並添加一些透明度。讓我們進入 HTML 和 CSS 來調整啓動欄的外觀。

修改外觀

在 src/index.html 文件中,我選擇刪除除文本輸入之外的所有內容。

<body>
    <input type="text" id="launcher" />
</body>

並更新 CSS,使頁面符合我們爲窗口配置設置的尺寸。輸入框也被最大化,以填充整個空間,並有一個漂亮的邊界半徑,使啓動條有圓角。CSS 的重要部分如下所示:

html, body {
  margin: 0;
  padding: 0;
  width: 640px;
  height: 128px;
}

input {
  border-radius: 8px;
  border: 1px solid #000;
  box-sizing: border-box;

  font-size: 4em;
  outline: none;
  padding: 0 0.4em;

  height: 100%;
  width: 100%;
}

// 根據用戶偏好更改配色方案
@media (prefers-color-scheme: dark) {
  input {
    color: #ffffff;
    background-color: #0f0f0fdd;
  }
}

@media (prefers-color-scheme: light) {
  input {
    color: #0f0f0f;
    background-color: #ffffffdd;
  }
}

通過 cargo tauri dev 運行應用程序,你應該會看到如下內容:

探測提交

我們需要更新 Javascript 和 Rust 代碼,以便從窗口探測到提交,並將輸入框文本發送回 Rust 端以滿足我們的處理需求。

需要調整了 create-tauri-app 生成的 javascript 代碼,以偵聽輸入框中的按鍵,並且只在接收到 Enter 鍵時調用 tauri 命令。

const { invoke } = window.__TAURI__.tauri;

let inputEl;

async function greet() {
  // 將輸入發送到Rust端
  await invoke("greet"{ name: inputEl.value });
  // 重置輸入框
  inputEl.value = "";
}

window.addEventListener("DOMContentLoaded"() ={
  inputEl = document.getElementById("launcher");
  // 添加一個keyup監聽器並等待按下“Enter”
  inputEl.addEventListener(
    "keyup",
    (event) ={
      if (event.key === "Enter") {
        greet();
      }
    });
});

現在實現了客戶端,我們可以調整 Rust 代碼,這樣我們就可以將結果輸出到 stdout 中,並在完成時隱藏窗口。

#[tauri::command]
fn greet(window: tauri::Window, name: &str) {
    println!("Input received: {}", name);
    toggle_launchbar(&window.app_handle());
}
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/zSKmqopDLTbKYONWxQGFiQ