diff --git a/src/alerts.cc b/src/alerts.cc index 886fd7e..ad6ff45 100644 --- a/src/alerts.cc +++ b/src/alerts.cc @@ -178,19 +178,13 @@ void AlertViewer::display_next_alert_maybe() { } } -bool AlertViewer::handle_key_press(int key) { - return (key == IV_KEY_PREV) or (key == IV_KEY_NEXT); -} - bool AlertViewer::handle_key_release(int key) { if (key == IV_KEY_PREV) { this->display_previous_alert_maybe(); - return true; } else if (key == IV_KEY_NEXT) { this->display_next_alert_maybe(); - return true; } - return false; + return true; } int AlertViewer::handle_pointer_event(int event_type, int pointer_pos_x, diff --git a/src/alerts.h b/src/alerts.h index 658a2ef..7c9f8cc 100644 --- a/src/alerts.h +++ b/src/alerts.h @@ -43,8 +43,6 @@ class AlertViewer : public ModalWidget { void do_paint() override; - bool handle_key_press(int key) override; - bool handle_key_release(int key) override; int handle_pointer_event(int event_type, int pointer_pos_x, diff --git a/src/ui.cc b/src/ui.cc index c882c70..a9adb94 100644 --- a/src/ui.cc +++ b/src/ui.cc @@ -73,6 +73,7 @@ Ui::Ui(std::shared_ptr config, std::shared_ptr model) this->children.push_back(this->forecast_stack); this->children.push_back(status_bar); + this->register_key_event_consumer(this->alert_viewer); this->register_key_event_consumer(menu_button); this->register_key_event_consumer(this->forecast_stack); } @@ -113,6 +114,14 @@ int Ui::handle_pointer_event(int event_type, int pointer_pos_x, return 0; } +bool Ui::is_key_event_consumer_active( + std::shared_ptr consumer) { + if (this->visible_modal) { + return consumer == this->visible_modal; + } + return KeyEventDispatcher::is_key_event_consumer_active(consumer); +} + void Ui::switch_forecast_widget() { this->forecast_stack->switch_forecast(); } void Ui::open_location_list(const std::vector &locations) { diff --git a/src/ui.h b/src/ui.h index 414bca3..6720a93 100644 --- a/src/ui.h +++ b/src/ui.h @@ -35,6 +35,9 @@ class Ui : public KeyEventDispatcher { int handle_pointer_event(int event_type, int pointer_pos_x, int pointer_pos_y); + bool is_key_event_consumer_active( + std::shared_ptr consumer) override; + void display_alert() { this->alert_viewer->open(); } void switch_forecast_widget(); diff --git a/src/widget.h b/src/widget.h index e1b5b58..b43dd8c 100644 --- a/src/widget.h +++ b/src/widget.h @@ -39,10 +39,11 @@ struct Widget : public KeyEventConsumer { virtual bool is_modal() const { return false; } // a modal widget takes control of the screen, and receives all - // keys and pointer events + // keys and pointer events when visible virtual bool is_visible() const { return true; } - // invisible widgets are painted white + // invisible widgets are painted white, note that nothing ensures + // that the returned value change when a modal is opened! virtual bool is_enabled() const { return true; } // disabled widgets don't receive keys and pointer events @@ -83,6 +84,8 @@ struct Widget : public KeyEventConsumer { return this->is_visible() and this->is_enabled(); } + bool handle_key_press(int key) override { return this->is_modal(); } + protected: irect bounding_box;