From 1972438da647f2a51c1883ca5324b1676467c98d Mon Sep 17 00:00:00 2001 From: yggverse Date: Wed, 16 Oct 2024 10:15:13 +0300 Subject: [PATCH] draft multiline input --- src/app/browser/window/tab/item/page.rs | 29 ++++++-------- src/app/browser/window/tab/item/page/input.rs | 4 +- .../window/tab/item/page/input/content.rs | 17 +++++++-- .../tab/item/page/input/content/response.rs | 8 ++-- .../page/input/content/response/widget.rs | 21 +++++----- .../tab/item/page/input/content/title.rs | 31 +++++++++++++++ .../item/page/input/content/title/widget.rs | 38 +++++++++++++++++++ .../tab/item/page/input/content/widget.rs | 7 ++-- src/app/browser/window/tab/item/page/meta.rs | 2 +- 9 files changed, 115 insertions(+), 42 deletions(-) create mode 100644 src/app/browser/window/tab/item/page/input/content/title.rs create mode 100644 src/app/browser/window/tab/item/page/input/content/title/widget.rs diff --git a/src/app/browser/window/tab/item/page.rs b/src/app/browser/window/tab/item/page.rs index 57c7a175..8c99d72e 100644 --- a/src/app/browser/window/tab/item/page.rs +++ b/src/app/browser/window/tab/item/page.rs @@ -272,32 +272,27 @@ impl Page { Some(code) => match code.as_str() { // Input expected "10" => { - match parts.get(4) { + match parts.get(3) { Some(placeholder) => { // Format response - meta.borrow_mut().status = Some(Status::Input); - meta.borrow_mut().description = None; // @TODO - meta.borrow_mut().title = Some(gformat!("Input expected")); + let status = Status::Input; + let title = gformat!("Input expected"); + let description = gformat!("{placeholder}"); - input.show(&placeholder, false); + // Show input request + input.show(Some(&description)); + + // Update meta + meta.borrow_mut().status = Some(status); + meta.borrow_mut().description = Some(description); + meta.borrow_mut().title = Some(title); }, None => todo!(), } - }, // Sensitive input expected "11" => { - match parts.get(4) { - Some(placeholder) => { - // Format response - meta.borrow_mut().status = Some(Status::SensitiveInput); - meta.borrow_mut().description = None; // @TODO - meta.borrow_mut().title = Some(gformat!("Input expected")); - - input.show(&placeholder, true); - }, - None => todo!(), - } + todo!() }, // Success "20" => { diff --git a/src/app/browser/window/tab/item/page/input.rs b/src/app/browser/window/tab/item/page/input.rs index eb0fa648..9a200bce 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, placeholder: &str, sensitive: bool) { - self.content.set(placeholder, sensitive); + pub fn show(&self, title: Option<&str>) { + self.content.set(title); 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 c5069547..8a707794 100644 --- a/src/app/browser/window/tab/item/page/input/content.rs +++ b/src/app/browser/window/tab/item/page/input/content.rs @@ -1,15 +1,18 @@ mod response; mod send; +mod title; mod widget; use response::Response; use send::Send; +use title::Title; use widget::Widget; use gtk::Box; use std::sync::Arc; pub struct Content { + title: Arc, response: Arc<Response>, widget: Arc<Widget>, } @@ -18,11 +21,12 @@ impl Content { // Construct pub fn new_arc() -> Arc<Self> { // Init components + let title = Title::new_arc(); let response = Response::new_arc(); let send = Send::new_arc(); // Init widget - let widget = Widget::new_arc(response.gobject(), send.gobject()); + let widget = Widget::new_arc(title.gobject(), response.gobject(), send.gobject()); // Init events /* @TODO @@ -30,12 +34,17 @@ impl Content { send.gobject().connect_clicked(|_| {}); */ // Return activated struct - Arc::new(Self { response, widget }) + Arc::new(Self { + title, + response, + widget, + }) } // Actions - pub fn set(&self, placeholder: &str, sensitive: bool) { - self.response.set(placeholder, sensitive); + pub fn set(&self, title: Option<&str>) { + self.title.set(title); + self.response.grab_focus(); } // Getters diff --git a/src/app/browser/window/tab/item/page/input/content/response.rs b/src/app/browser/window/tab/item/page/input/content/response.rs index 8f6d9051..dc524467 100644 --- a/src/app/browser/window/tab/item/page/input/content/response.rs +++ b/src/app/browser/window/tab/item/page/input/content/response.rs @@ -2,7 +2,7 @@ mod widget; use widget::Widget; -use gtk::Entry; +use gtk::TextView; use std::sync::Arc; pub struct Response { @@ -20,12 +20,12 @@ impl Response { } // Actions - pub fn set(&self, placeholder: &str, sensitive: bool) { - self.widget.set(placeholder, sensitive); + pub fn grab_focus(&self) { + self.widget.grab_focus(); } // Getters - pub fn gobject(&self) -> &Entry { + pub fn gobject(&self) -> &TextView { &self.widget.gobject() } } diff --git a/src/app/browser/window/tab/item/page/input/content/response/widget.rs b/src/app/browser/window/tab/item/page/input/content/response/widget.rs index cb8b0024..d0760ef6 100644 --- a/src/app/browser/window/tab/item/page/input/content/response/widget.rs +++ b/src/app/browser/window/tab/item/page/input/content/response/widget.rs @@ -1,31 +1,30 @@ -use gtk::{ - prelude::{EditableExt, EntryExt, WidgetExt}, - Entry, -}; +use gtk::{prelude::WidgetExt, TextView}; use std::sync::Arc; pub struct Widget { - gobject: Entry, + gobject: TextView, } impl Widget { // Construct pub fn new_arc() -> Arc<Self> { - let gobject = Entry::builder().editable(true).hexpand(true).build(); + let gobject = TextView::builder() + .left_margin(8) + .pixels_above_lines(8) + .pixels_below_lines(8) + .right_margin(8) + .build(); Arc::new(Self { gobject }) } // Actions - pub fn set(&self, placeholder_text: &str, sensitive: bool) { - self.gobject.set_text(&""); // reset - self.gobject.set_placeholder_text(Some(placeholder_text)); - // self.gobject.set_sensitive(sensitive); + pub fn grab_focus(&self) { self.gobject.grab_focus(); } // Getters - pub fn gobject(&self) -> &Entry { + pub fn gobject(&self) -> &TextView { &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 new file mode 100644 index 00000000..ea4eb716 --- /dev/null +++ b/src/app/browser/window/tab/item/page/input/content/title.rs @@ -0,0 +1,31 @@ +mod widget; + +use widget::Widget; + +use gtk::Label; +use std::sync::Arc; + +pub struct Title { + widget: Arc<Widget>, +} + +impl Title { + // Construct + pub fn new_arc() -> Arc<Self> { + // Init widget + let widget = Widget::new_arc(); + + // Result + Arc::new(Self { widget }) + } + + // Actions + pub fn set(&self, text: Option<&str>) { + self.widget.set(text); + } + + // Getters + pub fn gobject(&self) -> &Label { + &self.widget.gobject() + } +} 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 new file mode 100644 index 00000000..173d8efb --- /dev/null +++ b/src/app/browser/window/tab/item/page/input/content/title/widget.rs @@ -0,0 +1,38 @@ +use gtk::{prelude::WidgetExt, Align, Label}; +use std::sync::Arc; + +pub struct Widget { + gobject: Label, +} + +impl Widget { + // Construct + pub fn new_arc() -> Arc<Self> { + let gobject = Label::builder() + .halign(Align::Start) + .margin_end(8) + .margin_start(8) + .visible(false) + .build(); + + Arc::new(Self { gobject }) + } + + // Actions + pub fn set(&self, text: Option<&str>) { + match text { + Some(value) => { + self.gobject.set_label(value); + self.gobject.set_visible(!value.is_empty()); + } + 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/widget.rs b/src/app/browser/window/tab/item/page/input/content/widget.rs index 29373254..b7e40647 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, Entry, Orientation}; +use gtk::{prelude::BoxExt, Box, Button, Label, Orientation, TextView}; use std::sync::Arc; const MARGIN: i32 = 6; @@ -10,16 +10,17 @@ pub struct Widget { impl Widget { // Construct - pub fn new_arc(response: &Entry, send: &Button) -> Arc<Self> { + pub fn new_arc(title: &Label, response: &TextView, send: &Button) -> Arc<Self> { let gobject = Box::builder() .margin_bottom(MARGIN) .margin_end(MARGIN) .margin_start(MARGIN) .margin_top(MARGIN) .spacing(SPACING) - .orientation(Orientation::Horizontal) + .orientation(Orientation::Vertical) .build(); + gobject.append(title); gobject.append(response); gobject.append(send); diff --git a/src/app/browser/window/tab/item/page/meta.rs b/src/app/browser/window/tab/item/page/meta.rs index 29327107..29ab627e 100644 --- a/src/app/browser/window/tab/item/page/meta.rs +++ b/src/app/browser/window/tab/item/page/meta.rs @@ -18,7 +18,7 @@ pub enum Status { Reload, Request, Response, - SensitiveInput, + // @TODO SensitiveInput, Success, }