mouse input

This commit is contained in:
2025-07-03 09:44:28 -05:00
parent cb74ac1ddc
commit 2f9d52e15e
7 changed files with 71 additions and 18 deletions
+6 -3
View File
@@ -1,11 +1,14 @@
pub mod mouse;
pub mod tick;
pub mod velocity;
use std::sync::Arc;
use crate::widget::Widget;
use minifb::Window;
use crate::{style::RawTransform, widget::Widget};
pub trait Extension {
fn init(&self, _widgets: &Vec<Arc<Widget>>) {}
fn render(&self, _widget: &Arc<Widget>) {}
fn init(&mut self, _widgets: &Vec<Arc<Widget>>) {}
fn render(&mut self, _widgets: &Arc<Widget>, _transform: RawTransform, _win: &Window) {}
}
+44
View File
@@ -0,0 +1,44 @@
use std::sync::Arc;
use minifb::{MouseButton, Window};
use crate::{component, extensions::Extension, style::RawTransform, widget::Widget};
pub struct MouseExtension(bool);
impl Extension for MouseExtension {
fn render(&mut self, widget: &Arc<Widget>, transform: RawTransform, win: &Window) {
if win.get_mouse_down(MouseButton::Left) {
if !self.0 {
self.0 = true;
if let Some((mx, my)) = win.get_mouse_pos(minifb::MouseMode::Discard) {
let (mx, my) = (mx as usize, my as usize);
if mx >= transform.x
&& my >= transform.y
&& mx <= transform.x + transform.width
&& mx <= transform.y + transform.height
{
std::thread::spawn({
let widget = widget.clone();
move || {
if let Some(on_click) = widget.get::<OnClick>() {
(on_click.0)(&widget)
}
}
});
}
}
}
} else {
self.0 = false;
}
}
}
impl MouseExtension {
pub fn new() -> Self {
MouseExtension(false)
}
}
component!(OnClick(pub fn(&Arc<Widget>)));
+1 -1
View File
@@ -5,7 +5,7 @@ use crate::{component, extensions::Extension, widget::Widget};
pub struct TickExtension(pub usize);
impl Extension for TickExtension {
fn init(&self, widgets: &Vec<Arc<Widget>>) {
fn init(&mut self, widgets: &Vec<Arc<Widget>>) {
let rate_dur = 1000 / self.0 as u64;
std::thread::spawn({
let widgets = widgets.clone();
+1 -1
View File
@@ -42,7 +42,7 @@ impl VelocityExtension {
}
impl Extension for VelocityExtension {
fn init(&self, widgets: &Vec<Arc<Widget>>) {
fn init(&mut self, widgets: &Vec<Arc<Widget>>) {
std::thread::spawn({
let widgets = widgets.clone();
move || {
+10 -12
View File
@@ -1,4 +1,4 @@
use std::sync::Arc;
use std::sync::{Arc, Mutex};
use minifb::Window;
@@ -20,7 +20,7 @@ pub mod widget;
pub struct Screen {
window: Window,
pub widgets: Vec<Arc<Widget>>,
extensions: Vec<Arc<Box<dyn Extension>>>,
extensions: Vec<Arc<Mutex<Box<dyn Extension>>>>,
}
impl Screen {
@@ -38,7 +38,7 @@ impl Screen {
}
pub fn extension<E: Extension + 'static>(&mut self, ext: E) {
self.extensions.push(Arc::new(Box::new(ext)));
self.extensions.push(Arc::new(Mutex::new(Box::new(ext))));
}
pub fn run(&mut self) -> std::io::Result<()> {
@@ -47,7 +47,7 @@ impl Screen {
}
for ext in &self.extensions {
ext.init(&self.widgets);
ext.lock().unwrap().init(&self.widgets);
}
while self.window.is_open() {
@@ -68,13 +68,18 @@ impl Screen {
scope.set_transform(&t);
}
self.render_extension(elem.clone()).unwrap();
elem.0.lock().unwrap().render(&mut scope);
if let Some(t) = elem.get() {
scope.set_transform(&t);
}
for ext in &self.extensions {
ext.lock()
.unwrap()
.render(elem, scope.get_transform(), &self.window);
}
scope.draw();
}
@@ -82,11 +87,4 @@ impl Screen {
.update_with_buffer(&scope.get_buffer1d(), w, h)
.unwrap();
}
pub fn render_extension(&self, wi: Arc<Widget>) -> std::io::Result<()> {
for ext in &self.extensions {
ext.render(&wi);
}
Ok(())
}
}
+5 -1
View File
@@ -1,6 +1,9 @@
use minifb::{Window, WindowOptions};
use osgui::{
elements::div::Div, extensions::velocity::VelocityExtension, style::Transform, Screen,
elements::div::Div,
extensions::{mouse::MouseExtension, velocity::VelocityExtension},
style::Transform,
Screen,
};
fn main() {
@@ -17,6 +20,7 @@ fn main() {
let mut app = Screen::new(window);
app.extension(VelocityExtension);
app.extension(MouseExtension::new());
let mut d = Div::new();
+4
View File
@@ -147,6 +147,10 @@ impl RenderScope {
transform.use_position(self.parent_width, self.parent_height, &mut self.transform);
}
pub fn get_transform(&mut self) -> RawTransform {
self.transform.clone()
}
pub fn update_size(&mut self) {
self.max_size.0 = self.max_size.0.max(self.transform.width);
self.max_size.1 = self.max_size.1.max(self.transform.height);