use std::cell::Cell; use std::rc::Rc; use crate::{ model::{builder_traits::Product, models::SignalReduce, Frequency}, model_utils::signal_reducer::{ coef_of_signal_reduce, full_resistance_of_capacitor, reactive_resistance_of_capacitor, voltage_from_signal_source, }, view::{ components::{info_bar::InfoBar, input::Input}, properties::*, }, view_utils::signal_reduce_input_utils::{get_error_message, parse_fields}, }; use glib::clone; extern crate gio; use gio::ListStore; use gtk::{ prelude::{BoxExt, ButtonExt, Cast, CastNone, GridExt, ListItemExt, ListModelExt, SorterExt}, Align, WrapMode, *, }; use gtk4 as gtk; pub fn signal_reducing_page(wrapper: &Box) { let values = Rc::new(Cell::new(SignalReduce::default())); let info_bar = InfoBar::get_instance(); let (input_height, monospace, input_wrapping): (i32, bool, WrapMode) = (24, true, 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 input_labels: [&str; 6] = ["l, м:", "Rм, Ом", "Cм, пФ:", "Rи, Ом:", "Vи, мВ", "f, мГц:"]; let all_inputs: Vec = input_labels .iter() .map(move |label| { Input::builder() .label(label) .margins(MarginData::EqualsMargin(6)) .align(input_label_alignment) .build(monospace, input_wrapping, input_height) }) .collect(); for (id, elem) in all_inputs.iter().enumerate() { let row = id as i32 / 3; input_block.attach(elem.get(), (id as i32) - (3 * row), row, 1, 1); } let calculate_button = Button::builder().label("Расчитать").build(); let result_table_headers_labels: [&str; 4] = ["f, МГц", "Xc, Ом", "Vп, мВ", "ζ"]; let model = gio::ListStore::new::(); let model_for_events = model.clone(); for number in (0..=100).step_by(5) { if number == 0 { model.append(&Frequency::new(1.0)); } else if (number >= 70 && number % 10 == 0) || (number < 70 && number % 5 == 0) { model.append(&Frequency::new(number as f64)); } } let selection_model = NoSelection::new(Some(model)); let result_table = ColumnView::builder() .reorderable(true) .show_row_separators(true) .model(&selection_model) .build(); for label in result_table_headers_labels { let factory = SignalListItemFactory::new(); factory.connect_setup(move |_, list_item| { list_item .downcast_ref::() .expect("Needs to be ListItem") .set_child(Some(&Label::new(None))); }); let values_for_factory = values.clone(); factory.connect_bind(move |_, list_item| { let cell_value = list_item .downcast_ref::() .expect("Needs to be ListItem") .item() .and_downcast::() .expect("The item has to be an `IntegerObject`."); let cell_label = list_item .downcast_ref::() .expect("Needs to be ListItem") .child() .and_downcast::