Always close user menu when user is selected (#131).

This commit is contained in:
Antoine POPINEAU 2024-04-27 15:09:20 +02:00
parent f65c70689b
commit f988ed188d
No known key found for this signature in database
GPG Key ID: E8379674E92D25D2
5 changed files with 19 additions and 10 deletions

View File

@ -62,6 +62,7 @@ pub enum Mode {
#[default]
Username,
Password,
Action,
Users,
Command,
Sessions,

View File

@ -91,6 +91,9 @@ impl Ipc {
AuthMessageType::Info => {
greeter.remove_prompt();
greeter.previous_mode = greeter.mode;
greeter.mode = Mode::Action;
if let Some(message) = &mut greeter.message {
message.push('\n');
message.push_str(auth_message.trim_end());

View File

@ -240,6 +240,8 @@ pub async fn handle(greeter: Arc<RwLock<Greeter>>, input: KeyEvent, ipc: Ipc) ->
greeter.username = MaskedString::from(username, name);
}
greeter.mode = greeter.previous_mode;
validate_username(&mut greeter, &ipc).await;
}
@ -271,7 +273,7 @@ pub async fn handle(greeter: Arc<RwLock<Greeter>>, input: KeyEvent, ipc: Ipc) ->
greeter.mode = greeter.previous_mode;
}
Mode::Processing => {}
_ => {}
},
// Do not handle any other controls keybindings
@ -296,7 +298,7 @@ async fn insert_key(greeter: &mut Greeter, c: char) {
Mode::Username => &greeter.username.value,
Mode::Password => &greeter.buffer,
Mode::Command => &greeter.buffer,
Mode::Users | Mode::Sessions | Mode::Power | Mode::Processing => return,
_ => return,
};
let index = (value.chars().count() as i16 + greeter.cursor_offset) as usize;
@ -322,7 +324,7 @@ async fn delete_key(greeter: &mut Greeter, key: KeyCode) {
Mode::Username => &greeter.username.value,
Mode::Password => &greeter.buffer,
Mode::Command => &greeter.buffer,
Mode::Users | Mode::Sessions | Mode::Power | Mode::Processing => return,
_ => return,
};
let index = match key {
@ -341,7 +343,7 @@ async fn delete_key(greeter: &mut Greeter, key: KeyCode) {
Mode::Username => greeter.username.value = value,
Mode::Password => greeter.buffer = value,
Mode::Command => greeter.buffer = value,
Mode::Users | Mode::Sessions | Mode::Power | Mode::Processing => return,
_ => return,
};
if let KeyCode::Delete = key {

View File

@ -35,11 +35,13 @@ pub fn draw(greeter: &mut Greeter, f: &mut Frame) -> Result<(u16, u16), Box<dyn
let (message, message_height) = get_message_height(greeter, container_padding, 1);
let (greeting, greeting_height) = get_greeting_height(greeter, container_padding, 0);
let should_display_answer = greeter.mode == Mode::Password;
let constraints = [
Constraint::Length(greeting_height), // Greeting
Constraint::Length(1), // Username
Constraint::Length(if greeter.mode == Mode::Username { 0 } else { prompt_padding }), // Prompt padding
Constraint::Length(if greeter.mode == Mode::Username { 0 } else { 1 }), // Answer
Constraint::Length(greeting_height), // Greeting
Constraint::Length(1), // Username
Constraint::Length(if should_display_answer { prompt_padding } else { 0 }), // Prompt padding
Constraint::Length(if should_display_answer { 1 } else { 0 }), // Answer
];
let chunks = Layout::default().direction(Direction::Vertical).constraints(constraints.as_ref()).split(frame);
@ -67,7 +69,7 @@ pub fn draw(greeter: &mut Greeter, f: &mut Frame) -> Result<(u16, u16), Box<dyn
let username_value = Paragraph::new(username_value_text);
match greeter.mode {
Mode::Username | Mode::Password => {
Mode::Username | Mode::Password | Mode::Action => {
f.render_widget(username_label, chunks[USERNAME_INDEX]);
if !greeter.user_menu || !greeter.username.value.is_empty() {

View File

@ -18,6 +18,7 @@ pub fn should_hide_cursor(greeter: &Greeter) -> bool {
|| greeter.mode == Mode::Sessions
|| greeter.mode == Mode::Power
|| greeter.mode == Mode::Processing
|| greeter.mode == Mode::Action
}
// Computes the height of the main window where we display content, depending on
@ -37,7 +38,7 @@ pub fn get_height(greeter: &Greeter) -> u16 {
let prompt_padding = greeter.prompt_padding();
let initial = match greeter.mode {
Mode::Username | Mode::Command => (2 * container_padding) + 1,
Mode::Username | Mode::Action | Mode::Command => (2 * container_padding) + 1,
Mode::Password => match greeter.prompt {
Some(_) => (2 * container_padding) + prompt_padding + 2,
None => (2 * container_padding) + 1,