chiark / gitweb /
Add a file header!
authorSimon Tatham <anakin@pobox.com>
Fri, 29 Dec 2023 18:31:50 +0000 (18:31 +0000)
committerSimon Tatham <anakin@pobox.com>
Fri, 29 Dec 2023 18:31:50 +0000 (18:31 +0000)
src/file.rs

index 0e58edb90178fecb294b583c8f71e8f18372151a..6b5db17caddf2303f362693498e4e035d9704ed3 100644 (file)
@@ -17,6 +17,7 @@ enum FilePosition {
 
 struct FeedFileContents {
     id: FeedId,
+    header: FileHeader,
     origin: isize,
     items: Vec<Box<dyn TextFragment>>,
 }
@@ -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<dyn TextFragment> {
-        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<Self, ClientError> {
+    fn new(client: &mut Client, id: FeedId, desc: ColouredString) ->
+        Result<Self, ClientError>
+    {
         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<Box<dyn ActivityState>, ClientError>
 {
-    let file = FeedFile::new(FeedId::Home, client)?;
+    let file = FeedFile::new(client, FeedId::Home, ColouredString::general(
+        "Home timeline   <H>",
+        "HHHHHHHHHHHHHHHHHKH"))?;
     Ok(Box::new(file))
 }