store entire closed tab item to restore all features

This commit is contained in:
yggverse 2025-01-12 13:58:22 +02:00
parent 27ee3e8fe9
commit 1a0b31e695
6 changed files with 36 additions and 26 deletions

View File

@ -1,4 +1,4 @@
mod browser;
pub mod browser;
mod database;
use browser::Browser;

View File

@ -2,7 +2,7 @@ mod about;
mod action;
mod database;
mod widget;
mod window;
pub mod window;
use about::About;
use action::Action;

View File

@ -1,7 +1,7 @@
mod action;
mod database;
mod header;
mod tab;
pub mod tab;
mod widget;
use action::{Action, Position};

View File

@ -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);
}

View File

@ -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!"),

View File

@ -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<Item>,
pub unix_timestamp: i64,
}
/// Recently closed tabs index
pub struct Closed {
index: RefCell<HashMap<GString, i64>>,
index: RefCell<Vec<Record>>,
}
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<Item>, 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<GString> {
let mut recent: Vec<GString> = Vec::new();
for (request, _) in self
/// Get recent `Item` vector sorted by time DESC
pub fn recent(&self, limit: usize) -> Vec<Rc<Item>> {
let mut recent: Vec<Rc<Item>> = 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
}