From 1a0b31e6954970bd92f1082cb408006b5549f16b Mon Sep 17 00:00:00 2001 From: yggverse Date: Sun, 12 Jan 2025 13:58:22 +0200 Subject: [PATCH] store entire closed tab item to restore all features --- src/app.rs | 2 +- src/app/browser.rs | 2 +- src/app/browser/window.rs | 2 +- src/app/browser/window/header/bar/menu.rs | 9 +++--- src/app/browser/window/tab.rs | 13 +++++---- src/profile/history/memory/closed.rs | 34 ++++++++++++++--------- 6 files changed, 36 insertions(+), 26 deletions(-) diff --git a/src/app.rs b/src/app.rs index de3a1f85..05a9ec94 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,4 +1,4 @@ -mod browser; +pub mod browser; mod database; use browser::Browser; diff --git a/src/app/browser.rs b/src/app/browser.rs index 5e5c4ff1..978e671d 100644 --- a/src/app/browser.rs +++ b/src/app/browser.rs @@ -2,7 +2,7 @@ mod about; mod action; mod database; mod widget; -mod window; +pub mod window; use about::About; use action::Action; diff --git a/src/app/browser/window.rs b/src/app/browser/window.rs index 488ee2e5..d5f20d85 100644 --- a/src/app/browser/window.rs +++ b/src/app/browser/window.rs @@ -1,7 +1,7 @@ mod action; mod database; mod header; -mod tab; +pub mod tab; mod widget; use action::{Action, Position}; diff --git a/src/app/browser/window/header/bar/menu.rs b/src/app/browser/window/header/bar/menu.rs index 7254d304..1dd15785 100644 --- a/src/app/browser/window/header/bar/menu.rs +++ b/src/app/browser/window/header/bar/menu.rs @@ -1,7 +1,7 @@ use super::{BrowserAction, Profile, WindowAction}; use gtk::{ gio::{self}, - prelude::{ActionExt, ToVariant}, + prelude::{ActionExt, EditableExt, ToVariant}, Align, MenuButton, }; use std::rc::Rc; @@ -206,13 +206,14 @@ impl Menu { // History main_history_closed.remove_all(); - for request in profile.history.memory.closed.recent(RECENTLY_CLOSED) { - let menu_item = gio::MenuItem::new(Some(&label(&request, LABEL_MAX_LENGTH)), None); + for item in profile.history.memory.closed.recent(RECENTLY_CLOSED) { + let item_request = item.page.navigation.request.widget.entry.text(); // @TODO restore entire `Item` + let menu_item = gio::MenuItem::new(Some(&label(&item_request, LABEL_MAX_LENGTH)), None); menu_item.set_action_and_target_value(Some(&format!( "{}.{}", window_action.id, window_action.open.simple_action.name() - )), Some(&request.to_variant())); + )), Some(&item_request.to_variant())); main_history_closed.append_item(&menu_item); } diff --git a/src/app/browser/window/tab.rs b/src/app/browser/window/tab.rs index a930c730..079a9a4a 100644 --- a/src/app/browser/window/tab.rs +++ b/src/app/browser/window/tab.rs @@ -5,7 +5,7 @@ mod menu; mod widget; use error::Error; -use item::Item; +pub use item::Item; use menu::Menu; use widget::Widget; @@ -16,7 +16,7 @@ use crate::app::browser::{ use crate::Profile; use gtk::{ glib::{DateTime, GString, Propagation}, - prelude::{EditableExt, WidgetExt}, + prelude::WidgetExt, }; use sqlite::Transaction; use std::{cell::RefCell, collections::HashMap, rc::Rc}; @@ -104,10 +104,11 @@ impl Tab { if let Some(item) = index.borrow_mut().remove(&id) { // Add history record into profile memory pool // * this action allows to recover recently closed tab (e.g. from the main menu) - profile.history.memory.closed.add( - item.page.navigation.request.widget.entry.text(), - DateTime::now_local().unwrap().to_unix(), - ); + profile + .history + .memory + .closed + .add(item, DateTime::now_local().unwrap().to_unix()); } } None => panic!("Undefined tab index!"), diff --git a/src/profile/history/memory/closed.rs b/src/profile/history/memory/closed.rs index 68f96603..c25e5f3f 100644 --- a/src/profile/history/memory/closed.rs +++ b/src/profile/history/memory/closed.rs @@ -1,10 +1,15 @@ -use gtk::glib::GString; +use crate::app::browser::window::tab::Item; use itertools::Itertools; -use std::{cell::RefCell, collections::HashMap}; +use std::{cell::RefCell, rc::Rc}; -/// Reduce disk usage by cache Bookmarks index in memory +pub struct Record { + pub item: Rc, + pub unix_timestamp: i64, +} + +/// Recently closed tabs index pub struct Closed { - index: RefCell>, + index: RefCell>, } impl Default for Closed { @@ -19,7 +24,7 @@ impl Closed { /// Create new `Self` pub fn new() -> Self { Self { - index: RefCell::new(HashMap::new()), + index: RefCell::new(Vec::new()), } } @@ -27,21 +32,24 @@ impl Closed { /// Add new record /// * replace with new one if the record already exist - pub fn add(&self, request: GString, unix_timestamp: i64) { - self.index.borrow_mut().insert(request, unix_timestamp); + pub fn add(&self, item: Rc, unix_timestamp: i64) { + self.index.borrow_mut().push(Record { + item, + unix_timestamp, + }); } - /// Get recent requests vector sorted by `ID` DESC - pub fn recent(&self, limit: usize) -> Vec { - let mut recent: Vec = Vec::new(); - for (request, _) in self + /// Get recent `Item` vector sorted by time DESC + pub fn recent(&self, limit: usize) -> Vec> { + let mut recent: Vec> = Vec::new(); + for record in self .index .borrow() .iter() - .sorted_by(|a, b| Ord::cmp(&b.1, &a.1)) + .sorted_by(|a, b| Ord::cmp(&b.unix_timestamp, &a.unix_timestamp)) .take(limit) { - recent.push(request.clone()) + recent.push(record.item.clone()) } recent }