#pragma once namespace roro { // Selection and scrolling for a vertical list showing `visibleRows` rows at a time. // Up/Down wrap around; page moves don't. class ListModel { public: explicit ListModel(int visibleRows) : rows_(visibleRows) {} void setCount(int count); int count() const { return count_; } int selected() const { return selected_; } // -1 when empty int firstVisible() const { return first_; } int visibleRows() const { return rows_; } void select(int index); void up(); void down(); void pageUp(); void pageDown(); private: void scrollToSelection(); int rows_; int count_ = 0; int selected_ = -1; int first_ = 0; }; } // namespace roro