From 8ac969d772fc6cad691d0a04438a25c84843634b Mon Sep 17 00:00:00 2001 From: Yaya-Cout <67095734+Yaya-Cout@users.noreply.github.com> Date: Tue, 22 Mar 2022 17:59:52 +0100 Subject: [PATCH] [Feature] Backlight settings (#137) * Added backlight settings * Changed location of the brightness setting * Fix row size of brightness settings * [apps/settings/brightness] Update translations * Fix dimmer * Update translations * [apps/settings] Add dimmer duration setting * [apps/settings] Ensure of the brightness level is greater than the dimmed brightness level * Make transition smooth * Removed transition time setting I personally think that this setting is completely useless except if you absolutely want a transition that is not smooth, which is weird. * Moved everything related to brightness in one submenu * Some refactoring * Update defaults * Removed unnecessary translation * [apps/settings] Fix Shift + Minus/Plus in settings * Apply suggestions from code review * [apps/shared] Remove a think that I don't know what it is * Apply review suggestions Co-authored-by: Joachim LF Co-authored-by: lolocomotive --- apps/apps_container.cpp | 5 +- apps/backlight_dimming_timer.cpp | 43 ++---- apps/backlight_dimming_timer.h | 11 -- apps/global_preferences.cpp | 21 ++- apps/global_preferences.h | 12 ++ apps/settings/Makefile | 1 + apps/settings/base.de.i18n | 5 + apps/settings/base.en.i18n | 5 + apps/settings/base.es.i18n | 5 + apps/settings/base.fr.i18n | 5 + apps/settings/base.hu.i18n | 5 + apps/settings/base.it.i18n | 5 + apps/settings/base.nl.i18n | 5 + apps/settings/base.pt.i18n | 5 + apps/settings/main_controller.cpp | 35 +---- apps/settings/main_controller.h | 6 +- apps/settings/main_controller_prompt_beta.cpp | 2 +- apps/settings/main_controller_prompt_none.cpp | 2 +- .../main_controller_prompt_update.cpp | 4 +- .../sub_menu/brightness_controller.cpp | 142 ++++++++++++++++++ .../settings/sub_menu/brightness_controller.h | 33 ++++ apps/suspend_timer.cpp | 2 +- apps/suspend_timer.h | 1 - escher/include/escher/timer.h | 2 +- escher/src/timer.cpp | 5 +- ion/include/ion/backlight.h | 1 - 26 files changed, 288 insertions(+), 80 deletions(-) create mode 100644 apps/settings/sub_menu/brightness_controller.cpp create mode 100644 apps/settings/sub_menu/brightness_controller.h diff --git a/apps/apps_container.cpp b/apps/apps_container.cpp index 9423684e4..1bb917ddc 100644 --- a/apps/apps_container.cpp +++ b/apps/apps_container.cpp @@ -266,7 +266,8 @@ bool AppsContainer::processEvent(Ion::Events::Event event) { } if (event == Ion::Events::BrightnessPlus || event == Ion::Events::BrightnessMinus) { int delta = Ion::Backlight::MaxBrightness/GlobalPreferences::NumberOfBrightnessStates; - int direction = (event == Ion::Events::BrightnessPlus) ? Ion::Backlight::NumberOfStepsPerShortcut*delta : -delta*Ion::Backlight::NumberOfStepsPerShortcut; + int NumberOfStepsPerShortcut = GlobalPreferences::sharedGlobalPreferences()->brightnessShortcut(); + int direction = (event == Ion::Events::BrightnessPlus) ? NumberOfStepsPerShortcut*delta : -delta*NumberOfStepsPerShortcut; GlobalPreferences::sharedGlobalPreferences()->setBrightnessLevel(GlobalPreferences::sharedGlobalPreferences()->brightnessLevel()+direction); } return false; @@ -353,6 +354,8 @@ bool AppsContainer::updateBatteryState() { } void AppsContainer::refreshPreferences() { + m_suspendTimer.reset(GlobalPreferences::sharedGlobalPreferences()->idleBeforeSuspendSeconds()*1000/Timer::TickDuration); + m_backlightDimmingTimer.reset(GlobalPreferences::sharedGlobalPreferences()->idleBeforeDimmingSeconds()*1000/Timer::TickDuration); m_window.refreshPreferences(); } diff --git a/apps/backlight_dimming_timer.cpp b/apps/backlight_dimming_timer.cpp index 0d98d2749..a86c29c00 100644 --- a/apps/backlight_dimming_timer.cpp +++ b/apps/backlight_dimming_timer.cpp @@ -1,39 +1,26 @@ #include "backlight_dimming_timer.h" #include "global_preferences.h" +#include +#include +#include BacklightDimmingTimer::BacklightDimmingTimer() : - Timer(k_idleBeforeDimmingDuration/Timer::TickDuration) + Timer(GlobalPreferences::sharedGlobalPreferences()->idleBeforeDimmingSeconds()*1000/Timer::TickDuration) { } -bool BacklightDimmingTimer::fire() { - if (m_dimerExecutions == 0) { - m_brightnessLevel = GlobalPreferences::sharedGlobalPreferences()->brightnessLevel(); - m_dimerSteps = m_brightnessLevel / decreaseBy; - m_timeToSleep = decreasetime / m_dimerSteps; - m_period = m_timeToSleep / Timer::TickDuration; - if (m_period == 0) { - m_period = 1; +bool BacklightDimmingTimer::fire(){ + int i = Ion::Backlight::brightness(); + while (i > 0){ + int t = 20; + Ion::Events::Event e = Ion::Events::getEvent(&t); + AppsContainer::sharedAppsContainer()->dispatchEvent(e); + if (e.isKeyboardEvent()){ + return false; } - resetTimer(); + + Ion::Backlight::setBrightness(i); + i -= 15; } - if (m_dimerExecutions < m_dimerSteps) { - m_nextbrightness = (m_brightnessLevel-k_dimBacklightBrightness)/m_dimerSteps * (m_dimerSteps-m_dimerExecutions); - Ion::Backlight::setBrightness(m_nextbrightness); - resetTimer(); - } else if (m_dimerExecutions == m_dimerSteps) { - Ion::Backlight::setBrightness(k_dimBacklightBrightness); - } - m_dimerExecutions++; return false; } - -void BacklightDimmingTimer::reset() { - m_dimerExecutions = 0; - m_period = k_idleBeforeDimmingDuration / Timer::TickDuration; - resetTimer(); -} - -void BacklightDimmingTimer::resetTimer() { - BacklightDimmingTimer::m_numberOfTicksBeforeFire = BacklightDimmingTimer::m_period; -} diff --git a/apps/backlight_dimming_timer.h b/apps/backlight_dimming_timer.h index 1502ea2dc..192591370 100644 --- a/apps/backlight_dimming_timer.h +++ b/apps/backlight_dimming_timer.h @@ -6,19 +6,8 @@ class BacklightDimmingTimer : public Timer { public: BacklightDimmingTimer(); - void reset(); private: - constexpr static int k_idleBeforeDimmingDuration = 30*1000; // In miliseconds - constexpr static int k_dimBacklightBrightness = 0; - constexpr static int decreaseBy = 15; - constexpr static int decreasetime = 1*1000; // In miliseconds - int m_dimerExecutions = 0; - int m_brightnessLevel; - int m_dimerSteps; - int m_nextbrightness; - float m_timeToSleep; // In miliseconds bool fire() override; - void resetTimer(); }; #endif diff --git a/apps/global_preferences.cpp b/apps/global_preferences.cpp index 938cff861..c0eac31c8 100644 --- a/apps/global_preferences.cpp +++ b/apps/global_preferences.cpp @@ -41,6 +41,25 @@ void GlobalPreferences::setBrightnessLevel(int brightnessLevel) { brightnessLevel = brightnessLevel < 0 ? 0 : brightnessLevel; brightnessLevel = brightnessLevel > Ion::Backlight::MaxBrightness ? Ion::Backlight::MaxBrightness : brightnessLevel; m_brightnessLevel = brightnessLevel; - Ion::Backlight::setBrightness(m_brightnessLevel); } } + +void GlobalPreferences::setIdleBeforeSuspendSeconds(int idleBeforeSuspendSeconds) { + if (m_idleBeforeSuspendSeconds != idleBeforeSuspendSeconds) { + idleBeforeSuspendSeconds = idleBeforeSuspendSeconds < 5 ? 5 : idleBeforeSuspendSeconds; + idleBeforeSuspendSeconds = idleBeforeSuspendSeconds > 7200 ? 7200 : idleBeforeSuspendSeconds; + m_idleBeforeSuspendSeconds = idleBeforeSuspendSeconds; + } +} + +void GlobalPreferences::setIdleBeforeDimmingSeconds(int idleBeforeDimmingSeconds) { + if (m_idleBeforeDimmingSeconds != idleBeforeDimmingSeconds) { + idleBeforeDimmingSeconds = idleBeforeDimmingSeconds < 3 ? 3 : idleBeforeDimmingSeconds; + idleBeforeDimmingSeconds = idleBeforeDimmingSeconds > 1200 ? 1200 : idleBeforeDimmingSeconds; + m_idleBeforeDimmingSeconds = idleBeforeDimmingSeconds; + } +} + +void GlobalPreferences::setBrightnessShortcut(int brightnessShortcut){ + m_brightnessShortcut = brightnessShortcut; +} diff --git a/apps/global_preferences.h b/apps/global_preferences.h index bcfa324ea..f092fdaa0 100644 --- a/apps/global_preferences.h +++ b/apps/global_preferences.h @@ -45,6 +45,12 @@ public: const KDFont * font() const { return m_font; } void setFont(const KDFont * font) { m_font = font; } constexpr static int NumberOfBrightnessStates = 15; + int idleBeforeSuspendSeconds() const { return m_idleBeforeSuspendSeconds; } + void setIdleBeforeSuspendSeconds(int m_idleBeforeSuspendSeconds); + int idleBeforeDimmingSeconds() const { return m_idleBeforeDimmingSeconds; } + void setIdleBeforeDimmingSeconds(int m_idleBeforeDimmingSeconds); + int brightnessShortcut() const { return m_brightnessShortcut; } + void setBrightnessShortcut(int m_BrightnessShortcut); private: static_assert(I18n::NumberOfLanguages > 0, "I18n::NumberOfLanguages is not superior to 0"); // There should already have been an error when processing an empty EPSILON_I18N flag static_assert(I18n::NumberOfCountries > 0, "I18n::NumberOfCountries is not superior to 0"); // There should already have been an error when processing an empty EPSILON_COUNTRIES flag @@ -60,6 +66,9 @@ private: m_syntaxhighlighting(true), m_cursorSaving(true), m_brightnessLevel(Ion::Backlight::MaxBrightness), + m_idleBeforeSuspendSeconds(55), + m_idleBeforeDimmingSeconds(45), + m_brightnessShortcut(4), m_font(KDFont::LargeFont) {} I18n::Language m_language; I18n::Country m_country; @@ -74,6 +83,9 @@ private: bool m_syntaxhighlighting; bool m_cursorSaving; int m_brightnessLevel; + int m_idleBeforeSuspendSeconds; + int m_idleBeforeDimmingSeconds; + int m_brightnessShortcut; const KDFont * m_font; }; diff --git a/apps/settings/Makefile b/apps/settings/Makefile index 9823f80dd..c806527cb 100644 --- a/apps/settings/Makefile +++ b/apps/settings/Makefile @@ -26,6 +26,7 @@ app_settings_src = $(addprefix apps/settings/,\ sub_menu/math_options_controller.cpp \ sub_menu/selectable_view_with_messages.cpp \ sub_menu/usb_protection_controller.cpp \ + sub_menu/brightness_controller.cpp\ ) SFLAGS += -DOMEGA_STATE="$(OMEGA_STATE)" diff --git a/apps/settings/base.de.i18n b/apps/settings/base.de.i18n index d44631a8c..225fb46bf 100644 --- a/apps/settings/base.de.i18n +++ b/apps/settings/base.de.i18n @@ -32,6 +32,7 @@ Real = "Reell " Cartesian = "Kartesisch " Polar = "Polar " Brightness = "Helligkeit" +BrightnessSettings = "Helligkeitseinstellungen" SoftwareVersion = "Epsilon version" UpsilonVersion = "Upsilon version" OmegaVersion = "Omega version" @@ -79,3 +80,7 @@ USBProtectionLevel = "Akzeptierte Updates" USBDefaultLevel = "Basierend auf Upsilon" USBLowLevel = "Basierend auf Omega" USBParanoidLevel = "Nichts" +Normal = "Normal" +IdleTimeBeforeDimming = "Abdunkeln nach (s)" +IdleTimeBeforeSuspend = "Anhalten nach (s)" +BrightnessShortcut = "Tastenkombinationsschritte" diff --git a/apps/settings/base.en.i18n b/apps/settings/base.en.i18n index 50707610f..427eed03c 100644 --- a/apps/settings/base.en.i18n +++ b/apps/settings/base.en.i18n @@ -32,6 +32,7 @@ Real = "Real " Cartesian = "Cartesian " Polar = "Polar " Brightness = "Brightness" +BrightnessSettings = "Brightness settings" SoftwareVersion = "Epsilon version" UpsilonVersion = "Upsilon version" OmegaVersion = "Omega version" @@ -79,3 +80,7 @@ USBProtectionLevel = "Updates accepted" USBDefaultLevel = "Based on Upsilon" USBLowLevel = "Based on Omega" USBParanoidLevel = "None" +Normal = "Normal" +IdleTimeBeforeDimming = "Dim after (s)" +IdleTimeBeforeSuspend = "Suspend after (s)" +BrightnessShortcut = "Shortcut steps" diff --git a/apps/settings/base.es.i18n b/apps/settings/base.es.i18n index 4d47b15e0..b5723e5a7 100644 --- a/apps/settings/base.es.i18n +++ b/apps/settings/base.es.i18n @@ -32,6 +32,7 @@ Real = "Real " Cartesian = "Binómica " Polar = "Polar " Brightness = "Brillo" +BrightnessSettings = "Configuración de brillo" SoftwareVersion = "Versión de Epsilon" UpsilonVersion = "Versión de Upsilon" OmegaVersion = "Versión de Omega" @@ -79,3 +80,7 @@ USBProtectionLevel = "Actualizaciones aceptadas" USBDefaultLevel = "Basado en Upsilon" USBLowLevel = "Basado en Omega" USBParanoidLevel = "Ninguno" +Normal = "Normal" +IdleTimeBeforeDimming = "Oscurecer después de (s)" +IdleTimeBeforeSuspend = "Suspender después de (s)" +BrightnessShortcut = "Pasos de acceso directo" diff --git a/apps/settings/base.fr.i18n b/apps/settings/base.fr.i18n index e20010761..c8131e975 100644 --- a/apps/settings/base.fr.i18n +++ b/apps/settings/base.fr.i18n @@ -32,6 +32,7 @@ Real = "Réel " Cartesian = "Algébrique " Polar = "Exponentielle " Brightness = "Luminosité" +BrightnessSettings = "Paramètres de luminosité" SoftwareVersion = "Version d'Epsilon" UpsilonVersion = "Version d'Upsilon" OmegaVersion = "Version d'Omega" @@ -79,3 +80,7 @@ USBProtectionLevel = "Mise à jour acceptées" USBDefaultLevel = "Basées sur Upsilon" USBLowLevel = "Basées sur Omega" USBParanoidLevel = "Aucune" +Normal = "Normale" +IdleTimeBeforeDimming = "Assombrir après (s)" +IdleTimeBeforeSuspend = "Éteindre après (s)" +BrightnessShortcut = "Étapes du raccourci" diff --git a/apps/settings/base.hu.i18n b/apps/settings/base.hu.i18n index 3b4f083f7..4d5485cda 100644 --- a/apps/settings/base.hu.i18n +++ b/apps/settings/base.hu.i18n @@ -32,6 +32,7 @@ Real = "Valódi " Cartesian = "Kartéziánus " Polar = "Poláris " Brightness = "Fényerö" +BrightnessSettings = "Fényerő beállításai" SoftwareVersion = "Epsilon verzió" UpsilonVersion = "Upsilon verzió" OmegaVersion = "Omega verzió" @@ -79,3 +80,7 @@ USBProtectionLevel = "Elfogadott frissítések" USBDefaultLevel = "Upsilon alapján" USBLowLevel = "Omega alapján" USBParanoidLevel = "Egyik sem" +Normal = "Normale" +IdleTimeBeforeDimming = "Assombrir après (s)" +IdleTimeBeforeSuspend = "Éteindre après (s)" +BrightnessShortcut = "Parancsikon lépések" diff --git a/apps/settings/base.it.i18n b/apps/settings/base.it.i18n index a292dd0d2..74701f626 100644 --- a/apps/settings/base.it.i18n +++ b/apps/settings/base.it.i18n @@ -32,6 +32,7 @@ Real = "Reale " Cartesian = "Algebrico " Polar = "Esponenziale " Brightness = "Luminosità" +BrightnessSettings = "Impostazioni di luminosità" SoftwareVersion = "Epsilon version" UpsilonVersion = "Upsilon version" OmegaVersion = "Omega version" @@ -79,3 +80,7 @@ USBProtectionLevel = "Aggiornamenti accettati" USBDefaultLevel = "Basato su Upsilon" USBLowLevel = "A base di Omega" USBParanoidLevel = "Nessuno" +Normal = "Normale" +IdleTimeBeforeDimming = "Scurisci dopo (s)" +IdleTimeBeforeSuspend = "Sospendi dopo (s)" +BrightnessShortcut = "Passaggi di scelta rapida" diff --git a/apps/settings/base.nl.i18n b/apps/settings/base.nl.i18n index 9baf4be17..b393b653b 100644 --- a/apps/settings/base.nl.i18n +++ b/apps/settings/base.nl.i18n @@ -32,6 +32,7 @@ Real = "Reëel " Cartesian = "Cartesisch " Polar = "Polair " Brightness = "Helderheid" +BrightnessSettings = "Helderheidsinstellingen" SoftwareVersion = "Epsilon version" UpsilonVersion = "Upsilon version" OmegaVersion = "Omega version" @@ -79,3 +80,7 @@ USBProtectionLevel = "Updates geaccepteerd" USBDefaultLevel = "Gebaseerd op Upsilon" USBLowLevel = "Op basis van Omega" USBParanoidLevel = "Geen" +Normal = "Normaal" +IdleTimeBeforeDimming = "Donkerder maken na (s)" +IdleTimeBeforeSuspend = "Suspend after (s)" +BrightnessShortcut = "Snelkoppelingsstappen" diff --git a/apps/settings/base.pt.i18n b/apps/settings/base.pt.i18n index 66a432820..c11a54a16 100644 --- a/apps/settings/base.pt.i18n +++ b/apps/settings/base.pt.i18n @@ -32,6 +32,7 @@ Real = "Real " Cartesian = "Cartesiana " Polar = "Polar " Brightness = "Brilho" +BrightnessSettings = "Configurações de brilho" SoftwareVersion = "Versão do Epsilon" UpsilonVersion = "Versão do Upsilon" OmegaVersion = "Versão do Omega" @@ -79,3 +80,7 @@ USBProtectionLevel = "Atualizações aceitas" USBDefaultLevel = "Baseado em Upsilon" USBLowLevel = "Baseado em Ômega" USBParanoidLevel = "Nenhum" +Normal = "Normal" +IdleTimeBeforeDimming = "Diminuir depois (s)" +IdleTimeBeforeSuspend = "Suspender depois (s)" +BrightnessShortcut = "Passos de atalho" diff --git a/apps/settings/main_controller.cpp b/apps/settings/main_controller.cpp index 1b2e48468..71f7a5a34 100644 --- a/apps/settings/main_controller.cpp +++ b/apps/settings/main_controller.cpp @@ -19,6 +19,7 @@ constexpr SettingsMessageTree s_usbProtectionChildren[2] = {SettingsMessageTree( constexpr SettingsMessageTree s_usbProtectionLevelChildren[3] = {SettingsMessageTree(I18n::Message::USBDefaultLevel), SettingsMessageTree(I18n::Message::USBLowLevel), SettingsMessageTree(I18n::Message::USBParanoidLevel)}; constexpr SettingsMessageTree s_symbolFunctionChildren[3] = {SettingsMessageTree(I18n::Message::SymbolDefaultFunction), SettingsMessageTree(I18n::Message::SymbolArgDefaultFunction), SettingsMessageTree(I18n::Message::SymbolArgFunction)}; constexpr SettingsMessageTree s_modelMathOptionsChildren[6] = {SettingsMessageTree(I18n::Message::AngleUnit, s_modelAngleChildren), SettingsMessageTree(I18n::Message::DisplayMode, s_modelFloatDisplayModeChildren), SettingsMessageTree(I18n::Message::EditionMode, s_modelEditionModeChildren), SettingsMessageTree(I18n::Message::SymbolFunction, s_symbolFunctionChildren), SettingsMessageTree(I18n::Message::ComplexFormat, s_modelComplexFormatChildren), SettingsMessageTree(I18n::Message::SymbolMultiplication, s_symbolChildren)}; +constexpr SettingsMessageTree s_brightnessChildren[4] = {SettingsMessageTree(I18n::Message::Brightness), SettingsMessageTree(I18n::Message::IdleTimeBeforeDimming), SettingsMessageTree(I18n::Message::IdleTimeBeforeSuspend), SettingsMessageTree(I18n::Message::BrightnessShortcut)}; 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[18] = {SettingsMessageTree(I18n::Message::LaurianFournier), SettingsMessageTree(I18n::Message::YannCouturier), SettingsMessageTree(I18n::Message::DavidLuca), SettingsMessageTree(I18n::Message::LoicE), SettingsMessageTree(I18n::Message::VictorKretz), SettingsMessageTree(I18n::Message::QuentinGuidee), SettingsMessageTree(I18n::Message::JoachimLeFournis), SettingsMessageTree(I18n::Message::MaximeFriess), SettingsMessageTree(I18n::Message::JeanBaptisteBoric), SettingsMessageTree(I18n::Message::SandraSimmons), SettingsMessageTree(I18n::Message::David), SettingsMessageTree(I18n::Message::DamienNicolet), SettingsMessageTree(I18n::Message::EvannDreumont), SettingsMessageTree(I18n::Message::SzaboLevente), SettingsMessageTree(I18n::Message::VenceslasDuet), SettingsMessageTree(I18n::Message::CharlotteThomas), SettingsMessageTree(I18n::Message::AntoninLoubiere), SettingsMessageTree(I18n::Message::CyprienMejat)}; @@ -32,10 +33,10 @@ constexpr SettingsMessageTree s_modelAboutChildren[10] = {SettingsMessageTree(I1 MainController::MainController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate) : ViewController(parentResponder), - m_brightnessCell(I18n::Message::Default, KDFont::LargeFont), m_popUpCell(I18n::Message::Default, KDFont::LargeFont), m_selectableTableView(this), m_mathOptionsController(this, inputEventHandlerDelegate), + m_brightnessController(this, inputEventHandlerDelegate), m_localizationController(this, Metric::CommonTopMargin, LocalizationController::Mode::Language), m_accessibilityController(this), m_dateTimeController(this), @@ -63,13 +64,6 @@ void MainController::didBecomeFirstResponder() { bool MainController::handleEvent(Ion::Events::Event event) { GlobalPreferences * globalPreferences = GlobalPreferences::sharedGlobalPreferences(); - if (event == Ion::Events::BrightnessPlus || event == Ion::Events::BrightnessMinus){ - int delta = Ion::Backlight::MaxBrightness/GlobalPreferences::NumberOfBrightnessStates; - int direction = (event == Ion::Events::BrightnessPlus) ? Ion::Backlight::NumberOfStepsPerShortcut*delta : -delta*Ion::Backlight::NumberOfStepsPerShortcut; - GlobalPreferences::sharedGlobalPreferences()->setBrightnessLevel(GlobalPreferences::sharedGlobalPreferences()->brightnessLevel()+direction); - m_selectableTableView.reloadCellAtLocation(m_selectableTableView.selectedColumn(), 1); - return true; - } if (model()->childAtIndex(selectedRow())->numberOfChildren() == 0) { if (model()->childAtIndex(selectedRow())->label() == promptMessage()) { if (event == Ion::Events::OK || event == Ion::Events::EXE || event == Ion::Events::Right) { @@ -79,16 +73,6 @@ bool MainController::handleEvent(Ion::Events::Event event) { } return false; } - if (model()->childAtIndex(selectedRow())->label() == I18n::Message::Brightness) { - if (event == Ion::Events::Right || event == Ion::Events::Left || event == Ion::Events::Plus || event == Ion::Events::Minus) { - int delta = Ion::Backlight::MaxBrightness/GlobalPreferences::NumberOfBrightnessStates; - int direction = (event == Ion::Events::Right || event == Ion::Events::Plus) ? delta : -delta; - globalPreferences->setBrightnessLevel(globalPreferences->brightnessLevel()+direction); - m_selectableTableView.reloadCellAtLocation(m_selectableTableView.selectedColumn(), m_selectableTableView.selectedRow()); - return true; - } - return false; - } if (model()->childAtIndex(selectedRow())->label() == I18n::Message::Language || model()->childAtIndex(selectedRow())->label() == I18n::Message::Country) { if (event == Ion::Events::OK || event == Ion::Events::EXE || event == Ion::Events::Right) { m_localizationController.setMode(model()->childAtIndex(selectedRow())->label() == I18n::Message::Language ? LocalizationController::Mode::Language : LocalizationController::Mode::Country); @@ -107,6 +91,8 @@ bool MainController::handleEvent(Ion::Events::Event event) { subController = &m_examModeController; } else if (title == I18n::Message::About) { subController = &m_aboutController; + } else if (title == I18n::Message::BrightnessSettings) { + subController = &m_brightnessController; } else if (title == I18n::Message::Accessibility) { subController = &m_accessibilityController; } else if (title == I18n::Message::DateTime) { @@ -140,11 +126,7 @@ KDCoordinate MainController::rowHeight(int j) { } KDCoordinate MainController::cumulatedHeightFromIndex(int j) { - KDCoordinate height = j * rowHeight(0); - if (j > k_indexOfBrightnessCell) { - height += CellWithSeparator::k_margin; - } - return height; + return j * rowHeight(0); } int MainController::indexFromCumulatedHeight(KDCoordinate offsetY) { @@ -161,11 +143,8 @@ HighlightCell * MainController::reusableCell(int index, int type) { return &m_cells[index]; } assert(index == 0); - if (type == 2) { - return &m_popUpCell; - } - assert(type == 1); - return &m_brightnessCell; + assert(type == 2); + return &m_popUpCell; } int MainController::reusableCellCount(int type) { diff --git a/apps/settings/main_controller.h b/apps/settings/main_controller.h index 28c5b07d7..5a721e0c4 100644 --- a/apps/settings/main_controller.h +++ b/apps/settings/main_controller.h @@ -13,6 +13,7 @@ #include "sub_menu/math_options_controller.h" #include "sub_menu/preferences_controller.h" #include "sub_menu/usb_protection_controller.h" +#include "sub_menu/brightness_controller.h" namespace Settings { @@ -31,6 +32,7 @@ extern const Shared::SettingsMessageTree s_contributorsChildren[18]; extern const Shared::SettingsMessageTree s_modelAboutChildren[10]; extern const Shared::SettingsMessageTree s_usbProtectionChildren[2]; extern const Shared::SettingsMessageTree s_usbProtectionLevelChildren[3]; +extern const Shared::SettingsMessageTree s_brightnessChildren[4]; extern const Shared::SettingsMessageTree s_model; class MainController : public ViewController, public ListViewDataSource, public SelectableTableViewDataSource { @@ -66,12 +68,12 @@ private: StackViewController * stackController() const; I18n::Message promptMessage() const; bool hasPrompt() const { return promptMessage() != I18n::Message::Default; } - constexpr static int k_numberOfSimpleChevronCells = 9; + constexpr static int k_numberOfSimpleChevronCells = 10; MessageTableCellWithChevronAndMessage m_cells[k_numberOfSimpleChevronCells]; - MessageTableCellWithGaugeWithSeparator m_brightnessCell; MessageTableCellWithSwitch m_popUpCell; SelectableTableView m_selectableTableView; MathOptionsController m_mathOptionsController; + BrightnessController m_brightnessController; LocalizationController m_localizationController; AccessibilityController m_accessibilityController; DateTimeController m_dateTimeController; diff --git a/apps/settings/main_controller_prompt_beta.cpp b/apps/settings/main_controller_prompt_beta.cpp index 80b3e1459..90df4b897 100644 --- a/apps/settings/main_controller_prompt_beta.cpp +++ b/apps/settings/main_controller_prompt_beta.cpp @@ -8,7 +8,7 @@ namespace Settings { constexpr SettingsMessageTree s_modelMenu[] = {SettingsMessageTree(I18n::Message::MathOptions, s_modelMathOptionsChildren), - SettingsMessageTree(I18n::Message::Brightness), + SettingsMessageTree(I18n::Message::BrightnessSettings, s_brightnessChildren), SettingsMessageTree(I18n::Message::DateTime, s_modelDateTimeChildren), SettingsMessageTree(I18n::Message::Language), SettingsMessageTree(I18n::Message::Country), diff --git a/apps/settings/main_controller_prompt_none.cpp b/apps/settings/main_controller_prompt_none.cpp index d0b2727c5..9dc5d45a6 100644 --- a/apps/settings/main_controller_prompt_none.cpp +++ b/apps/settings/main_controller_prompt_none.cpp @@ -9,7 +9,7 @@ namespace Settings { constexpr SettingsMessageTree s_modelMenu[] = {SettingsMessageTree(I18n::Message::MathOptions, s_modelMathOptionsChildren), - SettingsMessageTree(I18n::Message::Brightness), + SettingsMessageTree(I18n::Message::BrightnessSettings, s_brightnessChildren), SettingsMessageTree(I18n::Message::DateTime, s_modelDateTimeChildren), SettingsMessageTree(I18n::Message::Language), SettingsMessageTree(I18n::Message::Country), diff --git a/apps/settings/main_controller_prompt_update.cpp b/apps/settings/main_controller_prompt_update.cpp index e028803ef..48c5b5012 100644 --- a/apps/settings/main_controller_prompt_update.cpp +++ b/apps/settings/main_controller_prompt_update.cpp @@ -8,14 +8,14 @@ using namespace Shared; constexpr SettingsMessageTree s_modelMenu[] = {SettingsMessageTree(I18n::Message::MathOptions, s_modelMathOptionsChildren), - SettingsMessageTree(I18n::Message::Brightness), + SettingsMessageTree(I18n::Message::BrightnessSettings, s_brightnessChildren), SettingsMessageTree(I18n::Message::DateTime, s_modelDateTimeChildren), SettingsMessageTree(I18n::Message::Language), SettingsMessageTree(I18n::Message::Country), SettingsMessageTree(I18n::Message::ExamMode, ExamModeConfiguration::s_modelExamChildren), #ifdef HAS_CODE SettingsMessageTree(I18n::Message::CodeApp, s_codeChildren), -#endif +#endif SettingsMessageTree(I18n::Message::UpdatePopUp), SettingsMessageTree(I18n::Message::Accessibility, s_accessibilityChildren), SettingsMessageTree(I18n::Message::UsbSetting, s_usbProtectionChildren), diff --git a/apps/settings/sub_menu/brightness_controller.cpp b/apps/settings/sub_menu/brightness_controller.cpp new file mode 100644 index 000000000..9af1f4215 --- /dev/null +++ b/apps/settings/sub_menu/brightness_controller.cpp @@ -0,0 +1,142 @@ +#include "brightness_controller.h" +#include "../../global_preferences.h" +#include "../../apps_container.h" +#include "../../shared/poincare_helpers.h" +#include +#include +#include "../app.h" +#include +#include + +using namespace Poincare; +using namespace Shared; + +namespace Settings { + +BrightnessController::BrightnessController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate) : + GenericSubController(parentResponder), + m_brightnessCell(I18n::Message::Brightness, KDFont::LargeFont), + m_editableCellIdleBeforeDimmingSeconds(&m_selectableTableView, inputEventHandlerDelegate, this), + m_editableCellIdleBeforeSuspendSeconds(&m_selectableTableView, inputEventHandlerDelegate, this), + m_BrightnessShortcutCell(&m_selectableTableView, inputEventHandlerDelegate, this) +{ + m_editableCellIdleBeforeDimmingSeconds.setMessage(I18n::Message::IdleTimeBeforeDimming); + m_editableCellIdleBeforeDimmingSeconds.setMessageFont(KDFont::LargeFont); + m_editableCellIdleBeforeSuspendSeconds.setMessage(I18n::Message::IdleTimeBeforeSuspend); + m_editableCellIdleBeforeSuspendSeconds.setMessageFont(KDFont::LargeFont); + m_BrightnessShortcutCell.setMessage(I18n::Message::BrightnessShortcut); + m_BrightnessShortcutCell.setMessageFont(KDFont::LargeFont); +} + +HighlightCell * BrightnessController::reusableCell(int index, int type) { + HighlightCell * editableCell[] = { + &m_brightnessCell, + &m_editableCellIdleBeforeDimmingSeconds, + &m_editableCellIdleBeforeSuspendSeconds, + &m_BrightnessShortcutCell + }; + return editableCell[index]; +} + +int BrightnessController::reusableCellCount(int type) { + switch(type) { + case 0: + case 1: + return k_totalNumberOfCell; + default: + assert(false); + return 0; + } +} + +void BrightnessController::willDisplayCellForIndex(HighlightCell * cell, int index) { + if(index == 0){ + MessageTableCellWithGauge * myGaugeCell = (MessageTableCellWithGauge *)cell; + GaugeView * myGauge = (GaugeView *)myGaugeCell->accessoryView(); + myGauge->setLevel((float)GlobalPreferences::sharedGlobalPreferences()->brightnessLevel()/(float)Ion::Backlight::MaxBrightness); + return; + } else { + MessageTableCellWithEditableText * myCell = (MessageTableCellWithEditableText *)cell; + GenericSubController::willDisplayCellForIndex(myCell, index); + char buffer[5]; + int val; + switch(index){ + case 1:{ + val = GlobalPreferences::sharedGlobalPreferences()->idleBeforeDimmingSeconds(); + break; + } + case 2:{ + val = GlobalPreferences::sharedGlobalPreferences()->idleBeforeSuspendSeconds(); + break; + } + case 3:{ + val = GlobalPreferences::sharedGlobalPreferences()->brightnessShortcut(); + break; + } + default: + assert(false); + } + Poincare::Integer(val).serialize(buffer, 5); + myCell->setAccessoryText(buffer); + } +} + +bool BrightnessController::handleEvent(Ion::Events::Event event) { + if ((selectedRow() == 0) && (event == Ion::Events::Right || event == Ion::Events::Left || event == Ion::Events::Plus || event == Ion::Events::Minus)) { + int delta = Ion::Backlight::MaxBrightness/GlobalPreferences::NumberOfBrightnessStates; + int direction = (event == Ion::Events::Right || event == Ion::Events::Plus) ? delta : -delta; + GlobalPreferences::sharedGlobalPreferences()->setBrightnessLevel(GlobalPreferences::sharedGlobalPreferences()->brightnessLevel()+direction); + m_selectableTableView.reloadCellAtLocation(m_selectableTableView.selectedColumn(), m_selectableTableView.selectedRow()); + return true; + } + if (event == Ion::Events::BrightnessPlus || event == Ion::Events::BrightnessMinus){ + int delta = Ion::Backlight::MaxBrightness/GlobalPreferences::NumberOfBrightnessStates; + int NumberOfStepsPerShortcut = GlobalPreferences::sharedGlobalPreferences()->brightnessShortcut(); + int direction = (event == Ion::Events::BrightnessPlus) ? NumberOfStepsPerShortcut*delta : -delta*NumberOfStepsPerShortcut; + GlobalPreferences::sharedGlobalPreferences()->setBrightnessLevel(GlobalPreferences::sharedGlobalPreferences()->brightnessLevel()+direction); + m_selectableTableView.reloadCellAtLocation(m_selectableTableView.selectedColumn(), 0); + return true; + } + return false; +} + +bool BrightnessController::textFieldShouldFinishEditing(TextField * textField, Ion::Events::Event event) { + return ((event == Ion::Events::Up && selectedRow() > 0) || (event == Ion::Events::Down && selectedRow() < k_totalNumberOfCell - 1)) + || TextFieldDelegate::textFieldShouldFinishEditing(textField, event); +} + +bool BrightnessController::textFieldDidFinishEditing(TextField * textField, const char * text, Ion::Events::Event event) { + double floatBody; + if (textFieldDelegateApp()->hasUndefinedValue(text, floatBody)) { + return false; + } + int val = std::round(floatBody); + switch (selectedRow()) { + case 1: + GlobalPreferences::sharedGlobalPreferences()->setIdleBeforeDimmingSeconds(val); + m_editableCellIdleBeforeDimmingSeconds.setAccessoryText(text); + break; + case 2: + GlobalPreferences::sharedGlobalPreferences()->setIdleBeforeSuspendSeconds(val); + m_editableCellIdleBeforeSuspendSeconds.setAccessoryText(text); + break; + case 3:{ + if(val > GlobalPreferences::NumberOfBrightnessStates){ val = GlobalPreferences::NumberOfBrightnessStates; + } else if (val < 0){val = 0;} + GlobalPreferences::sharedGlobalPreferences()->setBrightnessShortcut(val); + m_BrightnessShortcutCell.setAccessoryText(text); + break; + } + default: + assert(false); + } + AppsContainer * myContainer = AppsContainer::sharedAppsContainer(); + myContainer->refreshPreferences(); + m_selectableTableView.reloadCellAtLocation(0, selectedRow()); + if (event == Ion::Events::Up || event == Ion::Events::Down || event == Ion::Events::OK) { + m_selectableTableView.handleEvent(event); + } + return true; +} + +} diff --git a/apps/settings/sub_menu/brightness_controller.h b/apps/settings/sub_menu/brightness_controller.h new file mode 100644 index 000000000..a36a39a32 --- /dev/null +++ b/apps/settings/sub_menu/brightness_controller.h @@ -0,0 +1,33 @@ +#ifndef SETTINGS_BRIGHTNESS_CONTROLLER_H +#define SETTINGS_BRIGHTNESS_CONTROLLER_H + +#include "generic_sub_controller.h" +#include "preferences_controller.h" +#include "../message_table_cell_with_editable_text_with_separator.h" +#include "../../shared/parameter_text_field_delegate.h" +#include "../message_table_cell_with_gauge_with_separator.h" + +namespace Settings { + +class BrightnessController : public GenericSubController, public Shared::ParameterTextFieldDelegate { +public: + BrightnessController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate); + TELEMETRY_ID("BrightnessSettings"); + HighlightCell * reusableCell(int index, int type) override; + int reusableCellCount(int type) override; + void willDisplayCellForIndex(HighlightCell * cell, int index) override; + bool handleEvent(Ion::Events::Event event) override; + bool textFieldShouldFinishEditing(TextField * textField, Ion::Events::Event event) override; + bool textFieldDidFinishEditing(TextField * textField, const char * text, Ion::Events::Event event) override; +protected: + constexpr static int k_totalNumberOfCell = 4; +private: + MessageTableCellWithGauge m_brightnessCell; + MessageTableCellWithEditableText m_editableCellIdleBeforeDimmingSeconds; + MessageTableCellWithEditableText m_editableCellIdleBeforeSuspendSeconds; + MessageTableCellWithEditableText m_BrightnessShortcutCell; +}; + +} + +#endif diff --git a/apps/suspend_timer.cpp b/apps/suspend_timer.cpp index 34562d819..b21c1d6b3 100644 --- a/apps/suspend_timer.cpp +++ b/apps/suspend_timer.cpp @@ -2,7 +2,7 @@ #include "apps_container.h" SuspendTimer::SuspendTimer() : - Timer(k_idleBeforeSuspendDuration/Timer::TickDuration) + Timer(GlobalPreferences::sharedGlobalPreferences()->idleBeforeSuspendSeconds()*1000/Timer::TickDuration) { } diff --git a/apps/suspend_timer.h b/apps/suspend_timer.h index 0a7b735d6..8125ca855 100644 --- a/apps/suspend_timer.h +++ b/apps/suspend_timer.h @@ -7,7 +7,6 @@ class SuspendTimer : public Timer { public: SuspendTimer(); private: - constexpr static int k_idleBeforeSuspendDuration = 5*60*1000; // In miliseconds bool fire() override; }; diff --git a/escher/include/escher/timer.h b/escher/include/escher/timer.h index 3a7e2a7ec..94ed476c4 100644 --- a/escher/include/escher/timer.h +++ b/escher/include/escher/timer.h @@ -17,7 +17,7 @@ public: static constexpr int TickDuration = 300; // In Miliseconds Timer(uint32_t period); // Period is in ticks bool tick(); - void reset(); + void reset(uint32_t NewPeriod = -1); protected: virtual bool fire() = 0; uint32_t m_period; diff --git a/escher/src/timer.cpp b/escher/src/timer.cpp index 0e9f5a5ea..742634fbf 100644 --- a/escher/src/timer.cpp +++ b/escher/src/timer.cpp @@ -16,6 +16,9 @@ bool Timer::tick() { return false; } -void Timer::reset() { +void Timer::reset(uint32_t NewPeriod) { + if(NewPeriod != -1){ + m_period = NewPeriod; + } m_numberOfTicksBeforeFire = m_period; } diff --git a/ion/include/ion/backlight.h b/ion/include/ion/backlight.h index 89a19687c..cd69ee888 100644 --- a/ion/include/ion/backlight.h +++ b/ion/include/ion/backlight.h @@ -12,7 +12,6 @@ bool isInitialized(); void shutdown(); void setBrightness(uint8_t b); uint8_t brightness(); -const int NumberOfStepsPerShortcut = 4; } }