drawing: Generalized foreach_visible_button

This commit is contained in:
Dorota Czaplejewicz
2020-02-02 18:29:29 +00:00
parent 40b79f6209
commit 416bc6163e
2 changed files with 33 additions and 28 deletions

View File

@ -47,22 +47,17 @@ mod c {
let layout = unsafe { &mut *layout }; let layout = unsafe { &mut *layout };
let cr = unsafe { cairo::Context::from_raw_none(cr) }; let cr = unsafe { cairo::Context::from_raw_none(cr) };
let (view_offset, view) = layout.get_current_view_position(); layout.foreach_visible_button(|offset, button| {
for (row_offset, row) in &view.get_rows() { let state = RefCell::borrow(&button.state).clone();
for (x_offset, button) in &row.buttons { if state.pressed == keyboard::PressType::Pressed || state.locked {
let state = RefCell::borrow(&button.state).clone(); render_button_at_position(
if state.pressed == keyboard::PressType::Pressed || state.locked { renderer, &cr,
render_button_at_position( offset,
renderer, &cr, button.as_ref(),
view_offset state.pressed, state.locked,
+ row_offset.clone() );
+ Point { x: *x_offset, y: 0.0 },
button.as_ref(),
state.pressed, state.locked,
);
}
} }
} })
} }
#[no_mangle] #[no_mangle]
@ -74,19 +69,15 @@ mod c {
) { ) {
let layout = unsafe { &mut *layout }; let layout = unsafe { &mut *layout };
let cr = unsafe { cairo::Context::from_raw_none(cr) }; let cr = unsafe { cairo::Context::from_raw_none(cr) };
let (view_offset, view) = layout.get_current_view_position();
for (row_offset, row) in &view.get_rows() { layout.foreach_visible_button(|offset, button| {
for (x_offset, button) in &row.buttons { render_button_at_position(
render_button_at_position( renderer, &cr,
renderer, &cr, offset,
view_offset button.as_ref(),
+ row_offset.clone() keyboard::PressType::Released, false,
+ Point { x: *x_offset, y: 0.0 }, );
button.as_ref(), })
keyboard::PressType::Released, false,
);
}
}
} }
} }

View File

@ -728,6 +728,20 @@ impl Layout {
let (offset, layout) = self.get_current_view_position(); let (offset, layout) = self.get_current_view_position();
layout.find_button_by_position(point - offset) layout.find_button_by_position(point - offset)
} }
pub fn foreach_visible_button<F>(&self, mut f: F)
where F: FnMut(c::Point, &Box<Button>)
{
let (view_offset, view) = self.get_current_view_position();
for (row_offset, row) in &view.get_rows() {
for (x_offset, button) in &row.buttons {
let offset = view_offset
+ row_offset.clone()
+ c::Point { x: *x_offset, y: 0.0 };
f(offset, button);
}
}
}
} }
mod procedures { mod procedures {