app menu window
This commit is contained in:
@@ -1,20 +1,19 @@
|
||||
use tracing::info;
|
||||
|
||||
use crate::{
|
||||
services::{
|
||||
auth::get_tokens, preferences::create_preferences_window, scene::create_scene_window,
|
||||
},
|
||||
services::{auth::get_tokens, scene::open_scene_window},
|
||||
state::init_app_data,
|
||||
system_tray::init_system_tray,
|
||||
};
|
||||
|
||||
pub async fn start_fdoll() {
|
||||
init_system_tray();
|
||||
bootstrap().await;
|
||||
}
|
||||
|
||||
async fn construct_app() {
|
||||
init_app_data().await;
|
||||
create_scene_window();
|
||||
create_preferences_window();
|
||||
open_scene_window();
|
||||
}
|
||||
|
||||
pub async fn bootstrap() {
|
||||
|
||||
@@ -9,6 +9,7 @@ mod models;
|
||||
mod remotes;
|
||||
mod services;
|
||||
mod state;
|
||||
mod system_tray;
|
||||
mod utilities;
|
||||
|
||||
/// Tauri app handle
|
||||
@@ -51,6 +52,13 @@ fn get_app_data() -> Result<AppData, String> {
|
||||
return Ok(guard.app_data.clone());
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn quit_app() -> Result<(), String> {
|
||||
let app_handle = get_app_handle();
|
||||
app_handle.exit(0);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[cfg_attr(mobile, tauri::mobile_entry_point)]
|
||||
pub fn run() {
|
||||
tauri::Builder::default()
|
||||
@@ -59,7 +67,8 @@ pub fn run() {
|
||||
.plugin(tauri_plugin_opener::init())
|
||||
.invoke_handler(tauri::generate_handler![
|
||||
start_cursor_tracking,
|
||||
get_app_data
|
||||
get_app_data,
|
||||
quit_app
|
||||
])
|
||||
.setup(|app| {
|
||||
APP_HANDLE
|
||||
|
||||
43
src-tauri/src/services/app_menu.rs
Normal file
43
src-tauri/src/services/app_menu.rs
Normal file
@@ -0,0 +1,43 @@
|
||||
use tauri::Manager;
|
||||
use tracing::{error, info};
|
||||
|
||||
use crate::get_app_handle;
|
||||
|
||||
static APP_MENU_WINDOW_LABEL: &str = "app_menu";
|
||||
|
||||
pub fn open_app_menu_window() {
|
||||
let app_handle = get_app_handle();
|
||||
let existing_webview_window = app_handle.get_window(APP_MENU_WINDOW_LABEL);
|
||||
|
||||
if let Some(window) = existing_webview_window {
|
||||
window.show().unwrap();
|
||||
return;
|
||||
}
|
||||
|
||||
match tauri::WebviewWindowBuilder::new(
|
||||
app_handle,
|
||||
APP_MENU_WINDOW_LABEL,
|
||||
tauri::WebviewUrl::App("/app-menu".into()),
|
||||
)
|
||||
.title("Friendolls")
|
||||
.inner_size(600.0, 500.0)
|
||||
.resizable(true)
|
||||
.decorations(true)
|
||||
.transparent(true)
|
||||
.shadow(true)
|
||||
.visible(true)
|
||||
.skip_taskbar(false)
|
||||
.always_on_top(false)
|
||||
.visible_on_all_workspaces(false)
|
||||
.build()
|
||||
{
|
||||
Ok(window) => {
|
||||
info!("{} window builder succeeded", APP_MENU_WINDOW_LABEL);
|
||||
window
|
||||
}
|
||||
Err(e) => {
|
||||
error!("Failed to build {} window: {}", APP_MENU_WINDOW_LABEL, e);
|
||||
return;
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
pub mod app_menu;
|
||||
pub mod auth;
|
||||
pub mod cursor;
|
||||
pub mod preferences;
|
||||
pub mod scene;
|
||||
pub mod ws;
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
use tracing::{error, info};
|
||||
|
||||
use crate::get_app_handle;
|
||||
|
||||
pub fn create_preferences_window() {
|
||||
let webview_window = match tauri::WebviewWindowBuilder::new(
|
||||
get_app_handle(),
|
||||
"preferences",
|
||||
tauri::WebviewUrl::App("/preferences".into()),
|
||||
)
|
||||
.title("Friendolls Preferences")
|
||||
.inner_size(600.0, 500.0)
|
||||
.resizable(true)
|
||||
.decorations(true)
|
||||
.transparent(false)
|
||||
.shadow(true)
|
||||
.visible(true)
|
||||
.skip_taskbar(false)
|
||||
.always_on_top(false)
|
||||
.visible_on_all_workspaces(false)
|
||||
.build()
|
||||
{
|
||||
Ok(window) => {
|
||||
info!("Preferences window builder succeeded");
|
||||
window
|
||||
}
|
||||
Err(e) => {
|
||||
error!("Failed to build Preferences window: {}", e);
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
#[cfg(debug_assertions)]
|
||||
webview_window.open_devtools();
|
||||
}
|
||||
@@ -22,10 +22,18 @@ pub fn overlay_fullscreen(window: &tauri::Window) -> Result<(), tauri::Error> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn create_scene_window() {
|
||||
pub fn open_scene_window() {
|
||||
let app_handle = get_app_handle();
|
||||
let existing_webview_window = app_handle.get_window(SCENE_WINDOW_LABEL);
|
||||
|
||||
if let Some(window) = existing_webview_window {
|
||||
window.show().unwrap();
|
||||
return;
|
||||
}
|
||||
|
||||
info!("Starting scene creation...");
|
||||
let webview_window = match tauri::WebviewWindowBuilder::new(
|
||||
get_app_handle(),
|
||||
app_handle,
|
||||
SCENE_WINDOW_LABEL,
|
||||
tauri::WebviewUrl::App("/scene".into()),
|
||||
)
|
||||
|
||||
40
src-tauri/src/system_tray.rs
Normal file
40
src-tauri/src/system_tray.rs
Normal file
@@ -0,0 +1,40 @@
|
||||
use tauri::{
|
||||
menu::{Menu, MenuItem},
|
||||
tray::TrayIconBuilder,
|
||||
};
|
||||
use tracing::error;
|
||||
|
||||
use crate::{get_app_handle, services::app_menu::open_app_menu_window};
|
||||
|
||||
pub fn init_system_tray() {
|
||||
let app = get_app_handle();
|
||||
|
||||
let quit_i = MenuItem::with_id(app, "quit", "Quit", true, None::<&str>).unwrap();
|
||||
let open_app_menu_i =
|
||||
MenuItem::with_id(app, "open-app-menu", "Open App Menu", true, None::<&str>).unwrap();
|
||||
|
||||
let menu = match Menu::with_items(app, &[&open_app_menu_i, &quit_i]) {
|
||||
Ok(it) => it,
|
||||
Err(err) => todo!("Handle error: {}", err),
|
||||
};
|
||||
|
||||
match TrayIconBuilder::new()
|
||||
.menu(&menu)
|
||||
.on_menu_event(|app, event| match event.id.as_ref() {
|
||||
"quit" => {
|
||||
app.exit(0);
|
||||
}
|
||||
"open-app-menu" => {
|
||||
open_app_menu_window();
|
||||
}
|
||||
_ => {
|
||||
error!("menu item {:?} not handled", event.id);
|
||||
}
|
||||
})
|
||||
.icon(app.default_window_icon().unwrap().clone())
|
||||
.build(app)
|
||||
{
|
||||
Ok(it) => it,
|
||||
Err(err) => todo!("Handle error: {}", err),
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user