Merge branch 'main' into debugging-client
This commit is contained in:
@@ -19,9 +19,9 @@ namespace gui {
|
||||
class GUI;
|
||||
class Container;
|
||||
|
||||
using onaction = std::function<void(GUI&)>;
|
||||
using onnumberchange = std::function<void(GUI&, double)>;
|
||||
using onstringchange = std::function<void(GUI&, const std::string&)>;
|
||||
using OnAction = std::function<void(GUI&)>;
|
||||
using OnNumberChange = std::function<void(GUI&, double)>;
|
||||
using OnStringChange = std::function<void(GUI&, const std::string&)>;
|
||||
|
||||
template<typename... Args>
|
||||
class CallbacksSet {
|
||||
@@ -46,28 +46,60 @@ namespace gui {
|
||||
}
|
||||
};
|
||||
|
||||
using ActionsSet = CallbacksSet<GUI&>;
|
||||
template<class TagT, typename... Args>
|
||||
class TaggedCallbacksSet {
|
||||
public:
|
||||
using Func = std::function<void(Args...)>;
|
||||
private:
|
||||
std::unique_ptr<std::vector<std::pair<TagT, Func>>> callbacks;
|
||||
public:
|
||||
void listen(TagT tag, Func&& callback) {
|
||||
if (callbacks == nullptr) {
|
||||
callbacks =
|
||||
std::make_unique<std::vector<std::pair<TagT, Func>>>();
|
||||
}
|
||||
callbacks->push_back({tag, std::move(callback)});
|
||||
}
|
||||
|
||||
void notify(TagT notifyTag, Args&&... args) {
|
||||
if (callbacks == nullptr) {
|
||||
return;
|
||||
}
|
||||
for (const auto& [tag, callback] : * callbacks) {
|
||||
if (tag != notifyTag) {
|
||||
continue;
|
||||
}
|
||||
callback(args...);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
enum class UIAction {
|
||||
CLICK, DOUBLE_CLICK, FOCUS, DEFOCUS, RIGHT_CLICK
|
||||
};
|
||||
|
||||
using ActionsSet = TaggedCallbacksSet<UIAction, GUI&>;
|
||||
using StringCallbacksSet = CallbacksSet<GUI&, const std::string&>;
|
||||
|
||||
enum class Align {
|
||||
left, center, right,
|
||||
top=left, bottom=right,
|
||||
LEFT, CENTER, RIGHT,
|
||||
TOP=LEFT, BOTTOM=RIGHT,
|
||||
};
|
||||
|
||||
enum class Gravity {
|
||||
none,
|
||||
NONE,
|
||||
|
||||
top_left,
|
||||
top_center,
|
||||
top_right,
|
||||
TOP_LEFT,
|
||||
TOP_CENTER,
|
||||
TOP_RIGHT,
|
||||
|
||||
center_left,
|
||||
center_center,
|
||||
center_right,
|
||||
CENTER_LEFT,
|
||||
CENTER_CENTER,
|
||||
CENTER_RIGHT,
|
||||
|
||||
bottom_left,
|
||||
bottom_center,
|
||||
bottom_right
|
||||
BOTTOM_LEFT,
|
||||
BOTTOM_CENTER,
|
||||
BOTTOM_RIGHT
|
||||
};
|
||||
|
||||
/// @brief Base abstract class for all UI elements
|
||||
@@ -112,23 +144,15 @@ namespace gui {
|
||||
/// @brief z-index property specifies the stack order of an element
|
||||
int zindex = 0;
|
||||
/// @brief element content alignment (supported by Label only)
|
||||
Align align = Align::left;
|
||||
Align align = Align::LEFT;
|
||||
/// @brief parent element
|
||||
UINode* parent = nullptr;
|
||||
/// @brief position supplier for the element (called on parent element size update)
|
||||
vec2supplier positionfunc = nullptr;
|
||||
/// @brief size supplier for the element (called on parent element size update)
|
||||
vec2supplier sizefunc = nullptr;
|
||||
/// @brief 'onclick' callbacks
|
||||
/// @brief parameterless callbacks
|
||||
ActionsSet actions;
|
||||
/// @brief 'onrightclick' callbacks
|
||||
ActionsSet rightClickCallbacks;
|
||||
/// @brief 'ondoubleclick' callbacks
|
||||
ActionsSet doubleClickCallbacks;
|
||||
/// @brief 'onfocus' callbacks
|
||||
ActionsSet focusCallbacks;
|
||||
/// @brief 'ondefocus' callbacks
|
||||
ActionsSet defocusCallbacks;
|
||||
/// @brief element tooltip text
|
||||
std::wstring tooltip;
|
||||
/// @brief element tooltip delay
|
||||
@@ -189,11 +213,11 @@ namespace gui {
|
||||
/// @brief Get element z-index
|
||||
int getZIndex() const;
|
||||
|
||||
virtual UINode* listenAction(const onaction& action);
|
||||
virtual UINode* listenRightClick(const onaction& action);
|
||||
virtual UINode* listenDoubleClick(const onaction& action);
|
||||
virtual UINode* listenFocus(const onaction& action);
|
||||
virtual UINode* listenDefocus(const onaction& action);
|
||||
virtual void listenClick(OnAction action);
|
||||
virtual void listenRightClick(OnAction action);
|
||||
virtual void listenDoubleClick(OnAction action);
|
||||
virtual void listenFocus(OnAction action);
|
||||
virtual void listenDefocus(OnAction action);
|
||||
|
||||
virtual void onFocus();
|
||||
virtual void doubleClick(int x, int y);
|
||||
@@ -246,14 +270,14 @@ namespace gui {
|
||||
virtual glm::vec2 getContentOffset() {return glm::vec2(0.0f);};
|
||||
/// @brief Calculate screen position of the element
|
||||
virtual glm::vec2 calcPos() const;
|
||||
virtual void setPos(glm::vec2 pos);
|
||||
virtual void setPos(const glm::vec2& pos);
|
||||
virtual glm::vec2 getPos() const;
|
||||
glm::vec2 getSize() const;
|
||||
virtual void setSize(glm::vec2 size);
|
||||
virtual void setSize(const glm::vec2& size);
|
||||
glm::vec2 getMinSize() const;
|
||||
virtual void setMinSize(glm::vec2 size);
|
||||
virtual void setMinSize(const glm::vec2& size);
|
||||
glm::vec2 getMaxSize() const;
|
||||
virtual void setMaxSize(glm::vec2 size);
|
||||
virtual void setMaxSize(const glm::vec2& size);
|
||||
/// @brief Called in containers when new element added
|
||||
virtual void refresh() {};
|
||||
virtual void fullRefresh() {
|
||||
|
||||
Reference in New Issue
Block a user