mirror of
https://github.com/Zelda64Recomp/Zelda64Recomp.git
synced 2026-04-26 12:11:38 +00:00
Prevent hover styling and focus on input elements when disabled
This commit is contained in:
parent
b8ecd9608d
commit
43ec2d27be
7 changed files with 89 additions and 26 deletions
|
|
@ -81,10 +81,21 @@ namespace recompui {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case EventType::Hover:
|
case EventType::Hover:
|
||||||
set_style_enabled(hover_state, std::get<EventHover>(e.variant).active);
|
set_style_enabled(hover_state, std::get<EventHover>(e.variant).active && is_enabled());
|
||||||
break;
|
break;
|
||||||
case EventType::Enable:
|
case EventType::Enable:
|
||||||
set_style_enabled(disabled_state, !std::get<EventEnable>(e.variant).active);
|
{
|
||||||
|
bool enable_active = std::get<EventEnable>(e.variant).active;
|
||||||
|
set_style_enabled(disabled_state, !enable_active);
|
||||||
|
if (enable_active) {
|
||||||
|
set_cursor(Cursor::Pointer);
|
||||||
|
set_focusable(true);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
set_cursor(Cursor::None);
|
||||||
|
set_focusable(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case EventType::Focus:
|
case EventType::Focus:
|
||||||
set_style_enabled(focus_state, std::get<EventFocus>(e.variant).active);
|
set_style_enabled(focus_state, std::get<EventFocus>(e.variant).active);
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
namespace recompui {
|
namespace recompui {
|
||||||
|
|
||||||
Clickable::Clickable(Element *parent, bool draggable) : Element(parent, Events(EventType::Click, EventType::Hover, EventType::Enable, draggable ? EventType::Drag : EventType::None)) {
|
Clickable::Clickable(Element *parent, bool draggable) : Element(parent, Events(EventType::Click, EventType::Hover, EventType::Enable, draggable ? EventType::Drag : EventType::None)) {
|
||||||
|
set_cursor(Cursor::Pointer);
|
||||||
if (draggable) {
|
if (draggable) {
|
||||||
set_drag(Drag::Drag);
|
set_drag(Drag::Drag);
|
||||||
}
|
}
|
||||||
|
|
@ -11,24 +12,39 @@ namespace recompui {
|
||||||
void Clickable::process_event(const Event &e) {
|
void Clickable::process_event(const Event &e) {
|
||||||
switch (e.type) {
|
switch (e.type) {
|
||||||
case EventType::Click: {
|
case EventType::Click: {
|
||||||
const EventClick &click = std::get<EventClick>(e.variant);
|
if (is_enabled()) {
|
||||||
for (const auto &function : pressed_callbacks) {
|
const EventClick &click = std::get<EventClick>(e.variant);
|
||||||
function(click.x, click.y);
|
for (const auto &function : pressed_callbacks) {
|
||||||
|
function(click.x, click.y);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
case EventType::Hover:
|
case EventType::Hover:
|
||||||
set_style_enabled(hover_state, std::get<EventHover>(e.variant).active);
|
set_style_enabled(hover_state, std::get<EventHover>(e.variant).active && is_enabled());
|
||||||
break;
|
break;
|
||||||
case EventType::Enable:
|
case EventType::Enable:
|
||||||
set_style_enabled(disabled_state, !std::get<EventEnable>(e.variant).active);
|
{
|
||||||
break;
|
bool enable_active = std::get<EventEnable>(e.variant).active;
|
||||||
case EventType::Drag: {
|
set_style_enabled(disabled_state, !enable_active);
|
||||||
const EventDrag &drag = std::get<EventDrag>(e.variant);
|
if (enable_active) {
|
||||||
for (const auto &function : dragged_callbacks) {
|
set_cursor(Cursor::Pointer);
|
||||||
function(drag.x, drag.y, drag.phase);
|
set_focusable(true);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
set_cursor(Cursor::None);
|
||||||
|
set_focusable(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case EventType::Drag: {
|
||||||
|
if (is_enabled()) {
|
||||||
|
const EventDrag &drag = std::get<EventDrag>(e.variant);
|
||||||
|
for (const auto &function : dragged_callbacks) {
|
||||||
|
function(drag.x, drag.y, drag.phase);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -249,12 +249,12 @@ void Element::process_event(const Event &) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Element::enable_focus() {
|
void Element::enable_focus() {
|
||||||
set_property(Rml::PropertyId::TabIndex, Rml::Style::TabIndex::Auto);
|
set_tab_index_auto();
|
||||||
set_property(Rml::PropertyId::Focus, Rml::Style::Focus::Auto);
|
set_focusable(true);
|
||||||
set_property(Rml::PropertyId::NavUp, Rml::Style::Nav::Auto);
|
set_nav_auto(NavDirection::Up);
|
||||||
set_property(Rml::PropertyId::NavDown, Rml::Style::Nav::Auto);
|
set_nav_auto(NavDirection::Down);
|
||||||
set_property(Rml::PropertyId::NavLeft, Rml::Style::Nav::Auto);
|
set_nav_auto(NavDirection::Left);
|
||||||
set_property(Rml::PropertyId::NavRight, Rml::Style::Nav::Auto);
|
set_nav_auto(NavDirection::Right);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Element::clear_children() {
|
void Element::clear_children() {
|
||||||
|
|
|
||||||
|
|
@ -84,12 +84,17 @@ namespace recompui {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case EventType::Update:
|
case EventType::Update:
|
||||||
if (circle_element->is_style_enabled(focus_state)) {
|
if (is_enabled()) {
|
||||||
circle_element->set_background_color(recompui::get_pulse_color(750));
|
if (circle_element->is_style_enabled(focus_state)) {
|
||||||
queue_update();
|
circle_element->set_background_color(recompui::get_pulse_color(750));
|
||||||
|
queue_update();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
circle_element->set_background_color(Color{ 204, 204, 204, 255 });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
circle_element->set_background_color(Color{ 204, 204, 204, 255 });
|
circle_element->set_background_color(Color{ 102, 102, 102, 255 });
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case EventType::Navigate:
|
case EventType::Navigate:
|
||||||
|
|
@ -102,14 +107,32 @@ namespace recompui {
|
||||||
do_step(true);
|
do_step(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case EventType::Enable:
|
||||||
|
{
|
||||||
|
bool enable_active = std::get<EventEnable>(e.variant).active;
|
||||||
|
circle_element->set_enabled(enable_active);
|
||||||
|
if (enable_active) {
|
||||||
|
set_cursor(Cursor::Pointer);
|
||||||
|
set_focusable(true);
|
||||||
|
circle_element->set_background_color(Color{ 204, 204, 204, 255 });
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
set_cursor(Cursor::None);
|
||||||
|
set_focusable(false);
|
||||||
|
circle_element->set_background_color(Color{ 102, 102, 102, 255 });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Slider::Slider(Element *parent, SliderType type) : Element(parent, Events(EventType::Focus, EventType::Update, EventType::Navigate)) {
|
Slider::Slider(Element *parent, SliderType type) : Element(parent, Events(EventType::Focus, EventType::Update, EventType::Navigate, EventType::Enable)) {
|
||||||
this->type = type;
|
this->type = type;
|
||||||
|
|
||||||
|
set_cursor(Cursor::Pointer);
|
||||||
set_display(Display::Flex);
|
set_display(Display::Flex);
|
||||||
set_flex_direction(FlexDirection::Row);
|
set_flex_direction(FlexDirection::Row);
|
||||||
set_text_align(TextAlign::Left);
|
set_text_align(TextAlign::Left);
|
||||||
|
|
|
||||||
|
|
@ -429,7 +429,7 @@ namespace recompui {
|
||||||
void Style::set_cursor(Cursor cursor) {
|
void Style::set_cursor(Cursor cursor) {
|
||||||
switch (cursor) {
|
switch (cursor) {
|
||||||
case Cursor::None:
|
case Cursor::None:
|
||||||
assert(false && "Unimplemented.");
|
set_property(Rml::PropertyId::Cursor, Rml::Property("", Rml::Unit::STRING));
|
||||||
break;
|
break;
|
||||||
case Cursor::Pointer:
|
case Cursor::Pointer:
|
||||||
set_property(Rml::PropertyId::Cursor, Rml::Property("pointer", Rml::Unit::STRING));
|
set_property(Rml::PropertyId::Cursor, Rml::Property("pointer", Rml::Unit::STRING));
|
||||||
|
|
@ -604,5 +604,9 @@ namespace recompui {
|
||||||
set_property(Rml::PropertyId::TabIndex, Rml::Style::Nav::None);
|
set_property(Rml::PropertyId::TabIndex, Rml::Style::Nav::None);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Style::set_focusable(bool focusable) {
|
||||||
|
set_property(Rml::PropertyId::Focus, focusable ? Rml::Style::Focus::Auto : Rml::Style::Focus::None);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} // namespace recompui
|
} // namespace recompui
|
||||||
|
|
@ -100,6 +100,7 @@ namespace recompui {
|
||||||
void set_nav_manual(NavDirection dir, const std::string& target);
|
void set_nav_manual(NavDirection dir, const std::string& target);
|
||||||
void set_tab_index_auto();
|
void set_tab_index_auto();
|
||||||
void set_tab_index_none();
|
void set_tab_index_none();
|
||||||
|
void set_focusable(bool focusable);
|
||||||
virtual bool is_element() { return false; }
|
virtual bool is_element() { return false; }
|
||||||
ResourceId get_resource_id() { return resource_id; }
|
ResourceId get_resource_id() { return resource_id; }
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -93,7 +93,7 @@ namespace recompui {
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case EventType::Hover: {
|
case EventType::Hover: {
|
||||||
bool hover_active = std::get<EventHover>(e.variant).active;
|
bool hover_active = std::get<EventHover>(e.variant).active && is_enabled();
|
||||||
set_style_enabled(hover_state, hover_active);
|
set_style_enabled(hover_state, hover_active);
|
||||||
floater->set_style_enabled(hover_state, hover_active);
|
floater->set_style_enabled(hover_state, hover_active);
|
||||||
break;
|
break;
|
||||||
|
|
@ -107,6 +107,14 @@ namespace recompui {
|
||||||
bool enable_active = std::get<EventEnable>(e.variant).active;
|
bool enable_active = std::get<EventEnable>(e.variant).active;
|
||||||
set_style_enabled(disabled_state, !enable_active);
|
set_style_enabled(disabled_state, !enable_active);
|
||||||
floater->set_style_enabled(disabled_state, !enable_active);
|
floater->set_style_enabled(disabled_state, !enable_active);
|
||||||
|
if (enable_active) {
|
||||||
|
set_cursor(Cursor::Pointer);
|
||||||
|
set_focusable(true);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
set_cursor(Cursor::None);
|
||||||
|
set_focusable(false);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case EventType::Update: {
|
case EventType::Update: {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue