feat: add custom sleep timer picker (#2206)
## Summary * **What is the goal of this PR?** Mainly fixes #2196, but also allows users to set a sleep time of 1~30 min or to never sleep. * **What changes are included?** 1. Revert changes from #1948 and #2137 (Sorry @Uri-Tauber) 2. Cherrypick changes from https://github.com/uxjulia/CrossInk/commit/0cb91c3dd1c63f0559d4392fadc4a8340af5bdde and https://github.com/uxjulia/CrossInk/commit/4e6bd634b6ede51ff1a7107ba3e8efcd152bc6ee for a timeout interval picker UI, the custom sleep time feature, and migrate the existing setting in v1.3.0, `sleepTimeout`, to `sleepTimeoutMinutes` (Thanks! @uxjulia) 3. Add a "Never" at the far right of the timeout interval picker --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**PARTIALLY**_ --------- Co-authored-by: Julia <julia@uxj.io>
This commit is contained in:
@@ -143,7 +143,6 @@ STR_ALIGN_LEFT: "Па левым краі"
|
||||
STR_CENTER: "Па цэнтры"
|
||||
STR_ALIGN_RIGHT: "Па правым краі"
|
||||
STR_MIN_1: "1 хв"
|
||||
STR_MIN_3: "3 хв"
|
||||
STR_MIN_5: "5 хв"
|
||||
STR_MIN_10: "10 хв"
|
||||
STR_MIN_15: "15 хв"
|
||||
@@ -296,6 +295,9 @@ STR_DISPLAY_QR: "Паказаць старонку як QR"
|
||||
STR_FOOTNOTES: "Зноскі"
|
||||
STR_NO_FOOTNOTES: "На гэтай старонцы няма зносак"
|
||||
STR_LINK: "[спасылка]"
|
||||
STR_SLEEP_TIMER_VALUE_FORMAT: "%u хв"
|
||||
STR_SLEEP_NEVER: "Ніколі"
|
||||
STR_SLEEP_TIMER_STEP_HINT: "Улева/Управа: 1 хв Уверх/Уніз: 5 хв"
|
||||
STR_AUTO_TURN_ENABLED: "Аўтаперагортванне: "
|
||||
STR_AUTO_TURN_PAGES_PER_MIN: "Аўтаперагортванне (старонак за хвіліну)"
|
||||
STR_TILT_PAGE_TURN: "Перагортванне нахілам"
|
||||
|
||||
@@ -154,7 +154,6 @@ STR_ALIGN_LEFT: "Esquerra"
|
||||
STR_CENTER: "Centre"
|
||||
STR_ALIGN_RIGHT: "Dreta"
|
||||
STR_MIN_1: "1 min"
|
||||
STR_MIN_3: "3 min"
|
||||
STR_MIN_5: "5 min"
|
||||
STR_MIN_10: "10 min"
|
||||
STR_MIN_15: "15 min"
|
||||
@@ -304,6 +303,9 @@ STR_OPDS_SERVER_URL: "URL del servidor OPDS"
|
||||
STR_FOOTNOTES: "Notes al peu"
|
||||
STR_NO_FOOTNOTES: "No hi ha notes al peu en aquesta pàgina"
|
||||
STR_LINK: "[enllaç]"
|
||||
STR_SLEEP_TIMER_VALUE_FORMAT: "%u min"
|
||||
STR_SLEEP_NEVER: "Mai"
|
||||
STR_SLEEP_TIMER_STEP_HINT: "Esquerra/Dreta: 1 min Amunt/Avall: 5 min"
|
||||
STR_SCREENSHOT_BUTTON: "Fes una captura de pantalla"
|
||||
STR_AUTO_TURN_ENABLED: "Passar automàtic activat: "
|
||||
STR_AUTO_TURN_PAGES_PER_MIN: "Passar automàtic (pàgines per minut)"
|
||||
|
||||
@@ -148,7 +148,6 @@ STR_ALIGN_LEFT: "Vlevo"
|
||||
STR_CENTER: "Na střed"
|
||||
STR_ALIGN_RIGHT: "Vpravo"
|
||||
STR_MIN_1: "1 min"
|
||||
STR_MIN_3: "3 min"
|
||||
STR_MIN_5: "5 min"
|
||||
STR_MIN_10: "10 min"
|
||||
STR_MIN_15: "15 min"
|
||||
@@ -273,4 +272,7 @@ STR_EMBEDDED_STYLE: "Vložený styl"
|
||||
STR_FOCUS_READING: "Soustředěné čtení"
|
||||
STR_OPDS_SERVER_URL: "URL serveru OPDS"
|
||||
STR_SCREENSHOT_BUTTON: "Udělat snímek obrazovky"
|
||||
STR_SLEEP_TIMER_VALUE_FORMAT: "%u min"
|
||||
STR_SLEEP_NEVER: "Nikdy"
|
||||
STR_SLEEP_TIMER_STEP_HINT: "Vlevo/Vpravo: 1 min Nahoru/Dolů: 5 min"
|
||||
STR_TILT_PAGE_TURN: "Otáčení stránek nakloněním"
|
||||
|
||||
@@ -153,7 +153,6 @@ STR_ALIGN_LEFT: "Venstre"
|
||||
STR_CENTER: "Centreret"
|
||||
STR_ALIGN_RIGHT: "Højre"
|
||||
STR_MIN_1: "1 min"
|
||||
STR_MIN_3: "3 min"
|
||||
STR_MIN_5: "5 min"
|
||||
STR_MIN_10: "10 min"
|
||||
STR_MIN_15: "15 min"
|
||||
@@ -298,6 +297,9 @@ STR_OPDS_SERVER_URL: "OPDS Server URL"
|
||||
STR_FOOTNOTES: "Fodnoter"
|
||||
STR_NO_FOOTNOTES: "Ingen fodnoter på denne side"
|
||||
STR_LINK: "[link]"
|
||||
STR_SLEEP_TIMER_VALUE_FORMAT: "%u min"
|
||||
STR_SLEEP_NEVER: "Aldrig"
|
||||
STR_SLEEP_TIMER_STEP_HINT: "Venstre/Højre: 1 min Op/Ned: 5 min"
|
||||
STR_SCREENSHOT_BUTTON: "Tag skærmbillede"
|
||||
STR_AUTO_TURN_ENABLED: "Automatisk sidevendning aktiveret: "
|
||||
STR_AUTO_TURN_PAGES_PER_MIN: "Automatisk vending (sider per minut)"
|
||||
|
||||
@@ -153,7 +153,6 @@ STR_ALIGN_LEFT: "Links"
|
||||
STR_CENTER: "Centreren"
|
||||
STR_ALIGN_RIGHT: "Rechts"
|
||||
STR_MIN_1: "1 min"
|
||||
STR_MIN_3: "3 min"
|
||||
STR_MIN_5: "5 min"
|
||||
STR_MIN_10: "10 min"
|
||||
STR_MIN_15: "15 min"
|
||||
@@ -298,6 +297,9 @@ STR_OPDS_SERVER_URL: "OPDS-server URL"
|
||||
STR_FOOTNOTES: "Voetnoten"
|
||||
STR_NO_FOOTNOTES: "Geen voetnoten op deze pagina"
|
||||
STR_LINK: "[link]"
|
||||
STR_SLEEP_TIMER_VALUE_FORMAT: "%u min"
|
||||
STR_SLEEP_NEVER: "Nooit"
|
||||
STR_SLEEP_TIMER_STEP_HINT: "Links/Rechts: 1 min Omhoog/Omlaag: 5 min"
|
||||
STR_SCREENSHOT_BUTTON: "Screenshot maken"
|
||||
STR_AUTO_TURN_ENABLED: "Automatisch omslaan ingeschakeld: "
|
||||
STR_AUTO_TURN_PAGES_PER_MIN: "Autom. omslaan (pagina's per minuut)"
|
||||
|
||||
@@ -156,7 +156,6 @@ STR_ALIGN_LEFT: "Left"
|
||||
STR_CENTER: "Center"
|
||||
STR_ALIGN_RIGHT: "Right"
|
||||
STR_MIN_1: "1 min"
|
||||
STR_MIN_3: "3 min"
|
||||
STR_MIN_5: "5 min"
|
||||
STR_MIN_10: "10 min"
|
||||
STR_MIN_15: "15 min"
|
||||
@@ -330,6 +329,9 @@ STR_FOOTNOTES: "Footnotes"
|
||||
STR_NO_FOOTNOTES: "No footnotes on this page"
|
||||
STR_LINK: "[link]"
|
||||
STR_SCREENSHOT_BUTTON: "Take screenshot"
|
||||
STR_SLEEP_TIMER_VALUE_FORMAT: "%u min"
|
||||
STR_SLEEP_NEVER: "Never"
|
||||
STR_SLEEP_TIMER_STEP_HINT: "Left/Right: 1 min Up/Down: 5 min"
|
||||
STR_ADD_SERVER: "Add Server"
|
||||
STR_SERVER_NAME: "Server Name"
|
||||
STR_NO_SERVERS: "No OPDS servers configured"
|
||||
|
||||
@@ -148,7 +148,6 @@ STR_ALIGN_LEFT: "Vasen"
|
||||
STR_CENTER: "Keskitetty"
|
||||
STR_ALIGN_RIGHT: "Oikea"
|
||||
STR_MIN_1: "1 min"
|
||||
STR_MIN_3: "3 min"
|
||||
STR_MIN_5: "5 min"
|
||||
STR_MIN_10: "10 min"
|
||||
STR_MIN_15: "15 min"
|
||||
@@ -271,4 +270,7 @@ STR_EMBEDDED_STYLE: "Upotettu tyyli"
|
||||
STR_FOCUS_READING: "Keskittynyt lukeminen"
|
||||
STR_OPDS_SERVER_URL: "OPDS-palvelimen osoite"
|
||||
STR_SCREENSHOT_BUTTON: "Ota kuvakaappaus"
|
||||
STR_SLEEP_TIMER_VALUE_FORMAT: "%u min"
|
||||
STR_SLEEP_NEVER: "Ei koskaan"
|
||||
STR_SLEEP_TIMER_STEP_HINT: "Vasen/Oikea: 1 min Ylös/Alas: 5 min"
|
||||
STR_TILT_PAGE_TURN: "Sivunkääntö kallistamalla"
|
||||
|
||||
@@ -153,7 +153,6 @@ STR_ALIGN_LEFT: "Gauche"
|
||||
STR_CENTER: "Centré"
|
||||
STR_ALIGN_RIGHT: "Droite"
|
||||
STR_MIN_1: "1 min"
|
||||
STR_MIN_3: "3 min"
|
||||
STR_MIN_5: "5 min"
|
||||
STR_MIN_10: "10 min"
|
||||
STR_MIN_15: "15 min"
|
||||
@@ -299,6 +298,9 @@ STR_OPDS_SERVER_URL: "URL serveur OPDS"
|
||||
STR_FOOTNOTES: "Notes de bas de page"
|
||||
STR_NO_FOOTNOTES: "Aucune note sur cette page"
|
||||
STR_LINK: "[lien]"
|
||||
STR_SLEEP_TIMER_VALUE_FORMAT: "%u min"
|
||||
STR_SLEEP_NEVER: "Jamais"
|
||||
STR_SLEEP_TIMER_STEP_HINT: "Gauche/Droite : 1 min Haut/Bas : 5 min"
|
||||
STR_SCREENSHOT_BUTTON: "Capture d'écran"
|
||||
STR_AUTO_TURN_ENABLED: "Tourne-page auto : "
|
||||
STR_AUTO_TURN_PAGES_PER_MIN: "Tourne-page auto (pages par minute)"
|
||||
|
||||
@@ -151,7 +151,6 @@ STR_ALIGN_LEFT: "Links"
|
||||
STR_CENTER: "Zentriert"
|
||||
STR_ALIGN_RIGHT: "Rechts"
|
||||
STR_MIN_1: "1 Min"
|
||||
STR_MIN_3: "3 Min"
|
||||
STR_MIN_5: "5 Min"
|
||||
STR_MIN_10: "10 Min"
|
||||
STR_MIN_15: "15 Min"
|
||||
@@ -299,6 +298,9 @@ STR_SCREENSHOT_BUTTON: "Screenshot aufnehmen"
|
||||
STR_FOOTNOTES: "Fußnoten"
|
||||
STR_NO_FOOTNOTES: "Keine Fußnoten auf dieser Seite"
|
||||
STR_LINK: "[Link]"
|
||||
STR_SLEEP_TIMER_VALUE_FORMAT: "%u Min."
|
||||
STR_SLEEP_NEVER: "Nie"
|
||||
STR_SLEEP_TIMER_STEP_HINT: "Links/Rechts: 1 Min. Hoch/Runter: 5 Min."
|
||||
STR_AUTO_TURN_ENABLED: "Auto-Umblättern aktiv: "
|
||||
STR_AUTO_TURN_PAGES_PER_MIN: "Auto-Umblättern (Seiten/Min.)"
|
||||
STR_IMAGES: "Bilder"
|
||||
|
||||
@@ -150,7 +150,6 @@ STR_ALIGN_LEFT: "Bal"
|
||||
STR_CENTER: "Közép"
|
||||
STR_ALIGN_RIGHT: "Jobb"
|
||||
STR_MIN_1: "1 perc"
|
||||
STR_MIN_3: "3 perc"
|
||||
STR_MIN_5: "5 perc"
|
||||
STR_MIN_10: "10 perc"
|
||||
STR_MIN_15: "15 perc"
|
||||
@@ -295,6 +294,9 @@ STR_OPDS_SERVER_URL: "OPDS szerver URL"
|
||||
STR_FOOTNOTES: "Lábjegyzetek"
|
||||
STR_NO_FOOTNOTES: "Nincsenek lábjegyzetek ezen az oldalon"
|
||||
STR_LINK: "[link]"
|
||||
STR_SLEEP_TIMER_VALUE_FORMAT: "%u perc"
|
||||
STR_SLEEP_NEVER: "Soha"
|
||||
STR_SLEEP_TIMER_STEP_HINT: "Bal/Jobb: 1 perc Fel/Le: 5 perc"
|
||||
STR_SCREENSHOT_BUTTON: "Képernyőkép készítése"
|
||||
STR_AUTO_TURN_ENABLED: "Automatikus lapozás bekapcsolva: "
|
||||
STR_AUTO_TURN_PAGES_PER_MIN: "Automatikus lapozás (oldal/perc)"
|
||||
|
||||
@@ -154,7 +154,6 @@ STR_ALIGN_LEFT: "Sinistra"
|
||||
STR_CENTER: "Centrato"
|
||||
STR_ALIGN_RIGHT: "Destra"
|
||||
STR_MIN_1: "1 min"
|
||||
STR_MIN_3: "3 min"
|
||||
STR_MIN_5: "5 min"
|
||||
STR_MIN_10: "10 min"
|
||||
STR_MIN_15: "15 min"
|
||||
@@ -308,6 +307,9 @@ STR_SET_SLEEP_COVER: "Imposta copertina"
|
||||
STR_FOOTNOTES: "Note a piè pagina"
|
||||
STR_NO_FOOTNOTES: "Nessuna nota in questa pagina"
|
||||
STR_LINK: "[link]"
|
||||
STR_SLEEP_TIMER_VALUE_FORMAT: "%u min"
|
||||
STR_SLEEP_NEVER: "Mai"
|
||||
STR_SLEEP_TIMER_STEP_HINT: "Sinistra/Destra: 1 min Su/Giù: 5 min"
|
||||
STR_SCREENSHOT_BUTTON: "Screenshot"
|
||||
STR_ADD_SERVER: "Aggiungi server"
|
||||
STR_SERVER_NAME: "Nome server"
|
||||
|
||||
@@ -144,7 +144,6 @@ STR_ALIGN_LEFT: "Солға"
|
||||
STR_CENTER: "Ортаға"
|
||||
STR_ALIGN_RIGHT: "Оңға"
|
||||
STR_MIN_1: "1 мин"
|
||||
STR_MIN_3: "3 мин"
|
||||
STR_MIN_5: "5 мин"
|
||||
STR_MIN_10: "10 мин"
|
||||
STR_MIN_15: "15 мин"
|
||||
@@ -294,6 +293,9 @@ STR_DISPLAY_QR: "Бетті QR ретінде көрсету"
|
||||
STR_FOOTNOTES: "Түсіндірме жазбалар"
|
||||
STR_NO_FOOTNOTES: "Бұл бетте түсіндірме жазбалар жоқ"
|
||||
STR_LINK: "[сілтеме]"
|
||||
STR_SLEEP_TIMER_VALUE_FORMAT: "%u мин"
|
||||
STR_SLEEP_NEVER: "Ешқашан"
|
||||
STR_SLEEP_TIMER_STEP_HINT: "Сол/Оң: 1 мин Жоғары/Төмен: 5 мин"
|
||||
STR_SCREENSHOT_BUTTON: "Скриншот түсіру"
|
||||
STR_AUTO_TURN_ENABLED: "Автоматты бет аудару қосулы: "
|
||||
STR_AUTO_TURN_PAGES_PER_MIN: "Автоматты бет аудару (минутына бет саны)"
|
||||
|
||||
@@ -150,7 +150,6 @@ STR_ALIGN_LEFT: "Kairė"
|
||||
STR_CENTER: "Centras"
|
||||
STR_ALIGN_RIGHT: "Dešinė"
|
||||
STR_MIN_1: "1 min"
|
||||
STR_MIN_3: "3 min"
|
||||
STR_MIN_5: "5 min"
|
||||
STR_MIN_10: "10 min"
|
||||
STR_MIN_15: "15 min"
|
||||
@@ -295,6 +294,9 @@ STR_OPDS_SERVER_URL: "OPDS URL"
|
||||
STR_FOOTNOTES: "Išnašos"
|
||||
STR_NO_FOOTNOTES: "Šiame psl. išnašų nėra"
|
||||
STR_LINK: "[nuoroda]"
|
||||
STR_SLEEP_TIMER_VALUE_FORMAT: "%u min."
|
||||
STR_SLEEP_NEVER: "Niekada"
|
||||
STR_SLEEP_TIMER_STEP_HINT: "Kairė/Dešinė: 1 min. Viršus/Apačia: 5 min."
|
||||
STR_SCREENSHOT_BUTTON: "Ekrano nuotrauka"
|
||||
STR_AUTO_TURN_ENABLED: "Auto-vertimas: "
|
||||
STR_AUTO_TURN_PAGES_PER_MIN: "Auto-vertimas (psl/min)"
|
||||
|
||||
@@ -154,7 +154,6 @@ STR_ALIGN_LEFT: "Lewo"
|
||||
STR_CENTER: "Środek"
|
||||
STR_ALIGN_RIGHT: "Prawo"
|
||||
STR_MIN_1: "1 min"
|
||||
STR_MIN_3: "3 min"
|
||||
STR_MIN_5: "5 min"
|
||||
STR_MIN_10: "10 min"
|
||||
STR_MIN_15: "15 min"
|
||||
@@ -308,6 +307,9 @@ STR_SET_SLEEP_COVER: "Ustaw okładkę"
|
||||
STR_FOOTNOTES: "Przypisy"
|
||||
STR_NO_FOOTNOTES: "Brak przypisów na tej stronie"
|
||||
STR_LINK: "[link]"
|
||||
STR_SLEEP_TIMER_VALUE_FORMAT: "%u min"
|
||||
STR_SLEEP_NEVER: "Nigdy"
|
||||
STR_SLEEP_TIMER_STEP_HINT: "Lewo/Prawo: 1 min Góra/Dół: 5 min"
|
||||
STR_SCREENSHOT_BUTTON: "Zrób zrzut ekranu"
|
||||
STR_ADD_SERVER: "Dodaj serwer"
|
||||
STR_SERVER_NAME: "Nazwa serwera"
|
||||
|
||||
@@ -148,7 +148,6 @@ STR_ALIGN_LEFT: "Esquerda"
|
||||
STR_CENTER: "Centralizar"
|
||||
STR_ALIGN_RIGHT: "Direita"
|
||||
STR_MIN_1: "1 min"
|
||||
STR_MIN_3: "3 min"
|
||||
STR_MIN_5: "5 min"
|
||||
STR_MIN_10: "10 min"
|
||||
STR_MIN_15: "15 min"
|
||||
@@ -273,4 +272,7 @@ STR_EMBEDDED_STYLE: "Estilo embutido"
|
||||
STR_FOCUS_READING: "Leitura focada"
|
||||
STR_OPDS_SERVER_URL: "URL do servidor OPDS"
|
||||
STR_SCREENSHOT_BUTTON: "Capturar tela"
|
||||
STR_SLEEP_TIMER_VALUE_FORMAT: "%u min"
|
||||
STR_SLEEP_NEVER: "Nunca"
|
||||
STR_SLEEP_TIMER_STEP_HINT: "Esq/Dir: 1 min Cima/Baixo: 5 min"
|
||||
STR_TILT_PAGE_TURN: "Virar página por inclinação"
|
||||
|
||||
@@ -153,7 +153,6 @@ STR_ALIGN_LEFT: "Stânga"
|
||||
STR_CENTER: "Centru"
|
||||
STR_ALIGN_RIGHT: "Dreapta"
|
||||
STR_MIN_1: "1 min"
|
||||
STR_MIN_3: "3 min"
|
||||
STR_MIN_5: "5 min"
|
||||
STR_MIN_10: "10 min"
|
||||
STR_MIN_15: "15 min"
|
||||
@@ -298,6 +297,9 @@ STR_OPDS_SERVER_URL: "URL server OPDS"
|
||||
STR_FOOTNOTES: "Note de subsol"
|
||||
STR_NO_FOOTNOTES: "Nicio notă de subsol"
|
||||
STR_LINK: "[link]"
|
||||
STR_SLEEP_TIMER_VALUE_FORMAT: "%u min"
|
||||
STR_SLEEP_NEVER: "Niciodată"
|
||||
STR_SLEEP_TIMER_STEP_HINT: "Stânga/Dreapta: 1 min Sus/Jos: 5 min"
|
||||
STR_SCREENSHOT_BUTTON: "Captură ecran"
|
||||
STR_AUTO_TURN_ENABLED: "Răsfoire automată: "
|
||||
STR_AUTO_TURN_PAGES_PER_MIN: "Pagini pe minut"
|
||||
|
||||
@@ -155,7 +155,6 @@ STR_ALIGN_LEFT: "По левому краю"
|
||||
STR_CENTER: "По центру"
|
||||
STR_ALIGN_RIGHT: "По правому краю"
|
||||
STR_MIN_1: "1 мин"
|
||||
STR_MIN_3: "3 мин"
|
||||
STR_MIN_5: "5 мин"
|
||||
STR_MIN_10: "10 мин"
|
||||
STR_MIN_15: "15 мин"
|
||||
@@ -314,6 +313,9 @@ STR_SET_SLEEP_COVER: "Обложкой"
|
||||
STR_FOOTNOTES: "Примечания"
|
||||
STR_NO_FOOTNOTES: "На данной странице нет примечаний"
|
||||
STR_LINK: "[ссылка]"
|
||||
STR_SLEEP_TIMER_VALUE_FORMAT: "%u мин"
|
||||
STR_SLEEP_NEVER: "Никогда"
|
||||
STR_SLEEP_TIMER_STEP_HINT: "Влево/Вправо: 1 мин Вверх/Вниз: 5 мин"
|
||||
STR_SCREENSHOT_BUTTON: "Сделать снимок экрана"
|
||||
STR_ADD_SERVER: "Добавить сервер"
|
||||
STR_SERVER_NAME: "Имя сервера"
|
||||
|
||||
@@ -150,7 +150,6 @@ STR_ALIGN_LEFT: "Levo"
|
||||
STR_CENTER: "Sredinsko"
|
||||
STR_ALIGN_RIGHT: "Desno"
|
||||
STR_MIN_1: "1 min"
|
||||
STR_MIN_3: "3 min"
|
||||
STR_MIN_5: "5 min"
|
||||
STR_MIN_10: "10 min"
|
||||
STR_MIN_15: "15 min"
|
||||
@@ -295,6 +294,9 @@ STR_OPDS_SERVER_URL: "URL OPDS strežnika"
|
||||
STR_FOOTNOTES: "Opombe"
|
||||
STR_NO_FOOTNOTES: "Na tej strani ni opomb"
|
||||
STR_LINK: "[povezava]"
|
||||
STR_SLEEP_TIMER_VALUE_FORMAT: "%u min"
|
||||
STR_SLEEP_NEVER: "Nikoli"
|
||||
STR_SLEEP_TIMER_STEP_HINT: "Levo/desno: 1 min Gor/dol: 5 min"
|
||||
STR_SCREENSHOT_BUTTON: "Naredi posnetek zaslona"
|
||||
STR_AUTO_TURN_ENABLED: "Samodejno obračanje: "
|
||||
STR_AUTO_TURN_PAGES_PER_MIN: "Samodejno obračanje (strani na minuto)"
|
||||
|
||||
@@ -155,7 +155,6 @@ STR_ALIGN_LEFT: "Izquierda"
|
||||
STR_CENTER: "Centro"
|
||||
STR_ALIGN_RIGHT: "Derecha"
|
||||
STR_MIN_1: "1 min."
|
||||
STR_MIN_3: "3 min."
|
||||
STR_MIN_5: "5 min."
|
||||
STR_MIN_10: "10 min."
|
||||
STR_MIN_15: "15 min."
|
||||
@@ -329,6 +328,9 @@ STR_SET_SLEEP_COVER: "Pant. sus."
|
||||
STR_FOOTNOTES: "Pie de página"
|
||||
STR_NO_FOOTNOTES: "No hay notas al pie de esta página"
|
||||
STR_LINK: "[enlace]"
|
||||
STR_SLEEP_TIMER_VALUE_FORMAT: "%u min."
|
||||
STR_SLEEP_NEVER: "Nunca"
|
||||
STR_SLEEP_TIMER_STEP_HINT: "Izq./Dcha.: 1 min. Subir/Bajar: 5 min."
|
||||
STR_SCREENSHOT_BUTTON: "Tomar captura de pantalla"
|
||||
STR_ADD_SERVER: "Agregar servidor"
|
||||
STR_SERVER_NAME: "Nombre de servidor"
|
||||
|
||||
@@ -156,7 +156,6 @@ STR_ALIGN_LEFT: "Vänster"
|
||||
STR_CENTER: "Mitten"
|
||||
STR_ALIGN_RIGHT: "Höger"
|
||||
STR_MIN_1: "1 min"
|
||||
STR_MIN_3: "3 min"
|
||||
STR_MIN_5: "5 min"
|
||||
STR_MIN_10: "10 min"
|
||||
STR_MIN_15: "15 min"
|
||||
@@ -330,6 +329,9 @@ STR_SET_SLEEP_COVER: "Ställ in omslag"
|
||||
STR_FOOTNOTES: "Fotnoter"
|
||||
STR_NO_FOOTNOTES: "Inga fotnoter på den här sidan"
|
||||
STR_LINK: "[länk]"
|
||||
STR_SLEEP_TIMER_VALUE_FORMAT: "%u min"
|
||||
STR_SLEEP_NEVER: "Aldrig"
|
||||
STR_SLEEP_TIMER_STEP_HINT: "Vänster/Höger: 1 min Upp/Ner: 5 min"
|
||||
STR_SCREENSHOT_BUTTON: "Ta en skärmdump"
|
||||
STR_ADD_SERVER: "Lägg till server"
|
||||
STR_SERVER_NAME: "Servernamn"
|
||||
|
||||
@@ -148,7 +148,6 @@ STR_ALIGN_LEFT: "Sola Yasla"
|
||||
STR_CENTER: "Ortala"
|
||||
STR_ALIGN_RIGHT: "Sağa Yasla"
|
||||
STR_MIN_1: "1 dak"
|
||||
STR_MIN_3: "3 dak"
|
||||
STR_MIN_5: "5 dak"
|
||||
STR_MIN_10: "10 dak"
|
||||
STR_MIN_15: "15 dak"
|
||||
@@ -289,6 +288,9 @@ STR_IMAGES_DISPLAY: "Göster"
|
||||
STR_IMAGES_PLACEHOLDER: "Yer Tutucu"
|
||||
STR_IMAGES_SUPPRESS: "Bastır"
|
||||
STR_LINK: "[bağlantı]"
|
||||
STR_SLEEP_TIMER_VALUE_FORMAT: "%u dak"
|
||||
STR_SLEEP_NEVER: "Asla"
|
||||
STR_SLEEP_TIMER_STEP_HINT: "Sol/Sağ: 1 dak Yukarı/Aşağı: 5 dak"
|
||||
STR_NO_FILES_FOUND: "Dosya bulunamadı"
|
||||
STR_NO_FOOTNOTES: "Bu sayfada dipnot yok"
|
||||
STR_PREVIEW: "Önizleme"
|
||||
|
||||
@@ -154,7 +154,6 @@ STR_ALIGN_LEFT: "За лівим краєм"
|
||||
STR_CENTER: "По центру"
|
||||
STR_ALIGN_RIGHT: "За правим краєм"
|
||||
STR_MIN_1: "1 хв"
|
||||
STR_MIN_3: "3 хв"
|
||||
STR_MIN_5: "5 хв"
|
||||
STR_MIN_10: "10 хв"
|
||||
STR_MIN_15: "15 хв"
|
||||
@@ -308,6 +307,9 @@ STR_SET_SLEEP_COVER: "Як обкл."
|
||||
STR_FOOTNOTES: "Примітки"
|
||||
STR_NO_FOOTNOTES: "На цій сторінці немає приміток"
|
||||
STR_LINK: "[посилання]"
|
||||
STR_SLEEP_TIMER_VALUE_FORMAT: "%u хв"
|
||||
STR_SLEEP_NEVER: "Ніколи"
|
||||
STR_SLEEP_TIMER_STEP_HINT: "Вліво/Вправо: 1 хв Вгору/Вниз: 5 хв"
|
||||
STR_SCREENSHOT_BUTTON: "Знімок екрана"
|
||||
STR_ADD_SERVER: "Додати сервер"
|
||||
STR_SERVER_NAME: "Назва сервера"
|
||||
|
||||
@@ -85,6 +85,9 @@ STR_SCREEN_MARGIN: "Marge de pantalla del lector"
|
||||
STR_PARA_ALIGNMENT: "Alineació de paràgrafs del lector"
|
||||
STR_HYPHENATION: "Partició de mots"
|
||||
STR_TIME_TO_SLEEP: "Temps per entrar en repòs"
|
||||
STR_SLEEP_TIMER_VALUE_FORMAT: "%u min"
|
||||
STR_SLEEP_NEVER: "Mai"
|
||||
STR_SLEEP_TIMER_STEP_HINT: "Esquerra/Dreta: 1 min Amunt/Avall: 5 min"
|
||||
STR_SHOW_HIDDEN_FILES: "Mostra arxius ocults"
|
||||
STR_REMOVE_READ_FROM_RECENTS: "Esborra els llibres llegits de la llista de recents"
|
||||
STR_MOVE_FINISHED_TO_READ: "Mou els llibres acabats a la carpeta Read"
|
||||
@@ -155,7 +158,6 @@ STR_ALIGN_LEFT: "Esquerra"
|
||||
STR_CENTER: "Centre"
|
||||
STR_ALIGN_RIGHT: "Dreta"
|
||||
STR_MIN_1: "1 min"
|
||||
STR_MIN_3: "3 min"
|
||||
STR_MIN_5: "5 min"
|
||||
STR_MIN_10: "10 min"
|
||||
STR_MIN_15: "15 min"
|
||||
|
||||
+23
-17
@@ -79,6 +79,22 @@ void CrossPointSettings::validateFrontButtonMapping(CrossPointSettings& settings
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t CrossPointSettings::sleepTimeoutEnumToMinutes(const uint8_t legacyValue) {
|
||||
switch (legacyValue) {
|
||||
case SLEEP_1_MIN:
|
||||
return 1;
|
||||
case SLEEP_5_MIN:
|
||||
return 5;
|
||||
case SLEEP_15_MIN:
|
||||
return 15;
|
||||
case SLEEP_30_MIN:
|
||||
return 30;
|
||||
case SLEEP_10_MIN:
|
||||
default:
|
||||
return 10;
|
||||
}
|
||||
}
|
||||
|
||||
bool CrossPointSettings::saveToFile() const {
|
||||
Storage.mkdir("/.crosspoint");
|
||||
return JsonSettingsIO::saveSettings(*this, SETTINGS_FILE_JSON);
|
||||
@@ -186,7 +202,9 @@ bool CrossPointSettings::loadFromBinaryFile() {
|
||||
if (++settingsRead >= fileSettingsCount) break;
|
||||
readAndValidate(inputFile, paragraphAlignment, PARAGRAPH_ALIGNMENT_COUNT);
|
||||
if (++settingsRead >= fileSettingsCount) break;
|
||||
readAndValidate(inputFile, sleepTimeout, SLEEP_TIMEOUT_COUNT);
|
||||
uint8_t legacySleepTimeout = SLEEP_10_MIN;
|
||||
readAndValidate(inputFile, legacySleepTimeout, SLEEP_TIMEOUT_COUNT);
|
||||
sleepTimeoutMinutes = sleepTimeoutEnumToMinutes(legacySleepTimeout);
|
||||
if (++settingsRead >= fileSettingsCount) break;
|
||||
readAndValidate(inputFile, refreshFrequency, REFRESH_FREQUENCY_COUNT);
|
||||
if (++settingsRead >= fileSettingsCount) break;
|
||||
@@ -304,22 +322,10 @@ float CrossPointSettings::getReaderLineCompression() const {
|
||||
}
|
||||
|
||||
unsigned long CrossPointSettings::getSleepTimeoutMs() const {
|
||||
switch (sleepTimeout) {
|
||||
case SLEEP_1_MIN:
|
||||
return 1UL * 60 * 1000;
|
||||
case SLEEP_3_MIN:
|
||||
return 3UL * 60 * 1000;
|
||||
case SLEEP_5_MIN:
|
||||
return 5UL * 60 * 1000;
|
||||
case SLEEP_10_MIN:
|
||||
return 10UL * 60 * 1000;
|
||||
case SLEEP_15_MIN:
|
||||
return 15UL * 60 * 1000;
|
||||
case SLEEP_30_MIN:
|
||||
return 30UL * 60 * 1000;
|
||||
default:
|
||||
return 10UL * 60 * 1000;
|
||||
}
|
||||
if (sleepTimeoutMinutes >= SLEEP_TIMEOUT_NEVER_MINUTES) return 0UL;
|
||||
const uint8_t minutes =
|
||||
std::clamp(sleepTimeoutMinutes, MIN_SLEEP_TIMEOUT_MINUTES, static_cast<uint8_t>(SLEEP_TIMEOUT_NEVER_MINUTES - 1));
|
||||
return static_cast<unsigned long>(minutes) * 60UL * 1000UL;
|
||||
}
|
||||
|
||||
int CrossPointSettings::getRefreshFrequency() const {
|
||||
|
||||
@@ -115,11 +115,10 @@ class CrossPointSettings {
|
||||
// Auto-sleep timeout options (in minutes)
|
||||
enum SLEEP_TIMEOUT {
|
||||
SLEEP_1_MIN = 0,
|
||||
SLEEP_3_MIN = 1,
|
||||
SLEEP_5_MIN = 2,
|
||||
SLEEP_10_MIN = 3,
|
||||
SLEEP_15_MIN = 4,
|
||||
SLEEP_30_MIN = 5,
|
||||
SLEEP_5_MIN = 1,
|
||||
SLEEP_10_MIN = 2,
|
||||
SLEEP_15_MIN = 3,
|
||||
SLEEP_30_MIN = 4,
|
||||
SLEEP_TIMEOUT_COUNT
|
||||
};
|
||||
|
||||
@@ -210,8 +209,8 @@ class CrossPointSettings {
|
||||
uint8_t fontSize = MEDIUM;
|
||||
uint8_t lineSpacing = NORMAL;
|
||||
uint8_t paragraphAlignment = JUSTIFIED;
|
||||
// Auto-sleep timeout setting (default 10 minutes)
|
||||
uint8_t sleepTimeout = SLEEP_10_MIN;
|
||||
// Auto-sleep timeout setting (default 10 minutes). Legacy sleepTimeout enum values are migration-only.
|
||||
uint8_t sleepTimeoutMinutes = 10;
|
||||
// E-ink refresh frequency (default 15 pages)
|
||||
uint8_t refreshFrequency = REFRESH_15;
|
||||
uint8_t hyphenationEnabled = 0;
|
||||
@@ -256,6 +255,10 @@ class CrossPointSettings {
|
||||
// Get singleton instance
|
||||
static CrossPointSettings& getInstance() { return instance; }
|
||||
|
||||
static constexpr uint8_t MIN_SLEEP_TIMEOUT_MINUTES = 1;
|
||||
static constexpr uint8_t SLEEP_TIMEOUT_NEVER_MINUTES = 31;
|
||||
static constexpr uint8_t MAX_SLEEP_TIMEOUT_MINUTES = SLEEP_TIMEOUT_NEVER_MINUTES;
|
||||
|
||||
// Callback to resolve SD card font IDs. Set by SdCardFontSystem::begin().
|
||||
// Returns font ID or 0 if not found.
|
||||
using SdFontIdResolver = int (*)(void* ctx, const char* familyName, uint8_t fontSize);
|
||||
@@ -274,6 +277,7 @@ class CrossPointSettings {
|
||||
bool loadFromFile();
|
||||
|
||||
static void validateFrontButtonMapping(CrossPointSettings& settings);
|
||||
static uint8_t sleepTimeoutEnumToMinutes(uint8_t legacyValue);
|
||||
|
||||
private:
|
||||
bool loadFromBinaryFile();
|
||||
|
||||
@@ -224,6 +224,13 @@ bool JsonSettingsIO::loadSettings(CrossPointSettings& s, const char* json, bool*
|
||||
}
|
||||
}
|
||||
|
||||
if (doc["sleepTimeoutMinutes"].isNull() && !doc["sleepTimeout"].isNull()) {
|
||||
const uint8_t legacyValue =
|
||||
clamp(doc["sleepTimeout"] | (uint8_t)CrossPointSettings::SLEEP_10_MIN, CrossPointSettings::SLEEP_TIMEOUT_COUNT,
|
||||
(uint8_t)CrossPointSettings::SLEEP_10_MIN);
|
||||
s.sleepTimeoutMinutes = CrossPointSettings::sleepTimeoutEnumToMinutes(legacyValue);
|
||||
if (needsResave) *needsResave = true;
|
||||
}
|
||||
// Front button remap — managed by RemapFrontButtons sub-activity, not in SettingsList.
|
||||
using S = CrossPointSettings;
|
||||
s.frontButtonBack =
|
||||
|
||||
+4
-4
@@ -178,10 +178,10 @@ inline std::vector<SettingInfo> getSettingsList(const SdCardFontRegistry* regist
|
||||
"shortPwrBtn", StrId::STR_CAT_CONTROLS),
|
||||
|
||||
// --- System ---
|
||||
SettingInfo::Enum(StrId::STR_TIME_TO_SLEEP, &CrossPointSettings::sleepTimeout,
|
||||
{StrId::STR_MIN_1, StrId::STR_MIN_3, StrId::STR_MIN_5, StrId::STR_MIN_10, StrId::STR_MIN_15,
|
||||
StrId::STR_MIN_30},
|
||||
"sleepTimeout", StrId::STR_CAT_SYSTEM),
|
||||
SettingInfo::Value(
|
||||
StrId::STR_TIME_TO_SLEEP, &CrossPointSettings::sleepTimeoutMinutes,
|
||||
{CrossPointSettings::MIN_SLEEP_TIMEOUT_MINUTES, CrossPointSettings::MAX_SLEEP_TIMEOUT_MINUTES, 1},
|
||||
"sleepTimeoutMinutes", StrId::STR_CAT_SYSTEM),
|
||||
SettingInfo::Toggle(StrId::STR_SHOW_HIDDEN_FILES, &CrossPointSettings::showHiddenFiles, "showHiddenFiles",
|
||||
StrId::STR_CAT_SYSTEM),
|
||||
SettingInfo::Toggle(StrId::STR_REMOVE_READ_FROM_RECENTS, &CrossPointSettings::removeReadBooksFromRecents,
|
||||
|
||||
@@ -32,6 +32,10 @@ struct PercentResult {
|
||||
int percent = 0;
|
||||
};
|
||||
|
||||
struct IntervalResult {
|
||||
uint32_t value = 0;
|
||||
};
|
||||
|
||||
struct PageResult {
|
||||
uint32_t page = 0;
|
||||
};
|
||||
@@ -55,7 +59,8 @@ struct FilePathResult {
|
||||
std::string path;
|
||||
};
|
||||
|
||||
using ResultVariant = std::variant<std::monostate, WifiResult, KeyboardResult, MenuResult, ChapterResult, PercentResult,
|
||||
using ResultVariant =
|
||||
std::variant<std::monostate, WifiResult, KeyboardResult, MenuResult, ChapterResult, PercentResult, IntervalResult,
|
||||
PageResult, ProgressChangeResult, NetworkModeResult, FootnoteResult, FilePathResult>;
|
||||
|
||||
struct ActivityResult {
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
#include <GfxRenderer.h>
|
||||
#include <Logging.h>
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
|
||||
#include "ButtonRemapActivity.h"
|
||||
#include "ClearCacheActivity.h"
|
||||
#include "CrossPointSettings.h"
|
||||
@@ -18,6 +22,7 @@
|
||||
#include "SettingsList.h"
|
||||
#include "StatusBarSettingsActivity.h"
|
||||
#include "activities/network/WifiSelectionActivity.h"
|
||||
#include "activities/util/IntervalSelectionActivity.h"
|
||||
#include "components/UITheme.h"
|
||||
#include "fontIds.h"
|
||||
|
||||
@@ -183,6 +188,11 @@ void SettingsActivity::toggleCurrentSetting() {
|
||||
const bool sleepScreenChanged = setting.valuePtr == &CrossPointSettings::sleepScreen;
|
||||
const bool quickResumeTimeoutChanged = setting.valuePtr == &CrossPointSettings::quickResumeSleepScreen;
|
||||
|
||||
if (setting.nameId == StrId::STR_TIME_TO_SLEEP) {
|
||||
openSleepTimeoutPicker();
|
||||
return;
|
||||
}
|
||||
|
||||
if (setting.type == SettingType::TOGGLE && setting.valuePtr != nullptr) {
|
||||
// Toggle the boolean value using the member pointer
|
||||
const bool currentValue = SETTINGS.*(setting.valuePtr);
|
||||
@@ -286,6 +296,22 @@ void SettingsActivity::syncQuickResumeTimeoutForSleepScreen(bool sleepScreenChan
|
||||
}
|
||||
}
|
||||
|
||||
void SettingsActivity::openSleepTimeoutPicker() {
|
||||
startActivityForResult(
|
||||
std::make_unique<IntervalSelectionActivity>(
|
||||
renderer, mappedInput, "SleepTimeoutInterval", StrId::STR_TIME_TO_SLEEP, StrId::STR_SLEEP_TIMER_STEP_HINT,
|
||||
SETTINGS.sleepTimeoutMinutes, CrossPointSettings::MIN_SLEEP_TIMEOUT_MINUTES,
|
||||
CrossPointSettings::MAX_SLEEP_TIMEOUT_MINUTES, 1, 5, StrId::STR_SLEEP_TIMER_VALUE_FORMAT, false, true,
|
||||
StrId::STR_SLEEP_NEVER),
|
||||
[this](const ActivityResult& result) {
|
||||
if (!result.isCancelled) {
|
||||
SETTINGS.sleepTimeoutMinutes = static_cast<uint8_t>(std::get<IntervalResult>(result.data).value);
|
||||
SETTINGS.saveToFile();
|
||||
}
|
||||
requestUpdate();
|
||||
});
|
||||
}
|
||||
|
||||
void SettingsActivity::render(RenderLock&&) {
|
||||
renderer.clearScreen();
|
||||
|
||||
@@ -330,16 +356,30 @@ void SettingsActivity::render(RenderLock&&) {
|
||||
valueText = I18N.get(setting.enumValues[value]);
|
||||
}
|
||||
} else if (setting.type == SettingType::VALUE && setting.valuePtr != nullptr) {
|
||||
if (setting.nameId == StrId::STR_TIME_TO_SLEEP) {
|
||||
char valueBuffer[32];
|
||||
if (SETTINGS.sleepTimeoutMinutes >= CrossPointSettings::SLEEP_TIMEOUT_NEVER_MINUTES) {
|
||||
valueText = tr(STR_SLEEP_NEVER);
|
||||
} else {
|
||||
snprintf(valueBuffer, sizeof(valueBuffer), tr(STR_SLEEP_TIMER_VALUE_FORMAT),
|
||||
static_cast<unsigned int>(SETTINGS.*(setting.valuePtr)));
|
||||
valueText = valueBuffer;
|
||||
}
|
||||
} else {
|
||||
valueText = std::to_string(SETTINGS.*(setting.valuePtr));
|
||||
}
|
||||
}
|
||||
return valueText;
|
||||
},
|
||||
true);
|
||||
|
||||
// Draw help text
|
||||
const auto confirmLabel = (selectedSettingIndex == 0)
|
||||
const auto confirmLabel =
|
||||
(selectedSettingIndex == 0)
|
||||
? I18N.get(categoryNames[(selectedCategoryIndex + 1) % categoryCount])
|
||||
: tr(STR_TOGGLE);
|
||||
: (selectedSettingIndex > 0 && (*currentSettings)[selectedSettingIndex - 1].nameId == StrId::STR_TIME_TO_SLEEP
|
||||
? tr(STR_SELECT)
|
||||
: tr(STR_TOGGLE));
|
||||
const auto labels = mappedInput.mapLabels(tr(STR_BACK), confirmLabel, tr(STR_DIR_UP), tr(STR_DIR_DOWN));
|
||||
GUI.drawButtonHints(renderer, labels.btn1, labels.btn2, labels.btn3, labels.btn4);
|
||||
|
||||
|
||||
@@ -164,6 +164,7 @@ class SettingsActivity final : public Activity {
|
||||
|
||||
void enterCategory(int categoryIndex);
|
||||
void toggleCurrentSetting();
|
||||
void openSleepTimeoutPicker();
|
||||
void rebuildSettingsLists();
|
||||
void syncQuickResumeTimeoutForSleepScreen(bool sleepScreenChanged, bool quickResumeTimeoutChanged);
|
||||
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
#include "IntervalSelectionActivity.h"
|
||||
|
||||
#include <GfxRenderer.h>
|
||||
#include <I18n.h>
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstdio>
|
||||
#include <utility>
|
||||
|
||||
#include "components/UITheme.h"
|
||||
#include "fontIds.h"
|
||||
|
||||
int IntervalSelectionActivity::clampedValue(const int candidate) const {
|
||||
return std::clamp(candidate, minValue, maxValue);
|
||||
}
|
||||
|
||||
void IntervalSelectionActivity::onEnter() {
|
||||
Activity::onEnter();
|
||||
value = clampedValue(value);
|
||||
requestUpdate();
|
||||
}
|
||||
|
||||
void IntervalSelectionActivity::adjustValue(const int delta) {
|
||||
value = clampedValue(value + delta);
|
||||
requestUpdate();
|
||||
}
|
||||
|
||||
void IntervalSelectionActivity::loop() {
|
||||
if (ignoreConfirmRelease) {
|
||||
if (mappedInput.wasReleased(MappedInputManager::Button::Confirm)) {
|
||||
ignoreConfirmRelease = false;
|
||||
return;
|
||||
}
|
||||
if (!mappedInput.isPressed(MappedInputManager::Button::Confirm)) {
|
||||
ignoreConfirmRelease = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (mappedInput.wasReleased(MappedInputManager::Button::Back)) {
|
||||
ActivityResult result;
|
||||
result.isCancelled = true;
|
||||
setResult(std::move(result));
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
|
||||
if (mappedInput.wasReleased(MappedInputManager::Button::Confirm)) {
|
||||
setResult(IntervalResult{static_cast<uint32_t>(value)});
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
|
||||
buttonNavigator.onPressAndContinuous({MappedInputManager::Button::Left}, [this] { adjustValue(-smallStep); });
|
||||
buttonNavigator.onPressAndContinuous({MappedInputManager::Button::Right}, [this] { adjustValue(smallStep); });
|
||||
buttonNavigator.onPressAndContinuous({MappedInputManager::Button::Up}, [this] { adjustValue(largeStep); });
|
||||
buttonNavigator.onPressAndContinuous({MappedInputManager::Button::Down}, [this] { adjustValue(-largeStep); });
|
||||
}
|
||||
|
||||
void IntervalSelectionActivity::render(RenderLock&&) {
|
||||
renderer.clearScreen();
|
||||
|
||||
renderer.drawCenteredText(UI_12_FONT_ID, 15, I18N.get(titleId), true, EpdFontFamily::BOLD);
|
||||
|
||||
char formattedValue[32];
|
||||
if (maxBoundaryLabelId != StrId::STR_NONE_OPT && value == maxValue) {
|
||||
snprintf(formattedValue, sizeof(formattedValue), "%s", I18N.get(maxBoundaryLabelId));
|
||||
} else if (valueFormatId != StrId::STR_NONE_OPT) {
|
||||
snprintf(formattedValue, sizeof(formattedValue), I18N.get(valueFormatId), static_cast<unsigned int>(value));
|
||||
} else {
|
||||
snprintf(formattedValue, sizeof(formattedValue), "%d", value);
|
||||
}
|
||||
renderer.drawCenteredText(UI_12_FONT_ID, 90, formattedValue, true, EpdFontFamily::BOLD);
|
||||
|
||||
const int screenWidth = renderer.getScreenWidth();
|
||||
const int barWidth = std::min(360, std::max(0, screenWidth - 40));
|
||||
constexpr int barHeight = 16;
|
||||
const int barX = std::max(0, (screenWidth - barWidth) / 2);
|
||||
const int barY = 140;
|
||||
|
||||
renderer.drawRect(barX, barY, barWidth, barHeight);
|
||||
|
||||
const int range = std::max(1, maxValue - minValue);
|
||||
const int fillWidth = (barWidth - 4) * (value - minValue) / range;
|
||||
if (fillWidth > 0) {
|
||||
renderer.fillRect(barX + 2, barY + 2, fillWidth, barHeight - 4);
|
||||
}
|
||||
|
||||
const int knobX = std::max(barX + 2, barX + 2 + fillWidth - 2);
|
||||
renderer.fillRect(knobX, barY - 4, 4, barHeight + 8, true);
|
||||
|
||||
renderer.drawCenteredText(SMALL_FONT_ID, barY + 30, I18N.get(stepHintId), true);
|
||||
|
||||
const auto labels = mappedInput.mapLabels(tr(STR_BACK), tr(STR_SELECT), "-", "+");
|
||||
GUI.drawButtonHints(renderer, labels.btn1, labels.btn2, labels.btn3, labels.btn4);
|
||||
|
||||
renderer.displayBuffer();
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
#pragma once
|
||||
|
||||
#include <I18n.h>
|
||||
|
||||
#include "MappedInputManager.h"
|
||||
#include "activities/Activity.h"
|
||||
#include "util/ButtonNavigator.h"
|
||||
|
||||
class GfxRenderer;
|
||||
|
||||
class IntervalSelectionActivity final : public Activity {
|
||||
public:
|
||||
explicit IntervalSelectionActivity(GfxRenderer& renderer, MappedInputManager& mappedInput, const char* activityName,
|
||||
StrId titleId, StrId stepHintId, int initialValue, int minValue, int maxValue,
|
||||
int smallStep, int largeStep, StrId valueFormatId = StrId::STR_NONE_OPT,
|
||||
bool readerActivity = false, bool ignoreInitialConfirmRelease = false,
|
||||
StrId maxBoundaryLabelId = StrId::STR_NONE_OPT)
|
||||
: Activity(activityName, renderer, mappedInput),
|
||||
titleId(titleId),
|
||||
stepHintId(stepHintId),
|
||||
valueFormatId(valueFormatId),
|
||||
maxBoundaryLabelId(maxBoundaryLabelId),
|
||||
value(initialValue),
|
||||
minValue(minValue),
|
||||
maxValue(maxValue),
|
||||
smallStep(smallStep),
|
||||
largeStep(largeStep),
|
||||
readerActivity(readerActivity),
|
||||
ignoreConfirmRelease(ignoreInitialConfirmRelease) {}
|
||||
|
||||
void onEnter() override;
|
||||
void loop() override;
|
||||
void render(RenderLock&&) override;
|
||||
bool isReaderActivity() const override { return readerActivity; }
|
||||
|
||||
private:
|
||||
StrId titleId;
|
||||
StrId stepHintId;
|
||||
StrId valueFormatId;
|
||||
StrId maxBoundaryLabelId;
|
||||
int value;
|
||||
int minValue;
|
||||
int maxValue;
|
||||
int smallStep;
|
||||
int largeStep;
|
||||
bool readerActivity;
|
||||
bool ignoreConfirmRelease;
|
||||
ButtonNavigator buttonNavigator;
|
||||
|
||||
void adjustValue(int delta);
|
||||
int clampedValue(int candidate) const;
|
||||
};
|
||||
+1
-1
@@ -574,7 +574,7 @@ void loop() {
|
||||
}
|
||||
|
||||
const unsigned long sleepTimeoutMs = SETTINGS.getSleepTimeoutMs();
|
||||
if (millis() - lastActivityTime >= sleepTimeoutMs) {
|
||||
if (sleepTimeoutMs > 0 && millis() - lastActivityTime >= sleepTimeoutMs) {
|
||||
LOG_DBG("SLP", "Auto-sleep triggered after %lu ms of inactivity", sleepTimeoutMs);
|
||||
enterDeepSleep(true);
|
||||
// This should never be hit as `enterDeepSleep` calls esp_deep_sleep_start
|
||||
|
||||
Reference in New Issue
Block a user