diff --git a/src/app.rs b/src/app.rs index 9363539..8b6e285 100644 --- a/src/app.rs +++ b/src/app.rs @@ -559,14 +559,21 @@ impl ApplicationInner { let application = obj.upcast_ref::(); let menu_bar = gio::Menu::new(); - // [ref:TODO] show recent projects when opened without a project // [ref:TODO] update the menu when we open a new project // Get gtk's default manager or create new let recent_mgr = gtk::RecentManager::default().unwrap_or_default(); let mut items = recent_mgr .items() .into_iter() - .filter(|i| i.last_application().map(|a| a == "gerb").unwrap_or(false)) + .filter(|i| { + i.last_application().map(|a| a == "gerb").unwrap_or(false) + && i.mime_type() + .map(|a| a == "inode/directory") + .unwrap_or(false) + && i.uri_display() + .map(|a| Path::new(&a).exists()) + .unwrap_or(false) + }) .collect::>(); items.sort_by_key(|i| -i.modified()); diff --git a/src/themes/custom-widgets.css b/src/themes/custom-widgets.css index d79f0e1..afc1954 100644 --- a/src/themes/custom-widgets.css +++ b/src/themes/custom-widgets.css @@ -62,3 +62,7 @@ border: 0.1rem ridge; border-radius: 5px; border: .05rem ridge; } + +menu separator { + min-height:2rem; +} diff --git a/src/window.rs b/src/window.rs index 677f73b..d2e3402 100644 --- a/src/window.rs +++ b/src/window.rs @@ -72,20 +72,72 @@ impl ObjectImpl for WindowInner { self.welcome_banner.set_valign(gtk::Align::Center); self.welcome_banner .set_orientation(gtk::Orientation::Vertical); - self.welcome_banner - .pack_start(&welcome_label, true, false, 5); - let add_glyph_btn = gtk::Button::builder() + let new_project_btn = gtk::Button::builder() .relief(gtk::ReliefStyle::None) - .label("Start…") + .label("New") .halign(gtk::Align::Center) .visible(true) .build(); - add_glyph_btn.set_action_name(Some("app.project.new")); + new_project_btn.set_action_name(Some("app.project.new")); + let recent_mgr = gtk::RecentManager::default().unwrap_or_default(); + let mut items = recent_mgr + .items() + .into_iter() + .filter(|i| { + i.last_application().map(|a| a == "gerb").unwrap_or(false) + && i.mime_type() + .map(|a| a == "inode/directory") + .unwrap_or(false) + && i.uri_display() + .map(|a| Path::new(&a).exists()) + .unwrap_or(false) + }) + .collect::>(); + if !items.is_empty() { + items.sort_by_key(|i| -i.modified()); + let recent_box = gtk::ListBox::builder() + .expand(false) + .visible(true) + .can_focus(true) + .sensitive(true) + .halign(gtk::Align::Center) + .selection_mode(gtk::SelectionMode::Browse) + .build(); + for (uri, name) in items + .into_iter() + .filter_map(|i| Some((i.uri_display()?, i.short_name()?))) + .take(10) + { + let label = gtk::Label::new(Some(&name)); + label.set_visible(true); + label.set_tooltip_text(Some(&uri)); + label.set_sensitive(true); + label.set_halign(gtk::Align::Start); + label.set_ellipsize(gtk::pango::EllipsizeMode::End); + label.set_single_line_mode(true); + let wrapper = gtk::EventBox::new(); + wrapper.add(&label); + wrapper.connect_button_press_event( + clone!(@weak obj => @default-return Inhibit(false), move |_, _| { + obj.emit_by_name::<()>("open-project", &[&uri]); + Inhibit(true) + }), + ); + recent_box.add(&wrapper); + } + let label = gtk::Label::new(Some("Recently opened:")); + label.set_visible(true); + label.set_sensitive(false); + label.set_halign(gtk::Align::Center); + self.welcome_banner.pack_end(&recent_box, false, false, 5); + self.welcome_banner.pack_end(&label, false, false, 5); + } self.welcome_banner - .pack_end(&add_glyph_btn, false, false, 5); - + .pack_end(&new_project_btn, false, false, 5); + self.welcome_banner.pack_end(&welcome_label, true, false, 5); self.root_box .pack_start(&self.welcome_banner, false, false, 0); + self.root_box.set_expand(true); self.root_box.set_spacing(0); self.root_box.set_visible(true); @@ -110,7 +162,7 @@ impl ObjectImpl for WindowInner { .build(); } } - self.root_box.pack_start(&self.statusbar, false, false, 0); + self.root_box.pack_end(&self.statusbar, false, false, 0); obj.set_child(Some(&self.root_box)); obj.set_titlebar(Some(&self.headerbar));