Popup with fixed sizes or percentage

This commit is contained in:
veeso
2023-02-09 17:19:27 +01:00
parent 4d5f3a6b63
commit 1db2ff7ec5
5 changed files with 102 additions and 80 deletions

View File

@@ -6,7 +6,7 @@
use super::{components, AuthActivity, Context, FileTransferProtocol, Id, InputMask}; use super::{components, AuthActivity, Context, FileTransferProtocol, Id, InputMask};
use crate::filetransfer::params::{AwsS3Params, GenericProtocolParams, ProtocolParams}; use crate::filetransfer::params::{AwsS3Params, GenericProtocolParams, ProtocolParams};
use crate::filetransfer::FileTransferParams; use crate::filetransfer::FileTransferParams;
use crate::utils::ui::draw_area_in; use crate::utils::ui::{Popup, Size};
use std::path::PathBuf; use std::path::PathBuf;
use std::str::FromStr; use std::str::FromStr;
@@ -193,43 +193,43 @@ impl AuthActivity {
self.app.view(&Id::RecentsList, f, bookmark_chunks[1]); self.app.view(&Id::RecentsList, f, bookmark_chunks[1]);
// Popups // Popups
if self.app.mounted(&Id::ErrorPopup) { if self.app.mounted(&Id::ErrorPopup) {
let popup = draw_area_in(f.size(), 50, 10); let popup = Popup(Size::Percentage(50), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::ErrorPopup, f, popup); self.app.view(&Id::ErrorPopup, f, popup);
} else if self.app.mounted(&Id::InfoPopup) { } else if self.app.mounted(&Id::InfoPopup) {
let popup = draw_area_in(f.size(), 50, 10); let popup = Popup(Size::Percentage(50), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::InfoPopup, f, popup); self.app.view(&Id::InfoPopup, f, popup);
} else if self.app.mounted(&Id::WaitPopup) { } else if self.app.mounted(&Id::WaitPopup) {
let popup = draw_area_in(f.size(), 50, 10); let popup = Popup(Size::Percentage(50), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::WaitPopup, f, popup); self.app.view(&Id::WaitPopup, f, popup);
} else if self.app.mounted(&Id::WindowSizeError) { } else if self.app.mounted(&Id::WindowSizeError) {
let popup = draw_area_in(f.size(), 80, 20); let popup = Popup(Size::Percentage(80), Size::Percentage(20)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::WindowSizeError, f, popup); self.app.view(&Id::WindowSizeError, f, popup);
} else if self.app.mounted(&Id::QuitPopup) { } else if self.app.mounted(&Id::QuitPopup) {
// make popup // make popup
let popup = draw_area_in(f.size(), 30, 10); let popup = Popup(Size::Percentage(30), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
self.app.view(&Id::QuitPopup, f, popup); self.app.view(&Id::QuitPopup, f, popup);
} else if self.app.mounted(&Id::DeleteBookmarkPopup) { } else if self.app.mounted(&Id::DeleteBookmarkPopup) {
// make popup // make popup
let popup = draw_area_in(f.size(), 30, 10); let popup = Popup(Size::Percentage(30), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
self.app.view(&Id::DeleteBookmarkPopup, f, popup); self.app.view(&Id::DeleteBookmarkPopup, f, popup);
} else if self.app.mounted(&Id::DeleteRecentPopup) { } else if self.app.mounted(&Id::DeleteRecentPopup) {
// make popup // make popup
let popup = draw_area_in(f.size(), 30, 10); let popup = Popup(Size::Percentage(30), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
self.app.view(&Id::DeleteRecentPopup, f, popup); self.app.view(&Id::DeleteRecentPopup, f, popup);
} else if self.app.mounted(&Id::NewVersionChangelog) { } else if self.app.mounted(&Id::NewVersionChangelog) {
// make popup // make popup
let popup = draw_area_in(f.size(), 90, 85); let popup = Popup(Size::Percentage(90), Size::Percentage(85)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
let popup_chunks = Layout::default() let popup_chunks = Layout::default()
.direction(Direction::Vertical) .direction(Direction::Vertical)
@@ -245,12 +245,12 @@ impl AuthActivity {
self.app.view(&Id::InstallUpdatePopup, f, popup_chunks[1]); self.app.view(&Id::InstallUpdatePopup, f, popup_chunks[1]);
} else if self.app.mounted(&Id::Keybindings) { } else if self.app.mounted(&Id::Keybindings) {
// make popup // make popup
let popup = draw_area_in(f.size(), 50, 70); let popup = Popup(Size::Percentage(50), Size::Percentage(70)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
self.app.view(&Id::Keybindings, f, popup); self.app.view(&Id::Keybindings, f, popup);
} else if self.app.mounted(&Id::BookmarkSavePassword) { } else if self.app.mounted(&Id::BookmarkSavePassword) {
// make popup // make popup
let popup = draw_area_in(f.size(), 20, 20); let popup = Popup(Size::Percentage(20), Size::Percentage(20)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
let popup_chunks = Layout::default() let popup_chunks = Layout::default()
.direction(Direction::Vertical) .direction(Direction::Vertical)

View File

@@ -8,7 +8,7 @@ use super::{
components, Context, FileTransferActivity, Id, components, Context, FileTransferActivity, Id,
}; };
use crate::explorer::FileSorting; use crate::explorer::FileSorting;
use crate::utils::ui::draw_area_in; use crate::utils::ui::{Popup, Size};
// Ext // Ext
use remotefs::fs::File; use remotefs::fs::File;
use tuirealm::event::{Key, KeyEvent, KeyModifiers}; use tuirealm::event::{Key, KeyEvent, KeyModifiers};
@@ -155,62 +155,62 @@ impl FileTransferActivity {
self.app.view(&Id::StatusBarRemote, f, status_bar_chunks[1]); self.app.view(&Id::StatusBarRemote, f, status_bar_chunks[1]);
// @! Draw popups // @! Draw popups
if self.app.mounted(&Id::CopyPopup) { if self.app.mounted(&Id::CopyPopup) {
let popup = draw_area_in(f.size(), 40, 10); let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::CopyPopup, f, popup); self.app.view(&Id::CopyPopup, f, popup);
} else if self.app.mounted(&Id::FindPopup) { } else if self.app.mounted(&Id::FindPopup) {
let popup = draw_area_in(f.size(), 40, 10); let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::FindPopup, f, popup); self.app.view(&Id::FindPopup, f, popup);
} else if self.app.mounted(&Id::GotoPopup) { } else if self.app.mounted(&Id::GotoPopup) {
let popup = draw_area_in(f.size(), 40, 10); let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::GotoPopup, f, popup); self.app.view(&Id::GotoPopup, f, popup);
} else if self.app.mounted(&Id::MkdirPopup) { } else if self.app.mounted(&Id::MkdirPopup) {
let popup = draw_area_in(f.size(), 40, 10); let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::MkdirPopup, f, popup); self.app.view(&Id::MkdirPopup, f, popup);
} else if self.app.mounted(&Id::NewfilePopup) { } else if self.app.mounted(&Id::NewfilePopup) {
let popup = draw_area_in(f.size(), 40, 10); let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::NewfilePopup, f, popup); self.app.view(&Id::NewfilePopup, f, popup);
} else if self.app.mounted(&Id::OpenWithPopup) { } else if self.app.mounted(&Id::OpenWithPopup) {
let popup = draw_area_in(f.size(), 40, 10); let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::OpenWithPopup, f, popup); self.app.view(&Id::OpenWithPopup, f, popup);
} else if self.app.mounted(&Id::RenamePopup) { } else if self.app.mounted(&Id::RenamePopup) {
let popup = draw_area_in(f.size(), 40, 10); let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::RenamePopup, f, popup); self.app.view(&Id::RenamePopup, f, popup);
} else if self.app.mounted(&Id::SaveAsPopup) { } else if self.app.mounted(&Id::SaveAsPopup) {
let popup = draw_area_in(f.size(), 40, 10); let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::SaveAsPopup, f, popup); self.app.view(&Id::SaveAsPopup, f, popup);
} else if self.app.mounted(&Id::SymlinkPopup) { } else if self.app.mounted(&Id::SymlinkPopup) {
let popup = draw_area_in(f.size(), 50, 10); let popup = Popup(Size::Percentage(50), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::SymlinkPopup, f, popup); self.app.view(&Id::SymlinkPopup, f, popup);
} else if self.app.mounted(&Id::ExecPopup) { } else if self.app.mounted(&Id::ExecPopup) {
let popup = draw_area_in(f.size(), 40, 10); let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::ExecPopup, f, popup); self.app.view(&Id::ExecPopup, f, popup);
} else if self.app.mounted(&Id::FileInfoPopup) { } else if self.app.mounted(&Id::FileInfoPopup) {
let popup = draw_area_in(f.size(), 50, 50); let popup = Popup(Size::Percentage(50), Size::Percentage(50)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::FileInfoPopup, f, popup); self.app.view(&Id::FileInfoPopup, f, popup);
} else if self.app.mounted(&Id::ProgressBarPartial) { } else if self.app.mounted(&Id::ProgressBarPartial) {
let popup = draw_area_in(f.size(), 50, 20); let popup = Popup(Size::Percentage(50), Size::Percentage(20)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
let popup_chunks = Layout::default() let popup_chunks = Layout::default()
@@ -226,14 +226,14 @@ impl FileTransferActivity {
self.app.view(&Id::ProgressBarFull, f, popup_chunks[0]); self.app.view(&Id::ProgressBarFull, f, popup_chunks[0]);
self.app.view(&Id::ProgressBarPartial, f, popup_chunks[1]); self.app.view(&Id::ProgressBarPartial, f, popup_chunks[1]);
} else if self.app.mounted(&Id::DeletePopup) { } else if self.app.mounted(&Id::DeletePopup) {
let popup = draw_area_in(f.size(), 30, 10); let popup = Popup(Size::Percentage(30), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::DeletePopup, f, popup); self.app.view(&Id::DeletePopup, f, popup);
} else if self.app.mounted(&Id::ReplacePopup) { } else if self.app.mounted(&Id::ReplacePopup) {
// NOTE: handle extended / normal modes // NOTE: handle extended / normal modes
if self.is_radio_replace_extended() { if self.is_radio_replace_extended() {
let popup = draw_area_in(f.size(), 50, 50); let popup = Popup(Size::Percentage(50), Size::Percentage(50)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
let popup_chunks = Layout::default() let popup_chunks = Layout::default()
.direction(Direction::Vertical) .direction(Direction::Vertical)
@@ -249,66 +249,66 @@ impl FileTransferActivity {
.view(&Id::ReplacingFilesListPopup, f, popup_chunks[0]); .view(&Id::ReplacingFilesListPopup, f, popup_chunks[0]);
self.app.view(&Id::ReplacePopup, f, popup_chunks[1]); self.app.view(&Id::ReplacePopup, f, popup_chunks[1]);
} else { } else {
let popup = draw_area_in(f.size(), 50, 10); let popup = Popup(Size::Percentage(50), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::ReplacePopup, f, popup); self.app.view(&Id::ReplacePopup, f, popup);
} }
} else if self.app.mounted(&Id::DisconnectPopup) { } else if self.app.mounted(&Id::DisconnectPopup) {
let popup = draw_area_in(f.size(), 30, 10); let popup = Popup(Size::Percentage(30), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::DisconnectPopup, f, popup); self.app.view(&Id::DisconnectPopup, f, popup);
} else if self.app.mounted(&Id::QuitPopup) { } else if self.app.mounted(&Id::QuitPopup) {
let popup = draw_area_in(f.size(), 30, 10); let popup = Popup(Size::Percentage(30), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::QuitPopup, f, popup); self.app.view(&Id::QuitPopup, f, popup);
} else if self.app.mounted(&Id::WatchedPathsList) { } else if self.app.mounted(&Id::WatchedPathsList) {
let popup = draw_area_in(f.size(), 60, 50); let popup = Popup(Size::Percentage(60), Size::Percentage(50)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::WatchedPathsList, f, popup); self.app.view(&Id::WatchedPathsList, f, popup);
} else if self.app.mounted(&Id::WatcherPopup) { } else if self.app.mounted(&Id::WatcherPopup) {
let popup = draw_area_in(f.size(), 60, 10); let popup = Popup(Size::Percentage(60), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::WatcherPopup, f, popup); self.app.view(&Id::WatcherPopup, f, popup);
} else if self.app.mounted(&Id::SortingPopup) { } else if self.app.mounted(&Id::SortingPopup) {
let popup = draw_area_in(f.size(), 50, 10); let popup = Popup(Size::Percentage(50), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::SortingPopup, f, popup); self.app.view(&Id::SortingPopup, f, popup);
} else if self.app.mounted(&Id::ErrorPopup) { } else if self.app.mounted(&Id::ErrorPopup) {
let popup = draw_area_in( let popup = Popup(
f.size(), Size::Percentage(50),
50,
self.calc_popup_height(Id::ErrorPopup, f.size().width, f.size().height), self.calc_popup_height(Id::ErrorPopup, f.size().width, f.size().height),
); )
.draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::ErrorPopup, f, popup); self.app.view(&Id::ErrorPopup, f, popup);
} else if self.app.mounted(&Id::FatalPopup) { } else if self.app.mounted(&Id::FatalPopup) {
let popup = draw_area_in( let popup = Popup(
f.size(), Size::Percentage(50),
50,
self.calc_popup_height(Id::FatalPopup, f.size().width, f.size().height), self.calc_popup_height(Id::FatalPopup, f.size().width, f.size().height),
); )
.draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::FatalPopup, f, popup); self.app.view(&Id::FatalPopup, f, popup);
} else if self.app.mounted(&Id::WaitPopup) { } else if self.app.mounted(&Id::WaitPopup) {
let popup = draw_area_in(f.size(), 50, 10); let popup = Popup(Size::Percentage(50), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::WaitPopup, f, popup); self.app.view(&Id::WaitPopup, f, popup);
} else if self.app.mounted(&Id::SyncBrowsingMkdirPopup) { } else if self.app.mounted(&Id::SyncBrowsingMkdirPopup) {
let popup = draw_area_in(f.size(), 60, 10); let popup = Popup(Size::Percentage(60), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::SyncBrowsingMkdirPopup, f, popup); self.app.view(&Id::SyncBrowsingMkdirPopup, f, popup);
} else if self.app.mounted(&Id::KeybindingsPopup) { } else if self.app.mounted(&Id::KeybindingsPopup) {
let popup = draw_area_in(f.size(), 50, 80); let popup = Popup(Size::Percentage(50), Size::Percentage(80)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::KeybindingsPopup, f, popup); self.app.view(&Id::KeybindingsPopup, f, popup);
@@ -890,7 +890,7 @@ impl FileTransferActivity {
/// Given the id of the component to display and the width and height of the total area, /// Given the id of the component to display and the width and height of the total area,
/// returns the height in percentage to the entire area height, that the popup should have /// returns the height in percentage to the entire area height, that the popup should have
fn calc_popup_height(&self, id: Id, width: u16, height: u16) -> u16 { fn calc_popup_height(&self, id: Id, width: u16, height: u16) -> Size {
// Get current text width // Get current text width
let text_width = self let text_width = self
.app .app
@@ -914,7 +914,7 @@ impl FileTransferActivity {
// Get amount of required rows NOTE: + 2 because of margins // Get amount of required rows NOTE: + 2 because of margins
let display_rows = ((text_width as f64) / (row_width as f64)).ceil() as u16 + 2; let display_rows = ((text_width as f64) / (row_width as f64)).ceil() as u16 + 2;
// Return height (row_height_p * display_rows) // Return height (row_height_p * display_rows)
display_rows * row_height_p Size::Percentage(display_rows * row_height_p)
} }
// -- global listener // -- global listener

View File

@@ -8,7 +8,7 @@ pub mod ssh_keys;
pub mod theme; pub mod theme;
use super::*; use super::*;
use crate::utils::ui::draw_area_in; use crate::utils::ui::{Popup, Size};
pub use setup::*; pub use setup::*;
pub use ssh_keys::*; pub use ssh_keys::*;
pub use theme::*; pub use theme::*;
@@ -117,23 +117,23 @@ impl SetupActivity {
pub(super) fn view_popups(&mut self, f: &mut Frame) { pub(super) fn view_popups(&mut self, f: &mut Frame) {
if self.app.mounted(&Id::Common(IdCommon::ErrorPopup)) { if self.app.mounted(&Id::Common(IdCommon::ErrorPopup)) {
let popup = draw_area_in(f.size(), 50, 10); let popup = Popup(Size::Percentage(50), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
// make popup // make popup
self.app.view(&Id::Common(IdCommon::ErrorPopup), f, popup); self.app.view(&Id::Common(IdCommon::ErrorPopup), f, popup);
} else if self.app.mounted(&Id::Common(IdCommon::QuitPopup)) { } else if self.app.mounted(&Id::Common(IdCommon::QuitPopup)) {
// make popup // make popup
let popup = draw_area_in(f.size(), 40, 10); let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
self.app.view(&Id::Common(IdCommon::QuitPopup), f, popup); self.app.view(&Id::Common(IdCommon::QuitPopup), f, popup);
} else if self.app.mounted(&Id::Common(IdCommon::Keybindings)) { } else if self.app.mounted(&Id::Common(IdCommon::Keybindings)) {
// make popup // make popup
let popup = draw_area_in(f.size(), 50, 70); let popup = Popup(Size::Percentage(50), Size::Percentage(70)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
self.app.view(&Id::Common(IdCommon::Keybindings), f, popup); self.app.view(&Id::Common(IdCommon::Keybindings), f, popup);
} else if self.app.mounted(&Id::Common(IdCommon::SavePopup)) { } else if self.app.mounted(&Id::Common(IdCommon::SavePopup)) {
// make popup // make popup
let popup = draw_area_in(f.size(), 30, 10); let popup = Popup(Size::Percentage(30), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
self.app.view(&Id::Common(IdCommon::SavePopup), f, popup); self.app.view(&Id::Common(IdCommon::SavePopup), f, popup);
} }

View File

@@ -5,7 +5,7 @@
// Locals // Locals
use super::{components, Context, Id, IdCommon, IdSsh, SetupActivity, ViewLayout}; use super::{components, Context, Id, IdCommon, IdSsh, SetupActivity, ViewLayout};
use crate::utils::ui::draw_area_in; use crate::utils::ui::{Popup, Size};
// Ext // Ext
use tuirealm::tui::layout::{Constraint, Direction, Layout}; use tuirealm::tui::layout::{Constraint, Direction, Layout};
@@ -45,11 +45,11 @@ impl SetupActivity {
// Popups // Popups
self.view_popups(f); self.view_popups(f);
if self.app.mounted(&Id::Ssh(IdSsh::DelSshKeyPopup)) { if self.app.mounted(&Id::Ssh(IdSsh::DelSshKeyPopup)) {
let popup = draw_area_in(f.size(), 30, 10); let popup = Popup(Size::Percentage(30), Size::Unit(3)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
self.app.view(&Id::Ssh(IdSsh::DelSshKeyPopup), f, popup); self.app.view(&Id::Ssh(IdSsh::DelSshKeyPopup), f, popup);
} else if self.app.mounted(&Id::Ssh(IdSsh::SshHost)) { } else if self.app.mounted(&Id::Ssh(IdSsh::SshHost)) {
let popup = draw_area_in(f.size(), 50, 20); let popup = Popup(Size::Percentage(50), Size::Percentage(20)).draw_in(f.size());
f.render_widget(Clear, popup); f.render_widget(Clear, popup);
let popup_chunks = Layout::default() let popup_chunks = Layout::default()
.direction(Direction::Vertical) .direction(Direction::Vertical)

View File

@@ -4,32 +4,54 @@
use tuirealm::tui::layout::{Constraint, Direction, Layout, Rect}; use tuirealm::tui::layout::{Constraint, Direction, Layout, Rect};
/// ### draw_area_in /// Size type for UI renders
/// #[derive(Debug, Copy, Clone, Eq, PartialEq)]
/// Draw an area (WxH / 3) in the middle of the parent area pub enum Size {
pub fn draw_area_in(parent: Rect, width: u16, height: u16) -> Rect { Percentage(u16),
let new_area = Layout::default() Unit(u16),
.direction(Direction::Vertical) }
.constraints(
[ /// Ui popup dialog (w x h)
Constraint::Percentage((100 - height) / 2), pub struct Popup(pub Size, pub Size);
Constraint::Percentage(height),
Constraint::Percentage((100 - height) / 2), impl Popup {
] /// Draw popup in provided area
.as_ref(), pub fn draw_in(&self, parent: Rect) -> Rect {
) let new_area = Layout::default()
.split(parent); .direction(Direction::Vertical)
Layout::default() .constraints(self.height(&parent).as_ref())
.direction(Direction::Horizontal) .split(parent);
.constraints( Layout::default()
[ .direction(Direction::Horizontal)
Constraint::Percentage((100 - width) / 2), .constraints(self.width(&parent).as_ref())
Constraint::Percentage(width), .split(new_area[1])[1]
Constraint::Percentage((100 - width) / 2), }
]
.as_ref(), fn height(&self, parent: &Rect) -> [Constraint; 3] {
) Self::constraints(parent.height, self.1)
.split(new_area[1])[1] }
fn width(&self, parent: &Rect) -> [Constraint; 3] {
Self::constraints(parent.width, self.0)
}
fn constraints(area_size: u16, popup_size: Size) -> [Constraint; 3] {
match popup_size {
Size::Percentage(popup_size) => [
Constraint::Percentage((100 - popup_size) / 2),
Constraint::Percentage(popup_size),
Constraint::Percentage((100 - popup_size) / 2),
],
Size::Unit(popup_size) => {
let margin = (area_size - popup_size) / 2;
[
Constraint::Length(margin),
Constraint::Length(popup_size),
Constraint::Length(margin),
]
}
}
}
} }
#[cfg(test)] #[cfg(test)]
@@ -42,7 +64,7 @@ mod tests {
#[test] #[test]
fn test_utils_ui_draw_area_in() { fn test_utils_ui_draw_area_in() {
let area: Rect = Rect::new(0, 0, 1024, 512); let area: Rect = Rect::new(0, 0, 1024, 512);
let child: Rect = draw_area_in(area, 75, 30); let child: Rect = Popup(Size::Percentage(75), Size::Percentage(30)).draw_in(area);
assert_eq!(child.x, 43); assert_eq!(child.x, 43);
assert_eq!(child.y, 63); assert_eq!(child.y, 63);
assert_eq!(child.width, 271); assert_eq!(child.width, 271);