#pragma once #include #include #include "key_event.h" namespace roro { // A modal choice between buttons. The first button should be the safe one (e.g. "Cancel"): // it's highlighted initially, and Back always cancels. class DialogModel { public: static constexpr int kPending = -1; static constexpr int kCancelled = -2; explicit DialogModel(std::vector buttons) : buttons_(std::move(buttons)) {} // Consumes every key while open. bool onKey(const KeyEvent& e) { if (result_ != kPending) return true; int last = static_cast(buttons_.size()) - 1; switch (e.key) { case Key::Left: if (selected_ > 0) selected_--; break; case Key::Right: if (selected_ < last) selected_++; break; case Key::Tab: selected_ = selected_ == last ? 0 : selected_ + 1; break; case Key::Select: result_ = selected_; break; case Key::Back: result_ = kCancelled; break; default: break; } return true; } const std::vector& buttons() const { return buttons_; } int selected() const { return selected_; } int result() const { return result_; } private: std::vector buttons_; int selected_ = 0; int result_ = kPending; }; } // namespace roro