mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 11:08:11 +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:
parent
e478a2fb0a
commit
d12857fc36
9 changed files with 44 additions and 0 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -33,6 +33,7 @@ public:
|
|||
FocusOut,
|
||||
WindowCloseRequest,
|
||||
ContextMenu,
|
||||
EnabledChange,
|
||||
|
||||
__Begin_WM_Events,
|
||||
WM_WindowRemoved,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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(); }
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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&);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue