Procházet zdrojové kódy

Merge branch 'hell' of crt/BeepZone-Client-eGUI-Emo into master

crt před 3 týdny
rodič
revize
18c79d3cb7
5 změnil soubory, kde provedl 67 přidání a 35 odebrání
  1. 2 1
      kiosk.toml
  2. 6 0
      src/config.rs
  3. 16 0
      src/kioskui/app.rs
  4. 33 30
      src/kioskui/dashboard.rs
  5. 10 4
      src/main.rs

+ 2 - 1
kiosk.toml

@@ -19,10 +19,11 @@ title = "BeepZone  Kiosk"
 enable_osk = true
 enable_rfid = true
 fullscreen = true
+windowed_mode = false
 button_height = 80.0
 font_size = 34.0
 minimum_power_level_for_full_ui = 50
 timeout_seconds = 240
 enable_full_osk_button = true
 scaling_factor = 2
-windowed_mode = false
+view_scale_multiplier = 2.0

+ 6 - 0
src/config.rs

@@ -94,6 +94,8 @@ pub struct KioskUiSettings {
     pub enable_full_osk_button: bool,
     #[serde(default = "default_scaling_factor")]
     pub scaling_factor: f32,
+    #[serde(default = "default_view_scale_multiplier")]
+    pub view_scale_multiplier: f32,
 }
 
 fn default_kiosk_title() -> String {
@@ -111,3 +113,7 @@ fn default_min_power() -> i32 {
 fn default_scaling_factor() -> f32 {
     1.0
 }
+
+fn default_view_scale_multiplier() -> f32 {
+    1.0
+}

+ 16 - 0
src/kioskui/app.rs

@@ -144,6 +144,12 @@ impl eframe::App for KioskApp {
             if want_fullscreen {
                 ctx.send_viewport_cmd(egui::ViewportCommand::Fullscreen(true));
                 ctx.send_viewport_cmd(egui::ViewportCommand::Decorations(false));
+                // On Windows, ensure top-left and ask maximize as fallback
+                #[cfg(target_os = "windows")]
+                {
+                    ctx.send_viewport_cmd(egui::ViewportCommand::OuterPosition(egui::pos2(0.0, 0.0)));
+                    ctx.send_viewport_cmd(egui::ViewportCommand::Maximized(true));
+                }
             } else {
                 // Ensure we are not in fullscreen and re-enable window decorations (borders, title bar)
                 ctx.send_viewport_cmd(egui::ViewportCommand::Fullscreen(false));
@@ -157,6 +163,11 @@ impl eframe::App for KioskApp {
                 if want_fullscreen {
                     ctx.send_viewport_cmd(egui::ViewportCommand::Fullscreen(true));
                     ctx.send_viewport_cmd(egui::ViewportCommand::Decorations(false));
+                    #[cfg(target_os = "windows")]
+                    {
+                        ctx.send_viewport_cmd(egui::ViewportCommand::OuterPosition(egui::pos2(0.0, 0.0)));
+                        ctx.send_viewport_cmd(egui::ViewportCommand::Maximized(true));
+                    }
                 } else {
                     ctx.send_viewport_cmd(egui::ViewportCommand::Fullscreen(false));
                     ctx.send_viewport_cmd(egui::ViewportCommand::Decorations(true));
@@ -173,6 +184,11 @@ impl eframe::App for KioskApp {
             if want_fullscreen {
                 ctx.send_viewport_cmd(egui::ViewportCommand::Fullscreen(true));
                 ctx.send_viewport_cmd(egui::ViewportCommand::Decorations(false));
+                #[cfg(target_os = "windows")]
+                {
+                    ctx.send_viewport_cmd(egui::ViewportCommand::OuterPosition(egui::pos2(0.0, 0.0)));
+                    ctx.send_viewport_cmd(egui::ViewportCommand::Maximized(true));
+                }
             } else {
                 ctx.send_viewport_cmd(egui::ViewportCommand::Fullscreen(false));
                 ctx.send_viewport_cmd(egui::ViewportCommand::Decorations(true));

+ 33 - 30
src/kioskui/dashboard.rs

@@ -78,39 +78,42 @@ impl KioskDashboard {
 
         ui.allocate_ui_at_rect(content_rect, |ui| {
             if self.borrow_flow.is_open {
-                // Apply component scale to workflows so they match kiosk UI
-                let scale = if config.scale <= 0.0 { 1.0 } else { config.scale };
-                ui.scope(|ui| {
-                    let mut style: egui::Style = ui.style().as_ref().clone();
-                    // Scale common text styles
-                    for (_ts, font) in style.text_styles.iter_mut() {
-                        font.size *= scale;
-                    }
-                    // Scale paddings and spacings
-                    style.spacing.item_spacing *= scale;
-                    style.spacing.button_padding *= scale;
-                    style.spacing.indent *= scale;
-                    style.spacing.window_margin = style.spacing.window_margin * scale;
-                    ui.set_style(style);
-
+                // Apply optional view-level multiplier for reused desktop views
+                let vscale = config.view_scale_multiplier;
+                if (vscale - 1.0).abs() > f32::EPSILON {
+                    ui.scope(|ui| {
+                        let mut style: egui::Style = ui.style().as_ref().clone();
+                        for (_ts, font) in style.text_styles.iter_mut() {
+                            font.size *= vscale;
+                        }
+                        style.spacing.item_spacing *= vscale;
+                        style.spacing.button_padding *= vscale;
+                        style.spacing.indent *= vscale;
+                        style.spacing.window_margin = style.spacing.window_margin * vscale;
+                        ui.set_style(style);
+                        self.borrow_flow.show_content(ui, api_client);
+                    });
+                } else {
                     self.borrow_flow.show_content(ui, api_client);
-                });
+                }
             } else if self.return_flow.is_open {
-                // Apply component scale to workflows so they match kiosk UI
-                let scale = if config.scale <= 0.0 { 1.0 } else { config.scale };
-                ui.scope(|ui| {
-                    let mut style: egui::Style = ui.style().as_ref().clone();
-                    for (_ts, font) in style.text_styles.iter_mut() {
-                        font.size *= scale;
-                    }
-                    style.spacing.item_spacing *= scale;
-                    style.spacing.button_padding *= scale;
-                    style.spacing.indent *= scale;
-                    style.spacing.window_margin = style.spacing.window_margin * scale;
-                    ui.set_style(style);
-
+                let vscale = config.view_scale_multiplier;
+                if (vscale - 1.0).abs() > f32::EPSILON {
+                    ui.scope(|ui| {
+                        let mut style: egui::Style = ui.style().as_ref().clone();
+                        for (_ts, font) in style.text_styles.iter_mut() {
+                            font.size *= vscale;
+                        }
+                        style.spacing.item_spacing *= vscale;
+                        style.spacing.button_padding *= vscale;
+                        style.spacing.indent *= vscale;
+                        style.spacing.window_margin = style.spacing.window_margin * vscale;
+                        ui.set_style(style);
+                        self.return_flow.show_content(ui, api_client);
+                    });
+                } else {
                     self.return_flow.show_content(ui, api_client);
-                });
+                }
             } else {
                 self.show_dashboard_grid(ui, row_height, show_full_ui_requested, user, config, api_client);
             }

+ 10 - 4
src/main.rs

@@ -54,26 +54,32 @@ fn main() -> eframe::Result<()> {
     }
 
     // Configure egui options
-    let mut viewport_builder = egui::ViewportBuilder::default()
-        .with_inner_size([1280.0, 800.0])
-        .with_min_inner_size([800.0, 600.0])
-        .with_icon(load_icon());
+    let mut viewport_builder = egui::ViewportBuilder::default().with_icon(load_icon());
 
     if kiosk_mode {
         if let Some(config) = &kiosk_config {
             // windowed_mode overrides fullscreen when present
             let want_fullscreen = if config.ui.windowed_mode { false } else { config.ui.fullscreen };
             if want_fullscreen {
+                // Fullscreen: let OS choose monitor; avoid inner/min size constraints
                 viewport_builder = viewport_builder
                     .with_fullscreen(true)
                     .with_decorations(false);
             } else {
+                // Windowed: start with a reasonable size and maximize
                 viewport_builder = viewport_builder
                     .with_fullscreen(false)
+                    .with_inner_size([1280.0, 800.0])
+                    .with_min_inner_size([800.0, 600.0])
                     .with_decorations(true)
                     .with_maximized(true);
             }
         }
+    } else {
+        // Non-kiosk: default windowed size
+        viewport_builder = viewport_builder
+            .with_inner_size([1280.0, 800.0])
+            .with_min_inner_size([800.0, 600.0]);
     }
 
     let options = eframe::NativeOptions {