From 8633fe4774a83f90969e965c02b35e531d2ac6df Mon Sep 17 00:00:00 2001 From: flu0r1ne Date: Thu, 13 Jul 2023 16:04:55 -0500 Subject: Refactor, move label-making components into the model class, create a single update function for all labels --- src/controllers/timer_view.cpp | 195 ++++++++++++++++++++--------------------- 1 file changed, 93 insertions(+), 102 deletions(-) (limited to 'src/controllers') diff --git a/src/controllers/timer_view.cpp b/src/controllers/timer_view.cpp index 841d7f7..03e8bb5 100644 --- a/src/controllers/timer_view.cpp +++ b/src/controllers/timer_view.cpp @@ -19,11 +19,6 @@ class TimerView { public: - TimerView() - : _counters { FreqCounter(_timer), FreqCounter(_timer) } - , _alarm_sound_triggered(false) - { } - /* * Timer */ @@ -44,20 +39,76 @@ class TimerView { set_inner_text_by_id("clear-reset-btn", text); } + /* + * Counter + */ + + void counter_display_text(uint32_t counter_num, std::string const & counter_text, std::string const & rate_text) { + std::string counter_id = "counter-"; + counter_id.append(std::to_string(counter_num)); + + std::string rate_id = "rate-"; + rate_id.append(std::to_string(counter_num)); + + set_inner_text_by_id(counter_id, counter_text); + set_inner_text_by_id(rate_id, rate_text); + } + + + void set_clear_reset_button_disabled(bool disabled) { + set_button_disabled("clear-reset-btn", disabled); + } + + void play_alarm() { + + EM_ASM({ + const handle = document.getElementById("sound-handle"); + + const duration = Math.round(handle.duration * 1000.0); + + handle.currentTime = 0; + handle.play().then(() => { + setTimeout(() => { + handle.pause(); + }, duration); + }); + }); + + } + + private: + + static void set_inner_text_by_id(std::string const & id, std::string const & text) { + emval timer_display = document.call("getElementById", emval(id.c_str())); + timer_display.set("innerText", text.c_str()); + } + + static void set_button_disabled(std::string const & id, bool disabled) { + emval timer_display = document.call("getElementById", emval(id.c_str())); + timer_display.set("disabled", disabled); + } + +}; + +class TimerController { + + public: + + TimerController() + : _counters { FreqCounter(_timer), FreqCounter(_timer) } + , _alarm_sound_triggered(false) + { } + void handle_inc_time(uint32_t amount) { _timer.increment_preset_ms(amount * 1000); - _update_start_stop_label(); - _update_clear_reset_btn_label(); - _update_clear_reset_btn(); + _update_labels(); } void handle_start_stop() { _timer.toggleStart(); - _update_start_stop_label(); - _update_clear_reset_btn_label(); - _update_clear_reset_btn(); + _update_labels(); } void handle_clear_reset() { @@ -67,58 +118,32 @@ class TimerView { reset(); } - _update_clear_reset_btn_label(); - _update_clear_reset_btn(); + _update_labels(); } /* * Counter */ - void counter_display_text(uint32_t counter_num, std::string const & counter_text, std::string const & rate_text) { - std::string counter_id = "counter-"; - counter_id.append(std::to_string(counter_num)); - - std::string rate_id = "rate-"; - rate_id.append(std::to_string(counter_num)); - - set_inner_text_by_id(counter_id, counter_text); - set_inner_text_by_id(rate_id, rate_text); - } - void handle_inc_counter(uint32_t counter_num) { _counters[counter_num].inc(); + // Effects + _update_labels(); _update_counter(counter_num); - - _update_clear_reset_btn_label(); } void handle_timer_update() { - std::string value = _timer.counter_display_value(); - - timer_display_text(value); - - double record_floor = _timer.record_floor(); - - std::string rec_floor_text; - format_rate(rec_floor_text, record_floor); - - if(_timer.overtime()) { - std::string rec_floor_overtime; - format_rate(rec_floor_overtime, _timer.overtime_record_floor()); - rec_floor_text.append(", "); - rec_floor_text.append(rec_floor_overtime); - } + _view.timer_display_text(_timer.counter_display_value()); - timer_record_floor(rec_floor_text); + _view.timer_record_floor(_timer.record_floor_display()); for(size_t i = 0; i < _counters.size(); i++) _update_counter(i); if(_timer.overtime() && !_alarm_sound_triggered) { - _play_alarm(); + _view.play_alarm(); _alarm_sound_triggered = true; } } @@ -126,77 +151,43 @@ class TimerView { private: FreqTimer _timer; + TimerView _view; std::array _counters; bool _alarm_sound_triggered; - static void set_inner_text_by_id(std::string const & id, std::string const & text) { - emval timer_display = document.call("getElementById", emval(id.c_str())); - timer_display.set("innerText", text.c_str()); - } - - static void set_button_disabled(std::string const & id, bool disabled) { - emval timer_display = document.call("getElementById", emval(id.c_str())); - timer_display.set("disabled", disabled); - } - void _update_counter(uint32_t counter_num) { FreqCounter & counter = _counters[counter_num]; - std::string text = counter.display_value(); - double rate = counter.rate(); - - std::string rate_val; - format_rate(rate_val, rate); + std::string count = counter.display_value(); + std::string rate = counter.rate_display(); - if(_timer.overtime()) { - std::string rate_overtime; - format_rate(rate_overtime, counter.overtime_rate()); - rate_val.append(", "); - rate_val.append(rate_overtime); - } - - counter_display_text(counter_num, text, rate_val); + _view.counter_display_text(counter_num, count, rate); } - static void _play_alarm() { - - EM_ASM({ - const handle = document.getElementById("sound-handle"); - - const duration = Math.round(handle.duration * 1000.0); - - handle.currentTime = 0; - handle.play().then(() => { - setTimeout(() => { - handle.pause(); - }, duration); - }); - }); - + bool _clear_reset_btn_clears() const { + return ( + _timer.has_preset() and !_timer.started() and + (_counters[0].cnt() == 0 && _counters[1].cnt() == 0) + ); } - void _update_start_stop_label() { + void _update_labels() { + // Start / Stop Label if(_timer.running()) { - timer_start_stop_button_label("Stop"); + _view.timer_start_stop_button_label("Stop"); } else { - timer_start_stop_button_label("Start"); + _view.timer_start_stop_button_label("Start"); } - } - - bool _clear_reset_btn_clears() const { - return _timer.has_preset() and !_timer.started() and (_counters[0].cnt() == 0 && _counters[1].cnt() == 0); - } - void _update_clear_reset_btn_label() { + // Clear / Reset Button Label if(_clear_reset_btn_clears()) { - timer_clear_reset_button_label("Clear"); + _view.timer_clear_reset_button_label("Clear"); } else { - timer_clear_reset_button_label("Reset"); + _view.timer_clear_reset_button_label("Reset"); } - } - void _update_clear_reset_btn() { - set_button_disabled("clear-reset-btn", _timer.running()); + // Disable the clear / reset button when the timer is running + _view.set_clear_reset_button_disabled(_timer.running()); } void clear() { @@ -220,22 +211,22 @@ class TimerView { }; -EMSCRIPTEN_BINDINGS(timer_view) { - emscripten::class_("TimerView") +EMSCRIPTEN_BINDINGS(timer_controller) { + emscripten::class_("TimerController") .constructor() .function("handle_start_stop", - &TimerView::handle_start_stop + &TimerController::handle_start_stop ) .function("handle_clear_reset", - &TimerView::handle_clear_reset + &TimerController::handle_clear_reset ) .function("handle_inc_counter", - &TimerView::handle_inc_counter + &TimerController::handle_inc_counter ) .function("handle_inc_time", - &TimerView::handle_inc_time + &TimerController::handle_inc_time ) .function("handle_timer_update", - &TimerView::handle_timer_update + &TimerController::handle_timer_update ); } -- cgit v1.2.3