1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 11:48:10 +00:00

LibGUI: Notify widgets when their enabled state changes.

This is done by dispatching a (synchronous) "EnabledChange" event that can
be picked up in change_event(). Use this event to kick widgets out of their
"being pressed"-type modes if the user is interacting with them while the
state is programmatically changed.
This commit is contained in:
Andreas Kling 2019-05-25 13:40:57 +02:00
parent e478a2fb0a
commit d12857fc36
9 changed files with 44 additions and 0 deletions

View file

@ -124,3 +124,16 @@ void GAbstractButton::paint_text(GPainter& painter, const Rect& rect, const Font
if (is_focused())
painter.draw_rect(clipped_rect.inflated(6, 4), Color(140, 140, 140));
}
void GAbstractButton::change_event(GEvent& event)
{
if (event.type() == GEvent::Type::EnabledChange) {
if (!is_enabled()) {
bool was_being_pressed = m_being_pressed;
m_being_pressed = false;
if (was_being_pressed)
update();
}
}
GWidget::change_event(event);
}

View file

@ -37,6 +37,7 @@ protected:
virtual void keydown_event(GKeyEvent&) override;
virtual void enter_event(CEvent&) override;
virtual void leave_event(CEvent&) override;
virtual void change_event(GEvent&) override;
void paint_text(GPainter&, const Rect&, const Font&, TextAlignment);

View file

@ -33,6 +33,7 @@ public:
FocusOut,
WindowCloseRequest,
ContextMenu,
EnabledChange,
__Begin_WM_Events,
WM_WindowRemoved,

View file

@ -300,3 +300,12 @@ void GScrollBar::leave_event(CEvent&)
update();
}
}
void GScrollBar::change_event(GEvent& event)
{
if (event.type() == GEvent::Type::EnabledChange) {
if (!is_enabled())
m_scrubbing = false;
}
return GWidget::change_event(event);
}

View file

@ -42,6 +42,7 @@ private:
virtual void mouseup_event(GMouseEvent&) override;
virtual void mousemove_event(GMouseEvent&) override;
virtual void leave_event(CEvent&) override;
virtual void change_event(GEvent&) override;
int button_size() const { return 16; }
int button_width() const { return orientation() == Orientation::Vertical ? width() : button_size(); }

View file

@ -120,6 +120,15 @@ void GSlider::leave_event(CEvent& event)
GWidget::leave_event(event);
}
void GSlider::change_event(GEvent& event)
{
if (event.type() == GEvent::Type::EnabledChange) {
if (!is_enabled()))
m_dragging = false;
}
GWidget::change_event(event);
}
void GSlider::set_knob_hovered(bool hovered)
{
if (m_knob_hovered == hovered)

View file

@ -32,6 +32,7 @@ protected:
virtual void mousemove_event(GMouseEvent&) override;
virtual void mouseup_event(GMouseEvent&) override;
virtual void leave_event(CEvent&) override;
virtual void change_event(GEvent&) override;
private:
void set_knob_hovered(bool);

View file

@ -94,6 +94,8 @@ void GWidget::event(CEvent& event)
return handle_enter_event(event);
case GEvent::Leave:
return handle_leave_event(event);
case GEvent::EnabledChange:
return change_event(static_cast<GEvent&>(event));
default:
return CObject::event(event);
}
@ -271,6 +273,10 @@ void GWidget::leave_event(CEvent&)
{
}
void GWidget::change_event(GEvent&)
{
}
void GWidget::update()
{
if (rect().is_empty())
@ -454,6 +460,8 @@ void GWidget::set_enabled(bool enabled)
if (m_enabled == enabled)
return;
m_enabled = enabled;
GEvent e(GEvent::EnabledChange);
event(e);
update();
}

View file

@ -67,6 +67,7 @@ public:
virtual void enter_event(CEvent&);
virtual void leave_event(CEvent&);
virtual void child_event(CChildEvent&) override;
virtual void change_event(GEvent&);
// This is called after children have been painted.
virtual void second_paint_event(GPaintEvent&);