During prototyping a feature I found it useful for
text_art::wrapper_widget to be able to not have a child.

Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.
Pushed to trunk as r16-1266-gcda7145fa9e97f.

gcc/ChangeLog:
        * text-art/widget.cc (selftest::test_empty_wrapper_widget): New.
        (selftest::text_art_widget_cc_tests): Call it.
        * text-art/widget.h (text_art::wrapper_widget::calc_req_size):
        Gracefully handle m_child being null.
        (text_art::wrapper_widget::update_child_alloc_rects): Likewise.
        (text_art::wrapper_widget::paint_to_canvas): Likewise.

Signed-off-by: David Malcolm <dmalc...@redhat.com>
---
 gcc/text-art/widget.cc | 10 ++++++++++
 gcc/text-art/widget.h  | 11 ++++++++---
 2 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/gcc/text-art/widget.cc b/gcc/text-art/widget.cc
index 3c68018c3b54..5d3e5178484c 100644
--- a/gcc/text-art/widget.cc
+++ b/gcc/text-art/widget.cc
@@ -199,6 +199,15 @@ test_wrapper_widget ()
       "BBB\n"));
 }
 
+static void
+test_empty_wrapper_widget ()
+{
+  style_manager sm;
+  wrapper_widget w (nullptr);
+  canvas c (w.to_canvas (sm));
+  ASSERT_CANVAS_STREQ (c, false, "");
+}
+
 static void
 test_vbox_1 ()
 {
@@ -263,6 +272,7 @@ text_art_widget_cc_tests ()
   test_test_widget ();
   test_text_widget ();
   test_wrapper_widget ();
+  test_empty_wrapper_widget ();
   test_vbox_1 ();
   test_vbox_2 ();
   test_canvas_widget ();
diff --git a/gcc/text-art/widget.h b/gcc/text-art/widget.h
index 55655ebfd62a..ab7b1d3c4ecc 100644
--- a/gcc/text-art/widget.h
+++ b/gcc/text-art/widget.h
@@ -146,15 +146,20 @@ class wrapper_widget : public widget
   }
   canvas::size_t calc_req_size () override
   {
-    return m_child->get_req_size ();
+    if (m_child)
+      return m_child->get_req_size ();
+    else
+      return canvas::size_t (0,0);
   }
   void update_child_alloc_rects () override
   {
-    m_child->set_alloc_rect (get_alloc_rect ());
+    if (m_child)
+      m_child->set_alloc_rect (get_alloc_rect ());
   }
   void paint_to_canvas (canvas &canvas) override
   {
-    m_child->paint_to_canvas (canvas);
+    if (m_child)
+      m_child->paint_to_canvas (canvas);
   }
  private:
   std::unique_ptr<widget> m_child;
-- 
2.26.3

Reply via email to