Static buttons are easier to tap with touch screen

This commit is contained in:
Yousef Khadadeh 2026-04-28 21:19:16 +03:00
parent cd45d1e8cd
commit d9172f4848
5 changed files with 25 additions and 2 deletions

View file

@ -36,7 +36,13 @@ void ScrollArea::layout(const Clay_ElementId& id, const Options& options) {
},
.clip = {.horizontal = opts.clipHorizontal, .vertical = opts.clipVertical, .childOffset = {.x = scrollOffset.x(), .y = scrollOffset.y()}}
}) {
opts.innerContent({.contentDimensions = contentDimensions, .containerDimensions = containerDimensions, .scrollOffset = &scrollOffset});
if(scrollData.contentDimensions.height > scrollData.scrollContainerDimensions.height) {
gui.in_dynamic_area([&] {
opts.innerContent({.contentDimensions = contentDimensions, .containerDimensions = containerDimensions, .scrollOffset = &scrollOffset});
});
}
else
opts.innerContent({.contentDimensions = contentDimensions, .containerDimensions = containerDimensions, .scrollOffset = &scrollOffset});
clamp_scroll();
}

View file

@ -14,6 +14,7 @@ void SelectableButton::layout(const Clay_ElementId& id, const Data& d) {
SkColor4f backgroundColorHighlight;
SkColor4f backgroundColor;
inDynamicArea = gui.is_dynamic_area();
instantResponse = d.instantResponse;
onClick = [&, this, d] {
if(d.onClickButton)
@ -112,7 +113,7 @@ void SelectableButton::input_finger_touch_callback(const InputManager::FingerTou
}
void SelectableButton::input_finger_motion_callback(const InputManager::FingerMotionCallbackArgs& motion) {
if(isHovering || isHeld) {
if((isHovering || isHeld) && (inDynamicArea || !mouseHovering)) {
isHovering = false;
isHeld = false;
gui.set_to_layout();

View file

@ -35,6 +35,7 @@ class SelectableButton : public Element {
virtual void input_finger_motion_callback(const InputManager::FingerMotionCallbackArgs& motion) override;
private:
bool inDynamicArea = false;
bool instantResponse = false;
bool isHeld = false;
bool isHovering = false;

View file

@ -588,6 +588,17 @@ void GUIManager::clay_error_handler(Clay_ErrorData errorData) {
Logger::get().log("INFO", "[Clay Error] " + std::string(errorData.errorText.chars));
}
void GUIManager::in_dynamic_area(const std::function<void()>& f) {
bool oldDynamicArea = dynamicArea;
dynamicArea = true;
f();
dynamicArea = oldDynamicArea;
}
bool GUIManager::is_dynamic_area() {
return dynamicArea;
}
void GUIManager::new_id(const char* id, const std::function<void()>& f) {
push_id(id);
f();

View file

@ -30,6 +30,9 @@ class GUIManager {
UpdateInputData io;
void in_dynamic_area(const std::function<void()>& f);
bool is_dynamic_area();
void new_id(const char* id, const std::function<void()>& f);
void new_id(int64_t id, const std::function<void()>& f);
@ -139,6 +142,7 @@ class GUIManager {
int16_t zIndex = 0;
Element* parentElement = nullptr;
bool dynamicArea = false;
std::optional<SCollision::AABB<float>> clippingRegion;
std::function<void()> postCallbackFunc;