layout: Increase separation between mutable and logic
This commit is contained in:
@ -780,6 +780,11 @@ impl LayoutData {
|
||||
Some(key)
|
||||
}
|
||||
|
||||
fn find_button_place(&self, button: &ButtonPosition) -> Option<procedures::Place> {
|
||||
let (_, view) = self.views.get(&button.view)?;
|
||||
procedures::find_button_place(view, (button.row, button.position_in_row))
|
||||
}
|
||||
|
||||
/// Calculates size without margins
|
||||
fn calculate_inner_size(&self) -> Size {
|
||||
View::calculate_super_size(
|
||||
@ -1008,7 +1013,7 @@ fn try_set_view(layout: &mut Layout, view_name: &str) {
|
||||
mod procedures {
|
||||
use super::*;
|
||||
|
||||
type Place<'v> = (c::Point, &'v Button);
|
||||
pub type Place<'v> = (c::Point, &'v Button);
|
||||
|
||||
/// Finds the canvas offset of the button.
|
||||
pub fn find_button_place<'v>(
|
||||
@ -1116,8 +1121,8 @@ mod seat {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn handle_release_key(
|
||||
layout: &mut Layout,
|
||||
fn handle_release_key_cleaner(
|
||||
shape: &LayoutData,
|
||||
submission: &mut Submission,
|
||||
ui: Option<&UIBackend>,
|
||||
time: Timestamp,
|
||||
@ -1127,14 +1132,12 @@ mod seat {
|
||||
// and passed always.
|
||||
manager: Option<(&actors::popover::State, receiver::State)>,
|
||||
button_pos: &ButtonPosition,
|
||||
) {
|
||||
let button = layout.shape.get_button(&button_pos).unwrap();
|
||||
) -> Action{
|
||||
let button = shape.get_button(&button_pos).unwrap();
|
||||
let action = button.action.clone();
|
||||
|
||||
layout.apply_view_transition(&action);
|
||||
|
||||
// process non-view switching
|
||||
match action {
|
||||
match action.clone() {
|
||||
Action::Submit { text: _, keys: _ }
|
||||
| Action::Erase
|
||||
=> {
|
||||
@ -1156,10 +1159,7 @@ mod seat {
|
||||
Action::ShowPreferences => if let Some(ui) = &ui {
|
||||
// only show when layout manager is available
|
||||
if let Some((manager, app_state)) = manager {
|
||||
let view = layout.get_current_view();
|
||||
let place = procedures::find_button_place(
|
||||
view, (button_pos.row, button_pos.position_in_row),
|
||||
);
|
||||
let place = shape.find_button_place(button_pos);
|
||||
|
||||
if let Some((position, button)) = place {
|
||||
let bounds = c::Bounds {
|
||||
@ -1181,7 +1181,38 @@ mod seat {
|
||||
_ => {}
|
||||
};
|
||||
|
||||
action
|
||||
}
|
||||
|
||||
/// Mutates layout and sends events.
|
||||
/// This split away from handle_release_key
|
||||
/// in order to pull at least some of the mutation away
|
||||
/// from what should some day be core functional logic.
|
||||
pub fn handle_release_key(
|
||||
layout: &mut Layout,
|
||||
submission: &mut Submission,
|
||||
ui: Option<&UIBackend>,
|
||||
time: Timestamp,
|
||||
// TODO: intermediate measure:
|
||||
// passing state conditionally because it's only used for popover.
|
||||
// Eventually, it should be used for sumitting button events,
|
||||
// and passed always.
|
||||
manager: Option<(&actors::popover::State, receiver::State)>,
|
||||
button_pos: &ButtonPosition,
|
||||
) {
|
||||
// Send events
|
||||
let action = handle_release_key_cleaner(
|
||||
&layout.shape,
|
||||
submission,
|
||||
ui,
|
||||
time,
|
||||
manager,
|
||||
button_pos,
|
||||
);
|
||||
|
||||
// Apply state changes
|
||||
layout.apply_view_transition(&action);
|
||||
|
||||
if let Presence::Missing = layout.state.active_buttons.remove(&button_pos) {
|
||||
log_print!(
|
||||
logging::Level::Bug,
|
||||
|
||||
Reference in New Issue
Block a user