libpromeki main
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
application.h
Go to the documentation of this file.
1
8#pragma once
9
10#include <chrono>
14#include <promeki/core/point.h>
16#include <promeki/tui/screen.h>
17#include <promeki/tui/palette.h>
19
21
22class TuiWidget;
23
34 public:
40 TuiApplication(int argc, char **argv);
41
44
45 TuiApplication(const TuiApplication &) = delete;
46 TuiApplication &operator=(const TuiApplication &) = delete;
47
51 static TuiApplication *instance() { return _instance; }
52
57 void setRootWidget(TuiWidget *widget);
58
60 TuiWidget *rootWidget() const { return _rootWidget; }
61
63 TuiScreen &screen() { return _screen; }
64
66 Terminal &terminal() { return _terminal; }
67
69 const TuiPalette &palette() const { return _palette; }
70
72 TuiPalette &palette() { return _palette; }
73
75 void setPalette(const TuiPalette &palette) { _palette = palette; }
76
81 int exec();
82
87 void quit(int exitCode = 0);
88
101 _screen.setColorMode(mode);
102 updateAll();
103 }
104
109 Terminal::ColorSupport colorMode() const { return _screen.colorMode(); }
110
114 void updateAll();
115
121
123 TuiWidget *focusWidget() const { return _focusWidget; }
124
129 void focusNext(bool reverse = false);
130
139
146 void grabMouse(TuiWidget *widget) { _mouseGrab = widget; }
147
151 void releaseMouse() { _mouseGrab = nullptr; }
152
153 private:
154 static TuiApplication *_instance;
155
156 EventLoop _eventLoop;
157 Terminal _terminal;
158 TuiScreen _screen;
159 TuiPalette _palette;
160 TuiInputParser _inputParser;
161 AnsiStream _ansiStream;
162 TuiWidget *_rootWidget = nullptr;
163 TuiWidget *_focusWidget = nullptr;
164 TuiWidget *_mouseGrab = nullptr;
165 int _exitCode = 0;
166 bool _running = false;
167 bool _needsRepaint = true;
168 int _lastCols = 0;
169 int _lastRows = 0;
170
171 // Double-click detection state
172 using Clock = std::chrono::steady_clock;
173 using TimePoint = Clock::time_point;
174 static constexpr int DoubleClickIntervalMs = 400;
175 TimePoint _lastClickTime{};
176 Point2Di32 _lastClickPos{-1, -1};
177 MouseEvent::Button _lastClickButton = MouseEvent::NoButton;
178
179 void processInput();
180 void paintWidgets();
181 void paintWidget(TuiWidget *widget);
182 void handleResize();
183 void dispatchKeyEvent(const TuiInputParser::ParsedEvent &ev);
184 void dispatchMouseEvent(const TuiInputParser::ParsedEvent &ev);
185 void collectFocusable(TuiWidget *widget, List<TuiWidget *> &list);
186 TuiWidget *widgetAt(TuiWidget *widget, const Point2Di32 &globalPos);
187};
188
ANSI escape code writer backed by an IODevice. Writes ANSI escape sequences and raw text to an IODevi...
Definition ansistream.h:27
Application-wide state for the promeki library.
Definition application.h:47
Per-thread event loop providing event dispatch, timers, and posted callables.
Definition eventloop.h:58
Dynamic array container wrapping std::vector.
Definition list.h:40
Button
Mouse button flags (bit values for combining).
Definition mouseevent.h:29
Low-level terminal I/O abstraction.
Definition terminal.h:28
ColorSupport
Describes the color capability level of the terminal.
Definition terminal.h:54
Application class for TUI programs.
Definition application.h:33
void grabMouse(TuiWidget *widget)
Grabs mouse events for a widget.
Definition application.h:146
Terminal & terminal()
Returns the terminal.
Definition application.h:66
TuiWidget * focusWidget() const
Returns the currently focused widget.
Definition application.h:123
void releaseMouse()
Releases the mouse grab.
Definition application.h:151
void setRootWidget(TuiWidget *widget)
Sets the top-level (root) widget.
void markNeedsRepaint()
Marks the screen as needing a repaint.
Terminal::ColorSupport colorMode() const
Returns the current color mode.
Definition application.h:109
~TuiApplication()
Destructor. Restores terminal state.
void focusNext(bool reverse=false)
Cycles focus to the next focusable widget.
static TuiApplication * instance()
Returns the TuiApplication instance.
Definition application.h:51
int exec()
Runs the TUI application event loop.
void quit(int exitCode=0)
Requests the application to quit.
TuiApplication(int argc, char **argv)
Constructs a TuiApplication.
void setPalette(const TuiPalette &palette)
Sets the palette.
Definition application.h:75
TuiScreen & screen()
Returns the screen.
Definition application.h:63
void setFocusWidget(TuiWidget *widget)
Sets the focused widget.
const TuiPalette & palette() const
Returns the palette.
Definition application.h:69
void setColorMode(Terminal::ColorSupport mode)
Sets the color mode for the TUI screen.
Definition application.h:100
TuiPalette & palette()
Returns the palette for modification.
Definition application.h:72
TuiWidget * rootWidget() const
Returns the root widget.
Definition application.h:60
void updateAll()
Forces a full screen repaint.
State machine for parsing terminal escape sequences into events.
Definition inputparser.h:24
Style palette for TUI widgets.
Definition palette.h:35
Double-buffered character cell grid for TUI rendering.
Definition screen.h:60
Terminal::ColorSupport colorMode() const
Returns the current color mode.
Definition screen.h:131
void setColorMode(Terminal::ColorSupport mode)
Sets the color mode used when emitting colors during flush.
Definition screen.h:125
Base class for all TUI widgets.
Definition widget.h:88
#define PROMEKI_NAMESPACE_BEGIN
Starts a promeki namespace block.
Definition namespace.h:14
#define PROMEKI_NAMESPACE_END
Ends a promeki namespace block.
Definition namespace.h:19
Parsed event variant.
Definition inputparser.h:27