Files
Upsilon/apps/settings/sub_menu/preferences_controller.cpp
2020-06-18 19:58:34 +02:00

302 lines
10 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "preferences_controller.h"
#include "../../global_preferences.h"
#include "../../apps_container.h"
#include <assert.h>
#include <cmath>
#include <poincare/layout_helper.h>
#include <poincare/code_point_layout.h>
#include <poincare/fraction_layout.h>
#include <poincare/vertical_offset_layout.h>
#include <poincare/nth_root_layout.h>
#include <algorithm>
using namespace Poincare;
namespace Settings {
PreferencesController::PreferencesController(Responder * parentResponder) :
GenericSubController(parentResponder)
{
for (int i = 0; i < k_totalNumberOfCell; i++) {
m_cells[i].setMessageFont(KDFont::LargeFont);
}
}
void PreferencesController::didBecomeFirstResponder() {
Container::activeApp()->setFirstResponder(&m_selectableTableView);
}
bool PreferencesController::handleEvent(Ion::Events::Event event) {
if (event == Ion::Events::OK || event == Ion::Events::EXE) {
/* Generic behaviour of preference menu*/
assert(m_messageTreeModel->label() != I18n::Message::DisplayMode || selectedRow() != numberOfRows()-1); // In that case, events OK and EXE are handled by the cell
setPreferenceWithValueIndex(m_messageTreeModel->label(), selectedRow());
AppsContainer::sharedAppsContainer()->refreshPreferences();
StackViewController * stack = stackController();
stack->pop();
return true;
}
return GenericSubController::handleEvent(event);
}
HighlightCell * PreferencesController::reusableCell(int index, int type) {
assert(type == 0);
assert(index >= 0 && index < k_totalNumberOfCell);
return &m_cells[index];
}
int PreferencesController::reusableCellCount(int type) {
return k_totalNumberOfCell;
}
Layout PreferencesController::layoutForPreferences(I18n::Message message) {
switch (message) {
// Angle Unit
case I18n::Message::Degrees:
{
const char * degEx = "90°";
return LayoutHelper::String(degEx, strlen(degEx), k_layoutFont);
}
case I18n::Message::Radian:
return FractionLayout::Builder(
CodePointLayout::Builder(UCodePointGreekSmallLetterPi, k_layoutFont),
CodePointLayout::Builder('2', k_layoutFont));
case I18n::Message::Gradians:
{
const char * degEx = "100 gon";
return LayoutHelper::String(degEx, strlen(degEx), k_layoutFont);
}
// Display Mode format
case I18n::Message::Decimal:
return LayoutHelper::String("0.1234", 6, k_layoutFont);
case I18n::Message::Scientific:
{
const char * text = "1.234ᴇ-1";
return LayoutHelper::String(text, strlen(text), k_layoutFont);
}
case I18n::Message::Engineering:
{
const char * text = "123.4ᴇ-3";
return LayoutHelper::String(text, strlen(text), k_layoutFont);
}
// Edition mode
case I18n::Message::Edition2D:
return HorizontalLayout::Builder(
LayoutHelper::String("1+", 2, k_layoutFont),
FractionLayout::Builder(LayoutHelper::String("2", 1, k_layoutFont), LayoutHelper::String("3", 1, k_layoutFont))
);
case I18n::Message::EditionLinear:
return LayoutHelper::String("1+2/3", 5, k_layoutFont);
// Complex format
case I18n::Message::Real:
return CodePointLayout::Builder('x', k_layoutFont);
case I18n::Message::Cartesian:
{
const char * text = "a+𝐢b";
return LayoutHelper::String(text, strlen(text), k_layoutFont);
}
case I18n::Message::Polar:
{
const char * base = "r";
const char * superscript = "𝐢θ";
return HorizontalLayout::Builder(
LayoutHelper::String(base, strlen(base), k_layoutFont),
VerticalOffsetLayout::Builder(LayoutHelper::String(superscript, strlen(superscript), k_layoutFont), VerticalOffsetLayoutNode::Position::Superscript)
);
}
// LED placeholders
case I18n::Message::ColorRed:
{
const char * text = " ";
return LayoutHelper::String(text, strlen(text), k_layoutFont);
}
case I18n::Message::ColorWhite:
{
const char * text = " ";
return LayoutHelper::String(text, strlen(text), k_layoutFont);
}
case I18n::Message::ColorBlue:
{
const char * text = " ";
return LayoutHelper::String(text, strlen(text), k_layoutFont);
}
case I18n::Message::ColorGreen:
{
const char * text = " ";
return LayoutHelper::String(text, strlen(text), k_layoutFont);
}
case I18n::Message::ColorYellow:
{
const char * text = " ";
return LayoutHelper::String(text, strlen(text), k_layoutFont);
}
case I18n::Message::ColorPurple:
{
const char * text = " ";
return LayoutHelper::String(text, strlen(text), k_layoutFont);
}
case I18n::Message::ColorOrange:
{
const char * text = " ";
return LayoutHelper::String(text, strlen(text), k_layoutFont);
}
// Exam mode modes
case I18n::Message::ExamModeModeStandard:
{
const char * text = " ";
return LayoutHelper::String(text, strlen(text), k_layoutFont);
}
case I18n::Message::ExamModeModeNoSym:
{
const char * text = " ";
return LayoutHelper::String(text, strlen(text), k_layoutFont);
}
case I18n::Message::ExamModeModeNoSymNoText:
{
const char * text = " ";
return LayoutHelper::String(text, strlen(text), k_layoutFont);
}
case I18n::Message::ExamModeModeDutch:
{
const char * text = " ";
return LayoutHelper::String(text, strlen(text), k_layoutFont);
}
// Symbol controller
case I18n::Message::SymbolMultiplicationCross: // × and · aren't single characters, so they cannot be constructed into codepoints..?
{
const char * text = "×";
return LayoutHelper::String(text, strlen(text), k_layoutFont);
}
case I18n::Message::SymbolMultiplicationMiddleDot:
{
const char * text = "·";
return LayoutHelper::String(text, strlen(text), k_layoutFont);
}
case I18n::Message::SymbolMultiplicationStar:
return CodePointLayout::Builder('*', k_layoutFont);
case I18n::Message::SymbolMultiplicationAutoSymbol:
return CodePointLayout::Builder(' ', k_layoutFont);
// Symbol function
case I18n::Message::SymbolDefaultFunction:
{
return NthRootLayout::Builder(CodePointLayout::Builder('x'));
}
case I18n::Message::SymbolArgDefaultFunction:
{
return NthRootLayout::Builder(CodePointLayout::Builder('x'), CodePointLayout::Builder('2'));
}
case I18n::Message::SymbolArgFunction:
{
return NthRootLayout::Builder(CodePointLayout::Builder('x'), CodePointLayout::Builder('y'));
}
// Result display
case I18n::Message::DefaultResult:
{
const char * text = " ";
return LayoutHelper::String(text, strlen(text), k_layoutFont);
}
case I18n::Message::CompactResult:
{
const char * text = " ";
return LayoutHelper::String(text, strlen(text), k_layoutFont);
}
// Font size
case I18n::Message::LargeFont:
case I18n::Message::SmallFont:
{
const char * text = "abc";
const KDFont * font = message == I18n::Message::LargeFont ? KDFont::LargeFont : KDFont::SmallFont;
return LayoutHelper::String(text, strlen(text), font);
}
default:
assert(false);
return Layout();
}
}
void PreferencesController::willDisplayCellForIndex(HighlightCell * cell, int index) {
GenericSubController::willDisplayCellForIndex(cell, index);
MessageTableCellWithExpression * myCell = (MessageTableCellWithExpression *)cell;
myCell->setLayout(layoutForPreferences(m_messageTreeModel->children(index)->label()));
}
KDCoordinate PreferencesController::rowHeight(int j) {
/* We cheat for the Writing format subcontroller, because the Edition2D layout
* needs more vertical space. */
return GenericSubController::rowHeight(j) + (m_messageTreeModel->label() == I18n::Message::EditionMode ? 2 : 0);
}
void PreferencesController::setPreferenceWithValueIndex(I18n::Message message, int valueIndex) {
Preferences * preferences = Preferences::sharedPreferences();
if (message == I18n::Message::AngleUnit) {
preferences->setAngleUnit((Preferences::AngleUnit)valueIndex);
} else if (message == I18n::Message::DisplayMode) {
Preferences::PrintFloatMode mode = (Preferences::PrintFloatMode)valueIndex;
preferences->setDisplayMode(mode);
if (mode == Preferences::PrintFloatMode::Engineering) {
/* In Engineering mode, the number of significant digits cannot be lower
* than 3, because we need to be able to display 100 for instance. */
// TODO: Add warning about signifiant digits change ?
preferences->setNumberOfSignificantDigits(std::max<int>(preferences->numberOfSignificantDigits(), 3));
}
} else if (message == I18n::Message::EditionMode) {
preferences->setEditionMode((Preferences::EditionMode)valueIndex);
} else if (message == I18n::Message::ComplexFormat) {
preferences->setComplexFormat((Preferences::ComplexFormat)valueIndex);
} else if (message == I18n::Message::LEDColor) {
preferences->setColorOfLED((Preferences::LEDColor)valueIndex);
} else if (message == I18n::Message::ExamModeMode) {
GlobalPreferences::sharedGlobalPreferences()->setTempExamMode((GlobalPreferences::ExamMode)((uint8_t)valueIndex + 1));
} else if (message == I18n::Message::SymbolMultiplication) {
preferences->setSymbolMultiplication((Preferences::SymbolMultiplication)valueIndex);
} else if (message == I18n::Message::SymbolFunction) {
preferences->setSymbolofFunction((Preferences::SymbolFunction)valueIndex);
} else if (message == I18n::Message::FontSizes) {
GlobalPreferences::sharedGlobalPreferences()->setFont(valueIndex == 0 ? KDFont::LargeFont : KDFont::SmallFont);
}
}
int PreferencesController::valueIndexForPreference(I18n::Message message) const {
Preferences * preferences = Preferences::sharedPreferences();
if (message == I18n::Message::AngleUnit) {
return (int)preferences->angleUnit();
}
if (message == I18n::Message::DisplayMode) {
return (int)preferences->displayMode();
}
if (message == I18n::Message::EditionMode) {
return (int)preferences->editionMode();
}
if (message == I18n::Message::ComplexFormat) {
return (int)preferences->complexFormat();
}
#if LEDS_CHOICE
if (message == I18n::Message::LEDColor) {
return (int)preferences->colorOfLED();
}
#endif
if (message == I18n::Message::SymbolMultiplication) {
return (int)preferences->symbolofMultiplication();
}
if (message == I18n::Message::SymbolFunction) {
return (int)preferences->symbolofFunction();
}
if (message == I18n::Message::FontSizes) {
return GlobalPreferences::sharedGlobalPreferences()->font() == KDFont::LargeFont ? 0 : 1;
}
return 0;
}
}