AIT/src/view/pages/signal_reducing.rs

155 lines
4.3 KiB
Rust
Raw Normal View History

2024-08-15 22:17:00 +03:00
use std::{cell::Cell, rc::Rc};
use crate::{
2024-08-09 23:52:53 +03:00
model::{builder_traits::Product, models::SignalReduce, Frequency},
2024-08-15 22:17:00 +03:00
model_utils::signal_reducer::{find_by_frequency_value, set_default_values},
view::{
components::{info_bar::InfoBar, input::Input},
properties::*,
},
2024-08-15 22:17:00 +03:00
view_utils::signal_reduce_utils::*,
};
2024-08-02 23:00:05 +03:00
2024-08-12 11:14:13 +03:00
use glib::clone;
use gio::ListStore;
2024-04-19 11:03:16 +03:00
use gtk::{
2024-08-15 22:17:00 +03:00
prelude::{BoxExt, ButtonExt, Cast, GridExt, SorterExt},
Align, *,
2024-04-19 11:03:16 +03:00
};
2024-08-15 22:17:00 +03:00
2024-08-02 23:00:05 +03:00
use gtk4 as gtk;
pub fn signal_reducing_page(wrapper: &Box) {
2024-08-02 23:00:05 +03:00
let values = Rc::new(Cell::new(SignalReduce::default()));
let info_bar = InfoBar::get_instance();
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,
};
2024-08-10 00:19:29 +03:00
let input_labels: [&str; 6] = ["l, м:", "Rм, Ом", "Cм, пФ:", "Rи, Ом:", "Vи, мВ", "f, мГц:"];
let all_inputs: Vec<Input<Entry>> = input_labels
.iter()
.enumerate()
.map(|(index, label)| {
let elem = Input::<Entry>::builder()
2024-08-10 00:19:29 +03:00
.label(label)
.margins(MarginData::EqualsMargin(6))
.align(input_label_alignment)
.build_entry(None);
let row = index as i32 / 3;
2024-08-12 11:15:42 +03:00
input_block.attach(elem.get(), (index as i32) - (3 * row), row, 1, 1);
elem
})
.collect();
2024-04-19 11:03:16 +03:00
let calculate_button = Button::builder().label("Расчитать").build();
2024-08-10 00:19:29 +03:00
let result_table_headers_labels: [&str; 4] = ["f, МГц", "Xc, Ом", "Vп, мВ", "ζ"];
2024-08-02 23:00:05 +03:00
2024-08-12 11:16:28 +03:00
let model = ListStore::new::<Frequency>();
2024-08-12 22:49:40 +03:00
set_default_values(&model);
2024-08-02 23:00:05 +03:00
2024-08-12 11:16:28 +03:00
let numeric_sorter = CustomSorter::new(|a, b| {
let a = a.downcast_ref::<Frequency>().unwrap().frequency();
let b = b.downcast_ref::<Frequency>().unwrap().frequency();
a.total_cmp(&b).into()
});
let sorted_model = SortListModel::new(Some(model.clone()), Some(numeric_sorter.clone()));
2024-08-12 11:16:28 +03:00
let selection_model = NoSelection::new(Some(sorted_model.clone()));
2024-08-02 23:00:05 +03:00
let result_table = ColumnView::builder()
2024-08-10 00:19:29 +03:00
.show_row_separators(true)
2024-08-02 23:00:05 +03:00
.model(&selection_model)
.build();
2024-08-12 11:16:28 +03:00
result_table.connect_activate(clone!(
#[strong]
numeric_sorter,
2024-08-12 22:49:40 +03:00
move |_, _| numeric_sorter.changed(SorterChange::Different)
2024-08-12 11:16:28 +03:00
));
2024-08-02 23:00:05 +03:00
for label in result_table_headers_labels {
let factory = SignalListItemFactory::new();
2024-08-10 00:19:29 +03:00
factory.connect_setup(column_view_setup_factory);
factory.connect_bind(clone!(
#[strong]
values,
move |factory, list| column_view_bind_factory(factory, list, values.get(), label)
));
2024-08-02 23:00:05 +03:00
let column = ColumnViewColumn::builder()
.title(label)
.expand(true)
.resizable(false)
.factory(&factory)
.build();
result_table.append_column(&column);
}
let scrollable_table = ScrolledWindow::builder()
.vexpand(true)
.child(&result_table)
.build();
let table = Frame::builder()
.child(&scrollable_table)
.vexpand(true)
.build();
calculate_button.connect_clicked(clone!(
#[strong]
model,
#[strong]
result_table,
move |_| match parse_fields(all_inputs.clone()) {
Ok(results) => {
if values.get() == results {
info_bar.set_text_label(Some("Эти данные уже были введены."));
info_bar.show_infobar(5u64);
} else {
values.set(results);
let new_elem = Frequency::new(values.get().frequency);
if find_by_frequency_value(&model, &new_elem).is_none() {
model.append(&new_elem);
}
update_column_view(&result_table);
}
}
Err(error) => {
let error_kind: Option<&str> = get_error_message(error);
2024-08-02 23:00:05 +03:00
info_bar.set_text_label(error_kind);
info_bar.show_infobar(5u64);
}
2024-08-02 23:00:05 +03:00
}
));
wrapper.append(&input_block);
wrapper.append(&calculate_button);
2024-08-02 23:00:05 +03:00
wrapper.append(&table);
}