feat: Init of Tauri application with system tray support and configuration

- Added main.rs to set up the Tauri application with a system tray.
- Implemented a basic application state management using Mutex.
- Created a system tray menu with options for "Settings" and "Quit".
- Configured tauri.conf.json with application metadata and window settings.
This commit is contained in:
2026-01-18 16:04:22 +01:00
parent a7b0c6212f
commit cb14fe0989
13 changed files with 12736 additions and 1 deletions

17
.gitignore vendored Normal file
View File

@@ -0,0 +1,17 @@
# Rust / Tauri
/src-tauri/target/
/target/
**/*.rs.bk
# OS
.DS_Store
Thumbs.db
# VS Code
.vscode/
!.vscode/launch.json
!.vscode/tasks.json
# Node / Frontend (om det läggs till senare)
node_modules/
/dist/

191
README.md
View File

@@ -1,2 +1,191 @@
# AI-translater-clinet # AI Typist Client
En cross-platform skrivbordsapplikation utvecklad i Rust och Tauri v2 för Windows 11 och Linux (med Wayland-stöd). Applikationen fungerar som en smart AI-assistent som integrerar sömlöst med ditt arbetsflöde via system-tray, globala genvägar och urklippshantering.
## Projektbeskrivning
Målet med detta projekt är att skapa ett verktyg som kan förbättra, rättstava eller översätta text i alla applikationer genom att utnyttja lokala LLM:er (via Ollama) eller molnbaserade API:er (OpenAI).
### Kärnfunktionalitet
1. **System Tray Integration**:
* Applikationen körs i bakgrunden med en ikon i statusfältet/systemfältet.
* Högerklick ger en meny för att komma åt inställningar eller avsluta appen.
2. **AI-Workflow**:
* **Input**: Appen hämtar text direkt från systemets urklipp (clipboard).
* **Bearbetning**: Texten bakas in i en prompt och skickas till en LLM (Ollama/OpenAI) för översättning eller rättstavning.
* **Output**: Det bearbetade svaret kan antingen:
* Kopieras tillbaka till urklipp.
* Skrivas ut direkt i det aktiva fönstret genom att imitera tangentbordstryckningar (Keyboard Mimicry).
3. **Teknisk Stack**:
* **Språk**: Rust
* **GUI/Ramverk**: Tauri v2
* **Tangentbord/Input**: `enigo` (mimic) & `global-hotkey` (lyssna)
* **Urklipp**: `arboard`
* **AI-Kommunikation**: `reqwest` & `ollama-rs`
## Förutsättningar
Du behöver Rust installerat (rekommenderat via `rustup`).
**Installera Rust (Linux/macOS):**
```bash
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Följ instruktionerna på skärmen (standardinstallation är oftast bäst)
source $HOME/.cargo/env
```
**Felsökning: "cannot install while Rust is installed"**
Om du får detta felmeddelande har du redan Rust installerat via systemets pakethanterare (vilket sällan stöder cross-compilation smidigt).
*Lösning:* Avinstallera system-versionen och kör scriptet igen.
* **Arch Linux:** `sudo pacman -Rs rust` (Kolla även om du har `cargo` installerat separat)
* **Ubuntu/Debian:** `sudo apt remove rustc cargo`
**Verifiera installationen:**
```bash
rustc --version
cargo --version
```
### Linux-beroenden (Ubuntu/Debian)
För att kompilera Tauri på Linux krävs följande bibliotek:
```bash
sudo apt update
sudo apt install libwebkit2gtk-4.1-dev \
build-essential \
curl \
wget \
file \
libssl-dev \
libgtk-3-dev \
libayatana-appindicator3-dev \
librsvg2-dev
```
### Linux-beroenden (Arch Linux / Manjaro)
```bash
sudo pacman -Syu
sudo pacman -S webkit2gtk-4.1 \
base-devel \
curl \
wget \
file \
openssl \
gtk3 \
libayatana-appindicator \
librsvg
```
*Obs: För Wayland-stöd hanterar GTK3/4 detta oftast automatiskt, men säkerställ att du kör en modern distribution.*
## Utveckling
### Installera Tauri CLI
```bash
cargo install tauri-cli --version "^2.0.0"
```
### Kör i utvecklingsläge
Gå in i `src-tauri` mappen eller kör från roten om konfigurerat korrekt, men standard är:
```bash
cd src-tauri
cargo tauri dev
```
Detta kommer starta applikationen. Eftersom vi inte har en frontend (HTML/JS) ännu, kommer fönstret vara tomt eller vitt, men System Tray-ikonen ska synas.
## Debugging med VS Code (CodeLLDB)
För att debugga Rust-koden effektivt i VS Code, skapa filen `.vscode/launch.json` i roten av projektet med följande innehåll. Detta binder CodeLLDB till Tauri-processen.
```json
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Tauri App",
"type": "lldb",
"request": "launch",
"program": "${workspaceFolder}/src-tauri/target/debug/ai-translater-client",
"args": [],
"cwd": "${workspaceFolder}/src-tauri",
"preLaunchTask": "build",
"sourceLanguages": ["rust"]
}
]
}
```
## Cross-Compilation: Windows 11 från Linux
Att bygga Windows `.exe` från Linux är fullt möjligt med `cargo-xwin`.
1. **Installera cross-kompileringsverktyg:**
**Ubuntu/Debian:**
```bash
sudo apt install mingw-w64
```
**Arch Linux:**
```bash
sudo pacman -S mingw-w64 clang lld
# Välj "alla" (tryck Enter) om du tillfrågas om medlemmar i gruppen
```
**Alla:**
```bash
cargo install cargo-xwin
```
2. **Lägg till Windows target:**
```bash
rustup target add x86_64-pc-windows-msvc
```
3. **Bygg för Windows:**
Stå i `src-tauri` mappen och kör:
```bash
cargo tauri build --target x86_64-pc-windows-msvc --runner cargo-xwin
```
Resultatet (exe & msi) hamnar i `src-tauri/target/x86_64-pc-windows-msvc/release/bundle/`.
## Windows-testning på Linux (Wine/Proton)
För att snabbt verifiera att Windows-bygget startar utan att byta OS:
1. **Installera Wine:**
```bash
sudo apt install wine64
```
2. **Kör applikationen:**
Navigera till output-mappen från steget ovan och kör:
```bash
wine "ai-translater-client.exe"
```
*Notera: System Tray kan bete sig annorlunda i Wine än i äkta Windows.*
## Packaging & Distribution
Tauri hanterar paketering automatiskt baserat på ditt OS.
### Linux (.deb & .AppImage)
```bash
cargo tauri build
```
Filerna genereras i `src-tauri/target/release/bundle/deb/` och `appimage/`.
### Windows (.msi & .exe)
När du bygger via `cargo-xwin` (se ovan) eller på en Windows-maskin, genereras en `.msi` via WiX Toolset (om installerat) eller en `.exe` setup-fil via NSIS (standard i v2).
## Projektstruktur
* `src-tauri/Cargo.toml`: Alla beroenden (tauri, enigo, ollama-rs, etc).
* `src-tauri/src/main.rs`: Entry point. Innehåller logik för System Tray.
* `src-tauri/tauri.conf.json`: Konfiguration för fönster och byggprocess.

5645
src-tauri/Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

32
src-tauri/Cargo.toml Normal file
View File

@@ -0,0 +1,32 @@
[package]
name = "ai-translater-client"
version = "0.1.0"
description = "AI Typist Client"
authors = ["Din Namn"]
edition = "2021"
rust-version = "1.77"
[build-dependencies]
tauri-build = { version = "2.0", features = [] }
[dependencies]
# Tauri Framework
tauri = { version = "2.0", features = ["tray-icon", "image-png"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
# Async & Network
tokio = { version = "1.0", features = ["full"] }
reqwest = { version = "0.12", features = ["json", "multipart"] }
# AI & LLM
ollama-rs = "0.2"
# System Integration (Input/Clipboard/Hotkeys)
enigo = "0.3" # För tangentbords-mimic
arboard = "3.4" # Clipboard hantering
global-hotkey = "0.6" # Systemomfattande genvägar
# Logging (Strongly recommended for debugging)
log = "0.4"
env_logger = "0.11"

3
src-tauri/build.rs Normal file
View File

@@ -0,0 +1,3 @@
fn main() {
tauri_build::build()
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

BIN
src-tauri/icons/32x32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

81
src-tauri/src/main.rs Normal file
View File

@@ -0,0 +1,81 @@
// Prevents additional console window on Windows in release, DO NOT REMOVE!!
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
use tauri::{
menu::{Menu, MenuItem},
tray::{MouseButton, TrayIconBuilder, TrayIconEvent},
Manager,
};
use std::sync::Mutex;
// Placeholder for application state
struct AppState {
// Exempel: Spara status för ollama connection här
ollama_ready: Mutex<bool>,
}
#[tokio::main]
async fn main() {
// Initiera loggning
env_logger::init();
tauri::Builder::default()
.setup(|app| {
// Setup Application State
app.manage(AppState {
ollama_ready: Mutex::new(false),
});
// --- System Tray Setup ---
// Skapa menyalternativ
let quit_i = MenuItem::with_id(app, "quit", "Avsluta", true, None::<&str>)?;
let settings_i = MenuItem::with_id(app, "settings", "Inställningar", true, None::<&str>)?;
// Skapa menyn
let menu = Menu::with_items(app, &[&settings_i, &quit_i])?;
// Bygg Tray-ikonen
let _tray = TrayIconBuilder::new()
.icon(app.default_window_icon().unwrap().clone())
.menu(&menu)
.show_menu_on_left_click(false)
.on_menu_event(|app, event| {
match event.id.as_ref() {
"quit" => {
println!("Avslutar applikationen...");
app.exit(0);
}
"settings" => {
println!("Öppnar inställningar (Placeholder)...");
// Här kan du öppna ditt inställningsfönster:
// if let Some(window) = app.get_webview_window("main") {
// window.show().unwrap();
// window.set_focus().unwrap();
// }
}
_ => {}
}
})
.on_tray_icon_event(|tray, event| {
match event {
TrayIconEvent::Click {
button: MouseButton::Left,
..
} => {
let app = tray.app_handle();
if let Some(window) = app.get_webview_window("main") {
let _ = window.show();
let _ = window.set_focus();
}
}
_ => {}
}
})
.build(app)?;
Ok(())
})
.run(tauri::generate_context!())
.expect("error while running tauri application");
}

34
src-tauri/tauri.conf.json Normal file
View File

@@ -0,0 +1,34 @@
{
"productName": "ai-translater-client",
"version": "0.1.0",
"identifier": "com.ai-translater.client",
"build": {
"beforeDevCommand": "",
"beforeBuildCommand": "",
"frontendDist": "../dist"
},
"app": {
"windows": [
{
"title": "AI Typist Inställningar",
"width": 800,
"height": 600,
"visible": false
}
],
"security": {
"csp": null
}
},
"bundle": {
"active": true,
"targets": "all",
"icon": [
"icons/32x32.png",
"icons/128x128.png",
"icons/128x128@2x.png",
"icons/icon.icns",
"icons/icon.ico"
]
}
}