diff --git a/firmware/application/ui/ui_receiver.cpp b/firmware/application/ui/ui_receiver.cpp index daffb2932..4c3d2f494 100644 --- a/firmware/application/ui/ui_receiver.cpp +++ b/firmware/application/ui/ui_receiver.cpp @@ -275,29 +275,63 @@ FrequencyKeypadView::FrequencyKeypadView( }; button.on_select = button_fn; button.set_parent_rect({(n % 3) * button_w, - (n / 3) * button_h + 24, + (n / 3) * button_h + 25, button_w, button_h}); button.set_text(label); n++; } - add_children({&button_save, + add_children({&button_save_ghz, + &button_save_khz, + &button_save_mhz, &button_load, - &button_close}); + &button_clear, + &button_done_ghz, + &button_done_mhz, + &button_done_khz}); - button_save.on_select = [this, &nav](Button&) { - nav.push(this->value()); + button_save_mhz.on_select = [this, &nav](Button&) { + nav.push(this->value(FrequencyUnit::MHZ)); // pass as mhz and handle unit convert logic there, cuz idk if pass others would loss something }; + button_save_ghz.on_select = [this, &nav](Button&) { + nav.push(this->value(FrequencyUnit::GHZ)); + }; + button_save_khz.on_select = [this, &nav](Button&) { + nav.push(this->value(FrequencyUnit::KHZ)); + }; + button_load.on_select = [this, &nav](Button&) { auto load_view = nav.push(); load_view->on_frequency_loaded = [this](rf::Frequency value) { set_value(value); }; }; + button_clear.on_select = [this](Button&) { + mhz.clear(); + submhz.clear(); + clear_field_if_digits_entered = true; + if (state == State::DigitSubMHz) { + state = State::DigitMHz; + } + draw_input_hint(); + update_text(); + }; - button_close.on_select = [this, &nav](Button&) { + button_done_ghz.on_select = [this, &nav](Button&) { if (on_changed) - on_changed(this->value()); + on_changed(this->value(FrequencyUnit::GHZ)); + nav.pop(); + }; + + button_done_mhz.on_select = [this, &nav](Button&) { + if (on_changed) + on_changed(this->value(FrequencyUnit::MHZ)); + nav.pop(); + }; + + button_done_khz.on_select = [this, &nav](Button&) { + if (on_changed) + on_changed(this->value(FrequencyUnit::KHZ)); nav.pop(); }; @@ -305,11 +339,20 @@ FrequencyKeypadView::FrequencyKeypadView( } void FrequencyKeypadView::focus() { - button_close.focus(); + button_done_mhz.focus(); } -rf::Frequency FrequencyKeypadView::value() const { - return mhz.as_int() * 1000000ULL + submhz.as_int() * submhz_base; +rf::Frequency FrequencyKeypadView::value(FrequencyUnit frequency_uni) const { + switch (frequency_uni) { + case FrequencyUnit::GHZ: + return mhz.as_int() * 1000000000ULL + submhz.as_int() * submhz_base * 1000; + case FrequencyUnit::MHZ: + return mhz.as_int() * 1000000ULL + submhz.as_int() * submhz_base; + case FrequencyUnit::KHZ: + return mhz.as_int() * 1000ULL + submhz.as_int() * submhz_base / 1000; + default: + return mhz.as_int() * 1000000ULL + submhz.as_int() * submhz_base; + } } void FrequencyKeypadView::set_value(const rf::Frequency new_value) { @@ -381,6 +424,25 @@ void FrequencyKeypadView::field_toggle() { state = State::DigitMHz; clear_field_if_digits_entered = true; } + draw_input_hint(); +} + +void FrequencyKeypadView::draw_input_hint() { + set_dirty(); +} + +void FrequencyKeypadView::paint(Painter& painter) { + View::paint(painter); + + const bool s = state == State::DigitMHz; + painter.draw_hline( + {0, 36}, + 8 * 4, + s ? Color::white() : Color::black()); + painter.draw_hline( + {5 * 8, 36}, + 8 * 4, + s ? Color::black() : Color::white()); } void FrequencyKeypadView::update_text() { diff --git a/firmware/application/ui/ui_receiver.hpp b/firmware/application/ui/ui_receiver.hpp index ef7801b97..6bba24955 100644 --- a/firmware/application/ui/ui_receiver.hpp +++ b/firmware/application/ui/ui_receiver.hpp @@ -44,6 +44,12 @@ extern options_db_t freqman_steps; namespace ui { +enum FrequencyUnit { + GHZ = 0, + MHZ, + KHZ, +}; + class FrequencyField : public Widget { public: std::function on_change{}; @@ -207,8 +213,9 @@ class FrequencyKeypadView : public View { const rf::Frequency value); void focus() override; + void paint(Painter& painter) override; - rf::Frequency value() const; + rf::Frequency value(FrequencyUnit frequency_uni) const; void set_value(const rf::Frequency new_value); bool on_encoder(const EncoderEvent delta) override; bool on_keyboard(const KeyboardEvent key) override; @@ -220,7 +227,6 @@ class FrequencyKeypadView : public View { static constexpr int mhz_digits = 4; static constexpr int submhz_digits = 4; - static constexpr int mhz_mod = pow(10, mhz_digits); static constexpr int submhz_base = pow(10, 6 - submhz_digits); static constexpr int text_digits = mhz_digits + 1 + submhz_digits; @@ -230,15 +236,30 @@ class FrequencyKeypadView : public View { std::array buttons{}; - Button button_save{ - {0, button_h * 5, 60, button_h}, - "Save"}; + Button button_save_ghz{ + {0, 14 * 16, 80 / 2 - 1, 2 * 16}, + "GHz"}; + Button button_save_khz{ + {0 + 40 - 1, 14 * 16, 80 / 2, 2 * 16}, + "kHz"}; + Button button_save_mhz{ + {0, 16 * 16, 80 - 1, 3 * 16}, + "Save MHz"}; Button button_load{ - {60, button_h * 5, 60, button_h}, + {80 + 1, 14 * 16, 80 - 2, 40}, "Load"}; - Button button_close{ - {128, button_h * 5, 112, button_h}, - "Done"}; + Button button_clear{ + {80 + 1, 264, 80 - 2, 40}, + "Clear"}; + Button button_done_ghz{ + {160 + 1, 14 * 16, 80 / 2 - 1, 2 * 16}, + "GHz"}; + Button button_done_khz{ + {160 + 40, 14 * 16, 80 / 2 - 1, 2 * 16}, + "kHz"}; + Button button_done_mhz{ + {160 + 1, 16 * 16, 80 - 2, 3 * 16}, + "Done MHz"}; /* TODO: Template arg required in enum?! */ FieldString mhz{FieldString<4>::Justify::Right}; @@ -254,6 +275,8 @@ class FrequencyKeypadView : public View { void on_button(Button& button); + void draw_input_hint(); + void digit_add(const char c); void digit_delete();