diff --git a/src/data.rs b/src/data.rs index fed05459..effa7981 100644 --- a/src/data.rs +++ b/src/data.rs @@ -424,8 +424,8 @@ impl Layout { )} ); - let views = HashMap::from_iter( - self.views.iter().map(|(name, view)| { + let views: Vec<_> = self.views.iter() + .map(|(name, view)| { let rows = view.iter().map(|row| { let buttons = row.split_ascii_whitespace() .map(|name| { @@ -439,8 +439,7 @@ impl Layout { &mut warning_handler, )) }); - ::layout::Row { - angle: 0, + layout::Row { buttons: add_offsets( buttons, |button| button.size.width, @@ -453,8 +452,25 @@ impl Layout { name.clone(), layout::View::new(rows) ) - }) - ); + }).collect(); + + // Center views on the same point. + let views = { + let total_size = layout::View::calculate_super_size( + views.iter().map(|(_name, view)| view).collect() + ); + + HashMap::from_iter(views.into_iter().map(|(name, view)| ( + name, + ( + layout::c::Point { + x: (total_size.width - view.get_width()) / 2.0, + y: (total_size.height - view.get_height()) / 2.0, + }, + view, + ), + ))) + }; ( Ok(::layout::LayoutData { @@ -751,7 +767,7 @@ mod tests { .build(ProblemPanic).0 .unwrap(); assert_eq!( - out.views["base"] + out.views["base"].1 .get_rows()[0].1 .buttons[0].1 .label, @@ -766,7 +782,7 @@ mod tests { .build(ProblemPanic).0 .unwrap(); assert_eq!( - out.views["base"] + out.views["base"].1 .get_rows()[0].1 .buttons[0].1 .label, @@ -782,7 +798,7 @@ mod tests { .build(ProblemPanic).0 .unwrap(); assert_eq!( - out.views["base"] + out.views["base"].1 .get_rows()[0].1 .buttons[0].1 .state.borrow() diff --git a/src/drawing.rs b/src/drawing.rs index 95bf8123..504b6ec2 100644 --- a/src/drawing.rs +++ b/src/drawing.rs @@ -48,21 +48,18 @@ mod c { let layout = unsafe { &mut *layout }; let cr = unsafe { cairo::Context::from_raw_none(cr) }; - let view = layout.get_current_view(); - for (row_offset, row) in &view.get_rows() { - for (x_offset, button) in &row.buttons { - let state = RefCell::borrow(&button.state).clone(); - let locked = state.action.is_active(&layout.current_view); - if state.pressed == keyboard::PressType::Pressed || locked { - render_button_at_position( - renderer, &cr, - row_offset + Point { x: *x_offset, y: 0.0 }, - button.as_ref(), - state.pressed, locked, - ); - } + layout.foreach_visible_button(|offset, button| { + let state = RefCell::borrow(&button.state).clone(); + let locked = state.action.is_active(&layout.current_view); + if state.pressed == keyboard::PressType::Pressed || locked { + render_button_at_position( + renderer, &cr, + offset, + button.as_ref(), + state.pressed, locked, + ); } - } + }) } #[no_mangle] @@ -74,17 +71,15 @@ mod c { ) { let layout = unsafe { &mut *layout }; let cr = unsafe { cairo::Context::from_raw_none(cr) }; - let view = layout.get_current_view(); - for (row_offset, row) in &view.get_rows() { - for (x_offset, button) in &row.buttons { - render_button_at_position( - renderer, &cr, - row_offset + Point { x: *x_offset, y: 0.0 }, - button.as_ref(), - keyboard::PressType::Released, false, - ); - } - } + + layout.foreach_visible_button(|offset, button| { + render_button_at_position( + renderer, &cr, + offset, + button.as_ref(), + keyboard::PressType::Released, false, + ); + }) } } diff --git a/src/layout.rs b/src/layout.rs index d417c006..ec601b66 100644 --- a/src/layout.rs +++ b/src/layout.rs @@ -329,11 +329,8 @@ pub mod c { Point { x: x_widget, y: y_widget } ); - let state = { - let view = layout.get_current_view(); - view.find_button_by_position(point) - .map(|place| place.button.state.clone()) - }; + let state = layout.find_button_by_position(point) + .map(|place| place.button.state.clone()); if let Some(state) = state { seat::handle_press_key( @@ -374,8 +371,7 @@ pub mod c { let pressed = layout.pressed_keys.clone(); let button_info = { - let view = layout.get_current_view(); - let place = view.find_button_by_position(point); + let place = layout.find_button_by_position(point); place.map(|place| {( place.button.state.clone(), place.button.clone(), @@ -486,8 +482,6 @@ pub struct Button { pub struct Row { /// Buttons together with their offset from the left pub buttons: Vec<(f64, Box