CDC Badge OS
Firmware for the CDC Badge v1.0 hardware security key
Loading...
Searching...
No Matches
ListView.h
Go to the documentation of this file.
1#pragma once
2
3#include "cdc_ui/IView.h"
4#include "freertos/FreeRTOS.h"
5#include "freertos/semphr.h"
6#include <cstdint>
7
8class Gdey029T94;
9
10namespace cdc::ui {
11
15struct ListItem {
16 const char* label; // Display text
17 uint8_t icon = 0; // Icon type (0 = none)
18 bool iconDisabled = false; // Draw icon crossed-out
19 void* userData = nullptr; // Optional user data
20};
21
34class ListView : public ViewBase {
35public:
36 static constexpr uint16_t MAX_ITEMS = 2048;
37 static constexpr uint8_t DEFAULT_ITEM_HEIGHT = 18;
38 // The actual visible-row count is the file-scope VISIBLE_ITEMS in
39 // ListView.cpp (fixed at 4 for the 296x128 panel).
40
46 using SelectCallback = void(*)(uint16_t index, void* userData);
47
53 using MenuCallback = void(*)(uint16_t index, void* userData);
54
59 using ItemRenderCallback = bool(*)(Gdey029T94* gfx,
60 const ListItem& item,
61 uint16_t index,
62 int x, int y, int w, int h,
63 bool selected,
64 void* userCtx);
65
72 void init(const char* title, const ListItem* items, uint16_t count);
73
77 void setOnSelect(SelectCallback callback) { onSelect_ = callback; }
78
82 void setOnMenu(MenuCallback callback) { onMenu_ = callback; }
83
93 void setEditMutex(SemaphoreHandle_t mutex) { editMutex_ = mutex; }
94
98 void setItemRenderer(ItemRenderCallback callback, void* userCtx = nullptr) {
99 itemRenderer_ = callback;
100 itemRendererCtx_ = userCtx;
101 }
102
106 void setHint(const char* hint) { customHint_ = hint; }
107
111 void setEmptyText(const char* text) { emptyText_ = text; }
112
116 void setItemHeight(uint8_t height) { itemHeight_ = height > 0 ? height : DEFAULT_ITEM_HEIGHT; }
117
121 uint16_t getSelection() const { return selection_; }
122
126 void setSelection(uint16_t index);
127
131 uint16_t getItemCount() const { return itemCount_; }
132
136 const ListItem* getSelectedItem() const;
137
149 void updateItem(uint16_t index);
150
160 void insertItem(uint16_t index);
161
170 void removeItem(uint16_t index);
171
177 void repaintPartial();
178
183 void preservePosition() { preservePosition_ = true; }
184
185 // IView implementation
186 void render(bool partial) override;
187 InputResult onKey(char key) override;
188 InputResult onLongPress(char key) override;
189 const char* getName() const override { return "ListView"; }
190 const char* getFooterHint() const override;
191
192private:
193 const char* title_ = nullptr;
194 const char* customHint_ = nullptr;
195 const char* emptyText_ = nullptr;
196 const ListItem* items_ = nullptr;
197 uint16_t itemCount_ = 0;
198 uint16_t selection_ = 0;
199 uint16_t scrollPos_ = 0;
200 SelectCallback onSelect_ = nullptr;
201 MenuCallback onMenu_ = nullptr;
202 ItemRenderCallback itemRenderer_ = nullptr;
203 void* itemRendererCtx_ = nullptr;
204 bool preservePosition_ = false;
205 uint8_t itemHeight_ = DEFAULT_ITEM_HEIGHT;
206 // Optional, borrowed (not owned): serialises item-buffer access with a
207 // cross-task writer. Null disables locking. See setEditMutex().
208 SemaphoreHandle_t editMutex_ = nullptr;
209
210 // Calculated at render time based on display dimensions
211 uint8_t visibleItems_ = 4;
212
213 void navigate(bool down);
214 void ensureVisible();
215 void drawRow(Gdey029T94* gfx, uint16_t itemIndex, int y, int rowWidth);
216};
217
218// ============================================================================
219// Convenience Functions
220// ============================================================================
221
237ListView* showListView(const char* title, const ListItem* items, uint16_t count,
238 ListView::SelectCallback onSelect, const char* hint = nullptr);
239
240} // namespace cdc::ui
void repaintPartial()
Requests a redraw; the actual repaint happens once per render cycle.
Definition ListView.cpp:380
void setEditMutex(SemaphoreHandle_t mutex)
Definition ListView.h:93
void setItemHeight(uint8_t height)
Definition ListView.h:116
const char * getFooterHint() const override
Returns footer hint text for this list.
Definition ListView.cpp:219
static constexpr uint8_t DEFAULT_ITEM_HEIGHT
Definition ListView.h:37
void(*)(uint16_t index, void *userData) MenuCallback
Definition ListView.h:53
void preservePosition()
Definition ListView.h:183
uint16_t getSelection() const
Definition ListView.h:121
bool(*)(Gdey029T94 *gfx, const ListItem &item, uint16_t index, int x, int y, int w, int h, bool selected, void *userCtx) ItemRenderCallback
Definition ListView.h:59
void(*)(uint16_t index, void *userData) SelectCallback
Definition ListView.h:46
const ListItem * getSelectedItem() const
Returns the currently selected item.
Definition ListView.cpp:88
void setEmptyText(const char *text)
Definition ListView.h:111
static constexpr uint16_t MAX_ITEMS
Definition ListView.h:36
InputResult onKey(char key) override
Handles key input for list navigation and actions.
Definition ListView.cpp:144
void insertItem(uint16_t index)
Reflects a caller-side insertion at index and marks dirty.
Definition ListView.cpp:389
uint16_t getItemCount() const
Definition ListView.h:131
const char * getName() const override
Definition ListView.h:189
void setOnMenu(MenuCallback callback)
Definition ListView.h:82
void setSelection(uint16_t index)
Sets the selected item index.
Definition ListView.cpp:76
InputResult onLongPress(char key) override
Definition ListView.cpp:205
void setOnSelect(SelectCallback callback)
Definition ListView.h:77
void init(const char *title, const ListItem *items, uint16_t count)
Initializes list data and selection state.
Definition ListView.cpp:49
void setItemRenderer(ItemRenderCallback callback, void *userCtx=nullptr)
Definition ListView.h:98
void removeItem(uint16_t index)
Reflects a caller-side removal at index and marks dirty.
Definition ListView.cpp:409
void setHint(const char *hint)
Definition ListView.h:106
void updateItem(uint16_t index)
Marks the list dirty after the caller updated a backing item.
Definition ListView.cpp:370
const char * title_
Definition IView.h:202
SemaphoreHandle_t mutex
Definition ctaphid.cpp:51
Centralized key-code constants for cdc_views.
Definition IModule.h:8
InputResult
Definition IView.h:10
ListView * showListView(const char *title, const ListItem *items, uint16_t count, ListView::SelectCallback onSelect, const char *hint=nullptr)
Shows a shared list view instance with selection callback.
Definition ListView.cpp:438
const char * label
Definition ListView.h:16