From 6ccbaad41c92cda5f637eef1cada933180bbcaea Mon Sep 17 00:00:00 2001 From: Przemek Pawlas <3606072+Destroy666x@users.noreply.github.com> Date: Wed, 18 Sep 2024 09:46:39 +0200 Subject: [PATCH] Add enhanced relative time to variable tab cells --- CMakeLists.txt | 2 ++ data/locale/de-DE.ini | 2 +- data/locale/en-US.ini | 10 ++++-- data/locale/es-ES.ini | 2 +- data/locale/fr-FR.ini | 2 +- data/locale/ja-JP.ini | 4 +-- data/locale/pt-BR.ini | 4 +-- data/locale/ru-RU.ini | 2 +- data/locale/tr-TR.ini | 2 +- data/locale/zh-CN.ini | 2 +- lib/utils/duration-control.cpp | 2 +- lib/utils/duration.cpp | 2 +- lib/utils/time-helpers.cpp | 63 ++++++++++++++++++++++++++++++++++ lib/utils/time-helpers.hpp | 8 +++++ lib/variables/variable-tab.cpp | 9 ++--- 15 files changed, 93 insertions(+), 23 deletions(-) create mode 100644 lib/utils/time-helpers.cpp create mode 100644 lib/utils/time-helpers.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index ba2972ee..3bee1280 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -255,6 +255,8 @@ target_sources( lib/utils/tab-helpers.hpp lib/utils/temp-variable.cpp lib/utils/temp-variable.hpp + lib/utils/time-helpers.cpp + lib/utils/time-helpers.hpp lib/utils/ui-helpers.cpp lib/utils/ui-helpers.hpp lib/utils/utility.cpp diff --git a/data/locale/de-DE.ini b/data/locale/de-DE.ini index 356e8118..cfbccb35 100644 --- a/data/locale/de-DE.ini +++ b/data/locale/de-DE.ini @@ -895,7 +895,7 @@ AdvSceneSwitcher.firstBootMessage="

Dies scheint das erste AdvSceneSwitcher.deprecatedTabWarning="Die Entwicklung für dieses Tab wurde gestoppt!\nBitte stattdessen zur Verwendung des Makros-Tab übergehen.\nDieser Hinweis kann im Allgemein-Tab deaktiviert werden." AdvSceneSwitcher.unit.milliseconds="Millisekunden" -AdvSceneSwitcher.unit.secends="Sekunden" +AdvSceneSwitcher.unit.seconds="Sekunden" AdvSceneSwitcher.unit.minutes="Minuten" AdvSceneSwitcher.unit.hours="Stunden" AdvSceneSwitcher.duration.condition.none="Kein Dauer-Modifikator" diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 25f75aa0..14d45a4f 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -82,10 +82,8 @@ AdvSceneSwitcher.variableTab.value.header="Value" AdvSceneSwitcher.variableTab.saveLoadBehavior.header="Save/Load behavior" AdvSceneSwitcher.variableTab.saveLoadBehavior.text.default="Default to \"%1\"" AdvSceneSwitcher.variableTab.lastUsed.header="Last used" -AdvSceneSwitcher.variableTab.lastUsed.text="%1 seconds ago" AdvSceneSwitcher.variableTab.lastUsed.text.never="Never" AdvSceneSwitcher.variableTab.lastChanged.header="Last changed" -AdvSceneSwitcher.variableTab.lastChanged.text="%1 seconds ago" AdvSceneSwitcher.variableTab.lastChanged.text.none="No change since launch" AdvSceneSwitcher.variableTab.lastChanged.tooltip="Times changed: %1\n\nPrevious value: %2" @@ -1926,15 +1924,21 @@ AdvSceneSwitcher.firstBootMessage="

This seems to be the fi AdvSceneSwitcher.deprecatedTabWarning="Development for this tab stopped!\nPlease consider transitioning to using Macros instead.\nThis hint can be disabled on the General tab." AdvSceneSwitcher.unit.milliseconds="milliseconds" -AdvSceneSwitcher.unit.secends="seconds" +AdvSceneSwitcher.unit.seconds="seconds" AdvSceneSwitcher.unit.minutes="minutes" AdvSceneSwitcher.unit.hours="hours" +AdvSceneSwitcher.unit.days="days" +AdvSceneSwitcher.unit.weeks="weeks" +AdvSceneSwitcher.unit.months="months" +AdvSceneSwitcher.unit.years="years" AdvSceneSwitcher.duration.condition.none="No duration modifier" AdvSceneSwitcher.duration.condition.more="For at least" AdvSceneSwitcher.duration.condition.equal="For exactly" AdvSceneSwitcher.duration.condition.less="For at most" AdvSceneSwitcher.duration.condition.within="Within the last" +AdvSceneSwitcher.time.relative="%1 %2 ago" + AdvSceneSwitcher.audio.monitor.none="Monitor Off" AdvSceneSwitcher.audio.monitor.monitorOnly="Monitor Only (mute output)" AdvSceneSwitcher.audio.monitor.both="Monitor and Output" diff --git a/data/locale/es-ES.ini b/data/locale/es-ES.ini index 8edb4329..a65e243a 100644 --- a/data/locale/es-ES.ini +++ b/data/locale/es-ES.ini @@ -740,7 +740,7 @@ AdvSceneSwitcher.firstBootMessage="

Esta parece ser la prim AdvSceneSwitcher.deprecatedTabWarning="¡Se detuvo el desarrollo de esta pestaña!\nConsidere cambiar a macros en su lugar.\nEsta sugerencia se puede desactivar en la pestaña General". AdvSceneSwitcher.unit.milliseconds="milisegundos" -AdvSceneSwitcher.unit.secends="segundos" +AdvSceneSwitcher.unit.seconds="segundos" AdvSceneSwitcher.unit.minutes="minutos" AdvSceneSwitcher.unit.hours="horas" AdvSceneSwitcher.duration.condition.none="Sin límite de tiempo" diff --git a/data/locale/fr-FR.ini b/data/locale/fr-FR.ini index e88bb759..ad5822a4 100644 --- a/data/locale/fr-FR.ini +++ b/data/locale/fr-FR.ini @@ -1182,7 +1182,7 @@ AdvSceneSwitcher.firstBootMessage="

Il semble que ce soit l AdvSceneSwitcher.deprecatedTabWarning="Le développement de cet onglet est terminé !\nVeuillez envisager de passer à l'utilisation des Macros à la place.\nCette astuce peut être désactivée dans l'onglet Général." AdvSceneSwitcher.unit.milliseconds="millisecondes" -AdvSceneSwitcher.unit.secends="secondes" +AdvSceneSwitcher.unit.seconds="secondes" AdvSceneSwitcher.unit.minutes="minutes" AdvSceneSwitcher.unit.hours="heures" AdvSceneSwitcher.duration.condition.none="Aucun modificateur de durée" diff --git a/data/locale/ja-JP.ini b/data/locale/ja-JP.ini index 52a0aa5b..98b82428 100644 --- a/data/locale/ja-JP.ini +++ b/data/locale/ja-JP.ini @@ -82,10 +82,8 @@ AdvSceneSwitcher.variableTab.value.header="値" AdvSceneSwitcher.variableTab.saveLoadBehavior.header="保存・読み込みの動作" AdvSceneSwitcher.variableTab.saveLoadBehavior.text.default="デフォルト\"%1\"" AdvSceneSwitcher.variableTab.lastUsed.header="最後に使用された" -AdvSceneSwitcher.variableTab.lastUsed.text="%1 秒前" ; AdvSceneSwitcher.variableTab.lastUsed.text.never="Never" AdvSceneSwitcher.variableTab.lastChanged.header="最終変更" -AdvSceneSwitcher.variableTab.lastChanged.text="%1 秒前" AdvSceneSwitcher.variableTab.lastChanged.text.none="起動以来変更なし" AdvSceneSwitcher.variableTab.lastChanged.tooltip="変更された時間: %1\n\n以前の値: %2" @@ -1920,7 +1918,7 @@ AdvSceneSwitcher.firstBootMessage="

高機能シーンス AdvSceneSwitcher.deprecatedTabWarning="このタブの開発は停止しました!\n代わりにマクロの使用に移行することを検討してください。\nこのヒントは [全般] タブで無効にすることができます。" AdvSceneSwitcher.unit.milliseconds="ミリ秒" -AdvSceneSwitcher.unit.secends="秒" +AdvSceneSwitcher.unit.seconds="秒" AdvSceneSwitcher.unit.minutes="分" AdvSceneSwitcher.unit.hours="時間" AdvSceneSwitcher.duration.condition.none="期間修飾子なし" diff --git a/data/locale/pt-BR.ini b/data/locale/pt-BR.ini index b011a05d..c1907e42 100644 --- a/data/locale/pt-BR.ini +++ b/data/locale/pt-BR.ini @@ -82,10 +82,8 @@ AdvSceneSwitcher.variableTab.value.header="Valor" AdvSceneSwitcher.variableTab.saveLoadBehavior.header="Comportamento de Salvar/Carregar" AdvSceneSwitcher.variableTab.saveLoadBehavior.text.default="Padrão para \"%1\"" AdvSceneSwitcher.variableTab.lastUsed.header="Último uso" -AdvSceneSwitcher.variableTab.lastUsed.text="%1 segundos atrás" AdvSceneSwitcher.variableTab.lastUsed.text.never="Nunca" AdvSceneSwitcher.variableTab.lastChanged.header="Última alteração" -AdvSceneSwitcher.variableTab.lastChanged.text="%1 segundos atrás" AdvSceneSwitcher.variableTab.lastChanged.text.none="Sem alterações desde o lançamento" AdvSceneSwitcher.variableTab.lastChanged.tooltip="Vezes alteradas: %1\n\nValor anterior: %2" @@ -1888,7 +1886,7 @@ AdvSceneSwitcher.firstBootMessage="

Parece que esta é a pr AdvSceneSwitcher.deprecatedTabWarning="Desenvolvimento para esta aba interrompido!\nPor favor, considere a transição para o uso de Macros em vez disso.\nEsta dica pode ser desativada na aba Geral." AdvSceneSwitcher.unit.milliseconds="milissegundos" -AdvSceneSwitcher.unit.secends="segundos" +AdvSceneSwitcher.unit.seconds="segundos" AdvSceneSwitcher.unit.minutes="minutos" AdvSceneSwitcher.unit.hours="horas" AdvSceneSwitcher.duration.condition.none="Nenhum modificador de duração" diff --git a/data/locale/ru-RU.ini b/data/locale/ru-RU.ini index 603178f1..add18aa4 100644 --- a/data/locale/ru-RU.ini +++ b/data/locale/ru-RU.ini @@ -399,6 +399,6 @@ AdvSceneSwitcher.status.active="Активный" AdvSceneSwitcher.status.inactive="Неактивен" AdvSceneSwitcher.unit.milliseconds="миллисекунды" -AdvSceneSwitcher.unit.secends="секунды" +AdvSceneSwitcher.unit.seconds="секунды" AdvSceneSwitcher.unit.minutes="минуты" AdvSceneSwitcher.unit.hours="часы" diff --git a/data/locale/tr-TR.ini b/data/locale/tr-TR.ini index d8d968ed..93e076db 100644 --- a/data/locale/tr-TR.ini +++ b/data/locale/tr-TR.ini @@ -645,7 +645,7 @@ AdvSceneSwitcher.stopped="Eklenti durdu" AdvSceneSwitcher.firstBootMessage="

Gelişmiş Sahne Değiştirici ilk kez başlatılıyor gibi görünüyor.
Lütfen Wiki için kılavuzlar ve örnekler listesi.
Yapmayın. eklentinin konu!

" AdvSceneSwitcher.unit.milliseconds="millisaniye" -AdvSceneSwitcher.unit.secends="saniye" +AdvSceneSwitcher.unit.seconds="saniye" AdvSceneSwitcher.unit.minutes="dakika" AdvSceneSwitcher.unit.hours="saat" AdvSceneSwitcher.duration.condition.none="Zaman kısıtlaması yok" diff --git a/data/locale/zh-CN.ini b/data/locale/zh-CN.ini index a7899361..cd649b70 100644 --- a/data/locale/zh-CN.ini +++ b/data/locale/zh-CN.ini @@ -1048,7 +1048,7 @@ AdvSceneSwitcher.firstBootMessage="

这似乎是第一次 AdvSceneSwitcher.deprecatedTabWarning="此选项卡的开发已停止!请考虑转换为使用宏来代替。\n可以在“常规”选项卡上禁用此提示." AdvSceneSwitcher.unit.milliseconds="毫秒" -AdvSceneSwitcher.unit.secends="秒" +AdvSceneSwitcher.unit.seconds="秒" AdvSceneSwitcher.unit.minutes="分钟" AdvSceneSwitcher.unit.hours="小时" AdvSceneSwitcher.duration.condition.none="没有时间限制" diff --git a/lib/utils/duration-control.cpp b/lib/utils/duration-control.cpp index d79a74c8..3f9d1fd5 100644 --- a/lib/utils/duration-control.cpp +++ b/lib/utils/duration-control.cpp @@ -8,7 +8,7 @@ namespace advss { static void populateUnits(QComboBox *list) { - list->addItem(obs_module_text("AdvSceneSwitcher.unit.secends")); + list->addItem(obs_module_text("AdvSceneSwitcher.unit.seconds")); list->addItem(obs_module_text("AdvSceneSwitcher.unit.minutes")); list->addItem(obs_module_text("AdvSceneSwitcher.unit.hours")); } diff --git a/lib/utils/duration.cpp b/lib/utils/duration.cpp index 73ae35a5..a6365ca7 100644 --- a/lib/utils/duration.cpp +++ b/lib/utils/duration.cpp @@ -115,7 +115,7 @@ static std::string durationUnitToString(Duration::Unit u) { switch (u) { case Duration::Unit::SECONDS: - return obs_module_text("AdvSceneSwitcher.unit.secends"); + return obs_module_text("AdvSceneSwitcher.unit.seconds"); case Duration::Unit::MINUTES: return obs_module_text("AdvSceneSwitcher.unit.minutes"); case Duration::Unit::HOURS: diff --git a/lib/utils/time-helpers.cpp b/lib/utils/time-helpers.cpp new file mode 100644 index 00000000..d723ff11 --- /dev/null +++ b/lib/utils/time-helpers.cpp @@ -0,0 +1,63 @@ +#include "time-helpers.hpp" +#include "obs-module-helper.hpp" + +namespace advss { + +static QString combineRelativeTimeParts(const double unitCount, + const char *unitName) +{ + QString combined = obs_module_text("AdvSceneSwitcher.time.relative"); + + return combined.arg(QString::number(unitCount, 'g', 2)).arg(unitName); +} + +QString FormatRelativeTime(const double seconds) +{ + // 365.2425 days + double divided = seconds / 31556952; + if (divided >= 1) { + return combineRelativeTimeParts( + divided, + obs_module_text("AdvSceneSwitcher.unit.years")); + } + + // 30.436875 days + divided = seconds / 2629746; + if (divided >= 1) { + return combineRelativeTimeParts( + divided, + obs_module_text("AdvSceneSwitcher.unit.months")); + } + + divided = seconds / 604800; + if (divided >= 1) { + return combineRelativeTimeParts( + divided, + obs_module_text("AdvSceneSwitcher.unit.weeks")); + } + + divided = seconds / 86400; + if (divided >= 1) { + return combineRelativeTimeParts( + divided, obs_module_text("AdvSceneSwitcher.unit.days")); + } + + divided = seconds / 3600; + if (divided >= 1) { + return combineRelativeTimeParts( + divided, + obs_module_text("AdvSceneSwitcher.unit.hours")); + } + + divided = seconds / 60; + if (divided >= 1) { + return combineRelativeTimeParts( + divided, + obs_module_text("AdvSceneSwitcher.unit.minutes")); + } + + return combineRelativeTimeParts( + seconds, obs_module_text("AdvSceneSwitcher.unit.seconds")); +} + +} // namespace advss diff --git a/lib/utils/time-helpers.hpp b/lib/utils/time-helpers.hpp new file mode 100644 index 00000000..ce297b0f --- /dev/null +++ b/lib/utils/time-helpers.hpp @@ -0,0 +1,8 @@ +#pragma once +#include + +namespace advss { + +QString FormatRelativeTime(const double seconds); + +} // namespace advss diff --git a/lib/variables/variable-tab.cpp b/lib/variables/variable-tab.cpp index f6bea14d..35689414 100644 --- a/lib/variables/variable-tab.cpp +++ b/lib/variables/variable-tab.cpp @@ -4,6 +4,7 @@ #include "plugin-state-helpers.hpp" #include "sync-helpers.hpp" #include "tab-helpers.hpp" +#include "time-helpers.hpp" #include "ui-helpers.hpp" #include "variable.hpp" @@ -93,9 +94,7 @@ static QString formatLastUsedText(Variable *variable) "AdvSceneSwitcher.variableTab.lastUsed.text.never"); } - QString text = - obs_module_text("AdvSceneSwitcher.variableTab.lastUsed.text"); - return text.arg(QString::number(*lastUsed)); + return FormatRelativeTime(*lastUsed); } static QString formatLastChangedText(Variable *variable) @@ -106,9 +105,7 @@ static QString formatLastChangedText(Variable *variable) "AdvSceneSwitcher.variableTab.lastChanged.text.none"); } - QString text = obs_module_text( - "AdvSceneSwitcher.variableTab.lastChanged.text"); - return text.arg(QString::number(*lastChanged)); + return FormatRelativeTime(*lastChanged); } static QString formatLastChangedTooltip(Variable *variable)