From d7ff9088f82f2017bfa79c93e2b0d8ce20d19da2 Mon Sep 17 00:00:00 2001 From: WarmUpTill <19472752+WarmUpTill@users.noreply.github.com> Date: Sat, 14 Feb 2026 22:58:29 +0100 Subject: [PATCH] Enable selecting multiple days in simple view of date condition --- data/locale/de-DE.ini | 29 +++--- data/locale/en-US.ini | 31 +++--- data/locale/es-ES.ini | 27 ++--- data/locale/fr-FR.ini | 27 ++--- data/locale/ja-JP.ini | 25 ++--- data/locale/pt-BR.ini | 29 +++--- data/locale/zh-CN.ini | 29 +++--- plugins/base/macro-condition-date.cpp | 142 ++++++++++++++++---------- plugins/base/macro-condition-date.hpp | 24 ++--- 9 files changed, 197 insertions(+), 166 deletions(-) diff --git a/data/locale/de-DE.ini b/data/locale/de-DE.ini index 524beffb..a5759590 100644 --- a/data/locale/de-DE.ini +++ b/data/locale/de-DE.ini @@ -291,14 +291,14 @@ AdvSceneSwitcher.condition.replay.state.started="Replay Buffer gestartet" AdvSceneSwitcher.condition.replay.state.saved="Replay Buffer gespeichert" AdvSceneSwitcher.condition.replay.entry="{{state}}" AdvSceneSwitcher.condition.date="Datum" -AdvSceneSwitcher.condition.date.anyDay="Beliebiger Tag" -AdvSceneSwitcher.condition.date.monday="Montag" -AdvSceneSwitcher.condition.date.tuesday="Dienstag" -AdvSceneSwitcher.condition.date.wednesday="Mittwoch" -AdvSceneSwitcher.condition.date.thursday="Donnerstag" -AdvSceneSwitcher.condition.date.friday="Freitag" -AdvSceneSwitcher.condition.date.saturday="Samstag" -AdvSceneSwitcher.condition.date.sunday="Sonntag" +AdvSceneSwitcher.day.any="Beliebiger Tag" +AdvSceneSwitcher.day.monday="Montag" +AdvSceneSwitcher.day.tuesday="Dienstag" +AdvSceneSwitcher.day.wednesday="Mittwoch" +AdvSceneSwitcher.day.thursday="Donnerstag" +AdvSceneSwitcher.day.friday="Freitag" +AdvSceneSwitcher.day.saturday="Samstag" +AdvSceneSwitcher.day.sunday="Sonntag" AdvSceneSwitcher.condition.date.state.at="Am" AdvSceneSwitcher.condition.date.state.after="Nach" AdvSceneSwitcher.condition.date.state.before="Vor" @@ -309,12 +309,13 @@ AdvSceneSwitcher.condition.date.ignoreDate="Wenn diese Option nicht aktiviert is AdvSceneSwitcher.condition.date.ignoreTime="Wenn diese Option nicht aktiviert ist, wird die Zeitkomponente ignoriert" AdvSceneSwitcher.condition.date.showAdvancedSettings="Erweiterte Einstellungen anzeigen" AdvSceneSwitcher.condition.date.showSimpleSettings="Einfache Einstellungen anzeigen" -AdvSceneSwitcher.condition.date.entry.simple="Am {{dayOfWeek}} {{weekCondition}} {{ignoreWeekTime}}{{weekTime}}" -AdvSceneSwitcher.condition.date.entry.advanced="{{condition}} {{ignoreDate}}{{date}} {{ignoreTime}}{{time}} {{separator}} {{date2}} {{time2}}" -AdvSceneSwitcher.condition.date.entry.repeat="{{repeat}} Wiederholen alle {{duration}} bei Datumsübereinstimmung" -AdvSceneSwitcher.condition.date.entry.pattern="Aktuelles Datum \"{{currentDate}}\" entspricht dem Muster {{pattern}}" -AdvSceneSwitcher.condition.date.entry.nextMatchDate="Nächster Treffer bei: %1" -AdvSceneSwitcher.condition.date.entry.updateOnRepeat="{{updateOnRepeat}} Bei Wiederholung ausgewähltes Datum auf Wiederholungsdatum aktualisieren" +AdvSceneSwitcher.condition.date.layout.simple.day="Am{{dayOfWeek}}" +AdvSceneSwitcher.condition.date.layout.simple.time="{{ignoreWeekTime}}{{weekCondition}}{{weekTime}}" +AdvSceneSwitcher.condition.date.layout.advanced="{{condition}} {{ignoreDate}}{{date}} {{ignoreTime}}{{time}} {{separator}} {{date2}} {{time2}}" +AdvSceneSwitcher.condition.date.layout.repeat="{{repeat}} Wiederholen alle {{duration}} bei Datumsübereinstimmung" +AdvSceneSwitcher.condition.date.layout.pattern="Aktuelles Datum \"{{currentDate}}\" entspricht dem Muster {{pattern}}" +AdvSceneSwitcher.condition.date.layout.nextMatchDate="Nächster Treffer bei: %1" +AdvSceneSwitcher.condition.date.layout.updateOnRepeat="{{updateOnRepeat}} Bei Wiederholung ausgewähltes Datum auf Wiederholungsdatum aktualisieren" AdvSceneSwitcher.condition.sceneTransform="Szenenelement transformieren" AdvSceneSwitcher.condition.sceneTransform.getTransform="Transformation erhalten" AdvSceneSwitcher.condition.sceneTransform.condition.match="entspricht Transformation" diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 4d0913fe..edcf147e 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -589,14 +589,6 @@ AdvSceneSwitcher.condition.replay.state.started="Replay buffer started" AdvSceneSwitcher.condition.replay.state.saved="Replay buffer saved" AdvSceneSwitcher.condition.replay.entry="{{state}}" AdvSceneSwitcher.condition.date="Date" -AdvSceneSwitcher.condition.date.anyDay="Any day" -AdvSceneSwitcher.condition.date.monday="Monday" -AdvSceneSwitcher.condition.date.tuesday="Tuesday" -AdvSceneSwitcher.condition.date.wednesday="Wednesday" -AdvSceneSwitcher.condition.date.thursday="Thursday" -AdvSceneSwitcher.condition.date.friday="Friday" -AdvSceneSwitcher.condition.date.saturday="Saturday" -AdvSceneSwitcher.condition.date.sunday="Sunday" AdvSceneSwitcher.condition.date.state.at="At" AdvSceneSwitcher.condition.date.state.after="After" AdvSceneSwitcher.condition.date.state.before="Before" @@ -607,12 +599,13 @@ AdvSceneSwitcher.condition.date.ignoreDate="If unchecked the date component will AdvSceneSwitcher.condition.date.ignoreTime="If unchecked the time component will be ignored" AdvSceneSwitcher.condition.date.showAdvancedSettings="Show advanced settings" AdvSceneSwitcher.condition.date.showSimpleSettings="Show simple settings" -AdvSceneSwitcher.condition.date.entry.simple="On{{dayOfWeek}}{{weekCondition}}{{ignoreWeekTime}}{{weekTime}}" -AdvSceneSwitcher.condition.date.entry.advanced="{{condition}}{{ignoreDate}}{{date}}{{ignoreTime}}{{time}}{{separator}}{{date2}}{{time2}}" -AdvSceneSwitcher.condition.date.entry.repeat="{{repeat}}Repeat every{{duration}}on date match" -AdvSceneSwitcher.condition.date.entry.pattern="Current date \"{{currentDate}}\" matches pattern{{pattern}}" -AdvSceneSwitcher.condition.date.entry.nextMatchDate="Next match at: %1" -AdvSceneSwitcher.condition.date.entry.updateOnRepeat="{{updateOnRepeat}}On repeat update selected date to repeat date" +AdvSceneSwitcher.condition.date.layout.simple.day="On{{dayOfWeek}}" +AdvSceneSwitcher.condition.date.layout.simple.time="{{ignoreWeekTime}}{{weekCondition}}{{weekTime}}" +AdvSceneSwitcher.condition.date.layout.advanced="{{condition}}{{ignoreDate}}{{date}}{{ignoreTime}}{{time}}{{separator}}{{date2}}{{time2}}" +AdvSceneSwitcher.condition.date.layout.repeat="{{repeat}}Repeat every{{duration}}on date match" +AdvSceneSwitcher.condition.date.layout.pattern="Current date \"{{currentDate}}\" matches pattern{{pattern}}" +AdvSceneSwitcher.condition.date.layout.nextMatchDate="Next match at: %1" +AdvSceneSwitcher.condition.date.layout.updateOnRepeat="{{updateOnRepeat}}On repeat update selected date to repeat date" AdvSceneSwitcher.condition.sceneTransform="Scene item transform" AdvSceneSwitcher.condition.sceneTransform.getTransform="Get transform" AdvSceneSwitcher.condition.sceneTransform.getCurrentValue="Get current value" @@ -2474,6 +2467,16 @@ AdvSceneSwitcher.clearBufferOnMatch="Clear message buffer when matching message AdvSceneSwitcher.script.settings="Settings" AdvSceneSwitcher.script.timeout="Script timeout:{{timeout}}" +AdvSceneSwitcher.day.monday="Monday" +AdvSceneSwitcher.day.tuesday="Tuesday" +AdvSceneSwitcher.day.wednesday="Wednesday" +AdvSceneSwitcher.day.thursday="Thursday" +AdvSceneSwitcher.day.friday="Friday" +AdvSceneSwitcher.day.saturday="Saturday" +AdvSceneSwitcher.day.sunday="Sunday" +AdvSceneSwitcher.day.none="No day" +AdvSceneSwitcher.day.any="Any day" + # This secion is copied from the OBS locale files # OBS commonly shared locale diff --git a/data/locale/es-ES.ini b/data/locale/es-ES.ini index 7094859f..ca486fbe 100644 --- a/data/locale/es-ES.ini +++ b/data/locale/es-ES.ini @@ -241,14 +241,14 @@ AdvSceneSwitcher.condition.replay.state.started="Búfer de reproducción iniciad AdvSceneSwitcher.condition.replay.state.saved="Búfer de reproducción guardado" AdvSceneSwitcher.condition.replay.entry="{{state}}" AdvSceneSwitcher.condition.date="Fecha" -AdvSceneSwitcher.condition.date.anyDay="Cualquier día" -AdvSceneSwitcher.condition.date.monday="Lunes" -AdvSceneSwitcher.condition.date.tuesday="Martes" -AdvSceneSwitcher.condition.date.wednesday="Miércoles" -AdvSceneSwitcher.condition.date.thursday="Jueves" -AdvSceneSwitcher.condition.date.friday="Viernes" -AdvSceneSwitcher.condition.date.saturday="Sábado" -AdvSceneSwitcher.condition.date.sunday="Domingo" +AdvSceneSwitcher.day.any="Cualquier día" +AdvSceneSwitcher.day.monday="Lunes" +AdvSceneSwitcher.day.tuesday="Martes" +AdvSceneSwitcher.day.wednesday="Miércoles" +AdvSceneSwitcher.day.thursday="Jueves" +AdvSceneSwitcher.day.friday="Viernes" +AdvSceneSwitcher.day.saturday="Sábado" +AdvSceneSwitcher.day.sunday="Domingo" AdvSceneSwitcher.condition.date.state.at="A las" AdvSceneSwitcher.condition.date.state.after="Después" AdvSceneSwitcher.condition.date.state.before="Antes" @@ -258,11 +258,12 @@ AdvSceneSwitcher.condition.date.ignoreDate="Si no se marca, se ignorará el comp AdvSceneSwitcher.condition.date.ignoreTime="Si no se marca, se ignorará el componente de tiempo" AdvSceneSwitcher.condition.date.showAdvancedSettings="Mostrar configuración avanzada" AdvSceneSwitcher.condition.date.showSimpleSettings="Mostrar configuración simple" -AdvSceneSwitcher.condition.date.entry.simple="El {{dayOfWeek}} {{weekCondition}} {{ignoreWeekTime}}{{weekTime}}" -AdvSceneSwitcher.condition.date.entry.advanced="{{condition}} {{ignoreDate}}{{date}} {{ignoreTime}}{{time}} {{separator}} {{date2}} {{time2}}" -AdvSceneSwitcher.condition.date.entry.repeat="{{repeat}} Repetir cada {{duration}} en la coincidencia de fechas" -AdvSceneSwitcher.condition.date.entry.nextMatchDate="Próxima coincidencia en: %1" -AdvSceneSwitcher.condition.date.entry.updateOnRepeat="{{updateOnRepeat}} Al repetir actualizar la fecha seleccionada para repetir la fecha" +AdvSceneSwitcher.condition.date.layout.simple.day="El{{dayOfWeek}}" +AdvSceneSwitcher.condition.date.layout.simple.time="{{ignoreWeekTime}}{{weekCondition}}{{weekTime}}" +AdvSceneSwitcher.condition.date.layout.advanced="{{condition}} {{ignoreDate}}{{date}} {{ignoreTime}}{{time}} {{separator}} {{date2}} {{time2}}" +AdvSceneSwitcher.condition.date.layout.repeat="{{repeat}} Repetir cada {{duration}} en la coincidencia de fechas" +AdvSceneSwitcher.condition.date.layout.nextMatchDate="Próxima coincidencia en: %1" +AdvSceneSwitcher.condition.date.layout.updateOnRepeat="{{updateOnRepeat}} Al repetir actualizar la fecha seleccionada para repetir la fecha" AdvSceneSwitcher.condition.sceneTransform="Transformar elemento de escena" AdvSceneSwitcher.condition.sceneTransform.getTransform="Obtener transformación" AdvSceneSwitcher.condition.sceneTransform.condition.match="coincide con la transformación" diff --git a/data/locale/fr-FR.ini b/data/locale/fr-FR.ini index 0929f6df..eff1b69b 100644 --- a/data/locale/fr-FR.ini +++ b/data/locale/fr-FR.ini @@ -356,14 +356,14 @@ AdvSceneSwitcher.condition.replay.state.stopped="Tampon de répétition arrêté AdvSceneSwitcher.condition.replay.state.started="Tampon de répétition démarré" AdvSceneSwitcher.condition.replay.state.saved="Tampon de répétition enregistré" AdvSceneSwitcher.condition.date="Date" -AdvSceneSwitcher.condition.date.anyDay="N'importe quel jour" -AdvSceneSwitcher.condition.date.monday="Lundi" -AdvSceneSwitcher.condition.date.tuesday="Mardi" -AdvSceneSwitcher.condition.date.wednesday="Mercredi" -AdvSceneSwitcher.condition.date.thursday="Jeudi" -AdvSceneSwitcher.condition.date.friday="Vendredi" -AdvSceneSwitcher.condition.date.saturday="Samedi" -AdvSceneSwitcher.condition.date.sunday="Dimanche" +AdvSceneSwitcher.day.any="N'importe quel jour" +AdvSceneSwitcher.day.monday="Lundi" +AdvSceneSwitcher.day.tuesday="Mardi" +AdvSceneSwitcher.day.wednesday="Mercredi" +AdvSceneSwitcher.day.thursday="Jeudi" +AdvSceneSwitcher.day.friday="Vendredi" +AdvSceneSwitcher.day.saturday="Samedi" +AdvSceneSwitcher.day.sunday="Dimanche" AdvSceneSwitcher.condition.date.state.at="À" AdvSceneSwitcher.condition.date.state.after="Après" AdvSceneSwitcher.condition.date.state.before="Avant" @@ -374,11 +374,12 @@ AdvSceneSwitcher.condition.date.ignoreDate="Si non cochée, la composante date s AdvSceneSwitcher.condition.date.ignoreTime="Si non cochée, la composante heure sera ignorée" AdvSceneSwitcher.condition.date.showAdvancedSettings="Afficher les paramètres avancés" AdvSceneSwitcher.condition.date.showSimpleSettings="Afficher les paramètres simples" -AdvSceneSwitcher.condition.date.entry.simple="Le{{dayOfWeek}}{{weekCondition}}{{ignoreWeekTime}}{{weekTime}}" -AdvSceneSwitcher.condition.date.entry.repeat="{{repeat}}Répéter toutes les{{duration}}lorsque la date correspond" -AdvSceneSwitcher.condition.date.entry.pattern="La date actuelle \"{{currentDate}}\" correspond au motif{{pattern}}" -AdvSceneSwitcher.condition.date.entry.nextMatchDate="Prochaine correspondance à : %1" -AdvSceneSwitcher.condition.date.entry.updateOnRepeat="{{updateOnRepeat}}À la répétition, mettre à jour la date sélectionnée pour la date de répétition" +AdvSceneSwitcher.condition.date.layout.simple.day="Le{{dayOfWeek}}" +AdvSceneSwitcher.condition.date.layout.simple.time="{{ignoreWeekTime}}{{weekCondition}}{{weekTime}}" +AdvSceneSwitcher.condition.date.layout.repeat="{{repeat}}Répéter toutes les{{duration}}lorsque la date correspond" +AdvSceneSwitcher.condition.date.layout.pattern="La date actuelle \"{{currentDate}}\" correspond au motif{{pattern}}" +AdvSceneSwitcher.condition.date.layout.nextMatchDate="Prochaine correspondance à : %1" +AdvSceneSwitcher.condition.date.layout.updateOnRepeat="{{updateOnRepeat}}À la répétition, mettre à jour la date sélectionnée pour la date de répétition" AdvSceneSwitcher.condition.sceneTransform="Transformation de l'élément de la scène" AdvSceneSwitcher.condition.sceneTransform.getTransform="Obtenir la transformation" AdvSceneSwitcher.condition.sceneTransform.condition.match="correspond à la transformation" diff --git a/data/locale/ja-JP.ini b/data/locale/ja-JP.ini index d5f8b53b..fc579cce 100644 --- a/data/locale/ja-JP.ini +++ b/data/locale/ja-JP.ini @@ -555,14 +555,14 @@ AdvSceneSwitcher.condition.replay.state.started="リプレイバッファを開 AdvSceneSwitcher.condition.replay.state.saved="リプレイバッファを保存" ; AdvSceneSwitcher.condition.replay.entry="{{state}}" AdvSceneSwitcher.condition.date="日付条件" -AdvSceneSwitcher.condition.date.anyDay="いつでも" -AdvSceneSwitcher.condition.date.monday="月曜日" -AdvSceneSwitcher.condition.date.tuesday="火曜日" -AdvSceneSwitcher.condition.date.wednesday="水曜日" -AdvSceneSwitcher.condition.date.thursday="木曜日" -AdvSceneSwitcher.condition.date.friday="金曜日" -AdvSceneSwitcher.condition.date.saturday="土曜日" -AdvSceneSwitcher.condition.date.sunday="日曜日" +AdvSceneSwitcher.day.any="いつでも" +AdvSceneSwitcher.day.monday="月曜日" +AdvSceneSwitcher.day.tuesday="火曜日" +AdvSceneSwitcher.day.wednesday="水曜日" +AdvSceneSwitcher.day.thursday="木曜日" +AdvSceneSwitcher.day.friday="金曜日" +AdvSceneSwitcher.day.saturday="土曜日" +AdvSceneSwitcher.day.sunday="日曜日" ; AdvSceneSwitcher.condition.date.state.at="At" AdvSceneSwitcher.condition.date.state.after="アフター" AdvSceneSwitcher.condition.date.state.before="前" @@ -573,12 +573,9 @@ AdvSceneSwitcher.condition.date.ignoreDate="チェックを外すと日付部分 AdvSceneSwitcher.condition.date.ignoreTime="チェックを外すと時間要素は無視されます" AdvSceneSwitcher.condition.date.showAdvancedSettings="詳細設定を表示" AdvSceneSwitcher.condition.date.showSimpleSettings="簡単設定を表示" -; AdvSceneSwitcher.condition.date.entry.simple="On{{dayOfWeek}}{{weekCondition}}{{ignoreWeekTime}}{{weekTime}}" -; AdvSceneSwitcher.condition.date.entry.advanced="{{condition}}{{ignoreDate}}{{date}}{{ignoreTime}}{{time}}{{separator}}{{date2}}{{time2}}" -AdvSceneSwitcher.condition.date.entry.repeat="{{repeat}}日付の一致ごとに{{duration}}繰り返します" -AdvSceneSwitcher.condition.date.entry.pattern="現在の日付「{{currentDate}}」はパターン{{pattern}}と一致します" -; AdvSceneSwitcher.condition.date.entry.nextMatchDate="Next match at: %1" -AdvSceneSwitcher.condition.date.entry.updateOnRepeat="{{updateOnRepeat}}繰り返しの場合、選択した日付を繰り返しの日付に更新します" +AdvSceneSwitcher.condition.date.layout.repeat="{{repeat}}日付の一致ごとに{{duration}}繰り返します" +AdvSceneSwitcher.condition.date.layout.pattern="現在の日付「{{currentDate}}」はパターン{{pattern}}と一致します" +AdvSceneSwitcher.condition.date.layout.updateOnRepeat="{{updateOnRepeat}}繰り返しの場合、選択した日付を繰り返しの日付に更新します" ; AdvSceneSwitcher.condition.sceneTransform="Scene item transform" ; AdvSceneSwitcher.condition.sceneTransform.getTransform="Get transform" AdvSceneSwitcher.condition.sceneTransform.getCurrentValue="現在の値を取得" diff --git a/data/locale/pt-BR.ini b/data/locale/pt-BR.ini index ac497cad..c5fcd6db 100644 --- a/data/locale/pt-BR.ini +++ b/data/locale/pt-BR.ini @@ -502,14 +502,14 @@ AdvSceneSwitcher.condition.replay.state.started="Buffer de replay iniciado" AdvSceneSwitcher.condition.replay.state.saved="Buffer de replay salvo" AdvSceneSwitcher.condition.replay.entry="{{state}}" AdvSceneSwitcher.condition.date="Data" -AdvSceneSwitcher.condition.date.anyDay="Qualquer dia" -AdvSceneSwitcher.condition.date.monday="Segunda-feira" -AdvSceneSwitcher.condition.date.tuesday="Terça-feira" -AdvSceneSwitcher.condition.date.wednesday="Quarta-feira" -AdvSceneSwitcher.condition.date.thursday="Quinta-feira" -AdvSceneSwitcher.condition.date.friday="Sexta-feira" -AdvSceneSwitcher.condition.date.saturday="Sábado" -AdvSceneSwitcher.condition.date.sunday="Domingo" +AdvSceneSwitcher.day.any="Qualquer dia" +AdvSceneSwitcher.day.monday="Segunda-feira" +AdvSceneSwitcher.day.tuesday="Terça-feira" +AdvSceneSwitcher.day.wednesday="Quarta-feira" +AdvSceneSwitcher.day.thursday="Quinta-feira" +AdvSceneSwitcher.day.friday="Sexta-feira" +AdvSceneSwitcher.day.saturday="Sábado" +AdvSceneSwitcher.day.sunday="Domingo" AdvSceneSwitcher.condition.date.state.at="Às" AdvSceneSwitcher.condition.date.state.after="Após" AdvSceneSwitcher.condition.date.state.before="Antes" @@ -520,12 +520,13 @@ AdvSceneSwitcher.condition.date.ignoreDate="Se desmarcado, o componente de data AdvSceneSwitcher.condition.date.ignoreTime="Se desmarcado, o componente de tempo será ignorado" AdvSceneSwitcher.condition.date.showAdvancedSettings="Mostrar configurações avançadas" AdvSceneSwitcher.condition.date.showSimpleSettings="Mostrar configurações simples" -AdvSceneSwitcher.condition.date.entry.simple="Em{{dayOfWeek}}{{weekCondition}}{{ignoreWeekTime}}{{weekTime}}" -AdvSceneSwitcher.condition.date.entry.advanced="{{condition}}{{ignoreDate}}{{date}}{{ignoreTime}}{{time}}{{separator}}{{date2}}{{time2}}" -AdvSceneSwitcher.condition.date.entry.repeat="{{repeat}}Repetir a cada{{duration}}em correspondência de data" -AdvSceneSwitcher.condition.date.entry.pattern="Data atual \"{{currentDate}}\" corresponde ao padrão{{pattern}}" -AdvSceneSwitcher.condition.date.entry.nextMatchDate="Próxima correspondência em: %1" -AdvSceneSwitcher.condition.date.entry.updateOnRepeat="{{updateOnRepeat}}Ao repetir, atualize a data selecionada para a data de repetição" +AdvSceneSwitcher.condition.date.layout.simple.day="Em{{dayOfWeek}}" +AdvSceneSwitcher.condition.date.layout.simple.time="{{ignoreWeekTime}}{{weekCondition}}{{weekTime}}" +AdvSceneSwitcher.condition.date.layout.advanced="{{condition}}{{ignoreDate}}{{date}}{{ignoreTime}}{{time}}{{separator}}{{date2}}{{time2}}" +AdvSceneSwitcher.condition.date.layout.repeat="{{repeat}}Repetir a cada{{duration}}em correspondência de data" +AdvSceneSwitcher.condition.date.layout.pattern="Data atual \"{{currentDate}}\" corresponde ao padrão{{pattern}}" +AdvSceneSwitcher.condition.date.layout.nextMatchDate="Próxima correspondência em: %1" +AdvSceneSwitcher.condition.date.layout.updateOnRepeat="{{updateOnRepeat}}Ao repetir, atualize a data selecionada para a data de repetição" AdvSceneSwitcher.condition.sceneTransform="Transformação do item de cena" AdvSceneSwitcher.condition.sceneTransform.getTransform="Obter transformação" AdvSceneSwitcher.condition.sceneTransform.getCurrentValue="Obter valor atual" diff --git a/data/locale/zh-CN.ini b/data/locale/zh-CN.ini index 72932aa8..ac7d2060 100644 --- a/data/locale/zh-CN.ini +++ b/data/locale/zh-CN.ini @@ -530,14 +530,14 @@ AdvSceneSwitcher.condition.replay.state.started="回放缓存已启动" AdvSceneSwitcher.condition.replay.state.saved="已保存回放缓存" AdvSceneSwitcher.condition.replay.entry="{{state}}" AdvSceneSwitcher.condition.date="日期" -AdvSceneSwitcher.condition.date.anyDay="每一天" -AdvSceneSwitcher.condition.date.monday="周一" -AdvSceneSwitcher.condition.date.tuesday="周二" -AdvSceneSwitcher.condition.date.wednesday="周三" -AdvSceneSwitcher.condition.date.thursday="周四" -AdvSceneSwitcher.condition.date.friday="周五" -AdvSceneSwitcher.condition.date.saturday="周六" -AdvSceneSwitcher.condition.date.sunday="周日" +AdvSceneSwitcher.day.any="每一天" +AdvSceneSwitcher.day.monday="周一" +AdvSceneSwitcher.day.tuesday="周二" +AdvSceneSwitcher.day.wednesday="周三" +AdvSceneSwitcher.day.thursday="周四" +AdvSceneSwitcher.day.friday="周五" +AdvSceneSwitcher.day.saturday="周六" +AdvSceneSwitcher.day.sunday="周日" AdvSceneSwitcher.condition.date.state.at="现在" AdvSceneSwitcher.condition.date.state.after="之后" AdvSceneSwitcher.condition.date.state.before="之前" @@ -548,12 +548,13 @@ AdvSceneSwitcher.condition.date.ignoreDate="如果未选中,日期组件将被 AdvSceneSwitcher.condition.date.ignoreTime="如果未选中,时间组件将被忽略" AdvSceneSwitcher.condition.date.showAdvancedSettings="显示高级设置" AdvSceneSwitcher.condition.date.showSimpleSettings="显示简单设置" -AdvSceneSwitcher.condition.date.entry.simple="{{dayOfWeek}}{{weekCondition}}{{ignoreWeekTime}}{{weekTime}}" -AdvSceneSwitcher.condition.date.entry.advanced="{{condition}}{{ignoreDate}}{{date}}{{ignoreTime}}{{time}}{{separator}}{{date2}}{{time2}}" -AdvSceneSwitcher.condition.date.entry.repeat="{{repeat}} 每 {{duration}} 重复一次时间/日期匹配" -AdvSceneSwitcher.condition.date.entry.pattern="当前日期 \"{{currentDate}}\" 与 {{pattern}} 模式匹配 , 例子:2025 03 18 24 00 00 = .... .. .. .. .. .. ,难崩,我测试了一段时间才明白" -AdvSceneSwitcher.condition.date.entry.nextMatchDate="下一次匹配 在: %1" -AdvSceneSwitcher.condition.date.entry.updateOnRepeat="{{updateOnRepeat}} 在重复时将选定日期更新为重复日期" +AdvSceneSwitcher.condition.date.layout.simple.day="{{dayOfWeek}}" +AdvSceneSwitcher.condition.date.layout.simple.time="{{ignoreWeekTime}}{{weekCondition}}{{weekTime}}" +AdvSceneSwitcher.condition.date.layout.advanced="{{condition}}{{ignoreDate}}{{date}}{{ignoreTime}}{{time}}{{separator}}{{date2}}{{time2}}" +AdvSceneSwitcher.condition.date.layout.repeat="{{repeat}} 每 {{duration}} 重复一次时间/日期匹配" +AdvSceneSwitcher.condition.date.layout.pattern="当前日期 \"{{currentDate}}\" 与 {{pattern}} 模式匹配 , 例子:2025 03 18 24 00 00 = .... .. .. .. .. .. ,难崩,我测试了一段时间才明白" +AdvSceneSwitcher.condition.date.layout.nextMatchDate="下一次匹配 在: %1" +AdvSceneSwitcher.condition.date.layout.updateOnRepeat="{{updateOnRepeat}} 在重复时将选定日期更新为重复日期" AdvSceneSwitcher.condition.sceneTransform="场景项目变换" AdvSceneSwitcher.condition.sceneTransform.getTransform="获取变换" AdvSceneSwitcher.condition.sceneTransform.getCurrentValue="获取当前值" diff --git a/plugins/base/macro-condition-date.cpp b/plugins/base/macro-condition-date.cpp index e1e478c7..ed2b0262 100644 --- a/plugins/base/macro-condition-date.cpp +++ b/plugins/base/macro-condition-date.cpp @@ -38,32 +38,13 @@ const static std::map "AdvSceneSwitcher.condition.date.state.before"}, }; -const static std::map dayOfWeekNames = { - {MacroConditionDate::Day::ANY, - "AdvSceneSwitcher.condition.date.anyDay"}, - {MacroConditionDate::Day::MONDAY, - "AdvSceneSwitcher.condition.date.monday"}, - {MacroConditionDate::Day::TUESDAY, - "AdvSceneSwitcher.condition.date.tuesday"}, - {MacroConditionDate::Day::WEDNESDAY, - "AdvSceneSwitcher.condition.date.wednesday"}, - {MacroConditionDate::Day::THURSDAY, - "AdvSceneSwitcher.condition.date.thursday"}, - {MacroConditionDate::Day::FRIDAY, - "AdvSceneSwitcher.condition.date.friday"}, - {MacroConditionDate::Day::SATURDAY, - "AdvSceneSwitcher.condition.date.saturday"}, - {MacroConditionDate::Day::SUNDAY, - "AdvSceneSwitcher.condition.date.sunday"}, -}; - bool MacroConditionDate::CheckDayOfWeek(int64_t msSinceLastCheck) { QDateTime cur = QDateTime::currentDateTime(); SetVariables(cur); - if (_dayOfWeek != Day::ANY && - cur.date().dayOfWeek() != static_cast(_dayOfWeek)) { + if (!_days.contains(static_cast( + cur.date().dayOfWeek()))) { return false; } if (_ignoreTime) { @@ -201,7 +182,7 @@ bool MacroConditionDate::CheckCondition() bool MacroConditionDate::Save(obs_data_t *obj) const { MacroCondition::Save(obj); - obs_data_set_int(obj, "dayOfWeek", static_cast(_dayOfWeek)); + SaveSelectedDays(obj, _days); obs_data_set_int(obj, "condition", static_cast(_condition)); const auto &dateToSave = _updateOnRepeat ? _dateTime : _origDateTime; const auto &dateToSave2 = _updateOnRepeat ? _dateTime2 : _origDateTime2; @@ -216,13 +197,14 @@ bool MacroConditionDate::Save(obs_data_t *obj) const _duration.Save(obj); obs_data_set_bool(obj, "dayOfWeekCheck", _dayOfWeekCheck); obs_data_set_string(obj, "pattern", _pattern.c_str()); + obs_data_set_int(obj, "version", 1); return true; } bool MacroConditionDate::Load(obs_data_t *obj) { MacroCondition::Load(obj); - _dayOfWeek = static_cast(obs_data_get_int(obj, "dayOfWeek")); + _days = LoadSelectedDays(obj); _condition = static_cast( obs_data_get_int(obj, "condition")); _dateTime = QDateTime::fromString( @@ -245,17 +227,64 @@ bool MacroConditionDate::Load(obs_data_t *obj) _condition == MacroConditionDate::Condition::BETWEEN) { _condition = MacroConditionDate::Condition::AT; } + + if (!obs_data_has_user_value(obj, "version")) { + enum class Day { + ANY = 0, + MONDAY, + TUESDAY, + WEDNESDAY, + THURSDAY, + FRIDAY, + SATURDAY, + SUNDAY, + }; + auto oldDay = + static_cast(obs_data_get_int(obj, "dayOfWeek")); + switch (oldDay) { + case Day::ANY: + _days = {DayOfWeekSelector::Monday, + DayOfWeekSelector::Tuesday, + DayOfWeekSelector::Wednesday, + DayOfWeekSelector::Thursday, + DayOfWeekSelector::Friday, + DayOfWeekSelector::Saturday, + DayOfWeekSelector::Sunday}; + break; + case Day::MONDAY: + _days = {DayOfWeekSelector::Monday}; + break; + case Day::TUESDAY: + _days = {DayOfWeekSelector::Tuesday}; + break; + case Day::WEDNESDAY: + _days = {DayOfWeekSelector::Wednesday}; + break; + case Day::THURSDAY: + _days = {DayOfWeekSelector::Thursday}; + break; + case Day::FRIDAY: + _days = {DayOfWeekSelector::Friday}; + break; + case Day::SATURDAY: + _days = {DayOfWeekSelector::Saturday}; + break; + case Day::SUNDAY: + _days = {DayOfWeekSelector::Sunday}; + break; + default: + break; + } + } + return true; } std::string MacroConditionDate::GetShortDesc() const { if (_dayOfWeekCheck) { - auto it = dayOfWeekNames.find(_dayOfWeek); - if (it == dayOfWeekNames.end()) { - return ""; - } - std::string dayName = obs_module_text(it->second.c_str()); + const auto dayName = + DayOfWeekSelector::ToString(_days).toStdString(); if (_ignoreTime) { return dayName; } @@ -347,13 +376,6 @@ void MacroConditionDate::SetupTempVars() obs_module_text("AdvSceneSwitcher.tempVar.date.dayOfWeek")); } -static inline void populateDaySelection(QComboBox *list) -{ - for (auto entry : dayOfWeekNames) { - list->addItem(obs_module_text(entry.second.c_str())); - } -} - static inline void populateConditionSelection(QComboBox *list) { for (auto entry : dateConditionTypes) { @@ -372,7 +394,7 @@ MacroConditionDateEdit::MacroConditionDateEdit( QWidget *parent, std::shared_ptr entryData) : QWidget(parent), _weekCondition(new QComboBox()), - _dayOfWeek(new QComboBox()), + _days(new DayOfWeekSelector(this)), _ignoreWeekTime(new QCheckBox()), _weekTime(new QTimeEdit()), _condition(new QComboBox()), @@ -392,7 +414,7 @@ MacroConditionDateEdit::MacroConditionDateEdit( _currentDate(new QLabel()), _advancedSettingsTooggle(new QPushButton(obs_module_text( "AdvSceneSwitcher.condition.date.showAdvancedSettings"))), - _simpleLayout(new QHBoxLayout()), + _simpleLayout(new QVBoxLayout()), _advancedLayout(new QHBoxLayout()), _repeatLayout(new QVBoxLayout()), _repeatUpdateLayout(new QHBoxLayout()), @@ -418,8 +440,8 @@ MacroConditionDateEdit::MacroConditionDateEdit( QWidget::connect(_weekCondition, SIGNAL(currentIndexChanged(int)), this, SLOT(ConditionChanged(int))); - QWidget::connect(_dayOfWeek, SIGNAL(currentIndexChanged(int)), this, - SLOT(DayOfWeekChanged(int))); + QWidget::connect(_days, &DayOfWeekSelector::SelectionChanged, this, + &MacroConditionDateEdit::DaysChanged); QWidget::connect(_ignoreWeekTime, SIGNAL(stateChanged(int)), this, SLOT(IgnoreTimeChanged(int))); QWidget::connect(_weekTime, SIGNAL(timeChanged(const QTime &)), this, @@ -449,13 +471,12 @@ MacroConditionDateEdit::MacroConditionDateEdit( QWidget::connect(_pattern, SIGNAL(editingFinished()), this, SLOT(PatternChanged())); - populateDaySelection(_dayOfWeek); populateConditionSelection(_condition); populateWeekConditionSelection(_weekCondition); std::unordered_map widgetPlaceholders = { {"{{weekCondition}}", _weekCondition}, - {"{{dayOfWeek}}", _dayOfWeek}, + {"{{dayOfWeek}}", _days}, {"{{ignoreWeekTime}}", _ignoreWeekTime}, {"{{weekTime}}", _weekTime}, {"{{condition}}", _condition}, @@ -472,28 +493,39 @@ MacroConditionDateEdit::MacroConditionDateEdit( {"{{pattern}}", _pattern}, {"{{currentDate}}", _currentDate}, }; + + auto dayLayout = new QHBoxLayout; PlaceWidgets( - obs_module_text("AdvSceneSwitcher.condition.date.entry.simple"), - _simpleLayout, widgetPlaceholders); + obs_module_text( + "AdvSceneSwitcher.condition.date.layout.simple.day"), + dayLayout, widgetPlaceholders); + auto timeLayout = new QHBoxLayout; + PlaceWidgets( + obs_module_text( + "AdvSceneSwitcher.condition.date.layout.simple.time"), + timeLayout, widgetPlaceholders); + _simpleLayout->addLayout(dayLayout); + _simpleLayout->addLayout(timeLayout); + PlaceWidgets(obs_module_text( - "AdvSceneSwitcher.condition.date.entry.advanced"), + "AdvSceneSwitcher.condition.date.layout.advanced"), _advancedLayout, widgetPlaceholders); PlaceWidgets( obs_module_text( - "AdvSceneSwitcher.condition.date.entry.updateOnRepeat"), + "AdvSceneSwitcher.condition.date.layout.updateOnRepeat"), _repeatUpdateLayout, widgetPlaceholders); auto repeatLayout = new QHBoxLayout; - PlaceWidgets( - obs_module_text("AdvSceneSwitcher.condition.date.entry.repeat"), - repeatLayout, widgetPlaceholders); PlaceWidgets(obs_module_text( - "AdvSceneSwitcher.condition.date.entry.pattern"), + "AdvSceneSwitcher.condition.date.layout.repeat"), + repeatLayout, widgetPlaceholders); + PlaceWidgets(obs_module_text( + "AdvSceneSwitcher.condition.date.layout.pattern"), _patternLayout, widgetPlaceholders); _repeatLayout->addLayout(repeatLayout); _repeatLayout->addWidget(_nextMatchDate); _repeatLayout->addLayout(_repeatUpdateLayout); - auto *mainLayout = new QVBoxLayout; + auto mainLayout = new QVBoxLayout; mainLayout->addLayout(_simpleLayout); mainLayout->addLayout(_advancedLayout); mainLayout->addLayout(_patternLayout); @@ -515,10 +547,11 @@ MacroConditionDateEdit::MacroConditionDateEdit( _loading = false; } -void MacroConditionDateEdit::DayOfWeekChanged(int day) +void MacroConditionDateEdit::DaysChanged( + const QSet &days) { GUARD_LOADING_AND_LOCK(); - _entryData->_dayOfWeek = static_cast(day); + _entryData->_days = days; emit HeaderInfoChanged( QString::fromStdString(_entryData->GetShortDesc())); } @@ -632,7 +665,7 @@ void MacroConditionDateEdit::ShowNextMatch() return; } QString format(obs_module_text( - "AdvSceneSwitcher.condition.date.entry.nextMatchDate")); + "AdvSceneSwitcher.condition.date.layout.nextMatchDate")); _nextMatchDate->setText( format.arg(_entryData->GetNextMatchDateTime().toString())); } @@ -658,8 +691,7 @@ void MacroConditionDateEdit::UpdateEntryData() } _weekCondition->setCurrentIndex( static_cast(_entryData->_condition)); - _dayOfWeek->setCurrentIndex( - static_cast(static_cast(_entryData->_dayOfWeek))); + _days->SetSelectedDays(_entryData->_days); _ignoreWeekTime->setChecked(!_entryData->_ignoreTime); _weekTime->setTime(_entryData->GetDateTime1().time()); _condition->setCurrentIndex(static_cast(_entryData->_condition)); diff --git a/plugins/base/macro-condition-date.hpp b/plugins/base/macro-condition-date.hpp index 6658ccba..6eca4c05 100644 --- a/plugins/base/macro-condition-date.hpp +++ b/plugins/base/macro-condition-date.hpp @@ -1,5 +1,6 @@ #pragma once #include "macro-condition-edit.hpp" +#include "day-of-week-selector.hpp" #include "duration-control.hpp" #include @@ -30,17 +31,6 @@ public: QDateTime GetDateTime2() const; QDateTime GetNextMatchDateTime() const; - enum class Day { - ANY = 0, - MONDAY, - TUESDAY, - WEDNESDAY, - THURSDAY, - FRIDAY, - SATURDAY, - SUNDAY, - }; - enum class Condition { AT, AFTER, @@ -49,7 +39,11 @@ public: PATTERN, }; - Day _dayOfWeek = Day::ANY; + QSet _days = { + DayOfWeekSelector::Day::Monday, + DayOfWeekSelector::Day::Tuesday, + DayOfWeekSelector::Day::Wednesday, + }; bool _ignoreDate = false; bool _ignoreTime = false; bool _repeat = false; @@ -94,7 +88,7 @@ public: } private slots: - void DayOfWeekChanged(int day); + void DaysChanged(const QSet &); void ConditionChanged(int cond); void DateChanged(const QDate &date); void TimeChanged(const QTime &time); @@ -114,7 +108,7 @@ signals: protected: QComboBox *_weekCondition; - QComboBox *_dayOfWeek; + DayOfWeekSelector *_days; QCheckBox *_ignoreWeekTime; QTimeEdit *_weekTime; @@ -134,7 +128,7 @@ protected: QLabel *_currentDate; QPushButton *_advancedSettingsTooggle; - QHBoxLayout *_simpleLayout; + QVBoxLayout *_simpleLayout; QHBoxLayout *_advancedLayout; QVBoxLayout *_repeatLayout; QHBoxLayout *_repeatUpdateLayout;