2024-08-09 23:52:53 +03:00
|
|
|
use std::cell::Cell;
|
|
|
|
use std::rc::Rc;
|
2024-03-17 20:34:12 +03:00
|
|
|
|
2024-04-14 19:13:15 +03:00
|
|
|
use crate::{
|
2024-08-09 23:52:53 +03:00
|
|
|
model::{builder_traits::Product, models::SignalReduce, Frequency},
|
2024-08-02 23:00:05 +03:00
|
|
|
model_utils::signal_reducer::{
|
|
|
|
coef_of_signal_reduce, full_resistance_of_capacitor, reactive_resistance_of_capacitor,
|
|
|
|
voltage_from_signal_source,
|
|
|
|
},
|
2024-07-27 21:20:21 +03:00
|
|
|
view::{
|
|
|
|
components::{info_bar::InfoBar, input::Input},
|
|
|
|
properties::*,
|
|
|
|
},
|
2024-07-29 00:17:52 +03:00
|
|
|
view_utils::signal_reduce_input_utils::{get_error_message, parse_fields},
|
2024-03-17 20:34:12 +03:00
|
|
|
};
|
2024-08-02 23:00:05 +03:00
|
|
|
|
2024-08-12 11:14:13 +03:00
|
|
|
use glib::clone;
|
|
|
|
|
|
|
|
extern crate gio;
|
|
|
|
|
|
|
|
use gio::ListStore;
|
|
|
|
|
2024-04-19 11:03:16 +03:00
|
|
|
use gtk::{
|
2024-08-12 11:14:13 +03:00
|
|
|
prelude::{BoxExt, ButtonExt, Cast, CastNone, GridExt, ListItemExt, ListModelExt, SorterExt},
|
2024-04-19 11:03:16 +03:00
|
|
|
Align, WrapMode, *,
|
|
|
|
};
|
2024-08-02 23:00:05 +03:00
|
|
|
use gtk4 as gtk;
|
2024-03-17 20:34:12 +03:00
|
|
|
|
2024-07-27 21:20:21 +03:00
|
|
|
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_height, monospace, input_wrapping): (i32, bool, WrapMode) =
|
|
|
|
(24, true, WrapMode::Word);
|
2024-03-17 20:34:12 +03:00
|
|
|
|
2024-07-19 22:16:11 +03:00
|
|
|
let input_block: Grid = Grid::new();
|
|
|
|
|
|
|
|
input_block.set_column_homogeneous(true);
|
|
|
|
input_block.set_row_homogeneous(true);
|
|
|
|
|
2024-04-14 19:13:15 +03:00
|
|
|
let input_label_alignment = Alignment {
|
|
|
|
horizontal: Align::Start,
|
|
|
|
vertical: Align::Fill,
|
|
|
|
};
|
2024-03-17 20:34:12 +03:00
|
|
|
|
2024-08-10 00:19:29 +03:00
|
|
|
let input_labels: [&str; 6] = ["l, м:", "Rм, Ом", "Cм, пФ:", "Rи, Ом:", "Vи, мВ", "f, мГц:"];
|
2024-04-19 00:30:51 +03:00
|
|
|
|
2024-07-19 22:16:11 +03:00
|
|
|
let all_inputs: Vec<Input> = input_labels
|
|
|
|
.iter()
|
|
|
|
.map(move |label| {
|
|
|
|
Input::builder()
|
2024-08-10 00:19:29 +03:00
|
|
|
.label(label)
|
|
|
|
.margins(MarginData::EqualsMargin(6))
|
|
|
|
.align(input_label_alignment)
|
2024-07-19 22:16:11 +03:00
|
|
|
.build(monospace, input_wrapping, input_height)
|
|
|
|
})
|
|
|
|
.collect();
|
|
|
|
|
|
|
|
for (id, elem) in all_inputs.iter().enumerate() {
|
2024-08-12 11:15:42 +03:00
|
|
|
let row = id as i32 / 3;
|
|
|
|
|
|
|
|
input_block.attach(elem.get(), (id as i32) - (3 * row), row, 1, 1);
|
2024-04-19 11:03:16 +03:00
|
|
|
}
|
|
|
|
|
2024-07-19 22:16:11 +03:00
|
|
|
let calculate_button = Button::builder().label("Расчитать").build();
|
2024-04-18 11:23:13 +03:00
|
|
|
|
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-10 00:19:29 +03:00
|
|
|
let model = gio::ListStore::new::<Frequency>();
|
|
|
|
let model_for_events = model.clone();
|
2024-08-02 23:00:05 +03:00
|
|
|
|
2024-08-10 00:19:29 +03:00
|
|
|
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));
|
|
|
|
}
|
|
|
|
}
|
2024-08-02 23:00:05 +03:00
|
|
|
|
2024-08-10 00:19:29 +03:00
|
|
|
let selection_model = NoSelection::new(Some(model));
|
2024-08-02 23:00:05 +03:00
|
|
|
|
|
|
|
let result_table = ColumnView::builder()
|
|
|
|
.reorderable(true)
|
2024-08-10 00:19:29 +03:00
|
|
|
.show_row_separators(true)
|
2024-08-02 23:00:05 +03:00
|
|
|
.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::<ListItem>()
|
|
|
|
.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::<ListItem>()
|
|
|
|
.expect("Needs to be ListItem")
|
|
|
|
.item()
|
2024-08-10 00:19:29 +03:00
|
|
|
.and_downcast::<Frequency>()
|
2024-08-02 23:00:05 +03:00
|
|
|
.expect("The item has to be an `IntegerObject`.");
|
|
|
|
|
|
|
|
let cell_label = list_item
|
|
|
|
.downcast_ref::<ListItem>()
|
|
|
|
.expect("Needs to be ListItem")
|
|
|
|
.child()
|
|
|
|
.and_downcast::<Label>()
|
|
|
|
.expect("The child has to be a `Label`.");
|
|
|
|
|
2024-08-10 00:19:29 +03:00
|
|
|
let result_values = values_for_factory.get();
|
2024-08-02 23:00:05 +03:00
|
|
|
|
|
|
|
let reactive_resist: f64 = reactive_resistance_of_capacitor(
|
2024-08-10 00:19:29 +03:00
|
|
|
result_values.wire_capacity * 10f64.powi(-12),
|
|
|
|
result_values.length,
|
|
|
|
cell_value.frequency() * 10f64.powi(6),
|
2024-08-02 23:00:05 +03:00
|
|
|
);
|
|
|
|
|
|
|
|
let full_resistance: f64 = full_resistance_of_capacitor(
|
|
|
|
reactive_resist,
|
2024-08-10 00:19:29 +03:00
|
|
|
result_values.source_resistance,
|
|
|
|
result_values.wire_resistance,
|
|
|
|
result_values.length,
|
2024-08-02 23:00:05 +03:00
|
|
|
);
|
|
|
|
|
2024-08-10 00:19:29 +03:00
|
|
|
let signal_source_voltage: f64 = voltage_from_signal_source(
|
|
|
|
result_values.source_voltage * 10f64.powi(-3),
|
|
|
|
reactive_resist,
|
|
|
|
full_resistance,
|
|
|
|
) * 1000.0;
|
2024-08-02 23:00:05 +03:00
|
|
|
|
|
|
|
match label {
|
|
|
|
"f, МГц" => {
|
2024-08-10 00:19:29 +03:00
|
|
|
cell_label.set_label(&cell_value.frequency().to_string());
|
2024-08-02 23:00:05 +03:00
|
|
|
}
|
2024-08-10 00:19:29 +03:00
|
|
|
"Xc, Ом" => {
|
|
|
|
cell_label.set_label(format!("{0:.1$}", reactive_resist, 6).as_str());
|
2024-08-02 23:00:05 +03:00
|
|
|
}
|
|
|
|
"Vп, мВ" => {
|
2024-08-10 00:19:29 +03:00
|
|
|
cell_label.set_label(format!("{0:.1$}", signal_source_voltage, 6).as_str());
|
2024-08-02 23:00:05 +03:00
|
|
|
}
|
|
|
|
"ζ" => {
|
2024-08-10 00:19:29 +03:00
|
|
|
let coef: f64 =
|
|
|
|
coef_of_signal_reduce(result_values.source_voltage, signal_source_voltage);
|
|
|
|
|
|
|
|
cell_label.set_label(format!("{0:.1$}", coef, 6).as_str());
|
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();
|
|
|
|
|
2024-08-12 11:13:55 +03:00
|
|
|
calculate_button.connect_clicked(clone!(
|
|
|
|
#[strong]
|
|
|
|
model_for_events,
|
|
|
|
move |_| match parse_fields(all_inputs.clone()) {
|
|
|
|
Ok(results) => {
|
|
|
|
values.set(results);
|
|
|
|
|
|
|
|
let new_elem = &Frequency::new(values.get().frequency);
|
|
|
|
|
|
|
|
let exist_elem_pos = model_for_events.find_with_equal_func(|elem| {
|
|
|
|
elem.downcast_ref::<Frequency>().unwrap().frequency() == new_elem.frequency()
|
|
|
|
});
|
|
|
|
|
|
|
|
match exist_elem_pos {
|
|
|
|
Some(_) => {
|
|
|
|
info_bar.set_text_label(Some("Данная частота уже была задана."));
|
|
|
|
info_bar.show_infobar(5u64);
|
|
|
|
}
|
|
|
|
None => {
|
|
|
|
model_for_events.append(&Frequency::new(values.get().frequency));
|
|
|
|
|
|
|
|
model_for_events.items_changed(0, 0, 1);
|
|
|
|
model_for_events.items_changed(1, 1, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Err(error) => {
|
|
|
|
let error_kind: Option<&str> = get_error_message(error);
|
2024-08-02 23:00:05 +03:00
|
|
|
|
2024-08-12 11:13:55 +03:00
|
|
|
info_bar.set_text_label(error_kind);
|
|
|
|
info_bar.show_infobar(5u64);
|
|
|
|
}
|
2024-08-02 23:00:05 +03:00
|
|
|
}
|
2024-08-12 11:13:55 +03:00
|
|
|
));
|
2024-04-18 11:23:13 +03:00
|
|
|
|
2024-07-19 22:16:11 +03:00
|
|
|
wrapper.append(&input_block);
|
|
|
|
wrapper.append(&calculate_button);
|
2024-08-02 23:00:05 +03:00
|
|
|
wrapper.append(&table);
|
2024-04-14 19:13:15 +03:00
|
|
|
}
|