FifeGUI 0.3.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// Standard library includes
9#include <algorithm>
10#include <iterator>
11#include <list>
12#include <memory>
13#include <queue>
14#include <string>
15#include <vector>
16
17// Platform config include
18#include "fifechan/platform.hpp"
19
20// Project headers (subdirs before local)
21#include "fifechan/events/keyevent.hpp"
22#include "fifechan/events/mouseevent.hpp"
23#include "fifechan/mouseinput.hpp"
24
25namespace fcn
26{
27 class FocusHandler;
28 class Font;
29 class GuiDeathListener;
30 class Graphics;
31 class Input;
32 class KeyListener;
34 class Widget;
35 class DragHandler;
36
37 // The following comment will appear in the doxygen main page.
82
107 class FIFEGUI_API Gui
108 {
109 public:
110 friend class DragHandler;
111 Gui();
112
113 virtual ~Gui();
114
115 Gui(Gui const &) = delete;
116 Gui& operator=(Gui const &) = delete;
117 Gui(Gui&&) = delete;
118 Gui& operator=(Gui&&) = delete;
119
130 virtual void setTop(Widget* top);
131
137 virtual void setTop(std::unique_ptr<Widget> top);
138
144 virtual void setRoot(Widget* top);
145
151 virtual void setRoot(std::unique_ptr<Widget> top);
152
160 virtual Widget* getTop() const;
161
168 virtual void setGraphics(Graphics* graphics);
169
175 virtual void setGraphics(std::unique_ptr<Graphics> graphics);
176
184 virtual Graphics* getGraphics() const;
185
192 virtual void setInput(Input* input);
193
199 virtual void setInput(std::unique_ptr<Input> input);
200
208 virtual Input* getInput() const;
209
218 virtual void initialize(
219 std::unique_ptr<Graphics> graphics, std::unique_ptr<Input> input, int width, int height);
220
226 virtual FocusHandler* getFocusHandler() const;
227
234 virtual void setGlobalFont(std::string const & filename, int size);
235
243 virtual void logic();
244
253 virtual void draw();
254
259 virtual void focusNone();
260
269 virtual void setTabbingEnabled(bool tabbing);
270
277 virtual bool isTabbingEnabled();
278
288 virtual void addGlobalKeyListener(KeyListener* keyListener);
289
297 virtual void removeGlobalKeyListener(KeyListener* keyListener);
298
304 void addHiddenWidget(Widget* widget);
305
311 void addShownWidget(Widget* widget);
312
318 void widgetDied(Widget const * widget);
319
320 protected:
325 virtual void handleMouseInput();
326
331 virtual void handleKeyInput();
332
337 virtual void handleTextInput();
338
344 virtual void handleMouseMoved(MouseInput const & mouseInput);
345
351 virtual void handleMousePressed(MouseInput const & mouseInput);
352
359 virtual void handleMouseWheelMovedDown(MouseInput const & mouseInput);
360
366 virtual void handleMouseWheelMovedUp(MouseInput const & mouseInput);
367
373 virtual void handleMouseWheelMovedRight(MouseInput const & mouseInput);
374
380 virtual void handleMouseWheelMovedLeft(MouseInput const & mouseInput);
381
387 virtual void handleMouseReleased(MouseInput const & mouseInput);
388
395 virtual void handleModalFocus();
396
403 virtual void handleModalMouseInputFocus();
404
410 virtual void handleModalFocusGained();
411
418 virtual void handleModalFocusReleased();
419
426
434
438 virtual void handleHiddenWidgets();
439
443 virtual void handleShownWidgets();
444
449 void distributeMouseEvent(Widget* source, MouseEvent::Type type, MouseEvent::Button button, int x, int y)
450 {
451 distributeMouseEvent(source, type, button, x, y, false, false);
452 }
453
458 Widget* source, MouseEvent::Type type, MouseEvent::Button button, int x, int y, bool force)
459 {
460 distributeMouseEvent(source, type, button, x, y, force, false);
461 }
462
476 virtual void distributeMouseEvent(
477 Widget* source,
478 MouseEvent::Type type,
479 MouseEvent::Button button,
480 int x,
481 int y,
482 bool force,
483 bool toSourceOnly);
484
491 virtual void distributeKeyEvent(KeyEvent& keyEvent);
492
499 virtual void distributeKeyEventToGlobalKeyListeners(KeyEvent& keyEvent);
500
506 Widget* getWidgetAt(int x, int y)
507 {
508 return getWidgetAt(x, y, nullptr);
509 }
510
518 virtual Widget* getWidgetAt(int x, int y, Widget* exclude);
519
525 virtual Widget* getMouseEventSource(int x, int y);
526
535 void captureMouse(Widget* widget);
536
542 void releaseMouse(Widget* widget);
543
549 virtual Widget* getKeyEventSource();
550
558 virtual std::vector<Widget*> getWidgetsAt(int x, int y);
559
564
568 std::vector<Widget*> mHiddenWidgets;
569
573 std::vector<Widget*> mShownWidgets;
574
579
584
589
594
599
601 using KeyListenerList = std::list<KeyListener*>;
602
604 using KeyListenerListIterator = KeyListenerList::iterator;
605
610
615
620
625
630
635
640
645
650
656
663
666
668 std::unique_ptr<Widget> mOwnedTop;
669
671 std::unique_ptr<Graphics> mOwnedGraphics;
672
674 std::unique_ptr<Input> mOwnedInput;
675
677 std::shared_ptr<Font> mGlobalFont;
678 };
679} // namespace fcn
680
681#endif // INCLUDE_FIFECHAN_GUI_HPP_
Manages drag and drop operations for a Gui instance.
Definition dragdrop.hpp:217
Manages focus navigation and assignment among widgets within a Gui instance.
Abstract interface for font rendering.
Definition font.hpp:26
Abstract interface providing primitive drawing functions (lines, rectangles, etc.).
Definition graphics.hpp:58
Internal listener that forwards death notifications from widgets to the owning Gui so it can clean up...
Definition gui.cpp:46
Graphics * mGraphics
Holds the graphics implementation used.
Definition gui.hpp:578
Widget * mTop
Holds the top widget.
Definition gui.hpp:563
Input * mInput
Holds the input implementation used.
Definition gui.hpp:583
virtual Graphics * getGraphics() const
Gets the graphics object used for drawing.
Definition gui.cpp:167
virtual Input * getInput() const
Gets the input object being used for input handling.
Definition gui.cpp:188
virtual void handleModalMouseInputFocus()
Handles modal mouse input focus.
Definition gui.cpp:1017
virtual void focusNone()
Focuses none of the widgets in the GUI.
Definition gui.cpp:268
Widget * getWidgetAt(int x, int y)
Gets the widget at a certain position.
Definition gui.hpp:506
FocusHandler * mFocusHandler
Holds the focus handler for the GUI.
Definition gui.hpp:588
void addHiddenWidget(Widget *widget)
Inform gui that a widget was hidden.
Definition gui.cpp:293
virtual void setRoot(Widget *top)
Alias for setTop.
Definition gui.cpp:136
KeyListenerList mKeyListeners
Holds the global key listeners of the GUI.
Definition gui.hpp:609
bool mTabbing
True if tabbing is enabled, false otherwise.
Definition gui.hpp:598
virtual void draw()
Draws the GUI.
Definition gui.cpp:246
int mLastMouseDragButton
Holds the last button used when a drag of a widget was initiated.
Definition gui.hpp:662
virtual void handleModalFocus()
Handles modal focus.
Definition gui.cpp:1031
virtual FocusHandler * getFocusHandler() const
Returns the focus handler used by this GUI.
Definition gui.cpp:201
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:449
int mLastMousePressTimeStamp
Holds the last mouse press time stamp.
Definition gui.hpp:639
unsigned int mLastMousePressButton
Holds the last mouse button pressed.
Definition gui.hpp:634
virtual void handleMouseInput()
Handles all mouse input.
Definition gui.cpp:309
virtual void setGraphics(Graphics *graphics)
Sets the graphics object to use for drawing.
Definition gui.cpp:151
virtual void handleModalFocusReleased()
Handles modal focus released.
Definition gui.cpp:1067
bool mControlPressed
True if control is pressed, false otherwise.
Definition gui.hpp:624
virtual void handleTextInput()
Handles text input from the backend.
Definition gui.cpp:350
bool mMetaPressed
True if meta is pressed, false otherwise.
Definition gui.hpp:619
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:193
std::unique_ptr< Widget > mOwnedTop
Optional owned top widget (when Gui takes ownership).
Definition gui.hpp:668
std::unique_ptr< Graphics > mOwnedGraphics
Optional owned graphics backend instance.
Definition gui.hpp:671
int mLastMouseX
Holds the last mouse x coordinate.
Definition gui.hpp:644
virtual void handleMouseWheelMovedRight(MouseInput const &mouseInput)
Handles mouse wheel moved right input.
Definition gui.cpp:617
virtual void setInput(Input *input)
Sets the input object to use for input handling.
Definition gui.cpp:172
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:457
virtual void setTabbingEnabled(bool tabbing)
Sets tabbing enabled, or not.
Definition gui.cpp:273
virtual void handleModalMouseInputFocusReleased()
Handles modal mouse input focus released.
Definition gui.cpp:1108
virtual Widget * getTop() const
Gets the top widget.
Definition gui.cpp:146
virtual void handleKeyInput()
Handles key input.
Definition gui.cpp:374
virtual void handleHiddenWidgets()
Handles hidden widgets.
Definition gui.cpp:1127
std::vector< Widget * > mShownWidgets
Holds shown widgets.
Definition gui.hpp:573
bool mAltPressed
True if alt is pressed, false otherwise.
Definition gui.hpp:629
std::vector< Widget * > mHiddenWidgets
Holds hidden widgets.
Definition gui.hpp:568
int mLastMouseY
Holds the last mouse y coordinate.
Definition gui.hpp:649
KeyListenerList::iterator KeyListenerListIterator
Iterator for KeyListenerList.
Definition gui.hpp:604
virtual void handleShownWidgets()
Handles shown widgets.
Definition gui.cpp:1159
GuiDeathListener * mDeathListener
Listener notified when the GUI or top widget is destroyed.
Definition gui.hpp:665
virtual void handleMouseWheelMovedDown(MouseInput const &mouseInput)
Handles mouse wheel moved down input.
Definition gui.cpp:577
virtual bool isTabbingEnabled()
Checks if tabbing is enabled.
Definition gui.cpp:278
std::unique_ptr< Input > mOwnedInput
Optional owned input backend instance.
Definition gui.hpp:674
virtual void removeGlobalKeyListener(KeyListener *keyListener)
Removes global key listener from the GUI.
Definition gui.cpp:288
std::shared_ptr< Font > mGlobalFont
Shared global font used by widgets when not overridden.
Definition gui.hpp:677
void addShownWidget(Widget *widget)
Inform gui that a widget was shown.
Definition gui.cpp:298
virtual void handleModalMouseInputFocusGained()
Handles modal mouse input focus gained.
Definition gui.cpp:1086
virtual void handleMouseMoved(MouseInput const &mouseInput)
Handles mouse moved input.
Definition gui.cpp:443
virtual void handleMouseWheelMovedUp(MouseInput const &mouseInput)
Handles mouse wheel moved up input.
Definition gui.cpp:597
virtual void addGlobalKeyListener(KeyListener *keyListener)
Adds a global key listener to the GUI.
Definition gui.cpp:283
virtual void setTop(Widget *top)
Sets the top widget.
Definition gui.cpp:112
bool mShiftPressed
True if shift is pressed, false otherwise.
Definition gui.hpp:614
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:206
virtual void handleModalFocusGained()
Handles modal focus gained.
Definition gui.cpp:1045
virtual void handleMouseWheelMovedLeft(MouseInput const &mouseInput)
Handles mouse wheel moved left input.
Definition gui.cpp:637
virtual void handleMousePressed(MouseInput const &mouseInput)
Handles mouse pressed input.
Definition gui.cpp:538
void widgetDied(Widget const *widget)
Inform gui that a widget was deleted.
Definition gui.cpp:303
std::list< KeyListener * > KeyListenerList
List of KeyListener.
Definition gui.hpp:601
virtual void logic()
Performs logic of the GUI.
Definition gui.cpp:221
int mClickCount
Holds the current click count.
Definition gui.hpp:655
VisibilityEventHandler * mVisibilityEventHandler
Holds the visibility event handler for the GUI.
Definition gui.hpp:593
virtual void handleMouseReleased(MouseInput const &mouseInput)
Handles mouse released input.
Definition gui.cpp:657
Abstract interface for polling user input devices.
Definition input.hpp:37
Represents a key event.
Definition keyevent.hpp:26
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:56
Used replacement tokens by configure_file():