From a9c461687559de8ba6bad2d869e4370104ed9dc4 Mon Sep 17 00:00:00 2001 From: yggverse Date: Fri, 14 Feb 2025 23:48:44 +0200 Subject: [PATCH] add new columns, remove `Clamp` wrapper, sort order by name ASC, implement text/gemini mime type detection by extension --- .../window/tab/item/page/content/directory.rs | 18 ++-- .../tab/item/page/content/directory/column.rs | 102 ++++++++++++++++++ 2 files changed, 112 insertions(+), 8 deletions(-) diff --git a/src/app/browser/window/tab/item/page/content/directory.rs b/src/app/browser/window/tab/item/page/content/directory.rs index 4234fd80..39b4542b 100644 --- a/src/app/browser/window/tab/item/page/content/directory.rs +++ b/src/app/browser/window/tab/item/page/content/directory.rs @@ -14,9 +14,10 @@ impl Directory { // Init children widget let column_view = { const ATTRIBUTES: &str = - "standard::display-name,standard::symbolic-icon,standard::size,standard::content-type"; + "standard::display-name,standard::symbolic-icon,standard::size,standard::content-type,standard::modification-date-time"; let column_view = gtk::ColumnView::builder() + // @TODO implement profile save .reorderable(true) // @TODO enable this option may cause core dumped errors // .single_click_activate(true) .model( @@ -32,7 +33,13 @@ impl Directory { .build(); column_view.append_column(&Column::icon()); - column_view.append_column(&Column::name()); + let name = Column::name(); + column_view.append_column(&name); + column_view.append_column(&Column::size()); + column_view.append_column(&Column::content_type()); + //column_view.append_column(&Column::modification_date_time()); + + column_view.sort_by_column(Some(&name), gtk::SortType::Ascending); column_view }; @@ -55,12 +62,7 @@ impl Directory { // Build main widget ScrolledWindow::builder() - .child( - &adw::Clamp::builder() - .child(&column_view) - .css_classes(["view"]) - .build(), - ) + .child(&column_view) .vexpand(true) .build() } diff --git a/src/app/browser/window/tab/item/page/content/directory/column.rs b/src/app/browser/window/tab/item/page/content/directory/column.rs index bb9710c4..025b4d43 100644 --- a/src/app/browser/window/tab/item/page/content/directory/column.rs +++ b/src/app/browser/window/tab/item/page/content/directory/column.rs @@ -1,6 +1,11 @@ +const DEFAULT: &str = "-"; + pub trait Column { fn icon() -> Self; fn name() -> Self; + fn size() -> Self; + fn content_type() -> Self; + fn modification_date_time() -> Self; } impl Column for gtk::ColumnViewColumn { @@ -87,4 +92,101 @@ impl Column for gtk::ColumnViewColumn { }) .build() } + + fn size() -> Self { + gtk::ColumnViewColumn::builder() + .expand(true) + .title("Size") + .factory(&{ + let factory = gtk::SignalListItemFactory::new(); + factory.connect_bind(|_, this| { + use crate::tool::Format; + use gtk::prelude::{Cast, ListItemExt}; + let list_item = this.downcast_ref::().unwrap(); + let item = list_item.item().unwrap(); + let file_info = item.downcast_ref::().unwrap(); + list_item.set_child(Some( + >k::Label::builder() + .halign(gtk::Align::Start) + .ellipsize(gtk::pango::EllipsizeMode::Middle) + .label((file_info.size() as usize).bytes()) + .build(), + )); + }); + factory + }) + .build() + } + + fn content_type() -> Self { + gtk::ColumnViewColumn::builder() + .expand(true) + .title("Content Type") + .factory(&{ + let factory = gtk::SignalListItemFactory::new(); + factory.connect_bind(|_, this| { + use gtk::prelude::{Cast, ListItemExt}; + let list_item = this.downcast_ref::().unwrap(); + let item = list_item.item().unwrap(); + let file_info = item.downcast_ref::().unwrap(); + let content_type: gtk::glib::GString = match file_info.content_type() { + Some(content_type) => { + let display_name = file_info.display_name(); + if content_type == "text/plain" { + if display_name.ends_with(".gmi") + || display_name.ends_with(".gemini") + { + "text/gemini".into() + } else { + content_type + } + } else { + content_type + } + } + None => DEFAULT.into(), + } + .into(); + list_item.set_child(Some( + >k::Label::builder() + .halign(gtk::Align::Start) + .ellipsize(gtk::pango::EllipsizeMode::Middle) + .label(content_type) + .build(), + )); + }); + factory + }) + .build() + } + + fn modification_date_time() -> Self { + gtk::ColumnViewColumn::builder() + .expand(true) + .title("Modified") + .factory(&{ + let factory = gtk::SignalListItemFactory::new(); + factory.connect_bind(|_, this| { + use gtk::prelude::{Cast, ListItemExt}; + let list_item = this.downcast_ref::().unwrap(); + let item = list_item.item().unwrap(); + let file_info = item.downcast_ref::().unwrap(); + list_item.set_child(Some( + >k::Label::builder() + .halign(gtk::Align::Start) + .ellipsize(gtk::pango::EllipsizeMode::Middle) + .label( + file_info + .modification_date_time() + .unwrap() + .format_iso8601() + .unwrap_or(DEFAULT.into()), + ) + .build(), + )); + }); + factory + }) + .build() + } }