diff --git a/bracket-terminal/src/bterm.rs b/bracket-terminal/src/bterm.rs index e7af4efb..046ba01f 100755 --- a/bracket-terminal/src/bterm.rs +++ b/bracket-terminal/src/bterm.rs @@ -245,9 +245,10 @@ impl BTerm { self.width_pixels as f32 / max_sizes.0 as f32, self.height_pixels as f32 / max_sizes.1 as f32, ); + let global_offset = console.get_offset(); let mut offsets = ( - center_x as f32 * font_size.0 * (scale - 1.0), - center_y as f32 * font_size.1 * (scale - 1.0), + (center_x as f32 + global_offset.0) * font_size.0 * (scale - 1.0), + (center_y as f32 + global_offset.1) * font_size.1 * (scale - 1.0), ); let w: f32; @@ -261,12 +262,19 @@ impl BTerm { offsets.1 -= be.screen_scaler.gutter_top as f32; } - let extent_x = (pos.0 as f32 + offsets.0) / w; - let extent_y = (pos.1 as f32 + offsets.1) / h; + let mut global_offset = console.get_offset(); + global_offset.0 *= font_size.0 * scale; + global_offset.1 *= font_size.1 * scale; + + let extent_x = (pos.0 as f32 + offsets.0 - global_offset.0) / w; + let extent_y = (pos.1 as f32 + offsets.1 + global_offset.1) / h; let mouse_x = f32::min(extent_x * max_sizes.0 as f32, max_sizes.0 as f32 - 1.0); let mouse_y = f32::min(extent_y * max_sizes.1 as f32, max_sizes.1 as f32 - 1.0); - (i32::max(0, mouse_x as i32), i32::max(0, mouse_y as i32)) + ( + i32::max(-1, mouse_x.floor() as i32), + i32::max(-1, mouse_y.floor() as i32), + ) } /// Applies the current physical mouse position to the active console, and translates the coordinates into that console's coordinate space. @@ -354,13 +362,16 @@ impl BTerm { /// Internal: mark a mouse press pub(crate) fn on_mouse_button(&mut self, button_num: usize, pressed: bool) { - if button_num == 0 { - self.left_click = true; - } let mut input = INPUT.lock(); if pressed { + if button_num == 0 { + self.left_click = true; + } input.on_mouse_button_down(button_num); } else { + if button_num == 0 { + self.left_click = false; + } input.on_mouse_button_up(button_num); } input.push_event(BEvent::MouseClick { diff --git a/bracket-terminal/src/consoles/console.rs b/bracket-terminal/src/consoles/console.rs index dea81be3..9dcb4cd0 100755 --- a/bracket-terminal/src/consoles/console.rs +++ b/bracket-terminal/src/consoles/console.rs @@ -135,6 +135,10 @@ pub trait Console { /// drawing walls between tiles. fn set_offset(&mut self, x: f32, y: f32); + /// Return the current global offset (by character count, so 0.5 is half a character). Useful for + /// calculating mouse position. + fn get_offset(&self) -> (f32, f32); + /// Specify a scale and center of the console. /// A scale above 1.0 will make the text larger. /// The center of the scale is at character position (center_x, center_y). diff --git a/bracket-terminal/src/consoles/flexible_console.rs b/bracket-terminal/src/consoles/flexible_console.rs index 76ed3433..b1766570 100755 --- a/bracket-terminal/src/consoles/flexible_console.rs +++ b/bracket-terminal/src/consoles/flexible_console.rs @@ -5,9 +5,8 @@ use crate::prelude::{ use bracket_color::prelude::RGBA; use bracket_geometry::prelude::{PointF, Rect}; use bracket_rex::prelude::XpColor; -use ultraviolet::Vec2; - use std::any::Any; +use ultraviolet::Vec2; /// Internal storage structure for sparse tiles. pub struct FlexiTile { @@ -396,6 +395,12 @@ impl Console for FlexiConsole { self.offset_y = y * (2.0 / self.height as f32); } + fn get_offset(&self) -> (f32, f32) { + let x = self.offset_x / (2.0 / self.width as f32); + let y = self.offset_y / (2.0 / self.height as f32); + (x, y) + } + fn set_scale(&mut self, scale: f32, center_x: i32, center_y: i32) { self.is_dirty = true; self.scale = scale; diff --git a/bracket-terminal/src/consoles/simple_console.rs b/bracket-terminal/src/consoles/simple_console.rs index 66f7b053..f15a5cb7 100755 --- a/bracket-terminal/src/consoles/simple_console.rs +++ b/bracket-terminal/src/consoles/simple_console.rs @@ -327,6 +327,12 @@ impl Console for SimpleConsole { self.offset_y = y * (2.0 / self.height as f32); } + fn get_offset(&self) -> (f32, f32) { + let x = self.offset_x / (2.0 / self.width as f32); + let y = self.offset_y / (2.0 / self.height as f32); + (x, y) + } + fn set_scale(&mut self, scale: f32, center_x: i32, center_y: i32) { self.is_dirty = true; self.scale = scale; diff --git a/bracket-terminal/src/consoles/sparse_console.rs b/bracket-terminal/src/consoles/sparse_console.rs index e6afe949..3387f62a 100755 --- a/bracket-terminal/src/consoles/sparse_console.rs +++ b/bracket-terminal/src/consoles/sparse_console.rs @@ -359,6 +359,12 @@ impl Console for SparseConsole { self.offset_y = y * (2.0 / self.height as f32); } + fn get_offset(&self) -> (f32, f32) { + let x = self.offset_x / (2.0 / self.width as f32); + let y = self.offset_y / (2.0 / self.height as f32); + (x, y) + } + fn set_scale(&mut self, scale: f32, center_x: i32, center_y: i32) { self.is_dirty = true; self.scale = scale; diff --git a/bracket-terminal/src/consoles/sprite_console.rs b/bracket-terminal/src/consoles/sprite_console.rs index c36264ab..935449f0 100755 --- a/bracket-terminal/src/consoles/sprite_console.rs +++ b/bracket-terminal/src/consoles/sprite_console.rs @@ -224,6 +224,10 @@ impl Console for SpriteConsole { /// character size; so -0.5 will offset half a character to the left/top. fn set_offset(&mut self, _x: f32, _y: f32) {} + fn get_offset(&self) -> (f32, f32) { + (0.0, 0.0) + } + fn set_scale(&mut self, _scale: f32, _center_x: i32, _center_y: i32) {} fn get_scale(&self) -> (f32, i32, i32) { diff --git a/bracket-terminal/src/consoles/virtual_console.rs b/bracket-terminal/src/consoles/virtual_console.rs index 048dcac1..80ecdc24 100755 --- a/bracket-terminal/src/consoles/virtual_console.rs +++ b/bracket-terminal/src/consoles/virtual_console.rs @@ -378,6 +378,10 @@ impl Console for VirtualConsole { panic!("Unsupported on virtual consoles."); } + fn get_offset(&self) -> (f32, f32) { + (0.0, 0.0) + } + fn set_scale(&mut self, _scale: f32, _center_x: i32, _center_y: i32) { panic!("Unsupported on virtual consoles."); }