diff --git a/apps/Makefile b/apps/Makefile index 270d8c47d..3d89682ab 100644 --- a/apps/Makefile +++ b/apps/Makefile @@ -8,6 +8,7 @@ include apps/statistics/Makefile app_objs += $(addprefix apps/,\ apps_container.o\ + apps_window.o\ banner_view.o\ constant.o\ cursor_view.o\ diff --git a/apps/apps_container.cpp b/apps/apps_container.cpp index 51f843831..77edabc70 100644 --- a/apps/apps_container.cpp +++ b/apps/apps_container.cpp @@ -5,6 +5,7 @@ extern "C" { AppsContainer::AppsContainer() : Container(), + m_window(AppsWindow()), m_homeApp(this), m_graphApp(this, &m_globalContext), m_probabilityApp(this), @@ -53,3 +54,12 @@ bool AppsContainer::handleEvent(Ion::Events::Event event) { } return false; } + +void AppsContainer::switchTo(App * app) { + Container::switchTo(app); + /*do something with title bar*/ +} + +Window * AppsContainer::window() { + return &m_window; +} diff --git a/apps/apps_container.h b/apps/apps_container.h index 4dd3f4aa2..72c6398fc 100644 --- a/apps/apps_container.h +++ b/apps/apps_container.h @@ -7,6 +7,7 @@ #include "calculation/app.h" #include "regression/app.h" #include "statistics/app.h" +#include "apps_window.h" #include "toolbox_controller.h" #include "variable_box_controller.h" @@ -25,8 +26,11 @@ public: ToolboxController * toolboxController(); VariableBoxController * variableBoxController(); bool handleEvent(Ion::Events::Event event) override; + void switchTo(App * app) override; private: + Window * window() override; static constexpr int k_numberOfApps = 6; + AppsWindow m_window; Home::App m_homeApp; Graph::App m_graphApp; Probability::App m_probabilityApp; diff --git a/apps/apps_window.cpp b/apps/apps_window.cpp new file mode 100644 index 000000000..48a03000b --- /dev/null +++ b/apps/apps_window.cpp @@ -0,0 +1,43 @@ +#include "apps_window.h" +extern "C" { +#include +} + +/* Title Bar View */ + +void AppsWindow::TitleBarView::drawRect(KDContext * ctx, KDRect rect) const { + ctx->fillRect(bounds(), KDColorBlack); +} + +/* Window */ + +AppsWindow::AppsWindow() : + Window(), + m_titleBarView(TitleBarView()) +{ +} + +int AppsWindow::numberOfSubviews() const { + return (m_contentView == nullptr ? 1 : 2); +} + +View * AppsWindow::subviewAtIndex(int index) { + if (index == 0) { + return &m_titleBarView; + } + assert(m_contentView != nullptr && index == 1); + return m_contentView; +} + +void AppsWindow::layoutSubviews() { + m_titleBarView.setFrame(KDRect(0, 0, bounds().width(), k_titleBarHeight)); + if (m_contentView != nullptr) { + m_contentView->setFrame(KDRect(0, k_titleBarHeight, bounds().width(), bounds().height()-k_titleBarHeight)); + } +} + +#if ESCHER_VIEW_LOGGING +const char * AppsWindow::className() const { + return "Window"; +} +#endif diff --git a/apps/apps_window.h b/apps/apps_window.h new file mode 100644 index 000000000..637340ce1 --- /dev/null +++ b/apps/apps_window.h @@ -0,0 +1,20 @@ +#ifndef APPS_WINDOW_H +#define APPS_WINDOW_H + +#include + +class AppsWindow : public Window { +public: + AppsWindow(); +private: + class TitleBarView : public View { + void drawRect(KDContext * ctx, KDRect rect) const override; + }; + constexpr static KDCoordinate k_titleBarHeight = 18; + int numberOfSubviews() const override; + void layoutSubviews() override; + View * subviewAtIndex(int index) override; + TitleBarView m_titleBarView; +}; + +#endif diff --git a/escher/include/escher/container.h b/escher/include/escher/container.h index 40714922f..b2aba06fb 100644 --- a/escher/include/escher/container.h +++ b/escher/include/escher/container.h @@ -20,11 +20,12 @@ public: void run(); App * activeApp(); virtual bool handleEvent(Ion::Events::Event event); - void switchTo(App * app); + virtual void switchTo(App * app); +protected: + virtual Window * window() = 0; private: void step(); App * m_activeApp; - Window m_window; }; #endif diff --git a/escher/include/escher/window.h b/escher/include/escher/window.h index 5434717c9..d38a7ba16 100644 --- a/escher/include/escher/window.h +++ b/escher/include/escher/window.h @@ -12,12 +12,12 @@ protected: #if ESCHER_VIEW_LOGGING const char * className() const override; #endif - int numberOfSubviews() const override; - void layoutSubviews() override; + virtual int numberOfSubviews() const override; + virtual void layoutSubviews() override; + virtual View * subviewAtIndex(int index) override; + View * m_contentView; private: const Window * window() const override; - View * subviewAtIndex(int index) override; - View * m_contentView; }; #endif diff --git a/escher/src/app.cpp b/escher/src/app.cpp index 96bc8ccb0..22ce50fb9 100644 --- a/escher/src/app.cpp +++ b/escher/src/app.cpp @@ -24,7 +24,6 @@ void App::setWindow(Window * window) { assert(m_modalViewController.app() == this); window->setContentView(view); - view->setFrame(window->bounds()); window->redraw(); } diff --git a/escher/src/container.cpp b/escher/src/container.cpp index 9c33c6b10..7c7891e80 100644 --- a/escher/src/container.cpp +++ b/escher/src/container.cpp @@ -11,7 +11,7 @@ Container::Container() : void Container::switchTo(App * app) { m_activeApp = app; - m_activeApp->setWindow(&m_window); + m_activeApp->setWindow(window()); } App * Container::activeApp() { @@ -23,8 +23,8 @@ bool Container::handleEvent(Ion::Events::Event event) { } void Container::run() { - m_window.setFrame(KDRect(0, 0, Ion::Display::Width, Ion::Display::Height)); - m_window.redraw(); + window()->setFrame(KDRect(0, 0, Ion::Display::Width, Ion::Display::Height)); + window()->redraw(); #ifdef __EMSCRIPTEN__ emscripten_set_main_loop_arg([](void * ctx){ ((Container *)ctx)->step(); }, this, 0, 1); @@ -44,5 +44,5 @@ void Container::step() { return; } m_activeApp->processEvent(event); - m_window.redraw(); + window()->redraw(); } diff --git a/escher/src/window.cpp b/escher/src/window.cpp index 8958f3fe6..bf3ac28c0 100644 --- a/escher/src/window.cpp +++ b/escher/src/window.cpp @@ -16,8 +16,9 @@ void Window::setContentView(View * contentView) { if (m_contentView != contentView) { m_contentView = contentView; markRectAsDirty(bounds()); + layoutSubviews(); } -}; +} const Window * Window::window() const { return this; @@ -34,7 +35,7 @@ View * Window::subviewAtIndex(int index) { void Window::layoutSubviews() { if (m_contentView != nullptr) { - m_contentView->setFrame(this->bounds()); + m_contentView->setFrame(bounds()); } }