mirror of
https://seed.radicle.dev/rad:z39mP9rQAaGmERfUMPULfPUi473tY.git
synced 2026-11-03 18:30:41 +08:00
patch-select: Add support for more operations
This commit is contained in:
@@ -66,8 +66,12 @@ pub enum Subject {
|
||||
#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
|
||||
pub enum PatchOperation {
|
||||
Show,
|
||||
Edit,
|
||||
Update,
|
||||
Checkout,
|
||||
Review,
|
||||
Delete,
|
||||
Edit,
|
||||
Comment,
|
||||
}
|
||||
|
||||
impl Display for PatchOperation {
|
||||
@@ -76,12 +80,24 @@ impl Display for PatchOperation {
|
||||
PatchOperation::Show => {
|
||||
write!(f, "show")
|
||||
}
|
||||
PatchOperation::Edit => {
|
||||
write!(f, "edit")
|
||||
PatchOperation::Update => {
|
||||
write!(f, "update")
|
||||
}
|
||||
PatchOperation::Checkout => {
|
||||
write!(f, "checkout")
|
||||
}
|
||||
PatchOperation::Review => {
|
||||
write!(f, "review")
|
||||
}
|
||||
PatchOperation::Delete => {
|
||||
write!(f, "delete")
|
||||
}
|
||||
PatchOperation::Edit => {
|
||||
write!(f, "edit")
|
||||
}
|
||||
PatchOperation::Comment => {
|
||||
write!(f, "comment")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -94,6 +110,12 @@ pub struct Output {
|
||||
id: PatchId,
|
||||
}
|
||||
|
||||
impl Output {
|
||||
pub fn new(operation: Option<PatchOperation>, id: PatchId) -> Self {
|
||||
Self { operation, id }
|
||||
}
|
||||
}
|
||||
|
||||
impl Display for Output {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
match &self.operation {
|
||||
|
||||
@@ -32,6 +32,17 @@ impl tuirealm::Component<Message, NoUserEvent> for Widget<GlobalListener> {
|
||||
|
||||
impl tuirealm::Component<Message, NoUserEvent> for Widget<IdSelect> {
|
||||
fn on(&mut self, event: Event<NoUserEvent>) -> Option<Message> {
|
||||
let mut submit = || -> Option<radicle::cob::patch::PatchId> {
|
||||
let result = self.perform(Cmd::Submit);
|
||||
match result {
|
||||
CmdResult::Submit(State::One(StateValue::Usize(selected))) => {
|
||||
let item = self.items().get(selected)?;
|
||||
Some(item.id().to_owned())
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
};
|
||||
|
||||
match event {
|
||||
Event::Keyboard(KeyEvent { code: Key::Up, .. })
|
||||
| Event::Keyboard(KeyEvent {
|
||||
@@ -53,20 +64,10 @@ impl tuirealm::Component<Message, NoUserEvent> for Widget<IdSelect> {
|
||||
}
|
||||
Event::Keyboard(KeyEvent {
|
||||
code: Key::Enter, ..
|
||||
}) => {
|
||||
let result = self.perform(Cmd::Submit);
|
||||
match result {
|
||||
CmdResult::Submit(State::One(StateValue::Usize(selected))) => {
|
||||
let item = self.items().get(selected)?;
|
||||
let output = Output {
|
||||
operation: None,
|
||||
id: PatchId::from(item.id().to_owned()),
|
||||
};
|
||||
Some(Message::Quit(Some(output)))
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
}) => submit().map(|id| {
|
||||
let output = Output::new(None, PatchId::from(id));
|
||||
Message::Quit(Some(output))
|
||||
}),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
@@ -74,6 +75,17 @@ impl tuirealm::Component<Message, NoUserEvent> for Widget<IdSelect> {
|
||||
|
||||
impl tuirealm::Component<Message, NoUserEvent> for Widget<OperationSelect> {
|
||||
fn on(&mut self, event: Event<NoUserEvent>) -> Option<Message> {
|
||||
let mut submit = || -> Option<radicle::cob::patch::PatchId> {
|
||||
let result = self.perform(Cmd::Submit);
|
||||
match result {
|
||||
CmdResult::Submit(State::One(StateValue::Usize(selected))) => {
|
||||
let item = self.items().get(selected)?;
|
||||
Some(item.id().to_owned())
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
};
|
||||
|
||||
match event {
|
||||
Event::Keyboard(KeyEvent { code: Key::Up, .. })
|
||||
| Event::Keyboard(KeyEvent {
|
||||
@@ -95,54 +107,45 @@ impl tuirealm::Component<Message, NoUserEvent> for Widget<OperationSelect> {
|
||||
}
|
||||
Event::Keyboard(KeyEvent {
|
||||
code: Key::Enter, ..
|
||||
}) => {
|
||||
let result = self.perform(Cmd::Submit);
|
||||
match result {
|
||||
CmdResult::Submit(State::One(StateValue::Usize(selected))) => {
|
||||
let item = self.items().get(selected)?;
|
||||
let output = Output {
|
||||
operation: Some(PatchOperation::Show),
|
||||
id: PatchId::from(item.id().to_owned()),
|
||||
};
|
||||
Some(Message::Quit(Some(output)))
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
}) => submit().map(|id| {
|
||||
let output = Output::new(Some(PatchOperation::Show), PatchId::from(id));
|
||||
Message::Quit(Some(output))
|
||||
}),
|
||||
Event::Keyboard(KeyEvent {
|
||||
code: Key::Char('e'),
|
||||
code: Key::Char('u'),
|
||||
..
|
||||
}) => {
|
||||
let result = self.perform(Cmd::Submit);
|
||||
match result {
|
||||
CmdResult::Submit(State::One(StateValue::Usize(selected))) => {
|
||||
let item = self.items().get(selected)?;
|
||||
let output = Output {
|
||||
operation: Some(PatchOperation::Edit),
|
||||
id: PatchId::from(item.id().to_owned()),
|
||||
};
|
||||
Some(Message::Quit(Some(output)))
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
}) => submit().map(|id| {
|
||||
let output = Output::new(Some(PatchOperation::Update), PatchId::from(id));
|
||||
Message::Quit(Some(output))
|
||||
}),
|
||||
Event::Keyboard(KeyEvent {
|
||||
code: Key::Char('c'),
|
||||
..
|
||||
}) => {
|
||||
let result = self.perform(Cmd::Submit);
|
||||
match result {
|
||||
CmdResult::Submit(State::One(StateValue::Usize(selected))) => {
|
||||
let item = self.items().get(selected)?;
|
||||
let output = Output {
|
||||
operation: Some(PatchOperation::Checkout),
|
||||
id: PatchId::from(item.id().to_owned()),
|
||||
};
|
||||
Some(Message::Quit(Some(output)))
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
}) => submit().map(|id| {
|
||||
let output = Output::new(Some(PatchOperation::Checkout), PatchId::from(id));
|
||||
Message::Quit(Some(output))
|
||||
}),
|
||||
Event::Keyboard(KeyEvent {
|
||||
code: Key::Char('d'),
|
||||
..
|
||||
}) => submit().map(|id| {
|
||||
let output = Output::new(Some(PatchOperation::Delete), PatchId::from(id));
|
||||
Message::Quit(Some(output))
|
||||
}),
|
||||
Event::Keyboard(KeyEvent {
|
||||
code: Key::Char('e'),
|
||||
..
|
||||
}) => submit().map(|id| {
|
||||
let output = Output::new(Some(PatchOperation::Edit), PatchId::from(id));
|
||||
Message::Quit(Some(output))
|
||||
}),
|
||||
Event::Keyboard(KeyEvent {
|
||||
code: Key::Char('m'),
|
||||
..
|
||||
}) => submit().map(|id| {
|
||||
let output = Output::new(Some(PatchOperation::Comment), PatchId::from(id));
|
||||
Message::Quit(Some(output))
|
||||
}),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,8 +92,12 @@ impl OperationSelect {
|
||||
vec![
|
||||
tui::ui::shortcut(&self.theme, "↑/↓", "navigate"),
|
||||
tui::ui::shortcut(&self.theme, "enter", "show"),
|
||||
tui::ui::shortcut(&self.theme, "u", "update"),
|
||||
tui::ui::shortcut(&self.theme, "c", "checkout"),
|
||||
tui::ui::shortcut(&self.theme, "r", "review"),
|
||||
tui::ui::shortcut(&self.theme, "d", "delete"),
|
||||
tui::ui::shortcut(&self.theme, "e", "edit"),
|
||||
tui::ui::shortcut(&self.theme, "m", "comment"),
|
||||
tui::ui::shortcut(&self.theme, "q", "quit"),
|
||||
],
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user