Merge branch 'CompactResult' of https://github.com/0b101/Omega-1 into 0b101-CompactResult

This commit is contained in:
Quentin Guidée
2020-02-16 21:56:10 +01:00
20 changed files with 115 additions and 18 deletions

View File

@@ -135,6 +135,10 @@ KDCoordinate Calculation::height(Context * context, bool expanded, bool allExpre
// Get input height
Layout inputLayout = createInputLayout();
KDCoordinate inputHeight = inputLayout.layoutSize().height();
KDCoordinate inputWidth = inputLayout.layoutSize().width();
float singleMargin = 2 * Metric::CommonSmallMargin;
float doubleMargin = 2 * Metric::CommonSmallMargin;
bool singleLine = false;
KDCoordinate inputBaseline = inputLayout.baseline();
// Get exact output height if needed
@@ -156,11 +160,22 @@ KDCoordinate Calculation::height(Context * context, bool expanded, bool allExpre
if (displayOutput(context) == DisplayOutput::ExactOnly) {
KDCoordinate exactOutputHeight = exactLayout.layoutSize().height();
if (allExpressionsInline) {
KDCoordinate exactOutputBaseline = exactLayout.baseline();
result = maxCoordinate(inputBaseline, exactOutputBaseline) + maxCoordinate(inputHeight - inputBaseline, exactOutputHeight-exactOutputBaseline);
KDCoordinate exactOutputWidth = exactLayout.layoutSize().width();
singleLine = exactOutputWidth + inputWidth < maxWidth - 40;
if (singleLine && Poincare::Preferences::sharedPreferences()->resultDisplay() == Poincare::Preferences::ResultDisplay::Compact) {
if (allExpressionsInline) {
KDCoordinate exactOutputBaseline = exactLayout.baseline();
result = (inputHeight >= exactOutputHeight) ? maxCoordinate(inputBaseline, exactOutputBaseline) + singleMargin : maxCoordinate(inputHeight - inputBaseline, exactOutputHeight-exactOutputBaseline) + singleMargin;
} else {
result = (inputHeight >= exactOutputHeight) ? inputHeight + singleMargin : exactOutputHeight + singleMargin;
}
} else {
result = inputHeight+exactOutputHeight;
if (allExpressionsInline) {
KDCoordinate exactOutputBaseline = exactLayout.baseline();
result = maxCoordinate(inputBaseline, exactOutputBaseline) + maxCoordinate(inputHeight - inputBaseline, exactOutputHeight-exactOutputBaseline)+doubleMargin;
} else {
result = inputHeight+exactOutputHeight+doubleMargin+doubleMargin;
}
}
} else {
bool couldNotCreateApproximateLayout = false;
@@ -182,23 +197,47 @@ KDCoordinate Calculation::height(Context * context, bool expanded, bool allExpre
}
KDCoordinate approximateOutputHeight = approximateLayout.layoutSize().height();
KDCoordinate approximateOutputWidth = approximateLayout.layoutSize().width();
singleLine = approximateOutputWidth + inputWidth < maxWidth - 40;
if (displayOutput(context) == DisplayOutput::ApproximateOnly || (!expanded && displayOutput(context) == DisplayOutput::ExactAndApproximateToggle)) {
if (allExpressionsInline) {
KDCoordinate approximateOutputBaseline = approximateLayout.baseline();
result = maxCoordinate(inputBaseline, approximateOutputBaseline) + maxCoordinate(inputHeight - inputBaseline, approximateOutputHeight-approximateOutputBaseline);
if (singleLine && Poincare::Preferences::sharedPreferences()->resultDisplay() == Poincare::Preferences::ResultDisplay::Compact) {
if (allExpressionsInline) {
KDCoordinate approximateOutputBaseline = approximateLayout.baseline();
result = (inputHeight >= approximateOutputHeight) ? maxCoordinate(inputBaseline, approximateOutputBaseline) + singleMargin : maxCoordinate(inputHeight - inputBaseline, approximateOutputHeight-approximateOutputBaseline) + singleMargin;
} else {
result = (inputHeight >= approximateOutputHeight) ? inputHeight + singleMargin : approximateOutputHeight + singleMargin;
}
} else {
result = inputHeight+approximateOutputHeight;
if (allExpressionsInline) {
KDCoordinate approximateOutputBaseline = approximateLayout.baseline();
result = maxCoordinate(inputBaseline, approximateOutputBaseline) + maxCoordinate(inputHeight - inputBaseline, approximateOutputHeight-approximateOutputBaseline) + doubleMargin + singleMargin;
} else {
result = inputHeight+approximateOutputHeight+doubleMargin+singleMargin;
}
}
} else {
assert(displayOutput(context) == DisplayOutput::ExactAndApproximate || (displayOutput(context) == DisplayOutput::ExactAndApproximateToggle && expanded));
KDCoordinate exactOutputHeight = exactLayout.layoutSize().height();
KDCoordinate exactOutputBaseline = exactLayout.baseline();
KDCoordinate exactOutputWidth = exactLayout.layoutSize().width();
KDCoordinate approximateOutputWidth = approximateLayout.layoutSize().width();
KDCoordinate outputWidth = exactOutputWidth + approximateOutputWidth;
singleLine = outputWidth + inputWidth < maxWidth - 70;
KDCoordinate approximateOutputBaseline = approximateLayout.baseline();
if (allExpressionsInline) {
result = maxCoordinate(inputBaseline, maxCoordinate(exactOutputBaseline, approximateOutputBaseline)) + maxCoordinate(inputHeight - inputBaseline, maxCoordinate(exactOutputHeight - exactOutputBaseline, approximateOutputHeight-approximateOutputBaseline));
} else {
if (singleLine && Poincare::Preferences::sharedPreferences()->resultDisplay() == Poincare::Preferences::ResultDisplay::Compact) {
KDCoordinate outputHeight = maxCoordinate(exactOutputBaseline, approximateOutputBaseline) + maxCoordinate(exactOutputHeight-exactOutputBaseline, approximateOutputHeight-approximateOutputBaseline);
result = inputHeight + outputHeight;
if (allExpressionsInline) {
result = (inputHeight >= outputHeight) ? maxCoordinate(inputBaseline, maxCoordinate(exactOutputBaseline, approximateOutputBaseline)) + singleMargin : maxCoordinate(inputHeight - inputBaseline, maxCoordinate(exactOutputHeight - exactOutputBaseline, approximateOutputHeight-approximateOutputBaseline)) + singleMargin;
} else {
result = (inputHeight >= outputHeight) ? inputHeight + singleMargin : outputHeight + singleMargin;
}
} else {
if (allExpressionsInline) {
result = maxCoordinate(inputBaseline, maxCoordinate(exactOutputBaseline, approximateOutputBaseline)) + maxCoordinate(inputHeight - inputBaseline, maxCoordinate(exactOutputHeight - exactOutputBaseline, approximateOutputHeight-approximateOutputBaseline));
} else {
KDCoordinate outputHeight = maxCoordinate(exactOutputBaseline, approximateOutputBaseline) + maxCoordinate(exactOutputHeight-exactOutputBaseline, approximateOutputHeight-approximateOutputBaseline) + doubleMargin;
result = inputHeight + outputHeight + doubleMargin;
}
}
}
}

View File

@@ -95,6 +95,7 @@ public:
// Additional Information
AdditionalInformationType additionalInformationType(Poincare::Context * context);
private:
static constexpr int maxWidth = 314;
static constexpr int k_numberOfExpressions = 4;
static constexpr KDCoordinate k_heightComputationFailureHeight = 50;
static constexpr const char * k_maximalIntegerWithAdditionalInformation = "10000000000000000";

View File

@@ -200,7 +200,7 @@ KDCoordinate HistoryController::rowHeight(int j) {
return 0;
}
Shared::ExpiringPointer<Calculation> calculation = calculationAtIndex(j);
return calculation->height(App::app()->localContext(), j == selectedRow() && selectedSubviewType() == SubviewType::Output) + 4 * Metric::CommonSmallMargin;
return calculation->height(App::app()->localContext(), j == selectedRow() && selectedSubviewType() == SubviewType::Output);
}
int HistoryController::typeAtLocation(int i, int j) {

View File

@@ -37,7 +37,7 @@ private:
CalculationSelectableTableView * selectableTableView();
bool calculationAtIndexToggles(int index);
void historyViewCellDidChangeSelection(HistoryViewCell ** cell, HistoryViewCell ** previousCell, int previousSelectedCellX, int previousSelectedCellY, SubviewType type, SubviewType previousType) override;
constexpr static int k_maxNumberOfDisplayedRows = 5;
constexpr static int k_maxNumberOfDisplayedRows = 8;
CalculationSelectableTableView m_selectableTableView;
HistoryViewCell m_calculationHistory[k_maxNumberOfDisplayedRows];
CalculationStore * m_calculationStore;

View File

@@ -185,14 +185,21 @@ void HistoryViewCell::layoutSubviews(bool force) {
inputSize.height()),
force);
KDSize outputSize = m_scrollableOutputView.minimalSizeForOptimalDisplay();
int outputY = (oneLine() && Poincare::Preferences::sharedPreferences()->resultDisplay() == Poincare::Preferences::ResultDisplay::Compact) ? maxCoordinate(0, inputSize.height() - outputSize.height()) / 2 : inputSize.height();
m_scrollableOutputView.setFrame(KDRect(
maxCoordinate(0, maxFrameWidth - outputSize.width()),
inputSize.height(),
outputY,
minCoordinate(maxFrameWidth, outputSize.width()),
outputSize.height()),
oneLine() ? outputSize.height() : (bounds().height() - inputSize.height())),
force);
}
bool HistoryViewCell::oneLine() {
KDSize inputSize = m_inputView.minimalSizeForOptimalDisplay();
KDSize outputSize = m_scrollableOutputView.minimalSizeForOptimalDisplay();
return outputSize.width() + inputSize.width() < bounds().width() - 6;
}
void HistoryViewCell::setCalculation(Calculation * calculation, bool expanded) {
uint32_t newCalculationCRC = Ion::crc32Byte((const uint8_t *)calculation, ((char *)calculation->next()) - ((char *) calculation));
if (newCalculationCRC == m_calculationCRC32 && m_calculationExpanded == expanded) {

View File

@@ -51,6 +51,7 @@ public:
Shared::ScrollableTwoExpressionsView * outputView();
Calculation::AdditionalInformationType additionalInformationType() const { return m_calculationAdditionInformation; }
private:
bool oneLine();
constexpr static KDCoordinate k_resultWidth = 80;
void reloadScroll();
void reloadOutputSelection(HistoryViewCellDataSource::SubviewType previousType);

View File

@@ -38,6 +38,9 @@ SoftwareVersion = "Epsilon version"
CustomSoftwareVersion = "Omega version"
Username = "Name"
MicroPythonVersion = "µPythonversion"
ResultDisplay = "Result display"
DefaultResult = "Default "
CompactResult = "Compact "
FontSizes = "Python Schriftgröße"
LargeFont = "Große "
SmallFont = "Kleine "

View File

@@ -38,6 +38,9 @@ SoftwareVersion = "Epsilon version"
CustomSoftwareVersion = "Omega version"
Username = "Name"
MicroPythonVersion = "µPython version"
ResultDisplay = "Result display"
DefaultResult = "Default "
CompactResult = "Compact "
FontSizes = "Python font size"
LargeFont = "Large "
SmallFont = "Small "

View File

@@ -38,6 +38,9 @@ SoftwareVersion = "Versión de Epsilon"
CustomSoftwareVersion = "Versión de Omega"
Username = "Apellido"
MicroPythonVersion = "Version de µPython"
ResultDisplay = "Result display"
DefaultResult = "Default "
CompactResult = "Compact "
FontSizes = "Tipografía Python"
LargeFont = "Grande "
SmallFont = "Pequeño "

View File

@@ -38,6 +38,9 @@ SoftwareVersion = "Version d'Epsilon"
CustomSoftwareVersion = "Version d'Omega"
Username = "Nom"
MicroPythonVersion = "Version de µPython"
ResultDisplay = "Result display"
DefaultResult = "Default "
CompactResult = "Compact "
FontSizes = "Police Python"
LargeFont = "Grand "
SmallFont = "Petit "

View File

@@ -38,6 +38,9 @@ SoftwareVersion = "version d'Epsilon"
CustomSoftwareVersion = "Omega verzió"
Username = "Felhasználónév"
MicroPythonVersion = "µPython verzió"
ResultDisplay = "Result display"
DefaultResult = "Default "
CompactResult = "Compact "
FontSizes = "Python betü méret"
LargeFont = "Large "
SmallFont = "Small "

View File

@@ -38,6 +38,9 @@ SoftwareVersion = "Versão do Epsilon"
CustomSoftwareVersion = "Versão do Omega"
Username = "Nome"
MicroPythonVersion = "Versao do µPython"
ResultDisplay = "Result display"
DefaultResult = "Default "
CompactResult = "Compact "
FontSizes = "Tipografia Python"
LargeFont = "Grande "
SmallFont = "Pequeno "

View File

@@ -14,6 +14,7 @@ constexpr SettingsMessageTree s_modelFloatDisplayModeChildren[4] = {SettingsMess
constexpr SettingsMessageTree s_modelComplexFormatChildren[3] = {SettingsMessageTree(I18n::Message::Real), SettingsMessageTree(I18n::Message::Cartesian), SettingsMessageTree(I18n::Message::Polar)};
constexpr SettingsMessageTree s_symbolChildren[4] = {SettingsMessageTree(I18n::Message::SymbolMultiplicationCross),SettingsMessageTree(I18n::Message::SymbolMultiplicationMiddleDot),SettingsMessageTree(I18n::Message::SymbolMultiplicationStar),SettingsMessageTree(I18n::Message::SymbolMultiplicationAutoSymbol)};
constexpr SettingsMessageTree s_modelMathOptionsChildren[5] = {SettingsMessageTree(I18n::Message::AngleUnit, s_modelAngleChildren), SettingsMessageTree(I18n::Message::DisplayMode, s_modelFloatDisplayModeChildren), SettingsMessageTree(I18n::Message::EditionMode, s_modelEditionModeChildren), SettingsMessageTree(I18n::Message::ComplexFormat, s_modelComplexFormatChildren), SettingsMessageTree(I18n::Message::SymbolMultiplication, s_symbolChildren)};
constexpr SettingsMessageTree s_modelResultDisplayChildren[2] = {SettingsMessageTree(I18n::Message::DefaultResult), SettingsMessageTree(I18n::Message::CompactResult)};
constexpr SettingsMessageTree s_modelFontChildren[2] = {SettingsMessageTree(I18n::Message::LargeFont), SettingsMessageTree(I18n::Message::SmallFont)};
constexpr SettingsMessageTree s_accessibilityChildren[6] = {SettingsMessageTree(I18n::Message::AccessibilityInvertColors), SettingsMessageTree(I18n::Message::AccessibilityMagnify),SettingsMessageTree(I18n::Message::AccessibilityGamma),SettingsMessageTree(I18n::Message::AccessibilityGammaRed),SettingsMessageTree(I18n::Message::AccessibilityGammaGreen),SettingsMessageTree(I18n::Message::AccessibilityGammaBlue)};
constexpr SettingsMessageTree s_contributorsChildren[17] = {SettingsMessageTree(I18n::Message::Developers), SettingsMessageTree(I18n::Message::QuentinGuidee), SettingsMessageTree(I18n::Message::DannySimmons), SettingsMessageTree(I18n::Message::JoachimLeFournis), SettingsMessageTree(I18n::Message::JeanBaptisteBoric), SettingsMessageTree(I18n::Message::MaximeFriess), SettingsMessageTree(I18n::Message::David), SettingsMessageTree(I18n::Message::DamienNicolet), SettingsMessageTree(I18n::Message::EvannDreumont), SettingsMessageTree(I18n::Message::SzaboLevente), SettingsMessageTree(I18n::Message::VenceslasDuet), SettingsMessageTree(I18n::Message::BetaTesters), SettingsMessageTree(I18n::Message::CyprienMejat), SettingsMessageTree(I18n::Message::TimeoArnouts), SettingsMessageTree(I18n::Message::LouisC), SettingsMessageTree(I18n::Message::LucaRusso), SettingsMessageTree(I18n::Message::LelahelHideux)};

View File

@@ -19,6 +19,7 @@ extern const SettingsMessageTree s_modelFloatDisplayModeChildren[4];
extern const SettingsMessageTree s_modelComplexFormatChildren[3];
extern const SettingsMessageTree s_symbolChildren[4];
extern const SettingsMessageTree s_modelMathOptionsChildren[5];
extern const SettingsMessageTree s_modelResultDisplayChildren[2];
extern const SettingsMessageTree s_modelFontChildren[2];
extern const SettingsMessageTree s_accessibilityChildren[6];
extern const SettingsMessageTree s_contributorsChildren[17];
@@ -49,7 +50,8 @@ private:
constexpr static int k_indexOfBrightnessCell = k_indexOfMathOptionsChildren + 1;
constexpr static int k_indexOfLanguageCell = k_indexOfBrightnessCell + 1;
constexpr static int k_indexOfExamModeCell = k_indexOfLanguageCell + 1;
constexpr static int k_indexOfFontCell = k_indexOfExamModeCell + 1;
constexpr static int k_indexOfResultDisplayCell = k_indexOfExamModeCell + 1;
constexpr static int k_indexOfFontCell = k_indexOfResultDisplayCell + 1;
/* Pop-up cell and About cell are located at the same index because pop-up
* cell is optional. We must always correct k_indexOfAboutCell with
* hasPrompt() (TODO: make hasPrompt() constexpr and correct
@@ -61,7 +63,7 @@ private:
StackViewController * stackController() const;
I18n::Message promptMessage() const;
bool hasPrompt() const { return promptMessage() != I18n::Message::Default; }
constexpr static int k_numberOfSimpleChevronCells = 8;
constexpr static int k_numberOfSimpleChevronCells = 9;
MessageTableCellWithChevronAndMessage m_cells[k_numberOfSimpleChevronCells];
MessageTableCellWithGaugeWithSeparator m_brightnessCell;
MessageTableCellWithSwitch m_popUpCell;

View File

@@ -7,6 +7,7 @@ namespace Settings {
constexpr SettingsMessageTree s_modelMenu[] =
{SettingsMessageTree(I18n::Message::MathOptions, s_modelMathOptionsChildren),
SettingsMessageTree(I18n::Message::Brightness),
SettingsMessageTree(I18n::Message::ResultDisplay, s_modelResultDisplayChildren),
SettingsMessageTree(I18n::Message::FontSizes, s_modelFontChildren),
SettingsMessageTree(I18n::Message::Language),
SettingsMessageTree(I18n::Message::ExamMode, ExamModeConfiguration::s_modelExamChildren),

View File

@@ -9,6 +9,7 @@ constexpr SettingsMessageTree s_modelMenu[] =
SettingsMessageTree(I18n::Message::Brightness),
SettingsMessageTree(I18n::Message::Language),
SettingsMessageTree(I18n::Message::ExamMode, ExamModeConfiguration::s_modelExamChildren),
SettingsMessageTree(I18n::Message::ResultDisplay, s_modelResultDisplayChildren),
SettingsMessageTree(I18n::Message::FontSizes, s_modelFontChildren),
SettingsMessageTree(I18n::Message::Accessibility, s_accessibilityChildren),
SettingsMessageTree(I18n::Message::About, s_modelAboutChildren)};

View File

@@ -7,6 +7,7 @@ namespace Settings {
constexpr SettingsMessageTree s_modelMenu[] =
{SettingsMessageTree(I18n::Message::MathOptions, s_modelMathOptionsChildren),
SettingsMessageTree(I18n::Message::Brightness),
SettingsMessageTree(I18n::Message::ResultDisplay, s_modelResultDisplayChildren),
SettingsMessageTree(I18n::Message::FontSizes, s_modelFontChildren),
SettingsMessageTree(I18n::Message::Language),
SettingsMessageTree(I18n::Message::ExamMode, ExamModeConfiguration::s_modelExamChildren),

View File

@@ -183,6 +183,18 @@ Layout PreferencesController::layoutForPreferences(I18n::Message message) {
case I18n::Message::SymbolMultiplicationAutoSymbol:
return CodePointLayout::Builder(' ', k_layoutFont);
// Result display
case I18n::Message::DefaultResult:
{
const char * text = " ";
return LayoutHelper::String(text, strlen(text), k_layoutFont);
}
case I18n::Message::CompactResult:
{
const char * text = "Beta";
return LayoutHelper::String(text, strlen(text), k_layoutFont);
}
// Font size
case I18n::Message::LargeFont:
case I18n::Message::SmallFont:
@@ -233,6 +245,8 @@ void PreferencesController::setPreferenceWithValueIndex(I18n::Message message, i
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::ResultDisplay) {
preferences->setResultDisplay((Preferences::ResultDisplay)valueIndex);
} else if (message == I18n::Message::FontSizes) {
GlobalPreferences::sharedGlobalPreferences()->setFont(valueIndex == 0 ? KDFont::LargeFont : KDFont::SmallFont);
}
@@ -259,6 +273,9 @@ int PreferencesController::valueIndexForPreference(I18n::Message message) const
if (message == I18n::Message::SymbolMultiplication) {
return (int)preferences->symbolofMultiplication();
}
if (message == I18n::Message::ResultDisplay) {
return (int)preferences->resultDisplay();
}
if (message == I18n::Message::FontSizes) {
return GlobalPreferences::sharedGlobalPreferences()->font() == KDFont::LargeFont ? 0 : 1;
}

View File

@@ -52,6 +52,10 @@ public:
Star = 2,
Auto = 3
};
enum class ResultDisplay : uint8_t {
Default = 0,
Compact = 1
};
enum class PythonFont : uint8_t {
Large = 0,
Small = 1
@@ -72,6 +76,8 @@ public:
void setColorOfLED(LEDColor color) { m_colorOfLED = color; }
SymbolMultiplication symbolofMultiplication() const { return m_symbolMultiplication; }
void setSymbolMultiplication(SymbolMultiplication symbolofMultiplication) { m_symbolMultiplication = symbolofMultiplication; }
ResultDisplay resultDisplay() const { return m_resultDisplay; }
void setResultDisplay(ResultDisplay resultDisplay) { m_resultDisplay = resultDisplay; }
PythonFont pythonFont() const { return m_pythonFont; }
void setPythonFont(PythonFont pythonFont) { m_pythonFont = pythonFont; }
const KDFont * KDPythonFont() const { return (m_pythonFont == PythonFont::Small) ? KDFont::SmallFont : KDFont::LargeFont; }
@@ -83,6 +89,7 @@ private:
uint8_t m_numberOfSignificantDigits;
LEDColor m_colorOfLED;
SymbolMultiplication m_symbolMultiplication;
ResultDisplay m_resultDisplay;
PythonFont m_pythonFont;
};

View File

@@ -15,6 +15,7 @@ Preferences::Preferences() :
m_numberOfSignificantDigits(PrintFloat::k_numberOfPrintedSignificantDigits),
m_colorOfLED(Preferences::LEDColor::Red),
m_symbolMultiplication(Preferences::SymbolMultiplication::Auto),
m_resultDisplay(Preferences::ResultDisplay::Default),
m_pythonFont(Preferences::PythonFont::Large)
{}