From a21f201cc0dd56ac260df01f1d73c66842691aab Mon Sep 17 00:00:00 2001 From: Romain Goyet Date: Tue, 12 Apr 2016 18:47:36 +0200 Subject: [PATCH] Escher: Adding a GUI toolkit Change-Id: I9c78cc1afdd35968110484c3e3782c866b88c671 --- Makefile | 1 + escher/Makefile | 6 ++ escher/include/escher.h | 7 +++ escher/include/escher/solid_color_view.h | 14 +++++ escher/include/escher/view.h | 31 ++++++++++ escher/src/solid_color_view.cpp | 11 ++++ escher/src/view.cpp | 76 ++++++++++++++++++++++++ 7 files changed, 146 insertions(+) create mode 100644 escher/Makefile create mode 100644 escher/include/escher.h create mode 100644 escher/include/escher/solid_color_view.h create mode 100644 escher/include/escher/view.h create mode 100644 escher/src/solid_color_view.cpp create mode 100644 escher/src/view.cpp diff --git a/Makefile b/Makefile index ae0bbf86a..4e8011a04 100644 --- a/Makefile +++ b/Makefile @@ -59,6 +59,7 @@ endif include ion/Makefile include kandinsky/Makefile include poincare/Makefile +include escher/Makefile include app/Makefile include quiz/Makefile # Quiz should be included at the end diff --git a/escher/Makefile b/escher/Makefile new file mode 100644 index 000000000..b6be880c4 --- /dev/null +++ b/escher/Makefile @@ -0,0 +1,6 @@ +SFLAGS += -Iescher/include + +objs += $(addprefix escher/src/,\ + solid_color_view.o\ + view.o\ +) diff --git a/escher/include/escher.h b/escher/include/escher.h new file mode 100644 index 000000000..125bcbe12 --- /dev/null +++ b/escher/include/escher.h @@ -0,0 +1,7 @@ +#ifndef ESCHER_H +#define ESCHER_H + +#include +#include + +#endif diff --git a/escher/include/escher/solid_color_view.h b/escher/include/escher/solid_color_view.h new file mode 100644 index 000000000..03d63b5c2 --- /dev/null +++ b/escher/include/escher/solid_color_view.h @@ -0,0 +1,14 @@ +#ifndef ESCHER_SOLID_COLOR_VIEW_H +#define ESCHER_SOLID_COLOR_VIEW_H + +#include + +class SolidColorView : public View { +public: + SolidColorView(KDRect frame, KDColor color); + void drawRect(KDRect rect) override; +private: + KDColor m_color; +}; + +#endif diff --git a/escher/include/escher/view.h b/escher/include/escher/view.h new file mode 100644 index 000000000..f4e88714b --- /dev/null +++ b/escher/include/escher/view.h @@ -0,0 +1,31 @@ +#ifndef ESCHER_VIEW_H +#define ESCHER_VIEW_H + +extern "C" { +#include +#include +} + +class View { +public: + View(KDRect frame); + ~View(); + void draw(); + virtual void drawRect(KDRect rect); + void addSubview(View * subview); + void removeFromSuperview(); + void setFrame(KDRect frame); +protected: + KDRect bounds(); +private: + void setOriginAndDrawRect(KDRect rect); + KDPoint absoluteOrigin(); + //TODO: We may want a dynamic size at some point + static constexpr uint8_t k_maxNumberOfSubviews = 4; + KDRect m_frame; + View * m_superview; + View * m_subviews[k_maxNumberOfSubviews]; + uint8_t m_numberOfSubviews; +}; + +#endif diff --git a/escher/src/solid_color_view.cpp b/escher/src/solid_color_view.cpp new file mode 100644 index 000000000..291ad3862 --- /dev/null +++ b/escher/src/solid_color_view.cpp @@ -0,0 +1,11 @@ +#include + +SolidColorView::SolidColorView(KDRect frame, KDColor color) : + View(frame), + m_color(color) +{ +} + +void SolidColorView::drawRect(KDRect rect) { + KDFillRect(rect, m_color); +} diff --git a/escher/src/view.cpp b/escher/src/view.cpp new file mode 100644 index 000000000..0088160af --- /dev/null +++ b/escher/src/view.cpp @@ -0,0 +1,76 @@ +extern "C" { +#include +} +#include + +View::View(KDRect frame) : + m_frame(frame), + m_superview(nullptr), + m_numberOfSubviews(0) +{ +} + +View::~View() { +} + +void View::drawRect(KDRect rect) { +} + +void View::draw() { + setOriginAndDrawRect(m_frame); + for (uint8_t i=0; idraw(); + } +} + +void View::addSubview(View * subview) { + assert(m_numberOfSubviews < k_maxNumberOfSubviews); + subview->m_superview = this; + m_subviews[m_numberOfSubviews++] = subview; +} + +void View::removeFromSuperview() { + assert(m_superview != nullptr); + assert(false); // FIXME: Unimplemented +} + +void View::setFrame(KDRect frame) { + // TODO: Return if frame is equal to m_frame + if (m_superview != nullptr) { + // We're moving this view + // So let's ask its superview to redraw itself where that view previously was + m_superview->setOriginAndDrawRect(m_frame); + } + m_frame = frame; + if (m_superview != nullptr) { + // We've been moved + // Draw ourself at the new location + setOriginAndDrawRect(bounds()); + } +} + +KDRect View::bounds() { + KDRect bounds = m_frame; + bounds.x = 0; + bounds.y = 0; + return bounds; +} + +void View::setOriginAndDrawRect(KDRect rect) { + KDSetOrigin(absoluteOrigin()); + this->drawRect(rect); +} + +KDPoint View::absoluteOrigin() { + if (m_superview == nullptr) { + return m_frame.origin; + } else { + KDPoint parentOrigin = m_superview->absoluteOrigin(); + KDPoint myOrigin = m_frame.origin; + KDPoint result; + result.x = parentOrigin.x + myOrigin.x; + result.y = parentOrigin.y + myOrigin.y; + return result; + } +}