Added help footers

This commit is contained in:
veeso
2021-12-12 13:19:12 +01:00
committed by Christian Visintin
parent 2a3d4f2670
commit a93dbde0c8
11 changed files with 130 additions and 53 deletions

View File

@@ -44,7 +44,7 @@ pub use popup::{
ErrorPopup, InfoPopup, InstallUpdatePopup, Keybindings, QuitPopup, ReleaseNotes, WaitPopup, ErrorPopup, InfoPopup, InstallUpdatePopup, Keybindings, QuitPopup, ReleaseNotes, WaitPopup,
WindowSizeError, WindowSizeError,
}; };
pub use text::{HelpText, NewVersionDisclaimer, Subtitle, Title}; pub use text::{HelpFooter, NewVersionDisclaimer, Subtitle, Title};
use tui_realm_stdlib::Phantom; use tui_realm_stdlib::Phantom;
use tuirealm::event::{Event, Key, KeyEvent, KeyModifiers, NoUserEvent}; use tuirealm::event::{Event, Key, KeyEvent, KeyModifiers, NoUserEvent};
@@ -60,7 +60,10 @@ pub struct GlobalListener {
impl Component<Msg, NoUserEvent> for GlobalListener { impl Component<Msg, NoUserEvent> for GlobalListener {
fn on(&mut self, ev: Event<NoUserEvent>) -> Option<Msg> { fn on(&mut self, ev: Event<NoUserEvent>) -> Option<Msg> {
match ev { match ev {
Event::Keyboard(KeyEvent { code: Key::Esc, .. }) => Some(Msg::ShowQuitPopup), Event::Keyboard(KeyEvent {
code: Key::Esc | Key::Function(10),
..
}) => Some(Msg::ShowQuitPopup),
Event::Keyboard(KeyEvent { Event::Keyboard(KeyEvent {
code: Key::Char('c'), code: Key::Char('c'),
modifiers: KeyModifiers::CONTROL, modifiers: KeyModifiers::CONTROL,
@@ -69,6 +72,10 @@ impl Component<Msg, NoUserEvent> for GlobalListener {
code: Key::Char('h'), code: Key::Char('h'),
modifiers: KeyModifiers::CONTROL, modifiers: KeyModifiers::CONTROL,
}) => Some(Msg::ShowKeybindingsPopup), }) => Some(Msg::ShowKeybindingsPopup),
Event::Keyboard(KeyEvent {
code: Key::Function(1),
..
}) => Some(Msg::ShowKeybindingsPopup),
Event::Keyboard(KeyEvent { Event::Keyboard(KeyEvent {
code: Key::Char('r'), code: Key::Char('r'),
modifiers: KeyModifiers::CONTROL, modifiers: KeyModifiers::CONTROL,

View File

@@ -104,28 +104,35 @@ impl Component<Msg, NoUserEvent> for NewVersionDisclaimer {
} }
} }
// -- HelpText // -- HelpFooter
#[derive(MockComponent)] #[derive(MockComponent)]
pub struct HelpText { pub struct HelpFooter {
component: Span, component: Span,
} }
impl HelpText { impl HelpFooter {
pub fn new(key_color: Color) -> Self { pub fn new(key_color: Color) -> Self {
Self { Self {
component: Span::default().spans(&[ component: Span::default().spans(&[
TextSpan::new("Press ").bold(), TextSpan::from("<F1|CTRL+H>").bold().fg(key_color),
TextSpan::new("<CTRL+H>").bold().fg(key_color), TextSpan::from(" Help "),
TextSpan::new(" to show keybindings; ").bold(), TextSpan::from("<CTRL+C>").bold().fg(key_color),
TextSpan::new("<CTRL+C>").bold().fg(key_color), TextSpan::from(" Enter setup "),
TextSpan::new(" to enter setup").bold(), TextSpan::from("<UP/DOWN>").bold().fg(key_color),
TextSpan::from(" Change field "),
TextSpan::from("<TAB>").bold().fg(key_color),
TextSpan::from(" Switch tab "),
TextSpan::from("<ENTER>").bold().fg(key_color),
TextSpan::from(" Submit form "),
TextSpan::from("<F10|ESC>").bold().fg(key_color),
TextSpan::from(" Quit "),
]), ]),
} }
} }
} }
impl Component<Msg, NoUserEvent> for HelpText { impl Component<Msg, NoUserEvent> for HelpFooter {
fn on(&mut self, _ev: Event<NoUserEvent>) -> Option<Msg> { fn on(&mut self, _ev: Event<NoUserEvent>) -> Option<Msg> {
None None
} }

View File

@@ -55,7 +55,7 @@ pub enum Id {
DeleteRecentPopup, DeleteRecentPopup,
ErrorPopup, ErrorPopup,
GlobalListener, GlobalListener,
HelpText, HelpFooter,
InfoPopup, InfoPopup,
InstallUpdatePopup, InstallUpdatePopup,
Keybindings, Keybindings,

View File

@@ -58,8 +58,8 @@ impl AuthActivity {
assert!(self assert!(self
.app .app
.mount( .mount(
Id::HelpText, Id::HelpFooter,
Box::new(components::HelpText::new(key_color)), Box::new(components::HelpFooter::new(key_color)),
vec![] vec![]
) )
.is_ok()); .is_ok());
@@ -111,17 +111,30 @@ impl AuthActivity {
let height: u16 = f.size().height; let height: u16 = f.size().height;
self.check_minimum_window_size(height); self.check_minimum_window_size(height);
// Prepare chunks // Prepare chunks
let chunks = Layout::default() let body = Layout::default()
.direction(Direction::Vertical) .direction(Direction::Vertical)
.margin(1)
.constraints( .constraints(
[ [
Constraint::Length(21), // Auth Form Constraint::Min(24), // Body
Constraint::Min(3), // Bookmarks Constraint::Length(1), // Footer
] ]
.as_ref(), .as_ref(),
) )
.split(f.size()); .split(f.size());
// Footer
self.app.view(&Id::HelpFooter, f, body[1]);
let auth_form_len = 7 + self.input_mask_size();
let main_chunks = Layout::default()
.direction(Direction::Vertical)
.margin(1)
.constraints(
[
Constraint::Length(auth_form_len), // Auth Form
Constraint::Min(3), // Bookmarks
]
.as_ref(),
)
.split(body[0]);
// Create explorer chunks // Create explorer chunks
let auth_chunks = Layout::default() let auth_chunks = Layout::default()
.constraints( .constraints(
@@ -131,12 +144,12 @@ impl AuthActivity {
Constraint::Length(1), // Version Constraint::Length(1), // Version
Constraint::Length(3), // protocol Constraint::Length(3), // protocol
Constraint::Length(self.input_mask_size()), // Input mask Constraint::Length(self.input_mask_size()), // Input mask
Constraint::Length(3), // footer Constraint::Length(1), // Prevents last field to overflow
] ]
.as_ref(), .as_ref(),
) )
.direction(Direction::Vertical) .direction(Direction::Vertical)
.split(chunks[0]); .split(main_chunks[0]);
// Input mask chunks // Input mask chunks
let input_mask = match self.input_mask() { let input_mask = match self.input_mask() {
InputMask::AwsS3 => Layout::default() InputMask::AwsS3 => Layout::default()
@@ -167,7 +180,7 @@ impl AuthActivity {
let bookmark_chunks = Layout::default() let bookmark_chunks = Layout::default()
.constraints([Constraint::Percentage(50), Constraint::Percentage(50)].as_ref()) .constraints([Constraint::Percentage(50), Constraint::Percentage(50)].as_ref())
.direction(Direction::Horizontal) .direction(Direction::Horizontal)
.split(chunks[1]); .split(main_chunks[1]);
// Render // Render
// Auth chunks // Auth chunks
self.app.view(&Id::Title, f, auth_chunks[0]); self.app.view(&Id::Title, f, auth_chunks[0]);
@@ -188,7 +201,6 @@ impl AuthActivity {
self.app.view(&Id::Password, f, input_mask[3]); self.app.view(&Id::Password, f, input_mask[3]);
} }
} }
self.app.view(&Id::HelpText, f, auth_chunks[5]);
// Bookmark chunks // Bookmark chunks
self.app.view(&Id::BookmarksList, f, bookmark_chunks[0]); self.app.view(&Id::BookmarksList, f, bookmark_chunks[0]);
self.app.view(&Id::RecentsList, f, bookmark_chunks[1]); self.app.view(&Id::RecentsList, f, bookmark_chunks[1]);
@@ -788,6 +800,13 @@ impl AuthActivity {
}), }),
Self::no_popup_mounted_clause(), Self::no_popup_mounted_clause(),
), ),
Sub::new(
SubEventClause::Keyboard(KeyEvent {
code: Key::Function(10),
modifiers: KeyModifiers::NONE,
}),
Self::no_popup_mounted_clause(),
),
Sub::new( Sub::new(
SubEventClause::Keyboard(KeyEvent { SubEventClause::Keyboard(KeyEvent {
code: Key::Char('c'), code: Key::Char('c'),
@@ -802,6 +821,13 @@ impl AuthActivity {
}), }),
Self::no_popup_mounted_clause(), Self::no_popup_mounted_clause(),
), ),
Sub::new(
SubEventClause::Keyboard(KeyEvent {
code: Key::Function(1),
modifiers: KeyModifiers::NONE,
}),
Self::no_popup_mounted_clause(),
),
Sub::new( Sub::new(
SubEventClause::Keyboard(KeyEvent { SubEventClause::Keyboard(KeyEvent {
code: Key::Char('r'), code: Key::Char('r'),

View File

@@ -40,27 +40,27 @@ impl FooterBar {
pub fn new(key_color: Color) -> Self { pub fn new(key_color: Color) -> Self {
Self { Self {
component: Span::default().spans(&[ component: Span::default().spans(&[
TextSpan::from("<F1|H>").fg(key_color), TextSpan::from("<F1|H>").bold().fg(key_color),
TextSpan::from(" Help "), TextSpan::from(" Help "),
TextSpan::from("<TAB>").fg(key_color), TextSpan::from("<TAB>").bold().fg(key_color),
TextSpan::from(" Change tab "), TextSpan::from(" Change tab "),
TextSpan::from("<SPACE>").fg(key_color), TextSpan::from("<SPACE>").bold().fg(key_color),
TextSpan::from(" Transfer "), TextSpan::from(" Transfer "),
TextSpan::from("<ENTER>").fg(key_color), TextSpan::from("<ENTER>").bold().fg(key_color),
TextSpan::from(" Enter dir "), TextSpan::from(" Enter dir "),
TextSpan::from("<F3|V>").fg(key_color), TextSpan::from("<F3|V>").bold().fg(key_color),
TextSpan::from(" View "), TextSpan::from(" View "),
TextSpan::from("<F4|O>").fg(key_color), TextSpan::from("<F4|O>").bold().fg(key_color),
TextSpan::from(" Edit "), TextSpan::from(" Edit "),
TextSpan::from("<F5|C>").fg(key_color), TextSpan::from("<F5|C>").bold().fg(key_color),
TextSpan::from(" Copy "), TextSpan::from(" Copy "),
TextSpan::from("<F6|R>").fg(key_color), TextSpan::from("<F6|R>").bold().fg(key_color),
TextSpan::from(" Rename "), TextSpan::from(" Rename "),
TextSpan::from("<F7|D>").fg(key_color), TextSpan::from("<F7|D>").bold().fg(key_color),
TextSpan::from(" Make dir "), TextSpan::from(" Make dir "),
TextSpan::from("<F8|DEL>").fg(key_color), TextSpan::from("<F8|DEL>").bold().fg(key_color),
TextSpan::from(" Make dir "), TextSpan::from(" Make dir "),
TextSpan::from("<F10|Q>").fg(key_color), TextSpan::from("<F10|Q>").bold().fg(key_color),
TextSpan::from(" Quit "), TextSpan::from(" Quit "),
]), ]),
} }

View File

@@ -76,13 +76,16 @@ impl Default for Footer {
fn default() -> Self { fn default() -> Self {
Self { Self {
component: Span::default().spans(&[ component: Span::default().spans(&[
TextSpan::new("Press ").bold(), TextSpan::new("<F1|CTRL+H>").bold().fg(Color::Cyan),
TextSpan::new("<CTRL+H>").bold().fg(Color::Cyan), TextSpan::new(" Help "),
TextSpan::new(" to show keybindings; ").bold(), TextSpan::new("<F4|CTRL+S>").bold().fg(Color::Cyan),
TextSpan::new("<CTRL+S>").bold().fg(Color::Cyan), TextSpan::new(" Save parameters "),
TextSpan::new(" to save parameters; ").bold(), TextSpan::new("<F10|ESC>").bold().fg(Color::Cyan),
TextSpan::new(" Exit "),
TextSpan::new("<TAB>").bold().fg(Color::Cyan), TextSpan::new("<TAB>").bold().fg(Color::Cyan),
TextSpan::new(" to change panel").bold(), TextSpan::new(" Change panel "),
TextSpan::new("<UP/DOWN>").bold().fg(Color::Cyan),
TextSpan::new(" Change field "),
]), ]),
} }
} }

View File

@@ -54,9 +54,10 @@ pub struct GlobalListener {
impl Component<Msg, NoUserEvent> for GlobalListener { impl Component<Msg, NoUserEvent> for GlobalListener {
fn on(&mut self, ev: Event<NoUserEvent>) -> Option<Msg> { fn on(&mut self, ev: Event<NoUserEvent>) -> Option<Msg> {
match ev { match ev {
Event::Keyboard(KeyEvent { code: Key::Esc, .. }) => { Event::Keyboard(KeyEvent {
Some(Msg::Common(CommonMsg::ShowQuitPopup)) code: Key::Esc | Key::Function(10),
} ..
}) => Some(Msg::Common(CommonMsg::ShowQuitPopup)),
Event::Keyboard(KeyEvent { code: Key::Tab, .. }) => { Event::Keyboard(KeyEvent { code: Key::Tab, .. }) => {
Some(Msg::Common(CommonMsg::ChangeLayout)) Some(Msg::Common(CommonMsg::ChangeLayout))
} }
@@ -64,6 +65,10 @@ impl Component<Msg, NoUserEvent> for GlobalListener {
code: Key::Char('h'), code: Key::Char('h'),
modifiers: KeyModifiers::CONTROL, modifiers: KeyModifiers::CONTROL,
}) => Some(Msg::Common(CommonMsg::ShowKeybindings)), }) => Some(Msg::Common(CommonMsg::ShowKeybindings)),
Event::Keyboard(KeyEvent {
code: Key::Function(1),
modifiers: KeyModifiers::NONE,
}) => Some(Msg::Common(CommonMsg::ShowKeybindings)),
Event::Keyboard(KeyEvent { Event::Keyboard(KeyEvent {
code: Key::Char('r'), code: Key::Char('r'),
modifiers: KeyModifiers::CONTROL, modifiers: KeyModifiers::CONTROL,
@@ -72,6 +77,10 @@ impl Component<Msg, NoUserEvent> for GlobalListener {
code: Key::Char('s'), code: Key::Char('s'),
modifiers: KeyModifiers::CONTROL, modifiers: KeyModifiers::CONTROL,
}) => Some(Msg::Common(CommonMsg::ShowSavePopup)), }) => Some(Msg::Common(CommonMsg::ShowSavePopup)),
Event::Keyboard(KeyEvent {
code: Key::Function(4),
modifiers: KeyModifiers::NONE,
}) => Some(Msg::Common(CommonMsg::ShowSavePopup)),
_ => None, _ => None,
} }
} }

View File

@@ -206,6 +206,13 @@ impl SetupActivity {
}), }),
Self::no_popup_mounted_clause(), Self::no_popup_mounted_clause(),
), ),
Sub::new(
SubEventClause::Keyboard(KeyEvent {
code: Key::Function(10),
modifiers: KeyModifiers::NONE,
}),
Self::no_popup_mounted_clause(),
),
Sub::new( Sub::new(
SubEventClause::Keyboard(KeyEvent { SubEventClause::Keyboard(KeyEvent {
code: Key::Tab, code: Key::Tab,
@@ -220,6 +227,13 @@ impl SetupActivity {
}), }),
Self::no_popup_mounted_clause(), Self::no_popup_mounted_clause(),
), ),
Sub::new(
SubEventClause::Keyboard(KeyEvent {
code: Key::Function(1),
modifiers: KeyModifiers::NONE,
}),
Self::no_popup_mounted_clause(),
),
Sub::new( Sub::new(
SubEventClause::Keyboard(KeyEvent { SubEventClause::Keyboard(KeyEvent {
code: Key::Char('r'), code: Key::Char('r'),
@@ -234,6 +248,13 @@ impl SetupActivity {
}), }),
Self::no_popup_mounted_clause(), Self::no_popup_mounted_clause(),
), ),
Sub::new(
SubEventClause::Keyboard(KeyEvent {
code: Key::Function(4),
modifiers: KeyModifiers::NONE,
}),
Self::no_popup_mounted_clause(),
),
] ]
) )
.is_ok()); .is_ok());

View File

@@ -60,8 +60,8 @@ impl SetupActivity {
.constraints( .constraints(
[ [
Constraint::Length(3), // Current tab Constraint::Length(3), // Current tab
Constraint::Length(18), // Main body Constraint::Min(18), // Main body
Constraint::Length(3), // Help footer Constraint::Length(1), // Help footer
] ]
.as_ref(), .as_ref(),
) )
@@ -85,6 +85,7 @@ impl SetupActivity {
Constraint::Length(3), // Updates tab Constraint::Length(3), // Updates tab
Constraint::Length(3), // Prompt file replace Constraint::Length(3), // Prompt file replace
Constraint::Length(3), // Group dirs Constraint::Length(3), // Group dirs
Constraint::Length(1), // Prevent overflow
] ]
.as_ref(), .as_ref(),
) )
@@ -120,7 +121,7 @@ impl SetupActivity {
Constraint::Length(3), // Notifications enabled Constraint::Length(3), // Notifications enabled
Constraint::Length(3), // Notifications threshold Constraint::Length(3), // Notifications threshold
Constraint::Length(3), // Ssh config Constraint::Length(3), // Ssh config
Constraint::Length(1), // Filler Constraint::Length(1), // Prevent overflow
] ]
.as_ref(), .as_ref(),
) )

View File

@@ -57,8 +57,8 @@ impl SetupActivity {
.constraints( .constraints(
[ [
Constraint::Length(3), // Current tab Constraint::Length(3), // Current tab
Constraint::Percentage(90), // Main body Constraint::Min(5), // Main body
Constraint::Length(3), // Help footer Constraint::Length(1), // Help footer
] ]
.as_ref(), .as_ref(),
) )

View File

@@ -57,8 +57,8 @@ impl SetupActivity {
.constraints( .constraints(
[ [
Constraint::Length(3), // Current tab Constraint::Length(3), // Current tab
Constraint::Length(22), // Main body Constraint::Min(22), // Main body
Constraint::Length(3), // Help footer Constraint::Length(1), // Help footer
] ]
.as_ref(), .as_ref(),
) )
@@ -91,6 +91,7 @@ impl SetupActivity {
Constraint::Length(3), // Password Constraint::Length(3), // Password
Constraint::Length(3), // Bookmarks Constraint::Length(3), // Bookmarks
Constraint::Length(3), // Recents Constraint::Length(3), // Recents
Constraint::Length(1), // Prevent overflow
] ]
.as_ref(), .as_ref(),
) )
@@ -126,6 +127,7 @@ impl SetupActivity {
Constraint::Length(3), // Quit Constraint::Length(3), // Quit
Constraint::Length(3), // Save Constraint::Length(3), // Save
Constraint::Length(3), // Warn Constraint::Length(3), // Warn
Constraint::Length(1), // Prevent overflow
] ]
.as_ref(), .as_ref(),
) )
@@ -158,7 +160,7 @@ impl SetupActivity {
Constraint::Length(3), // remote explorer bg Constraint::Length(3), // remote explorer bg
Constraint::Length(3), // remote explorer fg Constraint::Length(3), // remote explorer fg
Constraint::Length(3), // remote explorer hg Constraint::Length(3), // remote explorer hg
Constraint::Length(3), // empty Constraint::Length(1), // Prevent overflow
] ]
.as_ref(), .as_ref(),
) )
@@ -210,6 +212,7 @@ impl SetupActivity {
Constraint::Length(3), // status sorting Constraint::Length(3), // status sorting
Constraint::Length(3), // status hidden Constraint::Length(3), // status hidden
Constraint::Length(3), // sync browsing Constraint::Length(3), // sync browsing
Constraint::Length(1), // Prevent overflow
] ]
.as_ref(), .as_ref(),
) )