Update zwidget

* Moved subtree scripts to tools, updated bash script for granularity

* Squashed 'libraries/ZWidget/' changes from 96501b6ef1..02da8cdc0e

02da8cdc0e Added ListView::GetPreferredWidth, ListView::GetPreferredHeight, ListView::GetMinHeight
04bf153d9d Added event subscriber system
1ce55e5da2 Added Dropdown Known issues: does not hide when parent widget's visibility changes

git-subtree-dir: libraries/ZWidget
git-subtree-split: 02da8cdc0e0ca14443245e0aa5a25b3f8e84928b
This commit is contained in:
Marcus Minhorst 2025-08-09 17:28:36 -07:00 committed by GitHub
commit 2ef2243f7f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 514 additions and 12 deletions

View file

@ -4,6 +4,7 @@
#include <memory>
#include <variant>
#include <unordered_map>
#include <unordered_set>
#include "canvas.h"
#include "rect.h"
#include "colorf.h"
@ -11,6 +12,7 @@
class Canvas;
class Timer;
class Dropdown;
enum class WidgetType
{
@ -19,6 +21,13 @@ enum class WidgetType
Popup
};
enum class WidgetEvent
{
VisibilityChange,
// TODO: add more events
};
class Widget : DisplayWindowHost
{
public:
@ -93,6 +102,9 @@ public:
void ShowNormal();
void Hide();
void Subscribe(Widget* subscriber);
void Unsubscribe(Widget* subscriber);
void ActivateWindow();
void Close();
@ -178,6 +190,8 @@ protected:
virtual void OnLostFocus() { }
virtual void OnEnableChanged() { }
virtual void Notify(Widget* source, const WidgetEvent type) { };
private:
void DetachFromParent();
@ -201,6 +215,8 @@ private:
void OnWindowDeactivated() override;
void OnWindowDpiScaleChanged() override;
void NotifySubscribers(const WidgetEvent type);
WidgetType Type = {};
Widget* ParentObj = nullptr;
@ -234,8 +250,12 @@ private:
Widget(const Widget&) = delete;
Widget& operator=(const Widget&) = delete;
std::unordered_set<Widget*> Subscribers;
std::unordered_set<Widget*> Subscriptions;
friend class Timer;
friend class OpenFileDialog;
friend class OpenFolderDialog;
friend class SaveFileDialog;
friend class Dropdown;
};

View file

@ -0,0 +1,58 @@
#pragma once
#include <string>
#include <vector>
#include <functional>
#include "../../core/widget.h"
#include "../../widgets/listview/listview.h"
class Dropdown : public Widget
{
public:
Dropdown(Widget* parent);
void AddItem(const std::string& text);
void RemoveItem(int index);
void ClearItems();
void SetMaxDisplayItems(int items);
void SetDropdownDirection(bool below);
int GetSelectedItem() const { return selectedItem; }
void SetSelectedItem(int index);
std::string GetSelectedText() const;
std::string GetText() const { return text; }
double GetPreferredHeight() const;
double GetPreferredWidth() const;
std::function<void(int)> OnChanged;
protected:
void OnPaint(Canvas* canvas) override;
bool OnMouseDown(const Point& pos, InputKey key) override;
void OnKeyDown(InputKey key) override;
void OnGeometryChanged() override;
void OnLostFocus() override;
void Notify(Widget* source, const WidgetEvent type) override;
private:
void OpenDropdown();
void CloseDropdown();
void OnDropdownActivated();
size_t GetDisplayItems();
std::vector<std::string> items;
int selectedItem = -1;
std::string text;
bool dropdownOpen = false;
Widget* dropdown = nullptr;
ListView* listView = nullptr;
int maxDisplayItems = 0;
bool dropdownDirection = true;
};

View file

@ -22,6 +22,10 @@ public:
void SetSelectedItem(int index);
void ScrollToItem(int index);
double GetPreferredWidth();
double GetPreferredHeight();
double GetMinimumHeight() const;
void Activate();
std::function<void(int)> OnChanged;