From: Simon Tatham Date: Mon, 1 Jan 2024 13:12:01 +0000 (+0000) Subject: Support reading hashtag feeds. X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ian/git?a=commitdiff_plain;h=80031a39b9d6838ba0751e5b468f87a11cc4f17b;p=mastodonochrome.git Support reading hashtag feeds. No trouble at all given the existing infrastructure. --- diff --git a/src/activity_stack.rs b/src/activity_stack.rs index 604f3fa..fff8f47 100644 --- a/src/activity_stack.rs +++ b/src/activity_stack.rs @@ -5,6 +5,7 @@ pub enum NonUtilityActivity { PublicTimelineFile, LocalTimelineFile, SinglePost(String), + HashtagTimeline(String), } #[derive(PartialEq, Eq, Debug, Clone)] @@ -27,6 +28,7 @@ pub enum UtilityActivity { pub enum OverlayActivity { GetUserToExamine, GetPostIdToRead, + GetHashtagToRead, } #[derive(PartialEq, Eq, Debug, Clone)] diff --git a/src/editor.rs b/src/editor.rs index 1cf5261..8f5c9ed 100644 --- a/src/editor.rs +++ b/src/editor.rs @@ -618,3 +618,20 @@ pub fn get_post_id_to_read() -> Box { }) )) } + +pub fn get_hashtag_to_read() -> Box { + Box::new(BottomLineEditorOverlay::new( + ColouredString::plain("View feed for hashtag: "), + Box::new(move |s, _client| { + let s = s.trim(); + let s = s.strip_prefix("#").unwrap_or(s); + if s.is_empty() { + LogicalAction::PopOverlaySilent + } else { + LogicalAction::Goto( + NonUtilityActivity::HashtagTimeline(s.to_owned()) + .into()) + } + }) + )) +} diff --git a/src/file.rs b/src/file.rs index a0116af..1f244bb 100644 --- a/src/file.rs +++ b/src/file.rs @@ -623,6 +623,16 @@ pub fn ego_log(client: &mut Client) -> Ok(Box::new(file)) } +pub fn hashtag_timeline(client: &mut Client, tag: &str) -> + Result, ClientError> +{ + let title = ColouredString::uniform( + &format!("Posts mentioning hashtag #{tag}"), 'H'); + let file = File::::new( + client, FeedSource::new(FeedId::Hashtag(tag.to_owned())), title)?; + Ok(Box::new(file)) +} + struct ExamineUserFileType {} impl FileType for ExamineUserFileType { type Item = ExamineUserDisplay; diff --git a/src/menu.rs b/src/menu.rs index 1143a83..ba256d2 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -195,8 +195,8 @@ pub fn main_menu() -> Box { menu.add_action(Pr('L'), "Local public timeline (this server)", LogicalAction::Goto( NonUtilityActivity::LocalTimelineFile.into())); - menu.add_action(Pr('#'), "Timeline for a #hashtag", - LogicalAction::NYI); + menu.add_action(Pr('#'), "Timeline for a #hashtag", LogicalAction::Goto( + OverlayActivity::GetHashtagToRead.into())); menu.add_blank_line(); menu.add_action(Pr('I'), "View a post by its ID", LogicalAction::Goto( OverlayActivity::GetPostIdToRead.into())); diff --git a/src/tui.rs b/src/tui.rs index 1be8273..0cad060 100644 --- a/src/tui.rs +++ b/src/tui.rs @@ -437,6 +437,8 @@ fn new_activity_state(activity: Activity, client: &mut Client) -> public_timeline(client), Activity::NonUtil(NonUtilityActivity::LocalTimelineFile) => local_timeline(client), + Activity::NonUtil(NonUtilityActivity::HashtagTimeline(ref id)) => + hashtag_timeline(client, id), Activity::Util(UtilityActivity::ReadMentions) => mentions(client), Activity::Util(UtilityActivity::EgoLog) => @@ -445,6 +447,8 @@ fn new_activity_state(activity: Activity, client: &mut Client) -> Ok(get_user_to_examine()), Activity::Overlay(OverlayActivity::GetPostIdToRead) => Ok(get_post_id_to_read()), + Activity::Overlay(OverlayActivity::GetHashtagToRead) => + Ok(get_hashtag_to_read()), Activity::Util(UtilityActivity::ExamineUser(ref name)) => examine_user(client, name), Activity::NonUtil(NonUtilityActivity::SinglePost(ref id)) =>