[apps] Create an exam pop up controller

Change-Id: I34868cd57efd1ace4a5a20994927a85119184cca
This commit is contained in:
Émilie Feral
2017-04-07 11:43:10 +02:00
parent 53596b20a8
commit bc49228404
3 changed files with 179 additions and 0 deletions

View File

@@ -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\

View File

@@ -0,0 +1,136 @@
#include "exam_pop_up_controller.h"
#include "i18n.h"
#include "global_preferences.h"
#include <assert.h>
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));
}

View File

@@ -0,0 +1,42 @@
#ifndef APPS_EXAM_POP_UP_CONTROLLER_H
#define APPS_EXAM_POP_UP_CONTROLLER_H
#include <escher.h>
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