Show popup message while connecting to server
This commit is contained in:
		@@ -1,3 +1,5 @@
 | 
				
			|||||||
 | 
					extern crate core;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub mod cli_args;
 | 
					pub mod cli_args;
 | 
				
			||||||
pub mod client;
 | 
					pub mod client;
 | 
				
			||||||
pub mod constants;
 | 
					pub mod constants;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,6 +17,7 @@ use cli_player::client::Client;
 | 
				
			|||||||
use cli_player::server::start_server_if_missing;
 | 
					use cli_player::server::start_server_if_missing;
 | 
				
			||||||
use cli_player::ui_screens::configure_game_rules::GameRulesConfigurationScreen;
 | 
					use cli_player::ui_screens::configure_game_rules::GameRulesConfigurationScreen;
 | 
				
			||||||
use cli_player::ui_screens::game_screen::GameScreen;
 | 
					use cli_player::ui_screens::game_screen::GameScreen;
 | 
				
			||||||
 | 
					use cli_player::ui_screens::popup_screen::PopupScreen;
 | 
				
			||||||
use cli_player::ui_screens::select_play_mode::{SelectPlayModeResult, SelectPlayModeScreen};
 | 
					use cli_player::ui_screens::select_play_mode::{SelectPlayModeResult, SelectPlayModeScreen};
 | 
				
			||||||
use cli_player::ui_screens::*;
 | 
					use cli_player::ui_screens::*;
 | 
				
			||||||
use sea_battle_backend::data::GameRules;
 | 
					use sea_battle_backend::data::GameRules;
 | 
				
			||||||
@@ -90,6 +91,7 @@ async fn run_app<B: Backend>(terminal: &mut Terminal<B>) -> Result<(), Box<dyn E
 | 
				
			|||||||
                };
 | 
					                };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                // Then connect to server
 | 
					                // Then connect to server
 | 
				
			||||||
 | 
					                PopupScreen::new("Connecting...").show_once(terminal)?;
 | 
				
			||||||
                let client = Client::start_bot_play(&rules).await?;
 | 
					                let client = Client::start_bot_play(&rules).await?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                // Wait for the server to become ready
 | 
					                // Wait for the server to become ready
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,6 +17,7 @@ use crate::ui_widgets::button_widget::ButtonWidget;
 | 
				
			|||||||
pub struct PopupScreen<'a> {
 | 
					pub struct PopupScreen<'a> {
 | 
				
			||||||
    title: &'a str,
 | 
					    title: &'a str,
 | 
				
			||||||
    msg: &'a str,
 | 
					    msg: &'a str,
 | 
				
			||||||
 | 
					    can_close: bool,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl<'a> PopupScreen<'a> {
 | 
					impl<'a> PopupScreen<'a> {
 | 
				
			||||||
@@ -24,9 +25,15 @@ impl<'a> PopupScreen<'a> {
 | 
				
			|||||||
        Self {
 | 
					        Self {
 | 
				
			||||||
            title: "Message",
 | 
					            title: "Message",
 | 
				
			||||||
            msg,
 | 
					            msg,
 | 
				
			||||||
 | 
					            can_close: true,
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn set_can_close(mut self, can_close: bool) -> Self {
 | 
				
			||||||
 | 
					        self.can_close = can_close;
 | 
				
			||||||
 | 
					        self
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn show<B: Backend>(mut self, terminal: &mut Terminal<B>) -> io::Result<ScreenResult<()>> {
 | 
					    pub fn show<B: Backend>(mut self, terminal: &mut Terminal<B>) -> io::Result<ScreenResult<()>> {
 | 
				
			||||||
        let mut last_tick = Instant::now();
 | 
					        let mut last_tick = Instant::now();
 | 
				
			||||||
        loop {
 | 
					        loop {
 | 
				
			||||||
@@ -53,12 +60,27 @@ impl<'a> PopupScreen<'a> {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Show message once message, without polling messages
 | 
				
			||||||
 | 
					    pub fn show_once<B: Backend>(mut self, terminal: &mut Terminal<B>) -> io::Result<()> {
 | 
				
			||||||
 | 
					        self.can_close = false;
 | 
				
			||||||
 | 
					        terminal.draw(|f| self.ui(f))?;
 | 
				
			||||||
 | 
					        Ok(())
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn ui<B: Backend>(&mut self, f: &mut Frame<B>) {
 | 
					    fn ui<B: Backend>(&mut self, f: &mut Frame<B>) {
 | 
				
			||||||
        // Preprocess message
 | 
					        // Preprocess message
 | 
				
			||||||
        let lines = textwrap::wrap(self.msg, f.size().width as usize - 20);
 | 
					        let lines = textwrap::wrap(self.msg, f.size().width as usize - 20);
 | 
				
			||||||
        let line_max_len = lines.iter().map(|l| l.len()).max().unwrap();
 | 
					        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 area = centered_rect_size(
 | 
				
			||||||
 | 
					            line_max_len as u16 + 4,
 | 
				
			||||||
 | 
					            match self.can_close {
 | 
				
			||||||
 | 
					                // reserve space for button
 | 
				
			||||||
 | 
					                true => 5,
 | 
				
			||||||
 | 
					                false => 2,
 | 
				
			||||||
 | 
					            } + lines.len() as u16,
 | 
				
			||||||
 | 
					            &f.size(),
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let block = Block::default().borders(Borders::ALL).title(self.title);
 | 
					        let block = Block::default().borders(Borders::ALL).title(self.title);
 | 
				
			||||||
        f.render_widget(block, area);
 | 
					        f.render_widget(block, area);
 | 
				
			||||||
@@ -85,7 +107,9 @@ impl<'a> PopupScreen<'a> {
 | 
				
			|||||||
        let paragraph = Paragraph::new(text);
 | 
					        let paragraph = Paragraph::new(text);
 | 
				
			||||||
        f.render_widget(paragraph, chunks[0]);
 | 
					        f.render_widget(paragraph, chunks[0]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let ok_button = ButtonWidget::new("OK", true);
 | 
					        if self.can_close {
 | 
				
			||||||
        f.render_widget(ok_button, chunks[1]);
 | 
					            let ok_button = ButtonWidget::new("OK", true);
 | 
				
			||||||
 | 
					            f.render_widget(ok_button, chunks[1]);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user