From a5792de93853a7ced8889675f748fff62b3cb3ed Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Fri, 29 Dec 2023 18:31:50 +0000 Subject: [PATCH] Add a file header! --- src/file.rs | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/file.rs b/src/file.rs index 0e58edb..6b5db17 100644 --- a/src/file.rs +++ b/src/file.rs @@ -17,6 +17,7 @@ enum FilePosition { struct FeedFileContents { id: FeedId, + header: FileHeader, origin: isize, items: Vec>, } @@ -40,6 +41,7 @@ impl FeedFileContents { } } + fn first_index(&self) -> isize { self.origin - 1 } fn index_limit(&self) -> isize { self.origin.checked_add_unsigned(self.items.len()) .expect("Out-of-range index") @@ -51,9 +53,13 @@ impl FeedFileContents { (index - self.origin) as usize } - fn get(&self, index: isize) -> &Box { - let index = self.phys_index(index); - &self.items[index] + fn get(&self, index: isize) -> &dyn TextFragment { + if index == self.origin - 1 { + &self.header + } else { + let index = self.phys_index(index); + &*self.items[index] + } } } @@ -65,11 +71,14 @@ struct FeedFile { } impl FeedFile { - fn new(id: FeedId, client: &mut Client) -> Result { + fn new(client: &mut Client, id: FeedId, desc: ColouredString) -> + Result + { client.fetch_feed(&id, FeedExtend::Initial)?; let mut contents = FeedFileContents { id: id, + header: FileHeader::new(desc), origin: 0, items: Vec::new(), }; @@ -114,7 +123,7 @@ impl FeedFile { let mut item = item; let mut lines_rendered = line; - while item > self.contents.origin && lines_rendered + 1 < h { + while item > self.contents.first_index() && lines_rendered + 1 < h { item -= 1; lines_rendered += self.ensure_item_rendered(item, w).len(); } @@ -160,7 +169,7 @@ impl FeedFile { remaining -= this; line -= this; if line == 0 { - if item <= self.contents.origin { + if item <= self.contents.first_index() { break; } item -= 1; @@ -230,7 +239,9 @@ impl ActivityState for FeedFile { let mut at_bottom = item == self.contents.last_index(); // Retrieve rendered lines from the bottom of the window upwards - 'outer: while item >= self.contents.origin && lines.len() + 1 < h { + 'outer: while item >= self.contents.first_index() && + lines.len() + 1 < h + { let rendered = self.rendered.get(&item) .expect("unrendered item reached draw()"); let line_limit = if item == start_item { @@ -314,6 +325,8 @@ impl ActivityState for FeedFile { pub fn home_timeline(client: &mut Client) -> Result, ClientError> { - let file = FeedFile::new(FeedId::Home, client)?; + let file = FeedFile::new(client, FeedId::Home, ColouredString::general( + "Home timeline ", + "HHHHHHHHHHHHHHHHHKH"))?; Ok(Box::new(file)) } -- 2.30.2