From 872c998ff12ca12b75128d02b2156929fc1a4018 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Fri, 14 Aug 2015 21:27:46 -0700 Subject: [PATCH] Move widget tree painting to ui::Painter. Still doesn't seem like the right place, but better than the event dispatcher! --- firmware/application/main.cpp | 26 +------------------------- firmware/common/ui_painter.cpp | 27 +++++++++++++++++++++++++++ firmware/common/ui_painter.hpp | 4 ++++ 3 files changed, 32 insertions(+), 25 deletions(-) diff --git a/firmware/application/main.cpp b/firmware/application/main.cpp index 2cf8a9f9..20b6009b 100755 --- a/firmware/application/main.cpp +++ b/firmware/application/main.cpp @@ -240,30 +240,6 @@ private: } } */ - void paint_widget(ui::Widget* const w) { - if( w->hidden() ) { - // Mark widget (and all children) as invisible. - w->visible(false); - } else { - // Mark this widget as visible and recurse. - w->visible(true); - - if( w->dirty() ) { - w->paint(painter); - // Force-paint all children. - for(const auto child : w->children()) { - child->set_dirty(); - paint_widget(child); - } - w->set_clean(); - } else { - // Selectively paint all children. - for(const auto child : w->children()) { - paint_widget(child); - } - } - } - } static ui::Widget* touch_widget(ui::Widget* const w, ui::TouchEvent event) { if( !w->hidden() ) { @@ -311,7 +287,7 @@ private: void handle_lcd_frame_sync() { if( ui::is_dirty() ) { - paint_widget(top_widget); + painter.paint_widget(top_widget); ui::dirty_clear(); } } diff --git a/firmware/common/ui_painter.cpp b/firmware/common/ui_painter.cpp index ef246e5f..77f2c34e 100644 --- a/firmware/common/ui_painter.cpp +++ b/firmware/common/ui_painter.cpp @@ -21,6 +21,8 @@ #include "ui_painter.hpp" +#include "ui_widget.hpp" + #include "portapack.hpp" using namespace portapack; @@ -71,4 +73,29 @@ void Painter::fill_rectangle(const Rect r, const Color c) { display.fill_rectangle(r, c); } +void Painter::paint_widget(Widget* const w) { + if( w->hidden() ) { + // Mark widget (and all children) as invisible. + w->visible(false); + } else { + // Mark this widget as visible and recurse. + w->visible(true); + + if( w->dirty() ) { + w->paint(*this); + // Force-paint all children. + for(const auto child : w->children()) { + child->set_dirty(); + paint_widget(child); + } + w->set_clean(); + } else { + // Selectively paint all children. + for(const auto child : w->children()) { + paint_widget(child); + } + } + } +} + } /* namespace ui */ diff --git a/firmware/common/ui_painter.hpp b/firmware/common/ui_painter.hpp index 542f3cab..aba85b77 100644 --- a/firmware/common/ui_painter.hpp +++ b/firmware/common/ui_painter.hpp @@ -37,6 +37,8 @@ struct Style { Style invert() const; }; +class Widget; + class Painter { public: Painter() { }; @@ -51,6 +53,8 @@ public: void draw_rectangle(const Rect r, const Color c); void fill_rectangle(const Rect r, const Color c); + void paint_widget(Widget* const w); + private: void draw_hline(Point p, size_t width, const Color c); void draw_vline(Point p, size_t height, const Color c);