Squashed 'libraries/ZWidget/' changes from 96501b6ef..cecd34301

cecd34301 Delay load DPI-related functions
bfc172f70 Added exception to some unimplemented functions
7c8d469bc Added item modifications functions
847d0e6d9 Improved keyboard navigation
8c4270e0f Dropdown can now be closed by re-selecting it
91402c31e Fix dropdown positioning in x11 and win32
02da8cdc0 Added ListView::GetPreferredWidth, ListView::GetPreferredHeight, ListView::GetMinHeight
04bf153d9 Added event subscriber system
1ce55e5da Added Dropdown Known issues: does not hide when parent widget's visibility changes

git-subtree-dir: libraries/ZWidget
git-subtree-split: cecd34301d369400227eb0f27bad2ab41ad756d2
This commit is contained in:
Mari the Deer 2025-08-13 14:11:06 +02:00
commit 31c8dde32f
12 changed files with 648 additions and 13 deletions

View file

@ -1,4 +1,3 @@
#include "core/widget.h"
#include "core/timer.h"
#include "core/colorf.h"
@ -34,6 +33,12 @@ Widget::Widget(Widget* parent, WidgetType type, RenderAPI renderAPI) : Type(type
Widget::~Widget()
{
for (auto subscription: Subscriptions)
subscription->Subscribers.erase(this);
for (auto subscriber: Subscribers)
subscriber->Subscriptions.erase(this);
if (DispCanvas)
DispCanvas->detach();
@ -46,6 +51,24 @@ Widget::~Widget()
DetachFromParent();
}
void Widget::Subscribe(Widget* subscriber)
{
Subscribers.insert(subscriber);
subscriber->Subscriptions.insert(this);
}
void Widget::Unsubscribe(Widget* subscriber)
{
Subscribers.erase(subscriber);
subscriber->Subscriptions.erase(this);
}
void Widget::NotifySubscribers(const WidgetEvent type)
{
for (auto subscriber: Subscribers)
subscriber->Notify(this, type);
}
void Widget::SetCanvas(std::unique_ptr<Canvas> canvas)
{
if (DispWindow)
@ -206,10 +229,12 @@ void Widget::Show()
if (Type != WidgetType::Child)
{
DispWindow->Show();
NotifySubscribers(WidgetEvent::VisibilityChange);
}
else if (HiddenFlag)
{
HiddenFlag = false;
NotifySubscribers(WidgetEvent::VisibilityChange);
Update();
}
}
@ -260,11 +285,15 @@ void Widget::Hide()
if (Type != WidgetType::Child)
{
if (DispWindow)
{
DispWindow->Hide();
NotifySubscribers(WidgetEvent::VisibilityChange);
}
}
else if (!HiddenFlag)
{
HiddenFlag = true;
NotifySubscribers(WidgetEvent::VisibilityChange);
Update();
}
}