From 1c6e6765576a21d2c813993f31d38c039212edb3 Mon Sep 17 00:00:00 2001 From: yggverse Date: Sat, 15 Feb 2025 00:47:45 +0200 Subject: [PATCH] implement `on_ready` callback --- .../tab/item/client/driver/file/directory.rs | 39 ++++++++++++------- .../browser/window/tab/item/page/content.rs | 6 ++- .../window/tab/item/page/content/directory.rs | 32 +++++++++------ 3 files changed, 52 insertions(+), 25 deletions(-) diff --git a/src/app/browser/window/tab/item/client/driver/file/directory.rs b/src/app/browser/window/tab/item/client/driver/file/directory.rs index 693cba5c..741463b9 100644 --- a/src/app/browser/window/tab/item/client/driver/file/directory.rs +++ b/src/app/browser/window/tab/item/client/driver/file/directory.rs @@ -7,20 +7,33 @@ pub struct Directory { impl Directory { pub fn handle(&self, page: &Rc) { - page.content.to_directory(&self.file, { - let page = page.clone(); - move |file| { - page.item_action.load.activate( - Some(&format!( - "file://{}", - file.path().unwrap().to_str().unwrap() - )), - true, - ) - } - }); + page.content.to_directory( + &self.file, + ( + // on ready + { + let page = page.clone(); + move || { + page.set_progress(0.0); + } + }, + // on activate + { + let page = page.clone(); + move |file| { + page.item_action.load.activate( + Some(&format!( + "file://{}", + file.path().unwrap().to_str().unwrap() + )), + true, + ) + } + }, + ), + ); page.set_title(&self.file.parse_name()); - page.set_progress(0.0); + page.window_action.find.simple_action.set_enabled(false); } } diff --git a/src/app/browser/window/tab/item/page/content.rs b/src/app/browser/window/tab/item/page/content.rs index 97e615d9..7e4067b2 100644 --- a/src/app/browser/window/tab/item/page/content.rs +++ b/src/app/browser/window/tab/item/page/content.rs @@ -131,7 +131,11 @@ impl Content { text } - pub fn to_directory(&self, file: &File, callback: impl Fn(&File) + 'static) { + pub fn to_directory( + &self, + file: &File, + callback: (impl Fn() + 'static, impl Fn(&File) + 'static), + ) { self.clean(); self.g_box.append(&Directory::for_file(file, callback)) } 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 483add5e..56f3c23b 100644 --- a/src/app/browser/window/tab/item/page/content/directory.rs +++ b/src/app/browser/window/tab/item/page/content/directory.rs @@ -7,27 +7,31 @@ pub struct Directory; // @TODO save settings impl Directory { // Constructors - pub fn for_file(file: &File, callback: impl Fn(&File) + 'static) -> ScrolledWindow { + pub fn for_file( + file: &File, + (on_ready, on_activate): (impl Fn() + 'static, impl Fn(&File) + 'static), + ) -> ScrolledWindow { use column::Column; use gtk::gio::FileInfo; + // Init model + const ATTRIBUTES: &str = + "standard::display-name,standard::symbolic-icon,standard::size,standard::content-type,standard::modification-date-time"; + + let directory_list = gtk::DirectoryList::builder() + .file(file) + .attributes(ATTRIBUTES) + .build(); + // Init children widget let column_view = { - const ATTRIBUTES: &str = - "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( >k::SingleSelection::builder() - .model( - >k::DirectoryList::builder() - .file(file) - .attributes(ATTRIBUTES) - .build(), - ) + .model(&directory_list) .build(), ) .build(); @@ -49,9 +53,15 @@ impl Directory { }; // Connect events + directory_list.connect_loading_notify(move |this| { + if !this.is_loading() { + on_ready() + } + }); + column_view.connect_activate(move |this, i| { use gtk::prelude::{Cast, ListModelExt}; - callback( + on_activate( this.model() .unwrap() .item(i)