struct FeedFileContents {
id: FeedId,
+ header: FileHeader,
origin: isize,
items: Vec<Box<dyn TextFragment>>,
}
}
}
+ 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")
(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]
+ }
}
}
}
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(),
};
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();
}
remaining -= this;
line -= this;
if line == 0 {
- if item <= self.contents.origin {
+ if item <= self.contents.first_index() {
break;
}
item -= 1;
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 {
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))
}