diff --git a/apps/i18n.cpp b/apps/i18n.cpp index 3a15c1ecd..77bfe784f 100644 --- a/apps/i18n.cpp +++ b/apps/i18n.cpp @@ -25,7 +25,7 @@ constexpr static char deviationSpanishDefinition[] = {Ion::Charset::SmallSigma, constexpr static char deviationGermanDefinition[] = {Ion::Charset::SmallSigma, ' ', ':', ' ', 'S', 't', 'a', 'n', 'd', 'a', 'r', 'd', 'a', 'b', 'w', 'e', 'i', 'c', 'h', 'u', 'n', 'g', 0}; constexpr static char deviationPortugueseDefinition[] = {Ion::Charset::SmallSigma, ' ', ':', ' ', 'D', 'e','s','v','i','o',' ','p','a','d','r','a','o', 0}; -const char * messages[222][5] { +const char * messages[223][5] { {"Attention", "Warning", "Cuidado", "Achtung", "Atencao"}, {"Valider", "Confirm", "Confirmar", "Bestatigen", "Confirmar"}, {"Annuler", "Cancel", "Cancelar", "Abbrechen", "Cancelar"}, @@ -239,6 +239,7 @@ const char * messages[222][5] { {"REGRESSIONS", "REGRESSION", "REGRESION", "REGRESSION", "REGRESSAO"}, {"Pas assez de donnees pour une regression", "Not enough data for regerssion", "Escasez de datos para la regresion", "Nicht genug Daten fur eine Regression", "Nao ha dados suficientes para uma regressao"}, + {"reg", "reg", "reg", "reg", "reg"}, {"Droite de regression", "Regression line", "Recta de regresion", "Regressionsgerade", "Linha de regressao"}, {"Prediction sachant X", "Prediction given X", "Prediccion dado X", "Berechne Y", "Predicao dado X"}, {"Prediction sachant Y", "Prediction given Y", "Prediccion dado Y", "Berechne X", "Predicao dado Y"}, @@ -331,7 +332,7 @@ const char * universalMessages[244] { ")=", finiteIntegralLegend, - " y=ax+b ", + " D: y=ax+b ", "Francais ", "English ", diff --git a/apps/i18n.h b/apps/i18n.h index a24b114bb..20f4592e1 100644 --- a/apps/i18n.h +++ b/apps/i18n.h @@ -205,6 +205,7 @@ namespace I18n { RegressionApp, RegressionAppCapital, NoEnoughDataForRegression, + Reg, RegressionSlope, XPrediction, YPrediction, diff --git a/apps/regression/banner_view.cpp b/apps/regression/banner_view.cpp index 419df74a9..93094d19f 100644 --- a/apps/regression/banner_view.cpp +++ b/apps/regression/banner_view.cpp @@ -3,27 +3,28 @@ namespace Regression { BannerView::BannerView() : - m_regressionTypeView(KDText::FontSize::Small, (I18n::Message)0, 0.5f, 0.5f, KDColorBlack, Palette::GreyMiddle), - m_slopeView(KDText::FontSize::Small, 0.5f, 0.5f, KDColorBlack, Palette::GreyMiddle), - m_yInterceptView(KDText::FontSize::Small, 0.5f, 0.5f, KDColorBlack, Palette::GreyMiddle), + m_dotNameView(KDText::FontSize::Small, 0.0f, 0.5f, KDColorBlack, Palette::GreyMiddle), m_xView(KDText::FontSize::Small, 0.5f, 0.5f, KDColorBlack, Palette::GreyMiddle), m_yView(KDText::FontSize::Small, 0.5f, 0.5f, KDColorBlack, Palette::GreyMiddle), + m_regressionTypeView(KDText::FontSize::Small, (I18n::Message)0, 0.0f, 0.5f, KDColorBlack, Palette::GreyMiddle), + m_slopeView(KDText::FontSize::Small, 0.5f, 0.5f, KDColorBlack, Palette::GreyMiddle), + m_yInterceptView(KDText::FontSize::Small, 0.5f, 0.5f, KDColorBlack, Palette::GreyMiddle), m_rView(KDText::FontSize::Small, 0.5f, 0.5f, KDColorBlack, Palette::GreyMiddle), m_r2View(KDText::FontSize::Small, 0.5f, 0.5f, KDColorBlack, Palette::GreyMiddle) { } int BannerView::numberOfSubviews() const { - return 7; + return 8; } TextView * BannerView::textViewAtIndex(int i) const { - const TextView * textViews[7] = {&m_regressionTypeView, &m_slopeView, &m_yInterceptView, &m_xView, &m_yView, &m_rView, &m_r2View}; + const TextView * textViews[8] = {&m_dotNameView, &m_xView, &m_yView, &m_regressionTypeView, &m_slopeView, &m_yInterceptView, &m_rView, &m_r2View}; return (TextView *)textViews[i]; } MessageTextView * BannerView::messageTextViewAtIndex(int i) const { - if (i == 0) { + if (i == 3) { return (MessageTextView *)&m_regressionTypeView; } return nullptr; diff --git a/apps/regression/banner_view.h b/apps/regression/banner_view.h index 45a644d02..b092df3f8 100644 --- a/apps/regression/banner_view.h +++ b/apps/regression/banner_view.h @@ -13,11 +13,12 @@ private: int numberOfSubviews() const override; TextView * textViewAtIndex(int i) const override; MessageTextView * messageTextViewAtIndex(int i) const override; + BufferTextView m_dotNameView; + BufferTextView m_xView; + BufferTextView m_yView; MessageTextView m_regressionTypeView; BufferTextView m_slopeView; BufferTextView m_yInterceptView; - BufferTextView m_xView; - BufferTextView m_yView; BufferTextView m_rView; BufferTextView m_r2View; }; diff --git a/apps/regression/graph_controller.cpp b/apps/regression/graph_controller.cpp index 611e7c664..3c1bff35d 100644 --- a/apps/regression/graph_controller.cpp +++ b/apps/regression/graph_controller.cpp @@ -58,36 +58,35 @@ bool GraphController::handleEnter() { } void GraphController::reloadBannerView() { - m_bannerView.setMessageAtIndex(I18n::Message::RegressionFormula, 0); + m_bannerView.setMessageAtIndex(I18n::Message::RegressionFormula, 3); + char buffer[k_maxNumberOfCharacters + Complex::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits)]; int numberOfChar = 0; - const char * legend = " a="; - float slope = m_store->slope(); + const char * legend = " P("; int legendLength = strlen(legend); strlcpy(buffer, legend, legendLength+1); numberOfChar += legendLength; - numberOfChar += Complex::convertFloatToText(slope, buffer+numberOfChar, Complex::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); - legend = " "; + if (m_selectedDotIndex == m_store->numberOfPairs()) { + legend = I18n::translate(I18n::Message::Mean); + legendLength = strlen(legend); + strlcpy(buffer+numberOfChar, legend, legendLength+1); + numberOfChar += legendLength; + } else if (m_selectedDotIndex < 0) { + legend = I18n::translate(I18n::Message::Reg); + legendLength = strlen(legend); + strlcpy(buffer+numberOfChar, legend, legendLength+1); + numberOfChar += legendLength; + } else { + numberOfChar += Complex::convertFloatToText((float)m_selectedDotIndex, buffer+numberOfChar, Complex::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, Expression::FloatDisplayMode::Decimal); + } + legend = ") "; legendLength = strlen(legend); strlcpy(buffer+numberOfChar, legend, legendLength+1); buffer[k_maxLegendLength] = 0; - m_bannerView.setLegendAtIndex(buffer, 1); + m_bannerView.setLegendAtIndex(buffer, 0); numberOfChar = 0; - legend = " b="; - float yIntercept = m_store->yIntercept(); - legendLength = strlen(legend); - strlcpy(buffer, legend, legendLength+1); - numberOfChar += legendLength; - numberOfChar += Complex::convertFloatToText(yIntercept, buffer+numberOfChar, Complex::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); - legend = " "; - legendLength = strlen(legend); - strlcpy(buffer+numberOfChar, legend, legendLength+1); - buffer[k_maxLegendLength] = 0; - m_bannerView.setLegendAtIndex(buffer, 2); - - numberOfChar = 0; - legend = " x="; + legend = "x="; float x = m_cursor->x(); // Display a specific legend if the mean dot is selected if (m_selectedDotIndex == m_store->numberOfPairs()) { @@ -99,14 +98,14 @@ void GraphController::reloadBannerView() { strlcpy(buffer, legend, legendLength+1); numberOfChar += legendLength; numberOfChar += Complex::convertFloatToText(x, buffer+numberOfChar, Complex::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); - legend = " "; + legend = " "; legendLength = strlen(legend); strlcpy(buffer+numberOfChar, legend, legendLength+1); buffer[k_maxLegendLength] = 0; - m_bannerView.setLegendAtIndex(buffer, 3); + m_bannerView.setLegendAtIndex(buffer, 1); numberOfChar = 0; - legend = " y="; + legend = "y="; float y = m_cursor->y(); if (m_selectedDotIndex == m_store->numberOfPairs()) { constexpr static char legY[] = {Ion::Charset::YBar, '=', 0}; @@ -117,38 +116,63 @@ void GraphController::reloadBannerView() { strlcpy(buffer, legend, legendLength+1); numberOfChar += legendLength; numberOfChar += Complex::convertFloatToText(y, buffer+numberOfChar, Complex::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); - legend = " "; + legend = " "; + legendLength = strlen(legend); + strlcpy(buffer+numberOfChar, legend, legendLength+1); + buffer[k_maxLegendLength] = 0; + m_bannerView.setLegendAtIndex(buffer, 2); + + numberOfChar = 0; + legend = " a="; + float slope = m_store->slope(); + legendLength = strlen(legend); + strlcpy(buffer, legend, legendLength+1); + numberOfChar += legendLength; + numberOfChar += Complex::convertFloatToText(slope, buffer+numberOfChar, Complex::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); + legend = " "; legendLength = strlen(legend); strlcpy(buffer+numberOfChar, legend, legendLength+1); buffer[k_maxLegendLength] = 0; m_bannerView.setLegendAtIndex(buffer, 4); - numberOfChar = 0; - legend = " r="; - float r = m_store->correlationCoefficient(); + legend = " b="; + float yIntercept = m_store->yIntercept(); legendLength = strlen(legend); strlcpy(buffer, legend, legendLength+1); numberOfChar += legendLength; - numberOfChar += Complex::convertFloatToText(r, buffer+numberOfChar, Complex::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); - legend = " "; + numberOfChar += Complex::convertFloatToText(yIntercept, buffer+numberOfChar, Complex::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); + legend = " "; legendLength = strlen(legend); strlcpy(buffer+numberOfChar, legend, legendLength+1); buffer[k_maxLegendLength] = 0; m_bannerView.setLegendAtIndex(buffer, 5); numberOfChar = 0; - legend = " r^2="; + legend = " r="; + float r = m_store->correlationCoefficient(); + legendLength = strlen(legend); + strlcpy(buffer, legend, legendLength+1); + numberOfChar += legendLength; + numberOfChar += Complex::convertFloatToText(r, buffer+numberOfChar, Complex::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); + legend = " "; + legendLength = strlen(legend); + strlcpy(buffer+numberOfChar, legend, legendLength+1); + buffer[k_maxLegendLength+10] = 0; + m_bannerView.setLegendAtIndex(buffer, 6); + + numberOfChar = 0; + legend = " r2="; float r2 = m_store->squaredCorrelationCoefficient(); legendLength = strlen(legend); strlcpy(buffer, legend, legendLength+1); numberOfChar += legendLength; numberOfChar += Complex::convertFloatToText(r2, buffer+numberOfChar, Complex::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); - legend = " "; + legend = " "; legendLength = strlen(legend); strlcpy(buffer+numberOfChar, legend, legendLength+1); buffer[k_maxLegendLength] = 0; - m_bannerView.setLegendAtIndex(buffer, 6); + m_bannerView.setLegendAtIndex(buffer, 7); } void GraphController::initRangeParameters() { diff --git a/apps/regression/graph_controller.h b/apps/regression/graph_controller.h index 89b992fc7..300a9e962 100644 --- a/apps/regression/graph_controller.h +++ b/apps/regression/graph_controller.h @@ -26,7 +26,7 @@ private: constexpr static float k_cursorBottomMarginRatio = 0.3f; // (cursorHeight/2+bannerHeigh)/graphViewHeight constexpr static float k_cursorLeftMarginRatio = 0.04f; // (cursorWidth/2)/graphViewWidth constexpr static int k_maxLegendLength = 16; - constexpr static int k_maxNumberOfCharacters = 20; + constexpr static int k_maxNumberOfCharacters = 50; BannerView * bannerView() override; Shared::CurveView * curveView() override; Shared::InteractiveCurveViewRange * interactiveCurveViewRange() override;