mirror of
https://github.com/YGGverse/Yoda.git
synced 2026-03-31 16:45:27 +00:00
draft page info dialog features
This commit is contained in:
parent
71ae92cfaa
commit
96230ee476
5 changed files with 133 additions and 4 deletions
|
|
@ -75,7 +75,7 @@ impl Gemini {
|
|||
0.9
|
||||
}
|
||||
SocketClientEvent::Complete => {
|
||||
i.add_event("Complete".to_string());
|
||||
i.add_event("Receiving".to_string());
|
||||
1.0
|
||||
}
|
||||
_ => panic!(), // alert on API change
|
||||
|
|
|
|||
|
|
@ -91,6 +91,7 @@ impl Request {
|
|||
});
|
||||
|
||||
entry.connect_icon_release({
|
||||
let i = info.clone();
|
||||
let p = profile.clone();
|
||||
move |e, position| match position {
|
||||
EntryIconPosition::Primary => {
|
||||
|
|
@ -100,8 +101,14 @@ impl Request {
|
|||
show_identity_dialog(e, &p)
|
||||
}
|
||||
}
|
||||
EntryIconPosition::Secondary => e.emit_activate(),
|
||||
_ => todo!(), // unexpected
|
||||
EntryIconPosition::Secondary => {
|
||||
if is_focused(e) {
|
||||
e.emit_activate()
|
||||
} else {
|
||||
i.borrow().dialog(Some(e));
|
||||
}
|
||||
}
|
||||
_ => panic!(),
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
mod dialog;
|
||||
|
||||
// Public dependencies
|
||||
|
||||
pub mod event;
|
||||
|
|
@ -5,7 +7,8 @@ pub use event::Event;
|
|||
|
||||
// Local dependencies
|
||||
|
||||
use gtk::gio::NetworkAddress;
|
||||
use dialog::Dialog;
|
||||
use gtk::{gio::NetworkAddress, prelude::IsA};
|
||||
|
||||
/// Common, shared `Page` information holder
|
||||
/// * used for the Information dialog window on request indicator activate
|
||||
|
|
@ -48,6 +51,11 @@ impl Info {
|
|||
|
||||
// Actions
|
||||
|
||||
pub fn dialog(&self, parent: Option<&impl IsA<gtk::Widget>>) {
|
||||
use adw::{PreferencesDialog, prelude::AdwDialogExt};
|
||||
PreferencesDialog::info(self).present(parent)
|
||||
}
|
||||
|
||||
/// Mark `Self` as deprecated
|
||||
/// * tip: usually called on page handler begin
|
||||
pub fn deprecate(&mut self) {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,104 @@
|
|||
use super::Info;
|
||||
use adw::{
|
||||
ActionRow, PreferencesDialog, PreferencesGroup, PreferencesPage,
|
||||
prelude::{PreferencesDialogExt, PreferencesGroupExt, PreferencesPageExt},
|
||||
};
|
||||
|
||||
pub trait Dialog {
|
||||
fn info(info: &Info) -> Self;
|
||||
}
|
||||
|
||||
impl Dialog for PreferencesDialog {
|
||||
fn info(info: &Info) -> Self {
|
||||
let d = PreferencesDialog::builder()
|
||||
.search_enabled(true)
|
||||
.title("Page info")
|
||||
.build();
|
||||
|
||||
d.add(&{
|
||||
let p = PreferencesPage::builder()
|
||||
.title("General")
|
||||
.icon_name("help-about-symbolic")
|
||||
.build();
|
||||
if info.mime.is_some() {
|
||||
p.add(&{
|
||||
let g = PreferencesGroup::builder().title("Meta").build();
|
||||
if let Some(ref mime) = info.mime {
|
||||
g.add(&{
|
||||
let r = ActionRow::builder()
|
||||
.css_classes(["property"])
|
||||
.subtitle(mime)
|
||||
.title("Content type")
|
||||
.build();
|
||||
r
|
||||
})
|
||||
}
|
||||
g
|
||||
});
|
||||
} // @TODO content language, header size, etc.
|
||||
if info.size.is_some() {
|
||||
p.add(&{
|
||||
let g = PreferencesGroup::builder().title("Size").build();
|
||||
if let Some(ref size) = info.size {
|
||||
g.add(&{
|
||||
use crate::tool::Format;
|
||||
let r = ActionRow::builder()
|
||||
.css_classes(["property"])
|
||||
.subtitle(size.bytes())
|
||||
.title("Content")
|
||||
.build();
|
||||
r
|
||||
})
|
||||
}
|
||||
g
|
||||
});
|
||||
} // @TODO header size, total size, etc.
|
||||
p
|
||||
});
|
||||
if let Some(ref redirect) = info.redirect {
|
||||
d.add(&{
|
||||
PreferencesPage::builder()
|
||||
.title("Redirect")
|
||||
.icon_name("insert-link-symbolic")
|
||||
.build()
|
||||
});
|
||||
// @TODO recursive lookup
|
||||
}
|
||||
if !info.event.is_empty() {
|
||||
d.add(&{
|
||||
let p = PreferencesPage::builder()
|
||||
.title("Events")
|
||||
.icon_name("system-run-symbolic")
|
||||
.build();
|
||||
p.add(&{
|
||||
let g = PreferencesGroup::new();
|
||||
let e = &info.event[0];
|
||||
let t = e.time();
|
||||
let n = e.name();
|
||||
g.add(&{
|
||||
let r = ActionRow::builder()
|
||||
.subtitle(t.format_iso8601().unwrap())
|
||||
.title(n)
|
||||
.build();
|
||||
r
|
||||
});
|
||||
for e in &info.event[1..] {
|
||||
g.add(&{
|
||||
let r = ActionRow::builder()
|
||||
.subtitle(gtk::glib::gformat!(
|
||||
"{} ms",
|
||||
e.time().difference(t).as_milliseconds()
|
||||
))
|
||||
.title(e.name())
|
||||
.build();
|
||||
r
|
||||
})
|
||||
}
|
||||
g
|
||||
});
|
||||
p
|
||||
})
|
||||
}
|
||||
d
|
||||
}
|
||||
}
|
||||
|
|
@ -19,4 +19,14 @@ impl Event {
|
|||
time: DateTime::now_local().unwrap(),
|
||||
}
|
||||
}
|
||||
|
||||
// Getters
|
||||
|
||||
pub fn name(&self) -> &str {
|
||||
&self.name
|
||||
}
|
||||
|
||||
pub fn time(&self) -> &DateTime {
|
||||
&self.time
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue