FifeGUI 0.2.0
A C++ GUI library designed for games.
gui.hpp
1// SPDX-License-Identifier: LGPL-2.1-or-later OR BSD-3-Clause
2// SPDX-FileCopyrightText: 2004 - 2008 Olof Naessén and Per Larsson
3// SPDX-FileCopyrightText: 2013 - 2026 Fifengine contributors
4
5#ifndef INCLUDE_FIFECHAN_GUI_HPP_
6#define INCLUDE_FIFECHAN_GUI_HPP_
7
8#include <algorithm>
9#include <iterator>
10#include <list>
11#include <memory>
12#include <queue>
13#include <set>
14#include <string>
15
16#include "fifechan/keyevent.hpp"
17#include "fifechan/mouseevent.hpp"
18#include "fifechan/mouseinput.hpp"
19#include "fifechan/platform.hpp"
20
21namespace fcn
22{
23 class FocusHandler;
24 class Font;
25 class GuiDeathListener;
26 class Graphics;
27 class Input;
28 class KeyListener;
30 class Widget;
31
32 // The following comment will appear in the doxygen main page.
77
100 class FIFEGUI_API Gui
101 {
102 public:
103 Gui();
104
105 virtual ~Gui();
106
107 Gui(Gui const &) = delete;
108 Gui& operator=(Gui const &) = delete;
109 Gui(Gui&&) = delete;
110 Gui& operator=(Gui&&) = delete;
111
120 virtual void setTop(Widget* top);
121
127 virtual void setTop(std::unique_ptr<Widget> top);
128
134 virtual void setRoot(Widget* top);
135
141 virtual void setRoot(std::unique_ptr<Widget> top);
142
149 virtual Widget* getTop() const;
150
157 virtual void setGraphics(Graphics* graphics);
158
164 virtual void setGraphics(std::unique_ptr<Graphics> graphics);
165
173 virtual Graphics* getGraphics() const;
174
181 virtual void setInput(Input* input);
182
188 virtual void setInput(std::unique_ptr<Input> input);
189
197 virtual Input* getInput() const;
198
207 virtual void initialize(
208 std::unique_ptr<Graphics> graphics, std::unique_ptr<Input> input, int width, int height);
209
215 virtual FocusHandler* getFocusHandler() const;
216
223 virtual void setGlobalFont(std::string const & filename, int size);
224
232 virtual void logic();
233
242 virtual void draw();
243
248 virtual void focusNone();
249
258 virtual void setTabbingEnabled(bool tabbing);
259
266 virtual bool isTabbingEnabled();
267
277 virtual void addGlobalKeyListener(KeyListener* keyListener);
278
286 virtual void removeGlobalKeyListener(KeyListener* keyListener);
287
293 void enqueueHiddenWidget(Widget* widget);
294
300 void enqueueShownWidget(Widget* widget);
301
307 void widgetDied(Widget const * widget);
308
309 protected:
314 virtual void handleMouseInput();
315
320 virtual void handleKeyInput();
321
327 virtual void handleMouseMoved(MouseInput const & mouseInput);
328
334 virtual void handleMousePressed(MouseInput const & mouseInput);
335
342 virtual void handleMouseWheelMovedDown(MouseInput const & mouseInput);
343
349 virtual void handleMouseWheelMovedUp(MouseInput const & mouseInput);
350
356 virtual void handleMouseWheelMovedRight(MouseInput const & mouseInput);
357
363 virtual void handleMouseWheelMovedLeft(MouseInput const & mouseInput);
364
370 virtual void handleMouseReleased(MouseInput const & mouseInput);
371
378 virtual void handleModalFocus();
379
386 virtual void handleModalMouseInputFocus();
387
393 virtual void handleModalFocusGained();
394
401 virtual void handleModalFocusReleased();
402
409
417
421 virtual void handleHiddenWidgets();
422
426 virtual void handleShownWidgets();
427
432 void distributeMouseEvent(Widget* source, MouseEvent::Type type, MouseEvent::Button button, int x, int y)
433 {
434 distributeMouseEvent(source, type, button, x, y, false, false);
435 }
436
441 Widget* source, MouseEvent::Type type, MouseEvent::Button button, int x, int y, bool force)
442 {
443 distributeMouseEvent(source, type, button, x, y, force, false);
444 }
445
459 virtual void distributeMouseEvent(
460 Widget* source,
461 MouseEvent::Type type,
462 MouseEvent::Button button,
463 int x,
464 int y,
465 bool force,
466 bool toSourceOnly);
467
474 virtual void distributeKeyEvent(KeyEvent& keyEvent);
475
482 virtual void distributeKeyEventToGlobalKeyListeners(KeyEvent& keyEvent);
483
489 Widget* getWidgetAt(int x, int y)
490 {
491 return getWidgetAt(x, y, nullptr);
492 }
493
501 virtual Widget* getWidgetAt(int x, int y, Widget* exclude);
502
508 virtual Widget* getMouseEventSource(int x, int y);
509
515 virtual Widget* getKeyEventSource();
516
524 virtual std::set<Widget*> getWidgetsAt(int x, int y);
525
530
534 std::queue<Widget*> mHiddenWidgets;
535
539 std::queue<Widget*> mShownWidgets;
540
545
550
555
560
565
569 using KeyListenerList = std::list<KeyListener*>;
570
574 using KeyListenerListIterator = KeyListenerList::iterator;
575
580
585
590
595
600
605
610
615
620
626
633
636
638 std::unique_ptr<Widget> mOwnedTop;
639
641 std::unique_ptr<Graphics> mOwnedGraphics;
642
644 std::unique_ptr<Input> mOwnedInput;
645
647 std::shared_ptr<Font> mGlobalFont;
648 };
649} // namespace fcn
650
651#endif // INCLUDE_FIFECHAN_GUI_HPP_
Manages focus navigation and assignment among widgets within a Gui instance.
Abstract interface for font rendering.
Definition font.hpp:24
Abstract interface providing primitive drawing functions (lines, rectangles, etc.).
Definition graphics.hpp:57
Internal listener that forwards death notifications from widgets to the owning Gui so it can clean up...
Definition gui.cpp:38
Graphics * mGraphics
Holds the graphics implementation used.
Definition gui.hpp:544
Widget * mTop
Holds the top widget.
Definition gui.hpp:529
Input * mInput
Holds the input implementation used.
Definition gui.hpp:549
virtual Graphics * getGraphics() const
Gets the graphics object used for drawing.
Definition gui.cpp:152
virtual Input * getInput() const
Gets the input object being used for input handling.
Definition gui.cpp:171
virtual void handleModalMouseInputFocus()
Handles modal mouse input focus.
Definition gui.cpp:902
virtual void focusNone()
Focuses none of the widgets in the Gui.
Definition gui.cpp:245
Widget * getWidgetAt(int x, int y)
Gets the widget at a certain position.
Definition gui.hpp:489
FocusHandler * mFocusHandler
Holds the focus handler for the Gui.
Definition gui.hpp:554
virtual void setRoot(Widget *top)
Alias for setTop.
Definition gui.cpp:123
KeyListenerList mKeyListeners
Holds the global key listeners of the Gui.
Definition gui.hpp:579
bool mTabbing
True if tabbing is enabled, false otherwise.
Definition gui.hpp:564
virtual void draw()
Draws the GUI.
Definition gui.cpp:226
std::queue< Widget * > mShownWidgets
Holds shown widgets.
Definition gui.hpp:539
int mLastMouseDragButton
Holds the last button used when a drag of a widget was initiated.
Definition gui.hpp:632
virtual void handleModalFocus()
Handles modal focus.
Definition gui.cpp:916
virtual FocusHandler * getFocusHandler() const
Returns the focus handler used by this GUI.
Definition gui.cpp:184
void distributeMouseEvent(Widget *source, MouseEvent::Type type, MouseEvent::Button button, int x, int y)
Convenience overload: distribute a mouse event forwarding to the full overload with force and toSourc...
Definition gui.hpp:432
int mLastMousePressTimeStamp
Holds the last mouse press time stamp.
Definition gui.hpp:609
unsigned int mLastMousePressButton
Holds the last mouse button pressed.
Definition gui.hpp:604
virtual void handleMouseInput()
Handles all mouse input.
Definition gui.cpp:303
virtual void setGraphics(Graphics *graphics)
Sets the graphics object to use for drawing.
Definition gui.cpp:138
virtual void handleModalFocusReleased()
Handles modal focus released.
Definition gui.cpp:953
bool mControlPressed
True if control is pressed, false otherwise.
Definition gui.hpp:594
bool mMetaPressed
True if meta is pressed, false otherwise.
Definition gui.hpp:589
virtual void initialize(std::unique_ptr< Graphics > graphics, std::unique_ptr< Input > input, int width, int height)
Initializes GUI backends in one call.
Definition gui.cpp:176
std::unique_ptr< Widget > mOwnedTop
Optional owned top widget (when Gui takes ownership).
Definition gui.hpp:638
std::unique_ptr< Graphics > mOwnedGraphics
Optional owned graphics backend instance.
Definition gui.hpp:641
int mLastMouseX
Holds the last mouse x coordinate.
Definition gui.hpp:614
virtual void handleMouseWheelMovedRight(MouseInput const &mouseInput)
Handles mouse wheel moved right input.
Definition gui.cpp:589
virtual void setInput(Input *input)
Sets the input object to use for input handling.
Definition gui.cpp:157
void enqueueShownWidget(Widget *widget)
Inform gui that a widget was shown.
Definition gui.cpp:275
void distributeMouseEvent(Widget *source, MouseEvent::Type type, MouseEvent::Button button, int x, int y, bool force)
Convenience overload: forward and allow specifying force while toSourceOnly remains false.
Definition gui.hpp:440
virtual void setTabbingEnabled(bool tabbing)
Sets tabbing enabled, or not.
Definition gui.cpp:250
virtual void handleModalMouseInputFocusReleased()
Handles modal mouse input focus released.
Definition gui.cpp:996
virtual Widget * getTop() const
Gets the top widget.
Definition gui.cpp:133
virtual void handleKeyInput()
Handles key input.
Definition gui.cpp:344
virtual void handleHiddenWidgets()
Handles hidden widgets.
Definition gui.cpp:1016
std::queue< Widget * > mHiddenWidgets
Holds hidden widgets.
Definition gui.hpp:534
bool mAltPressed
True if alt is pressed, false otherwise.
Definition gui.hpp:599
int mLastMouseY
Holds the last mouse y coordinate.
Definition gui.hpp:619
KeyListenerList::iterator KeyListenerListIterator
Typedef.
Definition gui.hpp:574
virtual void handleShownWidgets()
Handles shown widgets.
Definition gui.cpp:1050
GuiDeathListener * mDeathListener
Listener notified when the GUI or top widget is destroyed.
Definition gui.hpp:635
virtual void handleMouseWheelMovedDown(MouseInput const &mouseInput)
Handles mouse wheel moved down input.
Definition gui.cpp:549
virtual bool isTabbingEnabled()
Checks if tabbing is enabled.
Definition gui.cpp:255
std::unique_ptr< Input > mOwnedInput
Optional owned input backend instance.
Definition gui.hpp:644
virtual void removeGlobalKeyListener(KeyListener *keyListener)
Removes global key listener from the Gui.
Definition gui.cpp:265
std::shared_ptr< Font > mGlobalFont
Shared global font used by widgets when not overridden.
Definition gui.hpp:647
virtual void handleModalMouseInputFocusGained()
Handles modal mouse input focus gained.
Definition gui.cpp:973
virtual void handleMouseMoved(MouseInput const &mouseInput)
Handles mouse moved input.
Definition gui.cpp:413
virtual void handleMouseWheelMovedUp(MouseInput const &mouseInput)
Handles mouse wheel moved up input.
Definition gui.cpp:569
virtual void addGlobalKeyListener(KeyListener *keyListener)
Adds a global key listener to the Gui.
Definition gui.cpp:260
virtual void setTop(Widget *top)
Sets the top widget.
Definition gui.cpp:101
bool mShiftPressed
True if shift is pressed, false otherwise.
Definition gui.hpp:584
void enqueueHiddenWidget(Widget *widget)
Inform gui that a widget was hidden.
Definition gui.cpp:270
virtual void setGlobalFont(std::string const &filename, int size)
Loads a font using the active graphics backend and sets it as global widget font.
Definition gui.cpp:189
virtual void handleModalFocusGained()
Handles modal focus gained.
Definition gui.cpp:930
virtual void handleMouseWheelMovedLeft(MouseInput const &mouseInput)
Handles mouse wheel moved left input.
Definition gui.cpp:609
virtual void handleMousePressed(MouseInput const &mouseInput)
Handles mouse pressed input.
Definition gui.cpp:509
void widgetDied(Widget const *widget)
Inform gui that a widget was deleted.
Definition gui.cpp:280
std::list< KeyListener * > KeyListenerList
Typedef.
Definition gui.hpp:569
virtual void logic()
Performs logic of the GUI.
Definition gui.cpp:204
int mClickCount
Holds the current click count.
Definition gui.hpp:625
VisibilityEventHandler * mVisibilityEventHandler
Holds the visibility event handler for the Gui.
Definition gui.hpp:559
virtual void handleMouseReleased(MouseInput const &mouseInput)
Handles mouse released input.
Definition gui.cpp:629
Abstract interface for polling user input devices.
Definition input.hpp:28
Represents a key event.
Definition keyevent.hpp:22
Interface for listening to keyboard events.
Button
Mouse button types.
Type
Mouse event types.
Internal class representing raw mouse input data.
Handles changes in widget visibility states.
Abstract base class defining the common behavior, properties, and lifecycle of all GUI elements.
Definition widget.hpp:45