Move button finding to view
This commit is contained in:
@ -498,7 +498,7 @@ on_button_pressed (struct squeek_button *button,
|
||||
|
||||
struct button_place place = {
|
||||
.button = button,
|
||||
.row = eek_keyboard_get_row(view, button),
|
||||
.row = squeek_view_get_row(view, button),
|
||||
};
|
||||
if (!place.row) {
|
||||
return;
|
||||
|
||||
@ -294,26 +294,6 @@ struct GetRowData {
|
||||
struct squeek_key *needle;
|
||||
};
|
||||
|
||||
void find_button_in_row(struct squeek_row *row, gpointer user_data) {
|
||||
struct GetRowData *data = user_data;
|
||||
if (data->row) {
|
||||
return;
|
||||
}
|
||||
if (squeek_row_contains(row, data->button)) {
|
||||
data->row = row;
|
||||
}
|
||||
}
|
||||
|
||||
struct squeek_row *eek_keyboard_get_row(struct squeek_view *view,
|
||||
struct squeek_button *button) {
|
||||
struct GetRowData data = {
|
||||
.button = button,
|
||||
.row = NULL,
|
||||
};
|
||||
squeek_view_foreach(view, find_button_in_row, &data);
|
||||
return data.row;
|
||||
}
|
||||
|
||||
void find_key_in_row(struct squeek_row *row, gpointer user_data) {
|
||||
struct GetRowData *data = user_data;
|
||||
if (data->button) {
|
||||
|
||||
@ -61,8 +61,6 @@ struct _LevelKeyboard {
|
||||
};
|
||||
typedef struct _LevelKeyboard LevelKeyboard;
|
||||
|
||||
struct squeek_row *eek_keyboard_get_row(struct squeek_view *view,
|
||||
struct squeek_button *button);
|
||||
struct squeek_button *eek_keyboard_find_button_by_name(LevelKeyboard *keyboard,
|
||||
const gchar *name);
|
||||
|
||||
|
||||
@ -68,6 +68,8 @@ void squeek_view_foreach(struct squeek_view*,
|
||||
RowCallback callback,
|
||||
gpointer user_data);
|
||||
|
||||
struct squeek_row *squeek_view_get_row(struct squeek_view *view,
|
||||
struct squeek_button *button);
|
||||
|
||||
void squeek_row_place_buttons(struct squeek_row *row, LevelKeyboard *keyboard);
|
||||
#endif
|
||||
|
||||
@ -185,19 +185,6 @@ pub mod c {
|
||||
let row = unsafe { &mut *row };
|
||||
row.bounds = Some(bounds);
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C"
|
||||
fn squeek_row_contains(
|
||||
row: *mut ::layout::Row,
|
||||
needle: *const ::layout::Button,
|
||||
) -> u32 {
|
||||
let row = unsafe { &mut *row };
|
||||
row.buttons.iter().position(
|
||||
// TODO: wrap Button properly in Rc; this comparison is unreliable
|
||||
|button| button.as_ref() as *const ::layout::Button == needle
|
||||
).is_some() as u32
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C"
|
||||
@ -413,12 +400,54 @@ pub mod c {
|
||||
None => ptr::null_mut(),
|
||||
}
|
||||
}
|
||||
|
||||
fn squeek_row_contains(row: &Row, needle: *const Button) -> bool {
|
||||
row.buttons.iter().position(
|
||||
// TODO: wrap Button properly in Rc; this comparison is unreliable
|
||||
|button| button.as_ref() as *const ::layout::Button == needle
|
||||
).is_some()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C"
|
||||
fn squeek_view_get_row(
|
||||
view: *mut View,
|
||||
needle: *const ::layout::Button,
|
||||
) -> *mut Row {
|
||||
let view = unsafe { &mut *view };
|
||||
let result = view.rows.iter_mut().find(|row| {
|
||||
squeek_row_contains(row, needle)
|
||||
});
|
||||
match result {
|
||||
Some(row) => row.as_mut() as *mut Row,
|
||||
None => ptr::null_mut(),
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn row_has_button() {
|
||||
let mut row = Row::new(0);
|
||||
let button = squeek_row_create_button(&mut row as *mut Row, 0, 0);
|
||||
assert_eq!(squeek_row_contains(&row, button), true);
|
||||
let shared_button = squeek_row_create_button_with_state(
|
||||
&mut row as *mut Row,
|
||||
button
|
||||
);
|
||||
assert_eq!(squeek_row_contains(&row, shared_button), true);
|
||||
let row = Row::new(0);
|
||||
assert_eq!(squeek_row_contains(&row, button), false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::*;
|
||||
|
||||
|
||||
#[test]
|
||||
fn button_has_key() {
|
||||
let button = squeek_button_new(0, 0);
|
||||
@ -431,17 +460,6 @@ pub mod c {
|
||||
let shared_button = squeek_button_new_with_state(button);
|
||||
assert_eq!(squeek_button_has_key(shared_button, state), 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn row_has_button() {
|
||||
let row = squeek_row_new(0);
|
||||
let button = squeek_row_create_button(row, 0, 0);
|
||||
assert_eq!(squeek_row_contains(row, button), 1);
|
||||
let shared_button = squeek_row_create_button_with_state(row, button);
|
||||
assert_eq!(squeek_row_contains(row, shared_button), 1);
|
||||
let row = squeek_row_new(0);
|
||||
assert_eq!(squeek_row_contains(row, button), 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user