Pārlūkot izejas kodu

lol kiosk mode funny

UMTS at Teleco 3 nedēļas atpakaļ
vecāks
revīzija
70c98ce2d5
5 mainītis faili ar 64 papildinājumiem un 13 dzēšanām
  1. 3 2
      kiosk.toml
  2. 2 0
      src/config.rs
  3. 15 3
      src/core/table_renderer.rs
  4. 36 7
      src/kioskui/app.rs
  5. 8 1
      src/main.rs

+ 3 - 2
kiosk.toml

@@ -20,8 +20,9 @@ enable_osk = true
 enable_rfid = true
 fullscreen = true
 button_height = 80.0
-font_size = 24.0
+font_size = 34.0
 minimum_power_level_for_full_ui = 50
 timeout_seconds = 240
 enable_full_osk_button = true
-scaling_factor = 1
+scaling_factor = 2
+windowed_mode = false

+ 2 - 0
src/config.rs

@@ -80,6 +80,8 @@ pub struct KioskUiSettings {
     pub enable_rfid: bool,
     #[serde(default)]
     pub fullscreen: bool,
+    #[serde(default)]
+    pub windowed_mode: bool,
     pub button_height: f32,
     pub font_size: f32,
     #[serde(default = "default_scale", alias = "component_scale")]

+ 15 - 3
src/core/table_renderer.rs

@@ -296,6 +296,18 @@ impl TableRenderer {
 
         let visible_columns: Vec<_> = self.columns.iter().filter(|c| c.visible).collect();
 
+        // Derive dynamic sizes from current style and scaling
+        let body_font_size = ui
+            .style()
+            .text_styles
+            .get(&egui::TextStyle::Body)
+            .map(|f| f.size)
+            .unwrap_or(14.0);
+        let spacing = ui.style().spacing.item_spacing.y;
+        let header_height = (body_font_size * 1.30 + spacing).max(22.0);
+        let row_height = (body_font_size * 1.20 + spacing).max(20.0);
+        let checkbox_col_width = (body_font_size * 1.10).max(24.0);
+
         let mut table = TableBuilder::new(ui)
             .striped(true)
             .resizable(true)
@@ -303,13 +315,13 @@ impl TableRenderer {
             .max_scroll_height(f32::MAX);
 
         // Add selection checkbox column first, then remainder columns
-        table = table.column(Column::initial(28.0));
+        table = table.column(Column::initial(checkbox_col_width));
         for _column in &visible_columns {
             table = table.column(Column::remainder().resizable(true).clip(true));
         }
 
         table
-            .header(24.0, |mut header| {
+            .header(header_height, |mut header| {
                 // Selection header: Select All for multi, label for single
                 header.col(|ui| {
                     if matches!(self.selection_mode, SelectionMode::Multi) {
@@ -367,7 +379,7 @@ impl TableRenderer {
                     let _item_clone = (*item).clone();
                     let is_selected = self.selection.is_selected(idx);
 
-                    body.row(20.0, |mut row| {
+                    body.row(row_height, |mut row| {
                         // Apply selection highlight
                         if is_selected {
                             row.set_selected(true);

+ 36 - 7
src/kioskui/app.rs

@@ -39,6 +39,7 @@ pub struct KioskApp {
     last_interaction: std::time::Instant,
     startup_time: std::time::Instant,
     delayed_fullscreen_done: bool,
+    last_enforce_check: std::time::Instant,
 }
 
 impl KioskApp {
@@ -74,6 +75,7 @@ impl KioskApp {
             last_interaction: std::time::Instant::now(),
             startup_time: std::time::Instant::now(),
             delayed_fullscreen_done: false,
+            last_enforce_check: std::time::Instant::now(),
         }
     }
 
@@ -138,20 +140,47 @@ impl eframe::App for KioskApp {
 
         // Ensure window state on first frame
         if !self.window_setup_done {
-            if self.config.ui.fullscreen {
+            let want_fullscreen = if self.config.ui.windowed_mode { false } else { self.config.ui.fullscreen };
+            if want_fullscreen {
                 ctx.send_viewport_cmd(egui::ViewportCommand::Fullscreen(true));
+                ctx.send_viewport_cmd(egui::ViewportCommand::Decorations(false));
+            } else {
+                // Ensure we are not in fullscreen and re-enable window decorations (borders, title bar)
+                ctx.send_viewport_cmd(egui::ViewportCommand::Fullscreen(false));
+                ctx.send_viewport_cmd(egui::ViewportCommand::Decorations(true));
+                // Ask the window manager to maximize the window
+                ctx.send_viewport_cmd(egui::ViewportCommand::Maximized(true));
             }
 
-        // Enforce fullscreen again after a short delay (to handle some window managers)
-        if !self.delayed_fullscreen_done && self.startup_time.elapsed().as_secs_f32() > 1.0 {
-            if self.config.ui.fullscreen {
-                ctx.send_viewport_cmd(egui::ViewportCommand::Fullscreen(true));
+            // Enforce desired mode again after a short delay (to handle some window managers)
+            if !self.delayed_fullscreen_done && self.startup_time.elapsed().as_secs_f32() > 1.0 {
+                if want_fullscreen {
+                    ctx.send_viewport_cmd(egui::ViewportCommand::Fullscreen(true));
+                    ctx.send_viewport_cmd(egui::ViewportCommand::Decorations(false));
+                } else {
+                    ctx.send_viewport_cmd(egui::ViewportCommand::Fullscreen(false));
+                    ctx.send_viewport_cmd(egui::ViewportCommand::Decorations(true));
+                    ctx.send_viewport_cmd(egui::ViewportCommand::Maximized(true));
+                }
+                self.delayed_fullscreen_done = true;
             }
-            self.delayed_fullscreen_done = true;
-        }
             self.window_setup_done = true;
         }
 
+        // Periodically re-assert desired window mode in case the OS/window manager changed it.
+        if self.last_enforce_check.elapsed().as_secs_f32() > 3.0 {
+            let want_fullscreen = if self.config.ui.windowed_mode { false } else { self.config.ui.fullscreen };
+            if want_fullscreen {
+                ctx.send_viewport_cmd(egui::ViewportCommand::Fullscreen(true));
+                ctx.send_viewport_cmd(egui::ViewportCommand::Decorations(false));
+            } else {
+                ctx.send_viewport_cmd(egui::ViewportCommand::Fullscreen(false));
+                ctx.send_viewport_cmd(egui::ViewportCommand::Decorations(true));
+                ctx.send_viewport_cmd(egui::ViewportCommand::Maximized(true));
+            }
+            self.last_enforce_check = std::time::Instant::now();
+        }
+
         // Check for interaction (clicks or key presses, ignore mouse moves to prevent drift issues)
         let has_interaction = ctx.input(|i| {
             i.pointer.any_pressed() || 

+ 8 - 1
src/main.rs

@@ -61,10 +61,17 @@ fn main() -> eframe::Result<()> {
 
     if kiosk_mode {
         if let Some(config) = &kiosk_config {
-            if config.ui.fullscreen {
+            // windowed_mode overrides fullscreen when present
+            let want_fullscreen = if config.ui.windowed_mode { false } else { config.ui.fullscreen };
+            if want_fullscreen {
                 viewport_builder = viewport_builder
                     .with_fullscreen(true)
                     .with_decorations(false);
+            } else {
+                viewport_builder = viewport_builder
+                    .with_fullscreen(false)
+                    .with_decorations(true)
+                    .with_maximized(true);
             }
         }
     }