diff --git a/src/app/browser/window/tab/item/page.rs b/src/app/browser/window/tab/item/page.rs
index 5e80b774..bc8abf99 100644
--- a/src/app/browser/window/tab/item/page.rs
+++ b/src/app/browser/window/tab/item/page.rs
@@ -280,7 +280,7 @@ impl Page {
let description = gformat!("{placeholder}");
// Show input request
- input.show(Some(&description));
+ input.show(Some(&description), Some(&1024));
// Update meta
meta.borrow_mut().status = Some(status);
diff --git a/src/app/browser/window/tab/item/page/input.rs b/src/app/browser/window/tab/item/page/input.rs
index d8cdac96..ca4e4936 100644
--- a/src/app/browser/window/tab/item/page/input.rs
+++ b/src/app/browser/window/tab/item/page/input.rs
@@ -26,8 +26,8 @@ impl Input {
}
// Actions
- pub fn show(&self, title: Option<&str>) {
- self.content.set(title);
+ pub fn show(&self, title: Option<&str>, limit: Option<&i32>) {
+ self.content.update(title, limit);
self.widget.show(true);
}
diff --git a/src/app/browser/window/tab/item/page/input/content.rs b/src/app/browser/window/tab/item/page/input/content.rs
index 8a707794..ba5f1234 100644
--- a/src/app/browser/window/tab/item/page/input/content.rs
+++ b/src/app/browser/window/tab/item/page/input/content.rs
@@ -1,10 +1,10 @@
+mod control;
mod response;
-mod send;
mod title;
mod widget;
+use control::Control;
use response::Response;
-use send::Send;
use title::Title;
use widget::Widget;
@@ -12,8 +12,9 @@ use gtk::Box;
use std::sync::Arc;
pub struct Content {
- title: Arc
,
+ control: Arc,
response: Arc,
+ title: Arc,
widget: Arc,
}
@@ -21,29 +22,26 @@ impl Content {
// Construct
pub fn new_arc() -> Arc {
// Init components
- let title = Title::new_arc();
+ let control = Control::new_arc();
let response = Response::new_arc();
- let send = Send::new_arc();
+ let title = Title::new_arc();
// Init widget
- let widget = Widget::new_arc(title.gobject(), response.gobject(), send.gobject());
-
- // Init events
- /* @TODO
- response.gobject().connect_activate(|_| {});
- send.gobject().connect_clicked(|_| {}); */
+ let widget = Widget::new_arc(title.gobject(), response.gobject(), control.gobject());
// Return activated struct
Arc::new(Self {
- title,
+ control,
response,
+ title,
widget,
})
}
// Actions
- pub fn set(&self, title: Option<&str>) {
- self.title.set(title);
+ pub fn update(&self, title: Option<&str>, count_limit: Option<&i32>) {
+ self.control.update(&0, count_limit); // @TODO
+ self.title.update(title);
self.response.grab_focus();
}
diff --git a/src/app/browser/window/tab/item/page/input/content/control.rs b/src/app/browser/window/tab/item/page/input/content/control.rs
new file mode 100644
index 00000000..3fa033eb
--- /dev/null
+++ b/src/app/browser/window/tab/item/page/input/content/control.rs
@@ -0,0 +1,46 @@
+mod limit;
+mod send;
+mod widget;
+
+use limit::Limit;
+use send::Send;
+use widget::Widget;
+
+use gtk::Box;
+use std::sync::Arc;
+
+pub struct Control {
+ limit: Arc,
+ send: Arc,
+ widget: Arc,
+}
+
+impl Control {
+ // Construct
+ pub fn new_arc() -> Arc {
+ // Init components
+ let limit = Limit::new_arc();
+ let send = Send::new_arc();
+
+ // Init widget
+ let widget = Widget::new_arc(limit.gobject(), send.gobject());
+
+ // Return activated struct
+ Arc::new(Self {
+ limit,
+ send,
+ widget,
+ })
+ }
+
+ // Actions
+ pub fn update(&self, count: &i32, count_limit: Option<&i32>) {
+ self.limit.update(count, count_limit);
+ // @TODO self.send.update(limit);
+ }
+
+ // Getters
+ pub fn gobject(&self) -> &Box {
+ &self.widget.gobject()
+ }
+}
diff --git a/src/app/browser/window/tab/item/page/input/content/control/limit.rs b/src/app/browser/window/tab/item/page/input/content/control/limit.rs
new file mode 100644
index 00000000..93cdb1e0
--- /dev/null
+++ b/src/app/browser/window/tab/item/page/input/content/control/limit.rs
@@ -0,0 +1,31 @@
+mod widget;
+
+use widget::Widget;
+
+use gtk::Label;
+use std::sync::Arc;
+
+pub struct Limit {
+ widget: Arc,
+}
+
+impl Limit {
+ // Construct
+ pub fn new_arc() -> Arc {
+ // Init widget
+ let widget = Widget::new_arc();
+
+ // Result
+ Arc::new(Self { widget })
+ }
+
+ // Actions
+ pub fn update(&self, count: &i32, limit: Option<&i32>) {
+ self.widget.update(count, limit);
+ }
+
+ // Getters
+ pub fn gobject(&self) -> &Label {
+ &self.widget.gobject()
+ }
+}
diff --git a/src/app/browser/window/tab/item/page/input/content/control/limit/widget.rs b/src/app/browser/window/tab/item/page/input/content/control/limit/widget.rs
new file mode 100644
index 00000000..ebbbe198
--- /dev/null
+++ b/src/app/browser/window/tab/item/page/input/content/control/limit/widget.rs
@@ -0,0 +1,39 @@
+use gtk::{prelude::WidgetExt, Label};
+use std::sync::Arc;
+
+pub struct Widget {
+ gobject: Label,
+}
+
+impl Widget {
+ // Construct
+ pub fn new_arc() -> Arc {
+ let gobject = Label::builder().use_markup(true).build();
+
+ Arc::new(Self { gobject })
+ }
+
+ // Actions
+ pub fn update(&self, count: &i32, count_limit: Option<&i32>) {
+ match count_limit {
+ Some(limit) => {
+ // Update color on limit reached
+ self.gobject
+ .set_css_classes(&[if count < limit { "success" } else { "error" }]); // @TODO add warning step?
+
+ // Update text
+ self.gobject
+ .set_markup(&format!("{count} / {limit}"));
+
+ // Toggle visibility if limit provided
+ self.gobject.set_visible(true);
+ }
+ None => self.gobject.set_visible(false),
+ }
+ }
+
+ // Getters
+ pub fn gobject(&self) -> &Label {
+ &self.gobject
+ }
+}
diff --git a/src/app/browser/window/tab/item/page/input/content/send.rs b/src/app/browser/window/tab/item/page/input/content/control/send.rs
similarity index 100%
rename from src/app/browser/window/tab/item/page/input/content/send.rs
rename to src/app/browser/window/tab/item/page/input/content/control/send.rs
diff --git a/src/app/browser/window/tab/item/page/input/content/send/widget.rs b/src/app/browser/window/tab/item/page/input/content/control/send/widget.rs
similarity index 86%
rename from src/app/browser/window/tab/item/page/input/content/send/widget.rs
rename to src/app/browser/window/tab/item/page/input/content/control/send/widget.rs
index 31bd9f41..0b383234 100644
--- a/src/app/browser/window/tab/item/page/input/content/send/widget.rs
+++ b/src/app/browser/window/tab/item/page/input/content/control/send/widget.rs
@@ -1,4 +1,4 @@
-use gtk::{Align, Button};
+use gtk::Button;
use std::sync::Arc;
pub struct Widget {
@@ -10,7 +10,6 @@ impl Widget {
pub fn new_arc() -> Arc {
let gobject = Button::builder()
//.css_classes(["accent"])
- .halign(Align::End)
.label("Send")
.build();
diff --git a/src/app/browser/window/tab/item/page/input/content/control/widget.rs b/src/app/browser/window/tab/item/page/input/content/control/widget.rs
new file mode 100644
index 00000000..ec3c6878
--- /dev/null
+++ b/src/app/browser/window/tab/item/page/input/content/control/widget.rs
@@ -0,0 +1,29 @@
+use gtk::{prelude::BoxExt, Align, Box, Button, Label, Orientation};
+use std::sync::Arc;
+
+const SPACING: i32 = 8;
+
+pub struct Widget {
+ gobject: Box,
+}
+
+impl Widget {
+ // Construct
+ pub fn new_arc(limit: &Label, send: &Button) -> Arc {
+ let gobject = Box::builder()
+ .halign(Align::End)
+ .orientation(Orientation::Horizontal)
+ .spacing(SPACING)
+ .build();
+
+ gobject.append(limit);
+ gobject.append(send);
+
+ Arc::new(Self { gobject })
+ }
+
+ // Getters
+ pub fn gobject(&self) -> &Box {
+ &self.gobject
+ }
+}
diff --git a/src/app/browser/window/tab/item/page/input/content/title.rs b/src/app/browser/window/tab/item/page/input/content/title.rs
index ea4eb716..768a7128 100644
--- a/src/app/browser/window/tab/item/page/input/content/title.rs
+++ b/src/app/browser/window/tab/item/page/input/content/title.rs
@@ -20,8 +20,8 @@ impl Title {
}
// Actions
- pub fn set(&self, text: Option<&str>) {
- self.widget.set(text);
+ pub fn update(&self, text: Option<&str>) {
+ self.widget.update(text);
}
// Getters
diff --git a/src/app/browser/window/tab/item/page/input/content/title/widget.rs b/src/app/browser/window/tab/item/page/input/content/title/widget.rs
index b79daaba..5877f5cd 100644
--- a/src/app/browser/window/tab/item/page/input/content/title/widget.rs
+++ b/src/app/browser/window/tab/item/page/input/content/title/widget.rs
@@ -20,7 +20,7 @@ impl Widget {
}
// Actions
- pub fn set(&self, text: Option<&str>) {
+ pub fn update(&self, text: Option<&str>) {
match text {
Some(value) => {
self.gobject.set_label(value);
diff --git a/src/app/browser/window/tab/item/page/input/content/widget.rs b/src/app/browser/window/tab/item/page/input/content/widget.rs
index b7e40647..854f1fa7 100644
--- a/src/app/browser/window/tab/item/page/input/content/widget.rs
+++ b/src/app/browser/window/tab/item/page/input/content/widget.rs
@@ -1,4 +1,4 @@
-use gtk::{prelude::BoxExt, Box, Button, Label, Orientation, TextView};
+use gtk::{prelude::BoxExt, Box, Label, Orientation, TextView};
use std::sync::Arc;
const MARGIN: i32 = 6;
@@ -10,7 +10,7 @@ pub struct Widget {
impl Widget {
// Construct
- pub fn new_arc(title: &Label, response: &TextView, send: &Button) -> Arc {
+ pub fn new_arc(title: &Label, response: &TextView, control: &Box) -> Arc {
let gobject = Box::builder()
.margin_bottom(MARGIN)
.margin_end(MARGIN)
@@ -22,7 +22,7 @@ impl Widget {
gobject.append(title);
gobject.append(response);
- gobject.append(send);
+ gobject.append(control);
Arc::new(Self { gobject })
}