Focus locking and popups

This commit is contained in:
IlyaShurupov 2024-10-17 15:10:58 +03:00 committed by Ilya Shurupov
parent 96b293d1b5
commit c7496c7b42
13 changed files with 296 additions and 145 deletions

View file

@ -29,11 +29,21 @@ namespace tp {
void drawRecursion(Canvas& canvas, Widget* active, const Vec2F& pos);
void updateWidget(Widget*, const char* reason = nullptr) override;
void openPopup(Widget*) override;
void closePopup(Widget*) override;
void lockFocus(Widget*) override;
void freeFocus(Widget*) override;
void updateAnimations();
void updateAreaCache(Widget* iter, bool read);
private:
Widget* mRoot = nullptr;
Widget mRoot;
Widget mPopups;
Widget* mUserRoot = nullptr;
LayoutManager mLayoutManager;
UpdateManager mUpdateManager;

View file

@ -58,6 +58,12 @@ namespace tp {
void triggerWidgetUpdate(const char* reason = nullptr);
void openPopup(Widget*);
void closePopup(Widget*);
void lockFocus();
void freeFocus();
protected:
virtual void process(const EventHandler& events) {}
virtual void draw(Canvas& canvas) {}
@ -130,6 +136,13 @@ namespace tp {
struct WidgetManagerInterface : public Widget {
virtual void updateWidget(Widget*, const char* reason) = 0;
virtual void openPopup(Widget*) = 0;
virtual void closePopup(Widget*) = 0;
virtual void lockFocus(Widget*) = 0;
virtual void freeFocus(Widget*) = 0;
static WidgetLayout* defaultLayout(Widget* widget);
};
}

View file

@ -0,0 +1,18 @@
#pragma once
#include "Layout.hpp"
namespace tp {
class OverlayLayout : public WidgetLayout {
friend class DebugManager;
public:
explicit OverlayLayout(Widget* widget) : WidgetLayout(widget) {}
void updateLayout(bool vertical) override;
void pickRect(bool vertical) override {}
void clampRect() override {}
};
}

View file

@ -5,6 +5,7 @@
#include <map>
namespace tp {
// FIXME : desperately needs refactor
class UpdateManager {
friend DebugManager;
@ -13,6 +14,9 @@ namespace tp {
void scheduleUpdate(Widget* widget, const char* reason);
void lockFocus(Widget* widget);
void freeFocus(Widget* widget);
[[nodiscard]] bool isPendingUpdates() const {
return !mTriggeredWidgets.empty();
}
@ -34,6 +38,7 @@ namespace tp {
private:
std::map<Widget*, bool> mTriggeredWidgets;
Widget* mInFocusWidget = nullptr;
Widget* mFocusLockWidget = nullptr;
private:
int mDebugWidgetsToProcess = 0;

View file

@ -19,7 +19,7 @@ namespace tp {
[[nodiscard]] bool needsNextFrame() const override;
[[nodiscard]] bool propagateEventsToChildren() const override;
[[nodiscard]] bool processesEvents() const override { return true; }
[[nodiscard]] bool processesEvents() const override;
[[nodiscard]] bool isFloating() const;