Pārlūkot izejas kodu

GWidget: Add set_updates_enabled() for temporarily suppressing updates.

Andreas Kling 6 gadi atpakaļ
vecāks
revīzija
6d5507313e
2 mainītis faili ar 26 papildinājumiem un 4 dzēšanām
  1. 22 4
      LibGUI/GWidget.cpp
  2. 4 0
      LibGUI/GWidget.h

+ 22 - 4
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();
+}

+ 4 - 0
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;