diff options
author | Andreas Kling <awesomekling@gmail.com> | 2019-05-02 03:46:37 +0200 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-05-02 03:47:01 +0200 |
commit | 6d5507313e6449ae1081ec7812c07a9c0fa708f5 (patch) | |
tree | 5da29a218855955e255499d63e2746ddbbd074ec | |
parent | c3b7ace3e0d943326575b4d6d7b6a33e47d7242a (diff) | |
download | serenity-6d5507313e6449ae1081ec7812c07a9c0fa708f5.zip |
GWidget: Add set_updates_enabled() for temporarily suppressing updates.
-rw-r--r-- | LibGUI/GWidget.cpp | 26 | ||||
-rw-r--r-- | LibGUI/GWidget.h | 4 |
2 files changed, 26 insertions, 4 deletions
diff --git a/LibGUI/GWidget.cpp b/LibGUI/GWidget.cpp index 4b4cc35a52..fedecc8b74 100644 --- a/LibGUI/GWidget.cpp +++ b/LibGUI/GWidget.cpp @@ -283,6 +283,8 @@ void GWidget::leave_event(CEvent&) void GWidget::update() { + if (rect().is_empty()) + return; update(rect()); } @@ -290,10 +292,17 @@ void GWidget::update(const Rect& rect) { if (!is_visible()) return; - auto* w = window(); - if (!w) - return; - w->update(rect.translated(window_relative_rect().location())); + + GWindow* window = m_window; + GWidget* parent = parent_widget(); + while (parent) { + if (!parent->updates_enabled()) + return; + window = parent->m_window; + parent = parent->parent_widget(); + } + if (window) + window->update(rect.translated(window_relative_rect().location())); } Rect GWidget::window_relative_rect() const @@ -516,3 +525,12 @@ void GWidget::unregister_local_shortcut_action(Badge<GAction>, GAction& action) { m_local_shortcut_actions.remove(action.shortcut()); } + +void GWidget::set_updates_enabled(bool enabled) +{ + if (m_updates_enabled == enabled) + return; + m_updates_enabled = enabled; + if (enabled) + update(); +} diff --git a/LibGUI/GWidget.h b/LibGUI/GWidget.h index 1cb7104fa1..9be5d9b02e 100644 --- a/LibGUI/GWidget.h +++ b/LibGUI/GWidget.h @@ -45,6 +45,9 @@ public: bool is_enabled() const { return m_enabled; } void set_enabled(bool); + bool updates_enabled() const { return m_updates_enabled; } + void set_updates_enabled(bool); + virtual void event(CEvent&) override; virtual void paint_event(GPaintEvent&); virtual void resize_event(GResizeEvent&); @@ -211,6 +214,7 @@ private: bool m_greedy_for_hits { false }; bool m_enabled { true }; bool m_layout_dirty { false }; + bool m_updates_enabled { true }; CElapsedTimer m_left_click_clock; CElapsedTimer m_right_click_clock; |