diff --git a/src/view/pages/signal_reducing.rs b/src/view/pages/signal_reducing.rs index 2489507..f11215b 100644 --- a/src/view/pages/signal_reducing.rs +++ b/src/view/pages/signal_reducing.rs @@ -1,211 +1,113 @@ +use glib::property::PropertyGet; use gtk4 as gtk; +use gtk4::prelude::WidgetExt; +use std::{str::FromStr, time::Duration}; 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, + event_handlers::button_event_handlers::BtnEventHandler, + model::{builder_traits::Product, models::*}, + view::{components::input::Input, properties::*}, }; use gtk::{ - prelude::{BoxExt, ListBoxRowExt, WidgetExt}, + prelude::{BoxExt, GridExt, TextBufferExt, TextViewExt}, Align, WrapMode, *, }; -pub fn signal_reducing_page(wrapper: &Box) { +pub fn signal_reducing_page(wrapper: &Box, info_bar: Revealer) { let (input_height, monospace, input_alignment, input_wrapping): (i32, bool, Align, WrapMode) = (24, true, Align::Fill, WrapMode::Word); + let input_block: Grid = Grid::new(); + + input_block.set_column_homogeneous(true); + input_block.set_row_homogeneous(true); + 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, + let input_labels: [&str; 6] = [ + "l, м:", + "Rм, Ом:", + "Cм, пФ:", + "Vи, мВ", + "Rи, Ом:", + "f, мГц:", ]; - for elem in first_row_elements { - let input: Box = elem.clone().get(); + let all_inputs: Vec = input_labels + .iter() + .map(move |label| { + Input::builder() + .set_label(label) + .set_margins(MarginData::EqualsMargin(5)) + .set_align(input_label_alignment) + .build(monospace, input_wrapping, input_height) + }) + .collect(); - input.set_halign(input_alignment); - input.set_hexpand(true); + let mut row_position = 0i32; - 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; + for (id, elem) in all_inputs.iter().enumerate() { + if id % 3 == 0 { + row_position += 1; } - 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); + input_block.attach( + &elem.clone().get(), + (id as i32) - (3 * row_position), + row_position, + 1, + 1, + ); } - 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 calculate_button = Button::builder().label("Расчитать").build(); - let table_frame = table_of_calculated_values.clone(); + // TODO: Make asynchronious auto-hide info bar. + let test = info_bar.clone(); - let errors_label: Label = Label::new(Some("")); - let errors_label_for_handler: Label = errors_label.clone(); + // let (tx, rx) = std::sync::mpsc::channel::(); EventHandler::new(calculate_button.clone(), move |_| { - start_algorithm( - &errors_label_for_handler, - &all_text_views, - &table_frame.clone(), - &header, - ) + let mut values: [f64; 6] = [0f64; 6]; + + for (i, input) in all_inputs.iter().enumerate() { + let input_text_buffer: TextBuffer = input.clone().get_input().buffer(); + let try_extract_value = f64::from_str( + input_text_buffer + .text( + &input_text_buffer.start_iter(), + &input_text_buffer.end_iter(), + false, + ) + .as_str() + .trim(), + ); + if let Ok(value) = try_extract_value { + values[i] = value; + } else { + test.set_reveal_child(true); + + // TODO: Make asynchronious auto-hide info bar. + // let transmitter = tx.clone(); + // + // gio::spawn_blocking(move || { + // std::thread::sleep(Duration::from_secs(5)); + // transmitter.send(false).unwrap(); + // }); + // + // test.set_reveal_child(rx.recv().unwrap()); + + println!("Вы ввели некорректное значение поля."); + return; + } + } + println!("{:?}", values); }) .on_click(); - main_wrapper.append(&errors_label); - main_wrapper.append(&calculate_button); - main_wrapper.append(&table_of_calculated_values); - - wrapper.append(&main_wrapper); + wrapper.append(&input_block); + wrapper.append(&calculate_button); }