draft limit notification badge

This commit is contained in:
yggverse 2024-10-16 14:24:21 +03:00
parent edef963287
commit 88aeab91be
12 changed files with 167 additions and 25 deletions

View File

@ -280,7 +280,7 @@ impl Page {
let description = gformat!("{placeholder}"); let description = gformat!("{placeholder}");
// Show input request // Show input request
input.show(Some(&description)); input.show(Some(&description), Some(&1024));
// Update meta // Update meta
meta.borrow_mut().status = Some(status); meta.borrow_mut().status = Some(status);

View File

@ -26,8 +26,8 @@ impl Input {
} }
// Actions // Actions
pub fn show(&self, title: Option<&str>) { pub fn show(&self, title: Option<&str>, limit: Option<&i32>) {
self.content.set(title); self.content.update(title, limit);
self.widget.show(true); self.widget.show(true);
} }

View File

@ -1,10 +1,10 @@
mod control;
mod response; mod response;
mod send;
mod title; mod title;
mod widget; mod widget;
use control::Control;
use response::Response; use response::Response;
use send::Send;
use title::Title; use title::Title;
use widget::Widget; use widget::Widget;
@ -12,8 +12,9 @@ use gtk::Box;
use std::sync::Arc; use std::sync::Arc;
pub struct Content { pub struct Content {
title: Arc<Title>, control: Arc<Control>,
response: Arc<Response>, response: Arc<Response>,
title: Arc<Title>,
widget: Arc<Widget>, widget: Arc<Widget>,
} }
@ -21,29 +22,26 @@ impl Content {
// Construct // Construct
pub fn new_arc() -> Arc<Self> { pub fn new_arc() -> Arc<Self> {
// Init components // Init components
let title = Title::new_arc(); let control = Control::new_arc();
let response = Response::new_arc(); let response = Response::new_arc();
let send = Send::new_arc(); let title = Title::new_arc();
// Init widget // Init widget
let widget = Widget::new_arc(title.gobject(), response.gobject(), send.gobject()); let widget = Widget::new_arc(title.gobject(), response.gobject(), control.gobject());
// Init events
/* @TODO
response.gobject().connect_activate(|_| {});
send.gobject().connect_clicked(|_| {}); */
// Return activated struct // Return activated struct
Arc::new(Self { Arc::new(Self {
title, control,
response, response,
title,
widget, widget,
}) })
} }
// Actions // Actions
pub fn set(&self, title: Option<&str>) { pub fn update(&self, title: Option<&str>, count_limit: Option<&i32>) {
self.title.set(title); self.control.update(&0, count_limit); // @TODO
self.title.update(title);
self.response.grab_focus(); self.response.grab_focus();
} }

View File

@ -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<Limit>,
send: Arc<Send>,
widget: Arc<Widget>,
}
impl Control {
// Construct
pub fn new_arc() -> Arc<Self> {
// 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()
}
}

View File

@ -0,0 +1,31 @@
mod widget;
use widget::Widget;
use gtk::Label;
use std::sync::Arc;
pub struct Limit {
widget: Arc<Widget>,
}
impl Limit {
// Construct
pub fn new_arc() -> Arc<Self> {
// 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()
}
}

View File

@ -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<Self> {
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} <sup>/ {limit}</sup>"));
// Toggle visibility if limit provided
self.gobject.set_visible(true);
}
None => self.gobject.set_visible(false),
}
}
// Getters
pub fn gobject(&self) -> &Label {
&self.gobject
}
}

View File

@ -1,4 +1,4 @@
use gtk::{Align, Button}; use gtk::Button;
use std::sync::Arc; use std::sync::Arc;
pub struct Widget { pub struct Widget {
@ -10,7 +10,6 @@ impl Widget {
pub fn new_arc() -> Arc<Self> { pub fn new_arc() -> Arc<Self> {
let gobject = Button::builder() let gobject = Button::builder()
//.css_classes(["accent"]) //.css_classes(["accent"])
.halign(Align::End)
.label("Send") .label("Send")
.build(); .build();

View File

@ -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<Self> {
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
}
}

View File

@ -20,8 +20,8 @@ impl Title {
} }
// Actions // Actions
pub fn set(&self, text: Option<&str>) { pub fn update(&self, text: Option<&str>) {
self.widget.set(text); self.widget.update(text);
} }
// Getters // Getters

View File

@ -20,7 +20,7 @@ impl Widget {
} }
// Actions // Actions
pub fn set(&self, text: Option<&str>) { pub fn update(&self, text: Option<&str>) {
match text { match text {
Some(value) => { Some(value) => {
self.gobject.set_label(value); self.gobject.set_label(value);

View File

@ -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; use std::sync::Arc;
const MARGIN: i32 = 6; const MARGIN: i32 = 6;
@ -10,7 +10,7 @@ pub struct Widget {
impl Widget { impl Widget {
// Construct // Construct
pub fn new_arc(title: &Label, response: &TextView, send: &Button) -> Arc<Self> { pub fn new_arc(title: &Label, response: &TextView, control: &Box) -> Arc<Self> {
let gobject = Box::builder() let gobject = Box::builder()
.margin_bottom(MARGIN) .margin_bottom(MARGIN)
.margin_end(MARGIN) .margin_end(MARGIN)
@ -22,7 +22,7 @@ impl Widget {
gobject.append(title); gobject.append(title);
gobject.append(response); gobject.append(response);
gobject.append(send); gobject.append(control);
Arc::new(Self { gobject }) Arc::new(Self { gobject })
} }