feat: add persistent pull request sort and filter menus

This commit is contained in:
Valdemar Lorenzen
2026-10-21 13:30:38 +02:00
parent 37b47ebc8a
commit fbcb519e13
22 changed files with 1557 additions and 181 deletions
+49 -1
View File
@@ -2286,6 +2286,9 @@ pub struct Editor {
diff_display_options: (ViewMode, SplitAxis),
pub(crate) pull_request_review_requested_symbol: String,
pub(crate) pull_request_approved_symbol: String,
pub(crate) pull_request_preferences: crate::pull_requests::Preferences,
pub(crate) pull_request_preferences_changed: bool,
pub(crate) pull_request_configured: [bool; 2],
next_diff_request: u64,
outstanding_diff_request: Option<u64>,
pending_lsp_navigation: Option<PendingLspNavigation>,
@@ -2428,6 +2431,9 @@ impl Editor {
diff_display_options: (ViewMode::Split, SplitAxis::Vertical),
pull_request_review_requested_symbol: "🙏".into(),
pull_request_approved_symbol: "👍".into(),
pull_request_preferences: Default::default(),
pull_request_preferences_changed: false,
pull_request_configured: [false; 2],
next_diff_request: 0,
outstanding_diff_request: None,
pending_lsp_navigation: None,
@@ -5318,6 +5324,46 @@ impl Editor {
let phase = self.picker_diff().expect("active diff").phase;
let files_focused =
phase == Phase::View && self.picker_diff().unwrap().focus == Focus::Files;
if phase != Phase::View
&& self.picker_diff().unwrap().pull_request_remote.is_some()
&& (self.picker_diff().unwrap().pull_request_menu.is_some()
|| matches!(input, Input::Ctrl('s' | 'f')))
{
if !matches!(
input,
Input::Char('0'..='9' | ' ')
| Input::Ctrl('s' | 'f')
| Input::Escape
| Input::Enter
| Input::Left
| Input::Right
) && BackspaceKind::from_input(&input).is_none()
&& self.handle_selection_binding(&input)
{
return None;
}
let diff = self.picker_diff_mut().unwrap();
diff.handle(input);
if std::mem::take(&mut diff.pull_request_preferences_changed) {
let preferences = diff.pull_request_preferences.clone();
self.pull_request_preferences = preferences.clone();
self.pull_request_preferences_changed = true;
for diff in self
.diff
.iter_mut()
.chain(self.parked_diff.iter_mut())
.chain(
self.tabs
.values_mut()
.flat_map(|tab| tab.diff.iter_mut().chain(tab.parked_diff.iter_mut())),
)
.filter(|diff| diff.pull_request_remote.is_some())
{
diff.set_pull_request_preferences(preferences.clone());
}
}
return None;
}
if phase != Phase::View && input == Input::Escape {
return self.execute_action(Action::DiffClose.entry(), "");
}
@@ -10172,7 +10218,9 @@ impl Editor {
if args.split_whitespace().count() > 1 {
self.set_message("Usage: pull_requests [remote]");
} else {
self.open_diff(DiffState::pull_requests(args.into()));
let mut diff = DiffState::pull_requests(args.into());
diff.set_pull_request_preferences(self.pull_request_preferences.clone());
self.open_diff(diff);
}
} else if args.is_empty() {
self.open_diff(DiffState::new());