row: Move generic functions out of the C ghetto
This commit is contained in:
@ -27,10 +27,10 @@ pub mod c {
|
|||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct Bounds {
|
pub struct Bounds {
|
||||||
x: f64,
|
pub x: f64,
|
||||||
y: f64,
|
pub y: f64,
|
||||||
width: f64,
|
pub width: f64,
|
||||||
height: f64
|
pub height: f64
|
||||||
}
|
}
|
||||||
|
|
||||||
type ButtonCallback = unsafe extern "C" fn(button: *mut ::layout::Button, data: *mut UserData);
|
type ButtonCallback = unsafe extern "C" fn(button: *mut ::layout::Button, data: *mut UserData);
|
||||||
@ -272,8 +272,6 @@ pub mod c {
|
|||||||
) -> Bounds;
|
) -> Bounds;
|
||||||
}
|
}
|
||||||
|
|
||||||
const BUTTON_SPACING: f64 = 4.0;
|
|
||||||
|
|
||||||
fn squeek_buttons_get_outlines(
|
fn squeek_buttons_get_outlines(
|
||||||
buttons: &Vec<Box<Button>>,
|
buttons: &Vec<Box<Button>>,
|
||||||
keyboard: *const LevelKeyboard,
|
keyboard: *const LevelKeyboard,
|
||||||
@ -295,47 +293,9 @@ pub mod c {
|
|||||||
) {
|
) {
|
||||||
let row = unsafe { &mut *row };
|
let row = unsafe { &mut *row };
|
||||||
|
|
||||||
// Size buttons
|
|
||||||
let sizes = squeek_buttons_get_outlines(&row.buttons, keyboard);
|
let sizes = squeek_buttons_get_outlines(&row.buttons, keyboard);
|
||||||
|
|
||||||
for (mut button, bounds) in &mut row.buttons.iter_mut().zip(sizes) {
|
row.place_buttons_with_sizes(sizes);
|
||||||
button.bounds = Some(bounds);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Place buttons
|
|
||||||
let max_height = row.buttons.iter().map(
|
|
||||||
|button| FloatOrd(
|
|
||||||
button.bounds.as_ref().unwrap().height
|
|
||||||
)
|
|
||||||
).max()
|
|
||||||
.unwrap_or(FloatOrd(0f64))
|
|
||||||
.0;
|
|
||||||
|
|
||||||
row.buttons.iter_mut().fold(0f64, |acc, button| {
|
|
||||||
let mut bounds = button.bounds.as_mut().unwrap();
|
|
||||||
bounds.x = acc;
|
|
||||||
acc + bounds.width + BUTTON_SPACING
|
|
||||||
});
|
|
||||||
|
|
||||||
let total_width = match row.buttons.is_empty() {
|
|
||||||
true => 0f64,
|
|
||||||
false => {
|
|
||||||
let last_button = &row.buttons[row.buttons.len() - 1];
|
|
||||||
let bounds = last_button.bounds.as_ref().unwrap();
|
|
||||||
bounds.x + bounds.width
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
let old_row_bounds = row.bounds.as_ref().unwrap().clone();
|
|
||||||
row.bounds = Some(Bounds {
|
|
||||||
// FIXME: do centering of each row based on keyboard dimensions,
|
|
||||||
// one level up the iterators
|
|
||||||
// now centering by comparing previous width to the new, calculated one
|
|
||||||
x: (old_row_bounds.width - total_width) / 2f64,
|
|
||||||
width: total_width,
|
|
||||||
height: max_height,
|
|
||||||
..old_row_bounds
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Finds a button sharing this state
|
/// Finds a button sharing this state
|
||||||
@ -398,8 +358,54 @@ pub struct Button {
|
|||||||
pub state: Rc<RefCell<KeyState>>,
|
pub state: Rc<RefCell<KeyState>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const BUTTON_SPACING: f64 = 4.0;
|
||||||
|
|
||||||
pub struct Row {
|
pub struct Row {
|
||||||
buttons: Vec<Box<Button>>,
|
buttons: Vec<Box<Button>>,
|
||||||
angle: i32,
|
angle: i32,
|
||||||
bounds: Option<c::Bounds>,
|
bounds: Option<c::Bounds>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Row {
|
||||||
|
fn place_buttons_with_sizes(&mut self, sizes: Vec<c::Bounds>) {
|
||||||
|
for (mut button, bounds) in &mut self.buttons.iter_mut().zip(sizes) {
|
||||||
|
button.bounds = Some(bounds);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Place buttons
|
||||||
|
let max_height = self.buttons.iter().map(
|
||||||
|
|button| FloatOrd(
|
||||||
|
button.bounds.as_ref().unwrap().height
|
||||||
|
)
|
||||||
|
).max()
|
||||||
|
.unwrap_or(FloatOrd(0f64))
|
||||||
|
.0;
|
||||||
|
|
||||||
|
self.buttons.iter_mut().fold(0f64, |acc, button| {
|
||||||
|
let mut bounds = button.bounds.as_mut().unwrap();
|
||||||
|
bounds.x = acc;
|
||||||
|
acc + bounds.width + BUTTON_SPACING
|
||||||
|
});
|
||||||
|
|
||||||
|
let total_width = match self.buttons.is_empty() {
|
||||||
|
true => 0f64,
|
||||||
|
false => {
|
||||||
|
let last_button = &self.buttons[self.buttons.len() - 1];
|
||||||
|
let bounds = last_button.bounds.as_ref().unwrap();
|
||||||
|
bounds.x + bounds.width
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
let old_row_bounds = self.bounds.as_ref().unwrap().clone();
|
||||||
|
self.bounds = Some(c::Bounds {
|
||||||
|
// FIXME: do centering of each row based on keyboard dimensions,
|
||||||
|
// one level up the iterators
|
||||||
|
// now centering by comparing previous width to the new, calculated one
|
||||||
|
x: (old_row_bounds.width - total_width) / 2f64,
|
||||||
|
width: total_width,
|
||||||
|
height: max_height,
|
||||||
|
..old_row_bounds
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user