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 5d174c64..4234fd80 100644 --- a/src/app/browser/window/tab/item/page/content/directory.rs +++ b/src/app/browser/window/tab/item/page/content/directory.rs @@ -1,3 +1,5 @@ +mod column; + use gtk::{gio::File, ScrolledWindow}; pub struct Directory; @@ -6,7 +8,8 @@ impl Directory { // Constructors pub fn for_file(file: &File, callback: impl Fn(&File) + 'static) -> ScrolledWindow { - use gtk::{gio::FileInfo, Align, ListItem}; + use column::Column; + use gtk::gio::FileInfo; // Init children widget let column_view = { @@ -28,86 +31,8 @@ impl Directory { ) .build(); - column_view.append_column( - >k::ColumnViewColumn::builder() - .title("Type") - .factory(&{ - use gtk::prelude::{BoxExt, Cast, ListItemExt, WidgetExt}; - let factory = gtk::SignalListItemFactory::new(); - factory.connect_bind(|_, this| { - use gtk::gio::FileType; - let list_item = this.downcast_ref::().unwrap(); - let image = gtk::Image::from_gicon( - &list_item - .item() - .unwrap() - .downcast_ref::() - .unwrap() - .symbolic_icon() - .unwrap(), - ); - image.set_tooltip_text( - match list_item - .item() - .unwrap() - .downcast_ref::() - .unwrap() - .file_type() - { - FileType::Unknown => Some("Unknown"), - FileType::Regular => Some("File"), - FileType::Directory => Some("Directory"), - FileType::SymbolicLink => Some("SymbolicLink"), - FileType::Special => Some("Special"), - FileType::Shortcut => Some("Shortcut"), - FileType::Mountable => Some("Mountable"), - _ => None, - }, - ); - let container = gtk::Box::builder().halign(Align::Center).build(); // prevents `gtk::Image` blur - container.append(&image); - list_item.set_child(Some(&container)); - }); - factory - }) - .build(), - ); - - column_view.append_column( - >k::ColumnViewColumn::builder() - .expand(true) - .title("Name") - .factory(&{ - let factory = gtk::SignalListItemFactory::new(); - factory.connect_bind(|_, this| { - use gtk::prelude::{Cast, /*FileExt,*/ 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(Align::Start) - .ellipsize(gtk::pango::EllipsizeMode::Middle) - .label(file_info.display_name()) - /*.tooltip_text( - file_info - .attribute_object("standard::file") - .unwrap() - .downcast_ref::() - .unwrap() - .path() - .unwrap() - .to_str() - .unwrap(), - ) this feature maybe is not really wanted */ - .build(), - )); - }); - factory - }) - .build(), - ); - + column_view.append_column(&Column::icon()); + column_view.append_column(&Column::name()); column_view }; 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 new file mode 100644 index 00000000..bb9710c4 --- /dev/null +++ b/src/app/browser/window/tab/item/page/content/directory/column.rs @@ -0,0 +1,90 @@ +pub trait Column { + fn icon() -> Self; + fn name() -> Self; +} + +impl Column for gtk::ColumnViewColumn { + fn icon() -> Self { + use gtk::{ + gio::{FileInfo, FileType}, + prelude::{BoxExt, Cast, ListItemExt, WidgetExt}, + Align, ColumnViewColumn, ListItem, SignalListItemFactory, + }; + + ColumnViewColumn::builder() + .title("Type") + .factory(&{ + let factory = SignalListItemFactory::new(); + factory.connect_bind(|_, this| { + let list_item = this.downcast_ref::().unwrap(); + let image = gtk::Image::from_gicon( + &list_item + .item() + .unwrap() + .downcast_ref::() + .unwrap() + .symbolic_icon() + .unwrap(), + ); + image.set_tooltip_text( + match list_item + .item() + .unwrap() + .downcast_ref::() + .unwrap() + .file_type() + { + FileType::Unknown => Some("Unknown"), + FileType::Regular => Some("File"), + FileType::Directory => Some("Directory"), + FileType::SymbolicLink => Some("SymbolicLink"), + FileType::Special => Some("Special"), + FileType::Shortcut => Some("Shortcut"), + FileType::Mountable => Some("Mountable"), + _ => None, + }, + ); + let container = gtk::Box::builder().halign(Align::Center).build(); // prevents `gtk::Image` blur + container.append(&image); + list_item.set_child(Some(&container)); + }); + factory + }) + .build() + } + + fn name() -> Self { + gtk::ColumnViewColumn::builder() + .expand(true) + .title("Name") + .factory(&{ + let factory = gtk::SignalListItemFactory::new(); + factory.connect_bind(|_, this| { + use gtk::prelude::{Cast, /*FileExt,*/ 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.display_name()) + /*.tooltip_text( + file_info + .attribute_object("standard::file") + .unwrap() + .downcast_ref::() + .unwrap() + .path() + .unwrap() + .to_str() + .unwrap(), + ) this feature maybe is not really wanted */ + .build(), + )); + }); + factory + }) + .build() + } +}