From bc49228404def89479b7d2f52623b648b6a402c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Fri, 7 Apr 2017 11:43:10 +0200 Subject: [PATCH] [apps] Create an exam pop up controller Change-Id: I34868cd57efd1ace4a5a20994927a85119184cca --- apps/Makefile | 1 + apps/exam_pop_up_controller.cpp | 136 ++++++++++++++++++++++++++++++++ apps/exam_pop_up_controller.h | 42 ++++++++++ 3 files changed, 179 insertions(+) create mode 100644 apps/exam_pop_up_controller.cpp create mode 100644 apps/exam_pop_up_controller.h diff --git a/apps/Makefile b/apps/Makefile index c29903531..593a71416 100644 --- a/apps/Makefile +++ b/apps/Makefile @@ -16,6 +16,7 @@ app_objs += $(addprefix apps/,\ battery_view.o\ constant.o\ global_preferences.o\ + exam_pop_up_controller.o\ i18n.o\ led_timer.o\ main.o\ diff --git a/apps/exam_pop_up_controller.cpp b/apps/exam_pop_up_controller.cpp new file mode 100644 index 000000000..60e4760f6 --- /dev/null +++ b/apps/exam_pop_up_controller.cpp @@ -0,0 +1,136 @@ +#include "exam_pop_up_controller.h" +#include "i18n.h" +#include "global_preferences.h" +#include + +ExamPopUpController::ExamPopUpController() : + ViewController(nullptr), + m_contentView(ContentView(this)), + m_isActivatingExamMode(false) +{ +} + +View * ExamPopUpController::view() { + return &m_contentView; +} + +void ExamPopUpController::didBecomeFirstResponder() { + m_contentView.setSelectedButton(0, app()); +} + +bool ExamPopUpController::handleEvent(Ion::Events::Event event) { + if (event == Ion::Events::Left && m_contentView.selectedButton() == 1) { + m_contentView.setSelectedButton(0, app()); + return true; + } + if (event == Ion::Events::Right && m_contentView.selectedButton() == 0) { + m_contentView.setSelectedButton(1, app()); + return true; + } + return false; +} + +void ExamPopUpController::setActivatingExamMode(bool activatingExamMode) { + if (m_isActivatingExamMode != activatingExamMode) { + m_isActivatingExamMode = activatingExamMode; + m_contentView.setMessages(activatingExamMode); + } +} + +bool ExamPopUpController::isActivatingExamMode() { + return m_isActivatingExamMode; +} + +ExamPopUpController::ContentView::ContentView(Responder * parentResponder) : + m_cancelButton(Button(parentResponder, I18n::Message::Cancel, Invocation([](void * context, void * sender) { + ExamPopUpController * controller = (ExamPopUpController *)context; + Container * container = (Container *)controller->app()->container(); + container->activeApp()->dismissModalViewController(); + }, parentResponder), KDText::FontSize::Small)), + m_okButton(Button(parentResponder, I18n::Message::Ok, Invocation([](void * context, void * sender) { + ExamPopUpController * controller = (ExamPopUpController *)context; + GlobalPreferences::ExamMode nextExamMode = controller->isActivatingExamMode() ? GlobalPreferences::ExamMode::Activate : GlobalPreferences::ExamMode::Desactivate; + GlobalPreferences::sharedGlobalPreferences()->setExamMode(nextExamMode); + Container * container = (Container *)controller->app()->container(); + if (controller->isActivatingExamMode()) { + //container->reset(); + } else { + Ion::LED::setColor(KDColorBlack); + } + container->activeApp()->dismissModalViewController(); + }, parentResponder), KDText::FontSize::Small)), + m_warningTextView(MessageTextView(KDText::FontSize::Small, I18n::Message::Warning, 0.5, 0.5, KDColorWhite, KDColorBlack)), + m_messageTextView1(MessageTextView(KDText::FontSize::Small, I18n::Message::Default, 0.5, 0.5, KDColorWhite, KDColorBlack)), + m_messageTextView2(MessageTextView(KDText::FontSize::Small, I18n::Message::Default, 0.5, 0.5, KDColorWhite, KDColorBlack)), + m_messageTextView3(MessageTextView(KDText::FontSize::Small, I18n::Message::Default, 0.5, 0.5, KDColorWhite, KDColorBlack)) +{ +} + +void ExamPopUpController::ContentView::drawRect(KDContext * ctx, KDRect rect) const { + ctx->fillRect(bounds(), KDColorBlack); +} + +void ExamPopUpController::ContentView::setSelectedButton(int selectedButton, App * app) { + m_cancelButton.setHighlighted(selectedButton == 0); + m_okButton.setHighlighted(selectedButton == 1); + if (selectedButton == 0) { + app->setFirstResponder(&m_cancelButton); + } else { + app->setFirstResponder(&m_okButton); + } +} + +int ExamPopUpController::ContentView::selectedButton() { + if (m_cancelButton.isHighlighted()) { + return 0; + } + return 1; +} + +void ExamPopUpController::ContentView::setMessages(bool activingExamMode) { + if (activingExamMode) { + m_messageTextView1.setMessage(I18n::Message::ActiveExamModeMessage1); + m_messageTextView2.setMessage(I18n::Message::ActiveExamModeMessage2); + m_messageTextView3.setMessage(I18n::Message::ActiveExamModeMessage3); + } else { + m_messageTextView1.setMessage(I18n::Message::ExitExamMode1); + m_messageTextView2.setMessage(I18n::Message::ExitExamMode2); + m_messageTextView3.setMessage(I18n::Message::Default); + } +} + +int ExamPopUpController::ContentView::numberOfSubviews() const { + return 6; +} + +View * ExamPopUpController::ContentView::subviewAtIndex(int index) { + switch (index) { + case 0: + return &m_warningTextView; + case 1: + return &m_messageTextView1; + case 2: + return &m_messageTextView2; + case 3: + return &m_messageTextView3; + case 4: + return &m_cancelButton; + case 5: + return &m_okButton; + default: + assert(false); + return nullptr; + } +} + +void ExamPopUpController::ContentView::layoutSubviews() { + KDCoordinate height = bounds().height(); + KDCoordinate width = bounds().width(); + KDCoordinate textHeight = KDText::stringSize(" ", KDText::FontSize::Small).height(); + m_warningTextView.setFrame(KDRect(0, k_topMargin, width, textHeight)); + m_messageTextView1.setFrame(KDRect(0, k_topMargin+k_paragraphHeight+textHeight, width, textHeight)); + m_messageTextView2.setFrame(KDRect(0, k_topMargin+k_paragraphHeight+2*textHeight, width, textHeight)); + m_messageTextView3.setFrame(KDRect(0, k_topMargin+k_paragraphHeight+3*textHeight, width, textHeight)); + m_cancelButton.setFrame(KDRect(k_buttonMargin, height-k_buttonMargin-k_buttonHeight, (width-3*k_buttonMargin)/2, k_buttonHeight)); + m_okButton.setFrame(KDRect(2*k_buttonMargin+(width-3*k_buttonMargin)/2, height-k_buttonMargin-k_buttonHeight, (width-3*k_buttonMargin)/2, k_buttonHeight)); +} diff --git a/apps/exam_pop_up_controller.h b/apps/exam_pop_up_controller.h new file mode 100644 index 000000000..a507a2d25 --- /dev/null +++ b/apps/exam_pop_up_controller.h @@ -0,0 +1,42 @@ +#ifndef APPS_EXAM_POP_UP_CONTROLLER_H +#define APPS_EXAM_POP_UP_CONTROLLER_H + +#include + +class ExamPopUpController : public ViewController { +public: + ExamPopUpController(); + View * view() override; + void didBecomeFirstResponder() override; + bool handleEvent(Ion::Events::Event event) override; + void setActivatingExamMode(bool activingExamMode); + bool isActivatingExamMode(); +private: + class ContentView : public View { + public: + ContentView(Responder * parentResponder); + void drawRect(KDContext * ctx, KDRect rect) const override; + void setSelectedButton(int selectedButton, App * app); + int selectedButton(); + void setMessages(bool activingExamMode); + private: + constexpr static KDCoordinate k_buttonMargin = 10; + constexpr static KDCoordinate k_buttonHeight = 20; + constexpr static KDCoordinate k_topMargin = 12; + constexpr static KDCoordinate k_paragraphHeight = 20; + int numberOfSubviews() const override; + View * subviewAtIndex(int index) override; + void layoutSubviews() override; + Button m_cancelButton; + Button m_okButton; + MessageTextView m_warningTextView; + MessageTextView m_messageTextView1; + MessageTextView m_messageTextView2; + MessageTextView m_messageTextView3; + }; + ContentView m_contentView; + bool m_isActivatingExamMode; +}; + +#endif +