Add Text Align option

This commit is contained in:
dthelegend 2024-05-02 13:07:05 +01:00 committed by Antoine POPINEAU
parent f67e43ffa0
commit 6239bf0f31
2 changed files with 32 additions and 9 deletions

View File

@ -90,6 +90,15 @@ impl SecretDisplay {
}
}
// This enum models text alignment options
#[derive(SmartDefault, Debug, Clone)]
pub enum TextAlign {
#[default]
Center,
Left,
Right
}
#[derive(SmartDefault)]
pub struct Greeter {
pub debug: bool,
@ -270,7 +279,7 @@ impl Greeter {
self.connect().await;
}
// Connect to `greetd` and return a strea we can safely write to.
// Connect to `greetd` and return a stream we can safely write to.
pub async fn connect(&mut self) {
match UnixStream::connect(&self.socket).await {
Ok(stream) => self.stream = Some(Arc::new(RwLock::new(stream))),
@ -340,6 +349,18 @@ impl Greeter {
1
}
pub fn text_align(&self) -> TextAlign {
if let Some(value) = self.option("text-align") {
match value.to_uppercase().as_str() {
"LEFT" | "L" => TextAlign::Left,
"RIGHT" | "R" => TextAlign::Right,
_ => TextAlign::Center
}
} else {
TextAlign::default()
}
}
// Sets the locale that will be used for this invocation from environment.
fn set_locale(&mut self) {
let locale = DesktopLanguageRequester::requested_languages()
@ -384,6 +405,7 @@ impl Greeter {
opts.optopt("", "window-padding", "padding inside the terminal area (default: 0)", "PADDING");
opts.optopt("", "container-padding", "padding inside the main prompt container (default: 1)", "PADDING");
opts.optopt("", "prompt-padding", "padding between prompt rows (default: 1)", "PADDING");
opts.optopt("", "text-align", "alignment of text in the prompt container (default: 'center')", "[left|center|right]");
opts.optopt("", "power-shutdown", "command to run to shut down the system", "'CMD [ARGS]...'");
opts.optopt("", "power-reboot", "command to run to reboot the system", "'CMD [ARGS]...'");

View File

@ -7,11 +7,7 @@ use tui::{
widgets::{Block, BorderType, Borders, Paragraph},
};
use crate::{
info::get_hostname,
ui::{prompt_value, util::*, Frame},
Greeter, Mode, SecretDisplay,
};
use crate::{info::get_hostname, ui::{prompt_value, util::*, Frame}, Greeter, Mode, SecretDisplay, TextAlign};
use super::common::style::Themed;
@ -27,6 +23,11 @@ pub fn draw(greeter: &mut Greeter, f: &mut Frame) -> Result<(u16, u16), Box<dyn
let container_padding = greeter.container_padding();
let prompt_padding = greeter.prompt_padding();
let text_alignment = match greeter.text_align() {
TextAlign::Center => Alignment::Center,
TextAlign::Left => Alignment::Left,
TextAlign::Right => Alignment::Right
};
let container = Rect::new(x, y, width, height);
let frame = Rect::new(x + container_padding, y + container_padding, width - (2 * container_padding), height - (2 * container_padding));
@ -59,7 +60,7 @@ pub fn draw(greeter: &mut Greeter, f: &mut Frame) -> Result<(u16, u16), Box<dyn
if let Some(greeting) = &greeting {
let greeting_text = greeting.trim_end();
let greeting_label = Paragraph::new(greeting_text).alignment(Alignment::Center).style(theme.of(&[Themed::Greet]));
let greeting_label = Paragraph::new(greeting_text).alignment(text_alignment).style(theme.of(&[Themed::Greet]));
f.render_widget(greeting_label, chunks[GREETING_INDEX]);
}
@ -67,7 +68,7 @@ pub fn draw(greeter: &mut Greeter, f: &mut Frame) -> Result<(u16, u16), Box<dyn
let username_label = if greeter.user_menu && greeter.username.value.is_empty() {
let prompt_text = Span::from(fl!("select_user"));
Paragraph::new(prompt_text).alignment(Alignment::Center)
Paragraph::new(prompt_text).alignment(text_alignment)
} else {
let username_text = prompt_value(theme, Some(fl!("username")));
@ -133,7 +134,7 @@ pub fn draw(greeter: &mut Greeter, f: &mut Frame) -> Result<(u16, u16), Box<dyn
if let Some(message) = message {
let message_text = Text::from(message);
let message = Paragraph::new(message_text).alignment(Alignment::Center);
let message = Paragraph::new(message_text).alignment(text_alignment);
f.render_widget(message, Rect::new(x, y + height, width, message_height));
}