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);
}