Popup screen can display large texts
This commit is contained in:
		
							
								
								
									
										25
									
								
								rust/Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										25
									
								
								rust/Cargo.lock
									
									
									
										generated
									
									
									
								
							@@ -471,6 +471,7 @@ dependencies = [
 | 
				
			|||||||
 "num-derive",
 | 
					 "num-derive",
 | 
				
			||||||
 "num-traits",
 | 
					 "num-traits",
 | 
				
			||||||
 "sea_battle_backend",
 | 
					 "sea_battle_backend",
 | 
				
			||||||
 | 
					 "textwrap",
 | 
				
			||||||
 "tokio",
 | 
					 "tokio",
 | 
				
			||||||
 "tui",
 | 
					 "tui",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
@@ -809,6 +810,9 @@ name = "hashbrown"
 | 
				
			|||||||
version = "0.12.3"
 | 
					version = "0.12.3"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
 | 
					checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
 | 
				
			||||||
 | 
					dependencies = [
 | 
				
			||||||
 | 
					 "ahash",
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "heck"
 | 
					name = "heck"
 | 
				
			||||||
@@ -1469,6 +1473,12 @@ version = "1.9.0"
 | 
				
			|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1"
 | 
					checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "smawk"
 | 
				
			||||||
 | 
					version = "0.3.1"
 | 
				
			||||||
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
 | 
					checksum = "f67ad224767faa3c7d8b6d91985b78e70a1324408abcb1cfcc2be4c06bc06043"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "socket2"
 | 
					name = "socket2"
 | 
				
			||||||
version = "0.4.7"
 | 
					version = "0.4.7"
 | 
				
			||||||
@@ -1510,6 +1520,11 @@ name = "textwrap"
 | 
				
			|||||||
version = "0.15.1"
 | 
					version = "0.15.1"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "949517c0cf1bf4ee812e2e07e08ab448e3ae0d23472aee8a06c985f0c8815b16"
 | 
					checksum = "949517c0cf1bf4ee812e2e07e08ab448e3ae0d23472aee8a06c985f0c8815b16"
 | 
				
			||||||
 | 
					dependencies = [
 | 
				
			||||||
 | 
					 "smawk",
 | 
				
			||||||
 | 
					 "unicode-linebreak",
 | 
				
			||||||
 | 
					 "unicode-width",
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "thiserror"
 | 
					name = "thiserror"
 | 
				
			||||||
@@ -1693,6 +1708,16 @@ version = "1.0.4"
 | 
				
			|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "dcc811dc4066ac62f84f11307873c4850cb653bfa9b1719cee2bd2204a4bc5dd"
 | 
					checksum = "dcc811dc4066ac62f84f11307873c4850cb653bfa9b1719cee2bd2204a4bc5dd"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "unicode-linebreak"
 | 
				
			||||||
 | 
					version = "0.1.4"
 | 
				
			||||||
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
 | 
					checksum = "c5faade31a542b8b35855fff6e8def199853b2da8da256da52f52f1316ee3137"
 | 
				
			||||||
 | 
					dependencies = [
 | 
				
			||||||
 | 
					 "hashbrown",
 | 
				
			||||||
 | 
					 "regex",
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "unicode-normalization"
 | 
					name = "unicode-normalization"
 | 
				
			||||||
version = "0.1.22"
 | 
					version = "0.1.22"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,4 +16,5 @@ lazy_static = "1.4.0"
 | 
				
			|||||||
tokio = "1.21.2"
 | 
					tokio = "1.21.2"
 | 
				
			||||||
num = "0.4.0"
 | 
					num = "0.4.0"
 | 
				
			||||||
num-traits = "0.2.15"
 | 
					num-traits = "0.2.15"
 | 
				
			||||||
num-derive = "0.3.3"
 | 
					num-derive = "0.3.3"
 | 
				
			||||||
 | 
					textwrap = "0.15.1"
 | 
				
			||||||
@@ -22,7 +22,7 @@ async fn run_app<B: Backend>(terminal: &mut Terminal<B>) -> Result<(), Box<dyn E
 | 
				
			|||||||
    /*let mut rules = GameRules::default();
 | 
					    /*let mut rules = GameRules::default();
 | 
				
			||||||
    rules.boats_can_touch = true;
 | 
					    rules.boats_can_touch = true;
 | 
				
			||||||
    let res = set_boats_layout::set_boat_layout(&rules, terminal)?; // select_bot_type::select_bot_type(terminal)?;*/
 | 
					    let res = set_boats_layout::set_boat_layout(&rules, terminal)?; // select_bot_type::select_bot_type(terminal)?;*/
 | 
				
			||||||
    let res = popup_screen::popup_screen("Hello you are my guest today!", terminal);
 | 
					    let res = popup_screen::popup_screen("Hi\nWelcome there", terminal);
 | 
				
			||||||
    Err(io::Error::new(
 | 
					    Err(io::Error::new(
 | 
				
			||||||
        ErrorKind::Other,
 | 
					        ErrorKind::Other,
 | 
				
			||||||
        format!("result: {:?}", res),
 | 
					        format!("result: {:?}", res),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,6 @@ use crossterm::event;
 | 
				
			|||||||
use crossterm::event::{Event, KeyCode};
 | 
					use crossterm::event::{Event, KeyCode};
 | 
				
			||||||
use tui::backend::Backend;
 | 
					use tui::backend::Backend;
 | 
				
			||||||
use tui::layout::*;
 | 
					use tui::layout::*;
 | 
				
			||||||
use tui::style::*;
 | 
					 | 
				
			||||||
use tui::text::*;
 | 
					use tui::text::*;
 | 
				
			||||||
use tui::widgets::*;
 | 
					use tui::widgets::*;
 | 
				
			||||||
use tui::{Frame, Terminal};
 | 
					use tui::{Frame, Terminal};
 | 
				
			||||||
@@ -55,7 +54,11 @@ pub fn popup_screen<B: Backend>(
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn ui<B: Backend>(f: &mut Frame<B>, model: &mut PopupScreen) {
 | 
					fn ui<B: Backend>(f: &mut Frame<B>, model: &mut PopupScreen) {
 | 
				
			||||||
    let area = centered_rect_size(model.msg.len() as u16 + 2, 5, &f.size());
 | 
					    // Preprocess message
 | 
				
			||||||
 | 
					    let lines = textwrap::wrap(model.msg, f.size().width as usize - 20);
 | 
				
			||||||
 | 
					    let line_max_len = lines.iter().map(|l| l.len()).max().unwrap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let area = centered_rect_size(line_max_len as u16 + 4, 5 + lines.len() as u16, &f.size());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let block = Block::default().borders(Borders::ALL).title(model.title);
 | 
					    let block = Block::default().borders(Borders::ALL).title(model.title);
 | 
				
			||||||
    f.render_widget(block, area);
 | 
					    f.render_widget(block, area);
 | 
				
			||||||
@@ -63,14 +66,24 @@ fn ui<B: Backend>(f: &mut Frame<B>, model: &mut PopupScreen) {
 | 
				
			|||||||
    // Create two chunks with equal horizontal screen space
 | 
					    // Create two chunks with equal horizontal screen space
 | 
				
			||||||
    let chunks = Layout::default()
 | 
					    let chunks = Layout::default()
 | 
				
			||||||
        .direction(Direction::Vertical)
 | 
					        .direction(Direction::Vertical)
 | 
				
			||||||
        .constraints([Constraint::Percentage(70), Constraint::Percentage(30)].as_ref())
 | 
					        .constraints(
 | 
				
			||||||
 | 
					            [
 | 
				
			||||||
 | 
					                Constraint::Length(lines.len() as u16),
 | 
				
			||||||
 | 
					                Constraint::Length(3),
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					            .as_ref(),
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
        .split(area.inner(&Margin {
 | 
					        .split(area.inner(&Margin {
 | 
				
			||||||
            horizontal: 1,
 | 
					            horizontal: 2,
 | 
				
			||||||
            vertical: 1,
 | 
					            vertical: 1,
 | 
				
			||||||
        }));
 | 
					        }));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let text = Paragraph::new(model.msg);
 | 
					    let text = lines
 | 
				
			||||||
    f.render_widget(text, chunks[0]);
 | 
					        .iter()
 | 
				
			||||||
 | 
					        .map(|s| Spans::from(s.as_ref()))
 | 
				
			||||||
 | 
					        .collect::<Vec<_>>();
 | 
				
			||||||
 | 
					    let paragraph = Paragraph::new(text);
 | 
				
			||||||
 | 
					    f.render_widget(paragraph, chunks[0]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let ok_button = ButtonWidget::new("OK", true);
 | 
					    let ok_button = ButtonWidget::new("OK", true);
 | 
				
			||||||
    f.render_widget(ok_button, chunks[1]);
 | 
					    f.render_widget(ok_button, chunks[1]);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user