use gtk4 as gtk; use crate::{ controller::event_handlers::button_event_handlers::*, model::{builder_traits::Product, model::*}, view::{ components::{input::Input, wrapper::Wrapper}, properties::*, }, view_utils::signal_reduce_input_utils::start_algorithm, }; use gtk::{ prelude::{BoxExt, ListBoxRowExt, WidgetExt}, Align, WrapMode, *, }; pub fn signal_reducing_page(wrapper: &Box) { let (input_height, monospace, input_alignment, input_wrapping): (i32, bool, Align, WrapMode) = (24, true, Align::Fill, WrapMode::Word); let input_label_alignment = Alignment { horizontal: Align::Start, vertical: Align::Fill, }; let wire_length_input: Input = Input::builder() .set_label("l, м:") .set_margins(MarginData::EqualsMargin(5)) .set_align(input_label_alignment) .build(monospace, input_wrapping, input_height); let resistance_per_meter_input: Input = Input::builder() .set_label("Rм, Ом:") .set_margins(MarginData::EqualsMargin(5)) .set_align(input_label_alignment) .build(monospace, input_wrapping, input_height); let capacity_per_meter_input: Input = Input::builder() .set_label("Cм, пФ:") .set_margins(MarginData::EqualsMargin(5)) .set_align(input_label_alignment) .build(monospace, input_wrapping, input_height); let wrapper_first_row = Wrapper::col_builder() .halign(Align::Fill) .hexpand(true) .spacing(5) .build(); let first_row_elements: Vec<&Input> = vec![ &wire_length_input, &resistance_per_meter_input, &capacity_per_meter_input, ]; for elem in first_row_elements { let input: Box = elem.clone().get(); input.set_halign(input_alignment); input.set_hexpand(true); wrapper_first_row.append(&input); } let info_signal_voltage_input: Input = Input::builder() .set_label("Vи, мВ:") .set_margins(MarginData::EqualsMargin(5)) .set_align(input_label_alignment) .build(monospace, input_wrapping, input_height); let resistance_of_info_voltage_source_input: Input = Input::builder() .set_label("Rи, Ом:") .set_margins(MarginData::EqualsMargin(5)) .set_align(input_label_alignment) .build(monospace, input_wrapping, input_height); let info_voltage_source_frequency_input: Input = Input::builder() .set_label("f, мГц:") .set_margins(MarginData::EqualsMargin(5)) .set_align(input_label_alignment) .build(monospace, input_wrapping, input_height); let wrapper_second_row = Wrapper::col_builder() .halign(Align::Fill) .hexpand(true) .spacing(5) .build(); let second_row_elements: Vec<&Input> = vec![ &info_signal_voltage_input, &resistance_of_info_voltage_source_input, &info_voltage_source_frequency_input, ]; for elem in second_row_elements { let input: Box = elem.clone().get(); input.set_halign(input_alignment); input.set_hexpand(true); wrapper_second_row.append(&input); } let all_text_views: Vec = vec![ wire_length_input.get_input(), resistance_per_meter_input.get_input(), capacity_per_meter_input.get_input(), info_signal_voltage_input.get_input(), resistance_of_info_voltage_source_input.get_input(), info_voltage_source_frequency_input.get_input(), ]; let main_wrapper = Wrapper::row_builder().spacing(5).build(); main_wrapper.append(&wrapper_first_row); main_wrapper.append(&wrapper_second_row); let calculate_button = Button::builder() .label("Расчитать") .halign(Align::End) .set_margin(MarginData::MultipleMargin((10, 5, 0, 0))) .build(); let table_header_labels = vec!["f, Гц", "Xc, пФ", "Vп, мВ", "ζ"]; let table_header = ColumnView::builder() .focusable(false) .reorderable(false) .show_row_separators(true) .show_column_separators(true) .halign(Align::Fill) .hexpand(true) .build(); for table_header_label in table_header_labels { let column = ColumnViewColumn::builder() .title(table_header_label) .fixed_width(200) .expand(true) .build(); table_header.append_column(&column); } let mut table = ListBox::builder().hexpand(true).halign(Align::Fill).build(); let header = ListBoxRow::builder().child(&table_header).build(); table.append(&header); for i in (0..=100).step_by(5) { if i == 0 { continue; } let table_row = ListBoxRow::new(); let columns = ColumnView::builder().reorderable(false).build(); let column = ColumnViewColumn::builder() .title(format!("{i}")) .fixed_width(200) .expand(true) .build(); columns.append_column(&column); for table_row_label in 1..=3 { let column = ColumnViewColumn::builder() .title(format!("{table_row_label}")) .fixed_width(200) .expand(true) .build(); columns.append_column(&column); } table_row.set_child(Some(&columns)); table.append(&table_row); } let table_of_calculated_values = Frame::builder() .height_request(64) .hexpand(true) .child(&table) .halign(Align::Fill) .set_margin(MarginData::MultipleMargin((10, 5, 0, 0))) .build(); let table_frame = table_of_calculated_values.clone(); let errors_label: Label = Label::new(Some("")); let errors_label_for_handler: Label = errors_label.clone(); EventHandler::new(calculate_button.clone(), move |_| { start_algorithm( &errors_label_for_handler, &all_text_views, &table_frame.clone(), &header, ) }) .on_click(); main_wrapper.append(&errors_label); main_wrapper.append(&calculate_button); main_wrapper.append(&table_of_calculated_values); wrapper.append(&main_wrapper); }