use cacao::button::Button; use cacao::color::Color; use cacao::layout::{Layout, LayoutConstraint}; use cacao::view::View; use crate::calculator::Msg; use crate::content_view::{button, BUTTON_HEIGHT, BUTTON_WIDTH}; pub struct ButtonRow { pub view: View, pub buttons: Vec<Button> } impl ButtonRow { pub fn new(x: [Msg; 4], color: Color, action_color: Color) -> Self { let view = View::new(); let buttons: Vec<Button> = x .iter() .map(|y| { let button = button( match y { Msg::Clear => "C", Msg::Add => "+", Msg::Subtract => "-", Msg::Multiply => "X", Msg::Divide => "/", Msg::Invert => "+/-", Msg::Mod => "%", Msg::Push(i) if *i == 1 => "1", Msg::Push(i) if *i == 2 => "2", Msg::Push(i) if *i == 3 => "3", Msg::Push(i) if *i == 4 => "4", Msg::Push(i) if *i == 5 => "5", Msg::Push(i) if *i == 6 => "6", Msg::Push(i) if *i == 7 => "7", Msg::Push(i) if *i == 8 => "8", Msg::Push(i) if *i == 9 => "9", _ => "W" }, y.clone() ); view.add_subview(&button); button }) .collect(); buttons[0].set_background_color(color.clone()); buttons[1].set_background_color(color.clone()); buttons[2].set_background_color(color); buttons[3].set_background_color(action_color); let width = &buttons[0].width; LayoutConstraint::activate(&[ buttons[0].top.constraint_equal_to(&view.top), buttons[0].leading.constraint_equal_to(&view.leading), buttons[0].bottom.constraint_equal_to(&view.bottom), width.constraint_equal_to_constant(BUTTON_WIDTH), buttons[1].top.constraint_equal_to(&view.top), buttons[1].leading.constraint_equal_to(&buttons[0].trailing).offset(1.), buttons[1].bottom.constraint_equal_to(&view.bottom), buttons[1].width.constraint_equal_to(&width), buttons[2].top.constraint_equal_to(&view.top), buttons[2].leading.constraint_equal_to(&buttons[1].trailing).offset(1.), buttons[2].bottom.constraint_equal_to(&view.bottom), buttons[2].width.constraint_equal_to(&width), buttons[3].top.constraint_equal_to(&view.top), buttons[3].leading.constraint_equal_to(&buttons[2].trailing).offset(1.), buttons[3].trailing.constraint_equal_to(&view.trailing), buttons[3].bottom.constraint_equal_to(&view.bottom), buttons[3].width.constraint_equal_to(&width), view.height.constraint_equal_to_constant(BUTTON_HEIGHT) ]); Self { view, buttons } } }