From ebf7d9b85ca10f1105f7d786b1393756bf42ad71 Mon Sep 17 00:00:00 2001 From: doryan Date: Sat, 3 Aug 2024 00:00:05 +0400 Subject: [PATCH] feat(table): implement a result table --- src/view/pages/signal_reducing.rs | 143 ++++++++++++++++++++++++++++-- 1 file changed, 134 insertions(+), 9 deletions(-) diff --git a/src/view/pages/signal_reducing.rs b/src/view/pages/signal_reducing.rs index 6ef60d1..d4bcabc 100644 --- a/src/view/pages/signal_reducing.rs +++ b/src/view/pages/signal_reducing.rs @@ -1,23 +1,38 @@ -use gtk4 as gtk; -use std::{fmt::Debug, num::ParseFloatError, str::FromStr, sync::Arc, time::Duration}; +use std::{cell::Cell, rc::Rc}; use crate::{ event_handlers::button_event_handlers::BtnEventHandler, - model::{builder_traits::Product, models::*}, + model::{ + builder_traits::Product, + models::{EventHandler, SignalReduce}, + ResultValue, + }, + 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 gtk::{ - prelude::{BoxExt, GridExt, TextBufferExt, TextViewExt}, + prelude::{BoxExt, Cast, CastNone, GridExt, ListItemExt}, Align, WrapMode, *, }; +use gtk4 as gtk; 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 values = Rc::new(Cell::new(SignalReduce::default())); + + let last_query: Vec = Vec::new(); + + 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(); @@ -67,13 +82,123 @@ pub fn signal_reducing_page(wrapper: &Box) { let calculate_button = Button::builder().label("Расчитать").build(); - EventHandler::new(calculate_button.clone(), move |_| { - let values: Option<[f64; 6]> = parse_fields(all_inputs.clone()); + let result_table_headers_labels: [&str; 4] = ["f, МГц", "Xc, пФ", "Vп, мВ", "ζ"]; - println!("values: {:?}", values); + let model = gio::ListStore::new::(); + + let cloned_model = model.clone(); + + let selection_model = SingleSelection::new(Some(model)); + + let result_table = ColumnView::builder() + .reorderable(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::