From 7048925d6e53d1dee898763fcadee95163d2c92f Mon Sep 17 00:00:00 2001 From: WarmUpTill <19472752+WarmUpTill@users.noreply.github.com> Date: Sat, 14 Feb 2026 22:58:12 +0100 Subject: [PATCH] Add DayOfWeekSelector --- plugins/base/CMakeLists.txt | 2 + plugins/base/utils/day-of-week-selector.cpp | 121 ++++++++++++++++++++ plugins/base/utils/day-of-week-selector.hpp | 45 ++++++++ 3 files changed, 168 insertions(+) create mode 100644 plugins/base/utils/day-of-week-selector.cpp create mode 100644 plugins/base/utils/day-of-week-selector.hpp diff --git a/plugins/base/CMakeLists.txt b/plugins/base/CMakeLists.txt index a6eebee8..e9eb66a9 100644 --- a/plugins/base/CMakeLists.txt +++ b/plugins/base/CMakeLists.txt @@ -150,6 +150,8 @@ target_sources( utils/connection-manager.hpp utils/cursor-helpers.cpp utils/cursor-helpers.hpp + utils/day-of-week-selector.cpp + utils/day-of-week-selector.hpp utils/filter-selection.cpp utils/filter-selection.hpp utils/hotkey-helpers.cpp diff --git a/plugins/base/utils/day-of-week-selector.cpp b/plugins/base/utils/day-of-week-selector.cpp new file mode 100644 index 00000000..599b9fb3 --- /dev/null +++ b/plugins/base/utils/day-of-week-selector.cpp @@ -0,0 +1,121 @@ +#include "day-of-week-selector.hpp" +#include "obs-module-helper.hpp" + +#include +#include + +namespace advss { + +DayOfWeekSelector::DayOfWeekSelector(QWidget *parent) : QWidget(parent) +{ + auto layout = new QHBoxLayout(this); + layout->setContentsMargins(0, 0, 0, 0); + layout->setSpacing(4); + + const QVector> days = { + {Monday, obs_module_text("AdvSceneSwitcher.day.monday")}, + {Tuesday, obs_module_text("AdvSceneSwitcher.day.tuesday")}, + {Wednesday, obs_module_text("AdvSceneSwitcher.day.wednesday")}, + {Thursday, obs_module_text("AdvSceneSwitcher.day.thursday")}, + {Friday, obs_module_text("AdvSceneSwitcher.day.friday")}, + {Saturday, obs_module_text("AdvSceneSwitcher.day.saturday")}, + {Sunday, obs_module_text("AdvSceneSwitcher.day.sunday")}}; + + for (const auto &[day, name] : days) { + auto btn = new QPushButton(this); + btn->setText(name); + btn->setCheckable(true); + + connect(btn, &QPushButton::toggled, this, + &DayOfWeekSelector::OnButtonToggled); + + layout->addWidget(btn); + m_buttons.insert(day, btn); + } + + setLayout(layout); +} + +void DayOfWeekSelector::OnButtonToggled(bool) +{ + emit SelectionChanged(SelectedDays()); +} + +QSet DayOfWeekSelector::SelectedDays() const +{ + QSet result; + for (auto it = m_buttons.begin(); it != m_buttons.end(); ++it) { + if (it.value()->isChecked()) { + result.insert(it.key()); + } + } + return result; +} + +void DayOfWeekSelector::SetSelectedDays(const QSet &days) +{ + for (auto it = m_buttons.begin(); it != m_buttons.end(); ++it) { + it.value()->setChecked(days.contains(it.key())); + } +} + +QString DayOfWeekSelector::ToString(const QSet &days) +{ + const QVector> dayNames = { + {Monday, obs_module_text("AdvSceneSwitcher.day.monday")}, + {Tuesday, obs_module_text("AdvSceneSwitcher.day.tuesday")}, + {Wednesday, obs_module_text("AdvSceneSwitcher.day.wednesday")}, + {Thursday, obs_module_text("AdvSceneSwitcher.day.thursday")}, + {Friday, obs_module_text("AdvSceneSwitcher.day.friday")}, + {Saturday, obs_module_text("AdvSceneSwitcher.day.saturday")}, + {Sunday, obs_module_text("AdvSceneSwitcher.day.sunday")}}; + + if (days.isEmpty()) { + return obs_module_text("AdvSceneSwitcher.day.none"); + } + + if (days.size() == 7) { + return obs_module_text("AdvSceneSwitcher.day.any"); + } + + QStringList parts; + for (const auto &[day, name] : dayNames) { + if (days.contains(day)) { + parts << name; + } + } + + return parts.join(", "); +} + +void SaveSelectedDays(obs_data_t *settings, + const QSet &days) +{ + uint64_t mask = 0; + + for (DayOfWeekSelector::Day day : days) { + mask |= (1ULL << static_cast(day)); + } + + obs_data_set_int(settings, "selectedDays", + static_cast(mask)); +} + +QSet LoadSelectedDays(obs_data_t *settings) +{ + QSet result; + + uint64_t mask = static_cast( + obs_data_get_int(settings, "selectedDays")); + + for (int i = DayOfWeekSelector::Monday; i <= DayOfWeekSelector::Sunday; + ++i) { + if (mask & (1ULL << i)) { + result.insert(static_cast(i)); + } + } + + return result; +} + +} // namespace advss diff --git a/plugins/base/utils/day-of-week-selector.hpp b/plugins/base/utils/day-of-week-selector.hpp new file mode 100644 index 00000000..8a33812b --- /dev/null +++ b/plugins/base/utils/day-of-week-selector.hpp @@ -0,0 +1,45 @@ +#pragma once +#include +#include + +#include + +class QPushButton; + +namespace advss { + +class DayOfWeekSelector : public QWidget { + Q_OBJECT + +public: + enum Day { + Monday = 1, + Tuesday, + Wednesday, + Thursday, + Friday, + Saturday, + Sunday + }; + Q_ENUM(Day) + + explicit DayOfWeekSelector(QWidget *parent = nullptr); + + QSet SelectedDays() const; + void SetSelectedDays(const QSet &days); + static QString ToString(const QSet &days); + +signals: + void SelectionChanged(const QSet &days); + +private: + void OnButtonToggled(bool checked); + + QMap m_buttons; +}; + +void SaveSelectedDays(obs_data_t *settings, + const QSet &days); +QSet LoadSelectedDays(obs_data_t *settings); + +} // namespace advss