1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
use super::messagebox::messagebox; use crate::event::{ConfirmEvent, WaitEvent}; use crate::{Result, TileProvider}; use anyhow::anyhow; use sdl2::{ rect::{Point, Rect}, render::WindowCanvas, surface::Surface, EventPump, }; pub fn show( canvas: &mut WindowCanvas, tileprovider: &dyn TileProvider, text: &str, event_pump: &mut EventPump, ) -> Result<()> { let texture_creator = canvas.texture_creator(); let messagebox = messagebox(text, tileprovider, &texture_creator)?; let surface = canvas .window() .surface(event_pump) .map_err(|s| anyhow!(s))?; let destrect = Rect::from_center( Point::new( surface.width() as i32 / 2, surface.height() as i32 / 2, ), messagebox.width(), messagebox.height(), ); let mut background_backup = Surface::new( destrect.width(), destrect.height(), surface.pixel_format_enum(), ) .map_err(|s| anyhow!(s))?; surface .blit(destrect, &mut background_backup, None) .map_err(|s| anyhow!(s))?; canvas .copy(&messagebox.as_texture(&texture_creator)?, None, destrect) .map_err(|s| anyhow!(s))?; canvas.present(); loop { match ConfirmEvent::wait(event_pump)? { ConfirmEvent::Confirmed | ConfirmEvent::Aborted => { canvas .copy( &background_backup.as_texture(&texture_creator)?, None, destrect, ) .map_err(|s| anyhow!(s))?; canvas.present(); return Ok(()); } ConfirmEvent::RefreshScreen => { canvas.present(); } } } } #[derive(Default)] pub struct InfoMessageQueue { messages: Vec<String>, } impl InfoMessageQueue { pub fn new() -> Self { InfoMessageQueue { messages: Vec::new(), } } pub fn process( &mut self, canvas: &mut WindowCanvas, tileprovider: &dyn TileProvider, event_pump: &mut EventPump, ) -> Result<()> { for message in self.messages.drain(..) { show(canvas, tileprovider, &message, event_pump)?; } Ok(()) } pub fn push_back(&mut self, msg: String) { self.messages.push(msg); } }