diff --git a/apps/on_boarding/update_controller.cpp b/apps/on_boarding/update_controller.cpp index c8015f702..8bff66263 100644 --- a/apps/on_boarding/update_controller.cpp +++ b/apps/on_boarding/update_controller.cpp @@ -4,12 +4,63 @@ namespace OnBoarding { -static I18n::Message sOnBoardingMessages[] = {I18n::Message::UpdateAvailable, I18n::Message::UpdateMessage1, I18n::Message::UpdateMessage2, I18n::Message::UpdateMessage3, I18n::Message::UpdateMessage4}; +UpdateController::MessageViewWithSkip::MessageViewWithSkip(I18n::Message * messages, KDColor * colors, uint8_t numberOfMessages) : + MessageView(messages, colors, numberOfMessages), + m_skipView(KDText::FontSize::Small, I18n::Message::Skip, 1.0f, 0.5f), + m_okView() +{ +} -static KDColor sOnBoardingColors[] = {KDColorBlack, KDColorBlack, KDColorBlack, KDColorBlack, Palette::YellowDark}; +int UpdateController::MessageViewWithSkip::numberOfSubviews() const { + return MessageView::numberOfSubviews() + 2; +} + +View * UpdateController::MessageViewWithSkip::subviewAtIndex(int index) { + uint8_t numberOfMainMessages = MessageView::numberOfSubviews(); + if (index < numberOfMainMessages) { + return MessageView::subviewAtIndex(index); + } + if (index == numberOfMainMessages) { + return &m_skipView; + } + if (index == numberOfMainMessages + 1) { + return &m_okView; + } + assert(false); + return nullptr; +} + +void UpdateController::MessageViewWithSkip::layoutSubviews() { + // Layout the main message + MessageView::layoutSubviews(); + // Layout the "skip (OK)" + KDCoordinate height = bounds().height(); + KDCoordinate width = bounds().width(); + KDCoordinate textHeight = KDText::charSize(KDText::FontSize::Small).height(); + KDSize okSize = m_okView.minimalSizeForOptimalDisplay(); + m_skipView.setFrame(KDRect(0, height-k_bottomMargin-textHeight, width-okSize.width()-k_okMargin-k_skipMargin, textHeight)); + m_okView.setFrame(KDRect(width - okSize.width()-k_okMargin, height-okSize.height()-k_okMargin, okSize)); +} + +static I18n::Message sOnBoardingMessages[] = { + I18n::Message::UpdateAvailable, + I18n::Message::UpdateMessage1, + I18n::Message::UpdateMessage2, + I18n::Message::BlankMessage, + I18n::Message::UpdateMessage3, + I18n::Message::UpdateMessage4}; + +static KDColor sOnBoardingColors[] = { + KDColorBlack, + KDColorBlack, + KDColorBlack, + KDColorWhite, + KDColorBlack, + Palette::YellowDark}; UpdateController::UpdateController() : - MessageController(sOnBoardingMessages, sOnBoardingColors) + ViewController(nullptr), + m_messageViewWithSkip(sOnBoardingMessages, sOnBoardingColors, 6) { } diff --git a/apps/on_boarding/update_controller.h b/apps/on_boarding/update_controller.h index 964eebcb9..e59a2ce53 100644 --- a/apps/on_boarding/update_controller.h +++ b/apps/on_boarding/update_controller.h @@ -1,14 +1,34 @@ #ifndef ON_BOARDING_UPDATE_CONTROLLER_H #define ON_BOARDING_UPDATE_CONTROLLER_H -#include "../shared/message_controller.h" +#include +#include "../i18n.h" +#include "../shared/message_view.h" +#include "../shared/ok_view.h" namespace OnBoarding { -class UpdateController : public MessageController { +class UpdateController : public ViewController { public: UpdateController(); + View * view() override { return &m_messageViewWithSkip; } bool handleEvent(Ion::Events::Event event) override; +private: + class MessageViewWithSkip : public MessageView { + public: + MessageViewWithSkip(I18n::Message * messages, KDColor * colors, uint8_t numberOfMessages); + protected: + int numberOfSubviews() const override; + View * subviewAtIndex(int index) override; + void layoutSubviews() override; + private: + constexpr static KDCoordinate k_bottomMargin = 13; + constexpr static KDCoordinate k_okMargin = 10; + constexpr static KDCoordinate k_skipMargin = 4; + MessageTextView m_skipView; + Shared::OkView m_okView; + }; + MessageViewWithSkip m_messageViewWithSkip; }; } diff --git a/apps/shared.universal.i18n b/apps/shared.universal.i18n index 7385154fd..affc2009f 100644 --- a/apps/shared.universal.i18n +++ b/apps/shared.universal.i18n @@ -8,6 +8,7 @@ AsinhCommandWithArg = "asinh(x)" AtanhCommandWithArg = "atanh(x)" B = "b" BinomialCommandWithArg = "binomial(n,k)" +BlankMessage = " " CapitalAlpha = "ALPHA" CeilCommandWithArg = "ceil(x)" ConfidenceCommandWithArg = "confidence(f,n)" diff --git a/apps/shared/Makefile b/apps/shared/Makefile index e4d9c0bec..55f2e7c7e 100644 --- a/apps/shared/Makefile +++ b/apps/shared/Makefile @@ -29,7 +29,7 @@ app_objs += $(addprefix apps/shared/,\ list_controller.o\ list_parameter_controller.o\ memoized_curve_view_range.o\ - message_controller.o\ + message_view.o\ new_function_cell.o\ ok_view.o\ parameter_text_field_delegate.o\ diff --git a/apps/shared/message_controller.cpp b/apps/shared/message_controller.cpp index 0d3ac5f37..81521f96e 100644 --- a/apps/shared/message_controller.cpp +++ b/apps/shared/message_controller.cpp @@ -1,17 +1,12 @@ #include "message_controller.h" #include "../apps_container.h" -#include -MessageController::MessageController(I18n::Message * messages, KDColor * colors) : +MessageController::MessageController(I18n::Message * messages, KDColor * colors, uint8_t numberOfMessages) : ViewController(nullptr), - m_contentView(messages, colors) + m_messageViewWithSkip(messages, colors, numberOfMessages) { } -View * MessageController::view() { - return &m_contentView; -} - bool MessageController::handleEvent(Ion::Events::Event event) { if (event != Ion::Events::Back && event != Ion::Events::OnOff && event != Ion::Events::Home) { app()->dismissModalViewController(); @@ -19,59 +14,3 @@ bool MessageController::handleEvent(Ion::Events::Event event) { } return false; } - -MessageController::ContentView::ContentView(I18n::Message * messages, KDColor * colors) : - m_titleTextView(KDText::FontSize::Large, messages[0], 0.5f, 0.5f, colors[0]), - m_messageTextView1(KDText::FontSize::Small, messages[1], 0.5f, 0.5f, colors[1]), - m_messageTextView2(KDText::FontSize::Small, messages[2], 0.5f, 0.5f, colors[2]), - m_messageTextView3(KDText::FontSize::Small, messages[3], 0.5f, 0.5f, colors[3]), - m_messageTextView4(KDText::FontSize::Small, messages[4], 0.5f, 0.5f, colors[4]), - m_skipView(KDText::FontSize::Small, I18n::Message::Skip, 1.0f, 0.5f), - m_okView() -{ -} - -void MessageController::ContentView::drawRect(KDContext * ctx, KDRect rect) const { - ctx->fillRect(bounds(), KDColorWhite); -} - -int MessageController::ContentView::numberOfSubviews() const { - return 7; -} - -View * MessageController::ContentView::subviewAtIndex(int index) { - switch (index) { - case 0: - return &m_titleTextView; - case 1: - return &m_messageTextView1; - case 2: - return &m_messageTextView2; - case 3: - return &m_messageTextView3; - case 4: - return &m_messageTextView4; - case 5: - return &m_skipView; - case 6: - return &m_okView; - default: - assert(false); - return nullptr; - } -} - -void MessageController::ContentView::layoutSubviews() { - KDCoordinate height = bounds().height(); - KDCoordinate width = bounds().width(); - KDCoordinate titleHeight = m_titleTextView.minimalSizeForOptimalDisplay().height(); - KDCoordinate textHeight = KDText::charSize(KDText::FontSize::Small).height(); - m_titleTextView.setFrame(KDRect(0, Metric::MessageScreenTitleMargin, width, titleHeight)); - m_messageTextView1.setFrame(KDRect(0, Metric::MessageScreenParagraphHeight, width, textHeight)); - m_messageTextView2.setFrame(KDRect(0, Metric::MessageScreenParagraphHeight+textHeight, width, textHeight)); - m_messageTextView3.setFrame(KDRect(0, Metric::MessageScreenParagraphHeight+2*textHeight+Metric::MessageScreenParagraphMargin, width, textHeight)); - m_messageTextView4.setFrame(KDRect(0, Metric::MessageScreenParagraphHeight+3*textHeight+Metric::MessageScreenParagraphMargin, width, textHeight)); - KDSize okSize = m_okView.minimalSizeForOptimalDisplay(); - m_skipView.setFrame(KDRect(0, height-k_bottomMargin-textHeight, width-okSize.width()-k_okMargin-k_skipMargin, textHeight)); - m_okView.setFrame(KDRect(width - okSize.width()-k_okMargin, height-okSize.height()-k_okMargin, okSize)); -} diff --git a/apps/shared/message_controller.h b/apps/shared/message_controller.h index 22e65cc58..96217cb78 100644 --- a/apps/shared/message_controller.h +++ b/apps/shared/message_controller.h @@ -2,34 +2,15 @@ #define SHARED_MESSAGE_CONTROLLER_H #include -#include "ok_view.h" +#include "message_view_with_skip.h" class MessageController : public ViewController { public: - MessageController(I18n::Message * messages, KDColor * colors); - View * view() override; + MessageController(I18n::Message * messages, KDColor * colors, uint8_t numberOfMessages); + View * view() override { return &m_messageViewWithSkip; } bool handleEvent(Ion::Events::Event event) override; private: - class ContentView : public View { - public: - ContentView(I18n::Message * messages, KDColor * colors); - void drawRect(KDContext * ctx, KDRect rect) const override; - private: - constexpr static KDCoordinate k_bottomMargin = 13; - constexpr static KDCoordinate k_okMargin = 10; - constexpr static KDCoordinate k_skipMargin = 4; - int numberOfSubviews() const override; - View * subviewAtIndex(int index) override; - void layoutSubviews() override; - MessageTextView m_titleTextView; - MessageTextView m_messageTextView1; - MessageTextView m_messageTextView2; - MessageTextView m_messageTextView3; - MessageTextView m_messageTextView4; - MessageTextView m_skipView; - Shared::OkView m_okView; - }; - ContentView m_contentView; + MessageViewWithSkip m_messageViewWithSkip; }; #endif diff --git a/apps/shared/message_view.cpp b/apps/shared/message_view.cpp new file mode 100644 index 000000000..141830f38 --- /dev/null +++ b/apps/shared/message_view.cpp @@ -0,0 +1,37 @@ +#include "message_view.h" +#include + +MessageView::MessageView(I18n::Message * messages, KDColor * colors, uint8_t numberOfMessages) { + m_numberOfMessages = numberOfMessages < k_maxNumberOfMessages ? numberOfMessages : k_maxNumberOfMessages; + for (uint8_t i = 0; i < m_numberOfMessages; i++) { + m_messageTextViews[i].setFontSize(i == 0 ? KDText::FontSize::Large : KDText::FontSize::Small); + m_messageTextViews[i].setMessage(messages[i]); + m_messageTextViews[i].setAlignment(0.5f, 0.5f); + m_messageTextViews[i].setTextColor(colors[i]); + } +} + +void MessageView::drawRect(KDContext * ctx, KDRect rect) const { + ctx->fillRect(bounds(), KDColorWhite); +} + +View * MessageView::subviewAtIndex(int index) { + if (index >= m_numberOfMessages) { + assert(false); + return nullptr; + } + return &(m_messageTextViews[index]); +} + +void MessageView::layoutSubviews() { + if (m_numberOfMessages == 0) { + return; + } + KDCoordinate width = bounds().width(); + KDCoordinate titleHeight = m_messageTextViews[0].minimalSizeForOptimalDisplay().height(); + KDCoordinate textHeight = KDText::charSize(KDText::FontSize::Small).height(); + m_messageTextViews[0].setFrame(KDRect(0, k_titleMargin, width, titleHeight)); + for (uint8_t i = 1; i < m_numberOfMessages; i++) { + m_messageTextViews[i].setFrame(KDRect(0, k_paragraphHeight + (i-1) * textHeight, width, textHeight)); + } +} diff --git a/apps/shared/message_view.h b/apps/shared/message_view.h new file mode 100644 index 000000000..ba413b24e --- /dev/null +++ b/apps/shared/message_view.h @@ -0,0 +1,23 @@ +#ifndef SHARED_MESSAGE_VIEW_H +#define SHARED_MESSAGE_VIEW_H + +#include + +class MessageView : public View { +public: + MessageView(I18n::Message * messages, KDColor * colors, uint8_t numberOfMessages); + void drawRect(KDContext * ctx, KDRect rect) const override; +protected: + int numberOfSubviews() const override { return m_numberOfMessages; } + View * subviewAtIndex(int index) override; + void layoutSubviews() override; +private: + constexpr static KDCoordinate k_titleMargin = 40; + constexpr static KDCoordinate k_paragraphHeight = 100; + constexpr static uint8_t k_maxNumberOfMessages = 8; + MessageTextView m_messageTextViews[k_maxNumberOfMessages]; + uint8_t m_numberOfMessages; +}; + +#endif + diff --git a/apps/usb/usb_connected_controller.cpp b/apps/usb/usb_connected_controller.cpp index bbfe1ce17..a03835dc6 100644 --- a/apps/usb/usb_connected_controller.cpp +++ b/apps/usb/usb_connected_controller.cpp @@ -1,6 +1,5 @@ #include "usb_connected_controller.h" -#include "../apps_container.h" -#include +#include "../i18n.h" namespace USB { @@ -9,6 +8,7 @@ static I18n::Message sUSBConnectedMessages[] = { I18n::Message::ConnectedMessage1, I18n::Message::ConnectedMessage2, I18n::Message::ConnectedMessage3, + I18n::Message::BlankMessage, I18n::Message::ConnectedMessage4, I18n::Message::ConnectedMessage5, I18n::Message::ConnectedMessage6}; @@ -18,63 +18,14 @@ static KDColor sUSBConnectedColors[] = { KDColorBlack, KDColorBlack, Palette::YellowDark, + KDColorWhite, KDColorBlack, KDColorBlack, KDColorBlack}; -USBConnectedController::ContentView::ContentView(I18n::Message * messages, KDColor * colors) : - m_titleTextView(KDText::FontSize::Large, messages[0], 0.5f, 0.5f, colors[0]), - m_messageTextView1(KDText::FontSize::Small, messages[1], 0.5f, 0.5f, colors[1]), - m_messageTextView2(KDText::FontSize::Small, messages[2], 0.5f, 0.5f, colors[2]), - m_messageTextView3(KDText::FontSize::Small, messages[3], 0.5f, 0.5f, colors[3]), - m_messageTextView4(KDText::FontSize::Small, messages[4], 0.5f, 0.5f, colors[4]), - m_messageTextView5(KDText::FontSize::Small, messages[5], 0.5f, 0.5f, colors[5]), - m_messageTextView6(KDText::FontSize::Small, messages[6], 0.5f, 0.5f, colors[6]) -{ -} - -void USBConnectedController::ContentView::drawRect(KDContext * ctx, KDRect rect) const { - ctx->fillRect(bounds(), KDColorWhite); -} - -View * USBConnectedController::ContentView::subviewAtIndex(int index) { - switch (index) { - case 0: - return &m_titleTextView; - case 1: - return &m_messageTextView1; - case 2: - return &m_messageTextView2; - case 3: - return &m_messageTextView3; - case 4: - return &m_messageTextView4; - case 5: - return &m_messageTextView5; - case 6: - return &m_messageTextView6; - default: - assert(false); - return nullptr; - } -} - -void USBConnectedController::ContentView::layoutSubviews() { - KDCoordinate width = bounds().width(); - KDCoordinate titleHeight = m_titleTextView.minimalSizeForOptimalDisplay().height(); - KDCoordinate textHeight = KDText::charSize(KDText::FontSize::Small).height(); - m_titleTextView.setFrame(KDRect(0, Metric::MessageScreenTitleMargin, width, titleHeight)); - m_messageTextView1.setFrame(KDRect(0, Metric::MessageScreenParagraphHeight, width, textHeight)); - m_messageTextView2.setFrame(KDRect(0, Metric::MessageScreenParagraphHeight+textHeight, width, textHeight)); - m_messageTextView3.setFrame(KDRect(0, Metric::MessageScreenParagraphHeight+2*textHeight, width, textHeight)); - m_messageTextView4.setFrame(KDRect(0, Metric::MessageScreenParagraphHeight+3*textHeight+Metric::MessageScreenParagraphMargin, width, textHeight)); - m_messageTextView5.setFrame(KDRect(0, Metric::MessageScreenParagraphHeight+4*textHeight+Metric::MessageScreenParagraphMargin, width, textHeight)); - m_messageTextView6.setFrame(KDRect(0, Metric::MessageScreenParagraphHeight+5*textHeight+Metric::MessageScreenParagraphMargin, width, textHeight)); -} - USBConnectedController::USBConnectedController() : ViewController(nullptr), - m_contentView(sUSBConnectedMessages, sUSBConnectedColors) + m_messageView(sUSBConnectedMessages, sUSBConnectedColors, 8) { } diff --git a/apps/usb/usb_connected_controller.h b/apps/usb/usb_connected_controller.h index e56c09b6a..c733062ed 100644 --- a/apps/usb/usb_connected_controller.h +++ b/apps/usb/usb_connected_controller.h @@ -2,32 +2,17 @@ #define USB_USB_CONNECTED_CONTROLLER_H #include +#include "../shared/message_view.h" namespace USB { class USBConnectedController : public ViewController { public: USBConnectedController(); - View * view() override { return &m_contentView; } + View * view() override { return &m_messageView; } bool handleEvent(Ion::Events::Event event) override { return false; } private: - class ContentView : public View { - public: - ContentView(I18n::Message * messages, KDColor * colors); - void drawRect(KDContext * ctx, KDRect rect) const override; - private: - int numberOfSubviews() const override { return 7; } - View * subviewAtIndex(int index) override; - void layoutSubviews() override; - MessageTextView m_titleTextView; - MessageTextView m_messageTextView1; - MessageTextView m_messageTextView2; - MessageTextView m_messageTextView3; - MessageTextView m_messageTextView4; - MessageTextView m_messageTextView5; - MessageTextView m_messageTextView6; - }; - ContentView m_contentView; + MessageView m_messageView; }; } diff --git a/escher/include/escher/metric.h b/escher/include/escher/metric.h index ec55bec2c..55d2ba3dc 100644 --- a/escher/include/escher/metric.h +++ b/escher/include/escher/metric.h @@ -26,10 +26,6 @@ public: constexpr static KDCoordinate StoreRowHeight = 50; constexpr static KDCoordinate ToolboxRowHeight = 40; constexpr static KDCoordinate StackTitleHeight = 20; - constexpr static KDCoordinate MessageScreenTitleMargin = 40; - constexpr static KDCoordinate MessageScreenParagraphHeight = 100; - constexpr static KDCoordinate MessageScreenParagraphMargin = 13; - }; #endif