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 = {
|
struct button_place place = {
|
||||||
.button = button,
|
.button = button,
|
||||||
.row = eek_keyboard_get_row(view, button),
|
.row = squeek_view_get_row(view, button),
|
||||||
};
|
};
|
||||||
if (!place.row) {
|
if (!place.row) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -294,26 +294,6 @@ struct GetRowData {
|
|||||||
struct squeek_key *needle;
|
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) {
|
void find_key_in_row(struct squeek_row *row, gpointer user_data) {
|
||||||
struct GetRowData *data = user_data;
|
struct GetRowData *data = user_data;
|
||||||
if (data->button) {
|
if (data->button) {
|
||||||
|
|||||||
@ -61,8 +61,6 @@ struct _LevelKeyboard {
|
|||||||
};
|
};
|
||||||
typedef struct _LevelKeyboard 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,
|
struct squeek_button *eek_keyboard_find_button_by_name(LevelKeyboard *keyboard,
|
||||||
const gchar *name);
|
const gchar *name);
|
||||||
|
|
||||||
|
|||||||
@ -68,6 +68,8 @@ void squeek_view_foreach(struct squeek_view*,
|
|||||||
RowCallback callback,
|
RowCallback callback,
|
||||||
gpointer user_data);
|
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);
|
void squeek_row_place_buttons(struct squeek_row *row, LevelKeyboard *keyboard);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -185,19 +185,6 @@ pub mod c {
|
|||||||
let row = unsafe { &mut *row };
|
let row = unsafe { &mut *row };
|
||||||
row.bounds = Some(bounds);
|
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]
|
#[no_mangle]
|
||||||
pub extern "C"
|
pub extern "C"
|
||||||
@ -413,12 +400,54 @@ pub mod c {
|
|||||||
None => ptr::null_mut(),
|
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)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn button_has_key() {
|
fn button_has_key() {
|
||||||
let button = squeek_button_new(0, 0);
|
let button = squeek_button_new(0, 0);
|
||||||
@ -431,17 +460,6 @@ pub mod c {
|
|||||||
let shared_button = squeek_button_new_with_state(button);
|
let shared_button = squeek_button_new_with_state(button);
|
||||||
assert_eq!(squeek_button_has_key(shared_button, state), 1);
|
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