5#include "fifechan/focushandler.hpp"
12#include "fifechan/event.hpp"
13#include "fifechan/exception.hpp"
14#include "fifechan/focuslistener.hpp"
15#include "fifechan/widget.hpp"
19 FocusHandler::FocusHandler() :
20 mFocusedWidget(nullptr),
21 mModalFocusedWidget(nullptr),
22 mModalMouseInputFocusedWidget(nullptr),
23 mDraggedWidget(nullptr),
24 mLastWidgetWithMouse(nullptr),
25 mLastWidgetWithModalFocus(nullptr),
26 mLastWidgetWithModalMouseInputFocus(nullptr),
27 mLastWidgetPressed(nullptr)
38 int toBeFocusedIndex = -1;
39 for (i = 0; i <
mWidgets.size(); ++i) {
46 if (toBeFocusedIndex < 0) {
47 throwException(
"Trying to focus a none existing widget.");
52 if (oldFocused != widget) {
55 if (oldFocused !=
nullptr) {
56 Event const focusEvent(oldFocused);
68 throwException(
"Another widget already has modal focus.");
81 throwException(
"Another widget already has modal input focus.");
119 int focusedWidget = -1;
121 for (i = 0; std::cmp_less(i,
mWidgets.size()); ++i) {
127 int const focused = focusedWidget;
131 int num_widgets =
static_cast<int>(
mWidgets.size());
133 for (; num_widgets > 0; --num_widgets) {
136 if (std::cmp_greater_equal(focusedWidget,
mWidgets.size())) {
140 if (focusedWidget == focused) {
144 if (
mWidgets.at(focusedWidget)->isFocusable()) {
148 if (num_widgets == 1) {
154 if (focusedWidget >= 0) {
174 int focusedWidget = -1;
175 for (i = 0; std::cmp_less(i,
mWidgets.size()); ++i) {
180 int const focused = focusedWidget;
184 i =
static_cast<int>(
mWidgets.size());
195 if (focusedWidget < 0) {
196 focusedWidget =
mWidgets.size() - 1;
199 if (focusedWidget == focused) {
203 if (
mWidgets.at(focusedWidget)->isFocusable()) {
208 if (focusedWidget >= 0) {
236 auto iter = std::ranges::find(
mWidgets, widget);
237 if (iter != std::ranges::end(
mWidgets)) {
273 Event const focusEvent(focused);
292 int focusedWidget = -1;
293 for (i = 0; std::cmp_less(i,
mWidgets.size()); ++i) {
298 int const focused = focusedWidget;
300 i =
static_cast<int>(
mWidgets.size());
312 if (std::cmp_greater_equal(focusedWidget,
mWidgets.size())) {
316 if (focusedWidget == focused) {
320 if (
mWidgets.at(focusedWidget)->isFocusable() &&
mWidgets.at(focusedWidget)->isTabInEnabled() &&
326 if (focusedWidget >= 0) {
352 int focusedWidget = -1;
353 for (i = 0; std::cmp_less(i,
mWidgets.size()); ++i) {
358 int const focused = focusedWidget;
360 i =
static_cast<int>(
mWidgets.size());
372 if (focusedWidget <= 0) {
373 focusedWidget =
mWidgets.size() - 1;
376 if (focusedWidget == focused) {
380 if (
mWidgets.at(focusedWidget)->isFocusable() &&
mWidgets.at(focusedWidget)->isTabInEnabled() &&
386 if (focusedWidget >= 0) {
405 for (
auto& focusListener : focusListeners) {
406 focusListener->focusLost(focusEvent);
417 for (
auto& focusListener : focusListeners) {
418 focusListener->focusGained(focusEvent);
Base class for all GUI event objects.
Widget * getSource() const
Gets the source widget of the event.
Widget * mFocusedWidget
Holds the focused widget.
virtual Widget * getLastWidgetWithMouse()
Gets the last widget with the mouse.
WidgetVector mWidgets
Holds the widgets currently being handled by the focus handler.
Widget * mDraggedWidget
Holds the dragged widget.
virtual void focusPrevious()
Focuses the previous widget added to a container.
virtual void widgetHidden(Widget *widget)
Informs the focus handler that a widget was hidden.
virtual void setLastWidgetWithMouse(Widget *lastWidgetWithMouse)
Sets the last widget with the mouse.
virtual void focusNone()
Focuses nothing.
virtual Widget * getDraggedWidget()
Gets the widget being dragged.
Widget * mLastWidgetWithModalMouseInputFocus
Holds the last widget with modal mouse input focus.
Widget * mLastWidgetPressed
Holds the last widget pressed.
virtual void add(Widget *widget)
Adds a widget to by handles by the focus handler.
virtual void setLastWidgetWithModalFocus(Widget *lastWidgetWithModalFocus)
Sets the last widget with modal focus.
virtual void releaseModalFocus(Widget *widget)
Releases modal focus if the widget has modal focus.
virtual void setLastWidgetPressed(Widget *lastWidgetPressed)
Sets the last widget pressed.
virtual Widget * getLastWidgetWithModalMouseInputFocus()
Gets the last widget with modal mouse input focus.
virtual Widget * getLastWidgetWithModalFocus()
Gets the last widget with modal focus.
virtual void remove(Widget *widget)
Removes a widget from the focus handler.
Widget * mModalMouseInputFocusedWidget
Holds the modal mouse input focused widget.
virtual bool isFocused(Widget const *widget) const
Checks if a widget is focused.
virtual void distributeFocusGainedEvent(Event const &focusEvent)
Distributes a focus gained event.
virtual void tabPrevious()
Focuses the previous widget which allows tabbing in unless current focused widget disallows tabbing o...
Widget * mLastWidgetWithModalFocus
Holds the last widget with modal focus.
virtual void requestModalFocus(Widget *widget)
Requests modal focus for a widget.
virtual void tabNext()
Focuses the next widget which allows tabbing in unless the current focused Widget disallows tabbing o...
virtual void distributeFocusLostEvent(Event const &focusEvent)
Distributes a focus lost event.
virtual void focusNext()
Focuses the next widget added to a container.
Widget * mModalFocusedWidget
Holds the modal focused widget.
virtual Widget * getModalFocused() const
Gets the widget with modal focus.
virtual void setDraggedWidget(Widget *draggedWidget)
Sets the widget being dragged.
virtual void requestFocus(Widget *widget)
Requests focus for a widget.
virtual Widget * getModalMouseInputFocused() const
Gets the widget with modal mouse input focus.
virtual Widget * getLastWidgetPressed()
Gets the last widget pressed.
virtual void requestModalMouseInputFocus(Widget *widget)
Requests modal mouse input focus for a widget.
Widget * mLastWidgetWithMouse
Holds the last widget with the mouse.
virtual void setLastWidgetWithModalMouseInputFocus(Widget *lastWidgetWithModalMouseInputFocus)
Sets the last widget with modal mouse input focus.
virtual void releaseModalMouseInputFocus(Widget *widget)
Releases modal mouse input focus if the widget has modal mouse input focus.
virtual Widget * getFocused() const
Gets the widget with focus.