]> git.proxmox.com Git - pve-installer.git/commitdiff
tui: limit `FloatEditView` to 2 decimal places
authorChristoph Heiss <c.heiss@proxmox.com>
Mon, 19 Jun 2023 12:52:41 +0000 (14:52 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Mon, 19 Jun 2023 13:09:53 +0000 (15:09 +0200)
Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
proxmox-tui-installer/src/views/mod.rs

index 1c0f1b38d471c78f569a72ab55bc1884812eb227..226dd4060a1a1e37ee2f26c938482f39410d145d 100644 (file)
@@ -41,11 +41,6 @@ impl<T: Copy + ToString + FromStr + PartialOrd> NumericEditView<T> {
         self
     }
 
-    pub fn content(mut self, content: T) -> Self {
-        self.view = self.view.content(content.to_string());
-        self
-    }
-
     pub fn get_content(&self) -> Result<T, <T as FromStr>::Err> {
         self.view.get_content().parse()
     }
@@ -78,9 +73,19 @@ impl ViewWrapper for FloatEditView {
     fn wrap_on_event(&mut self, event: Event) -> EventResult {
         let original = self.view.get_content();
 
+        let has_decimal_place = original.find('.').is_some();
+        let decimal_places = original
+            .split_once('.')
+            .map(|(_, s)| s.len())
+            .unwrap_or_default();
+
         let result = match event {
             // Drop all other characters than numbers; allow dots if not set to integer-only
-            Event::Char(c) if !(c.is_numeric() || c == '.') => EventResult::consumed(),
+            Event::Char(c)
+                if !(c.is_numeric() || (!has_decimal_place && c == '.')) || decimal_places >= 2 =>
+            {
+                EventResult::consumed()
+            }
             _ => self.view.on_event(event),
         };
 
@@ -88,6 +93,13 @@ impl ViewWrapper for FloatEditView {
     }
 }
 
+impl FloatEditView {
+    pub fn content(mut self, content: f64) -> Self {
+        self.view = self.view.content(format!("{:.2}", content));
+        self
+    }
+}
+
 impl ViewWrapper for IntegerEditView {
     cursive::wrap_impl!(self.view: EditView);
 
@@ -104,6 +116,13 @@ impl ViewWrapper for IntegerEditView {
     }
 }
 
+impl IntegerEditView {
+    pub fn content(mut self, content: usize) -> Self {
+        self.view = self.view.content(content.to_string());
+        self
+    }
+}
+
 pub struct DiskSizeEditView {
     view: LinearLayout,
 }