Move button finding to view

This commit is contained in:
Dorota Czaplejewicz
2019-08-16 17:14:36 +00:00
parent c9a580dc07
commit 4e9a8e4afe
5 changed files with 46 additions and 48 deletions

View File

@ -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;

View File

@ -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) {

View File

@ -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);

View File

@ -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

View File

@ -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);
}
}
}