feat: more details button in SendungsVerfolgung
This commit is contained in:
parent
f3732051af
commit
ae64f73176
4 changed files with 132 additions and 5 deletions
3
icons.toml
Normal file
3
icons.toml
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
app_id = "de.j4ne.Paket"
|
||||||
|
|
||||||
|
icons = ["plus", "minus"]
|
|
@ -16,3 +16,4 @@ reqwest = "0.12"
|
||||||
libpaket = { path = "../libpaket" }
|
libpaket = { path = "../libpaket" }
|
||||||
glycin = { version = "2.0.0-beta", features = ["gdk4"] }
|
glycin = { version = "2.0.0-beta", features = ["gdk4"] }
|
||||||
oo7 = { version = "0.3" }
|
oo7 = { version = "0.3" }
|
||||||
|
relm4-icons = { version = "0.9" }
|
|
@ -3,6 +3,7 @@ use std::sync::Arc;
|
||||||
use login::{Login, LoginOutput, LoginSharedState};
|
use login::{Login, LoginOutput, LoginSharedState};
|
||||||
use ready::{Ready, ReadyOutput};
|
use ready::{Ready, ReadyOutput};
|
||||||
use relm4::{
|
use relm4::{
|
||||||
|
RELM_THREADS,
|
||||||
adw, gtk, main_adw_application, prelude::*, tokio::sync::Mutex,
|
adw, gtk, main_adw_application, prelude::*, tokio::sync::Mutex,
|
||||||
AsyncComponentSender, SharedState,
|
AsyncComponentSender, SharedState,
|
||||||
};
|
};
|
||||||
|
@ -289,6 +290,13 @@ fn convert_ready_response(response: ReadyOutput) -> AppInput {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
RELM_THREADS.set(4).unwrap();
|
||||||
|
gtk::init().unwrap();
|
||||||
|
let display = gtk::gdk::Display::default().unwrap();
|
||||||
|
let theme = gtk::IconTheme::for_display(&display);
|
||||||
|
theme.add_resource_path("/de/j4ne/Paket/icons/");
|
||||||
|
theme.add_resource_path("/de/j4ne/Paket/scalable/actions/");
|
||||||
|
relm4_icons::initialize_icons();
|
||||||
let app = RelmApp::new(constants::APP_ID);
|
let app = RelmApp::new(constants::APP_ID);
|
||||||
app.run_async::<App>(());
|
app.run_async::<App>(());
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,20 @@ use relm4::{adw, gtk};
|
||||||
|
|
||||||
pub struct ShipmentView {
|
pub struct ShipmentView {
|
||||||
model: Shipment,
|
model: Shipment,
|
||||||
|
|
||||||
|
// model abstraction
|
||||||
|
have_events: bool,
|
||||||
|
|
||||||
|
// state
|
||||||
|
expanded: bool,
|
||||||
|
|
||||||
|
// workarounds
|
||||||
|
list_box_history: gtk::ListBox,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum ViewInput {
|
||||||
|
ToggleExpand,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[relm4::factory(pub)]
|
#[relm4::factory(pub)]
|
||||||
|
@ -13,7 +27,7 @@ impl FactoryComponent for ShipmentView {
|
||||||
type CommandOutput = ();
|
type CommandOutput = ();
|
||||||
type Init = Shipment;
|
type Init = Shipment;
|
||||||
type Output = ();
|
type Output = ();
|
||||||
type Input = ();
|
type Input = ViewInput;
|
||||||
type ParentWidget = gtk::Box;
|
type ParentWidget = gtk::Box;
|
||||||
type Index = String;
|
type Index = String;
|
||||||
|
|
||||||
|
@ -23,14 +37,26 @@ impl FactoryComponent for ShipmentView {
|
||||||
add_css_class: relm4::css::CARD,
|
add_css_class: relm4::css::CARD,
|
||||||
set_hexpand: true,
|
set_hexpand: true,
|
||||||
set_margin_all: 8,
|
set_margin_all: 8,
|
||||||
|
set_orientation: gtk::Orientation::Vertical,
|
||||||
|
|
||||||
|
gtk::ProgressBar {
|
||||||
|
add_css_class: relm4::css::OSD,
|
||||||
|
set_margin_start: 8,
|
||||||
|
set_margin_end: 8,
|
||||||
|
set_margin_bottom: 1,
|
||||||
|
|
||||||
|
set_fraction: f64::from(self.model.history.maximal_fortschritt) / f64::from(self.model.history.fortschritt),
|
||||||
|
},
|
||||||
|
|
||||||
// title box
|
// title box
|
||||||
gtk::Box {
|
gtk::Box {
|
||||||
set_orientation: gtk::Orientation::Vertical,
|
set_orientation: gtk::Orientation::Horizontal,
|
||||||
|
set_hexpand: true,
|
||||||
set_margin_all: 8,
|
set_margin_all: 8,
|
||||||
|
|
||||||
gtk::Box {
|
gtk::Box {
|
||||||
set_orientation: gtk::Orientation::Vertical,
|
set_orientation: gtk::Orientation::Vertical,
|
||||||
|
set_hexpand: true,
|
||||||
set_halign: gtk::Align::Start,
|
set_halign: gtk::Align::Start,
|
||||||
|
|
||||||
gtk::Label {
|
gtk::Label {
|
||||||
|
@ -61,9 +87,52 @@ impl FactoryComponent for ShipmentView {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
gtk::Button {
|
||||||
|
set_halign: gtk::Align::End,
|
||||||
|
add_css_class: relm4::css::FLAT,
|
||||||
|
|
||||||
|
#[watch]
|
||||||
|
set_icon_name: {
|
||||||
|
if self.expanded {
|
||||||
|
relm4_icons::icon_names::MINUS
|
||||||
|
} else {
|
||||||
|
relm4_icons::icon_names::PLUS
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
connect_clicked => ViewInput::ToggleExpand,
|
||||||
}
|
}
|
||||||
}
|
}, // title box end
|
||||||
|
|
||||||
|
gtk::Revealer {
|
||||||
|
#[watch]
|
||||||
|
set_reveal_child: self.expanded,
|
||||||
|
|
||||||
|
#[wrap(Some)]
|
||||||
|
set_child = >k::Box {
|
||||||
|
// history viewstack
|
||||||
|
adw::StatusPage {
|
||||||
|
set_visible: !self.have_events,
|
||||||
|
|
||||||
|
set_title: "No events",
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
append = &self.list_box_history.clone() {
|
||||||
|
set_visible: self.have_events,
|
||||||
|
|
||||||
|
add_css_class: relm4::css::BOXED_LIST,
|
||||||
|
|
||||||
|
set_selection_mode: gtk::SelectionMode::None,
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn init_model(
|
fn init_model(
|
||||||
|
@ -71,8 +140,54 @@ impl FactoryComponent for ShipmentView {
|
||||||
index: &Self::Index,
|
index: &Self::Index,
|
||||||
sender: relm4::FactorySender<Self>,
|
sender: relm4::FactorySender<Self>,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
let model = ShipmentView { model: init };
|
let have_events = init.history.events.as_ref().is_some_and(|a| a.len() > 0);
|
||||||
|
|
||||||
model
|
let list_box_history = gtk::ListBox::new();
|
||||||
|
|
||||||
|
let _self = ShipmentView {
|
||||||
|
have_events,
|
||||||
|
model: init,
|
||||||
|
list_box_history,
|
||||||
|
expanded: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
for elem in _self.model.history.events.as_ref().unwrap() {
|
||||||
|
let label_datum = gtk::Label::builder()
|
||||||
|
.css_classes([relm4::css::NUMERIC])
|
||||||
|
.label(&elem.datum)
|
||||||
|
.halign(gtk::Align::Start)
|
||||||
|
.valign(gtk::Align::Start)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// TODO: is html, parse it
|
||||||
|
let label_status = gtk::Label::builder()
|
||||||
|
.wrap(true)
|
||||||
|
.halign(gtk::Align::Start)
|
||||||
|
.valign(gtk::Align::Start)
|
||||||
|
.build();
|
||||||
|
label_status.set_markup(&elem.status);
|
||||||
|
|
||||||
|
let boxie = gtk::Box::builder()
|
||||||
|
.orientation(gtk::Orientation::Horizontal)
|
||||||
|
.margin_start(8)
|
||||||
|
.margin_end(8)
|
||||||
|
.spacing(8)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
boxie.append(&label_datum);
|
||||||
|
boxie.append(&label_status);
|
||||||
|
|
||||||
|
_self.list_box_history.append(&boxie);
|
||||||
|
}
|
||||||
|
|
||||||
|
_self
|
||||||
|
}
|
||||||
|
|
||||||
|
fn update(&mut self, message: Self::Input, sender: FactorySender<Self>) {
|
||||||
|
match message {
|
||||||
|
ViewInput::ToggleExpand => {
|
||||||
|
self.expanded = !self.expanded;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue