diff --git a/data/locale/de-DE.ini b/data/locale/de-DE.ini index 3de9e0ab..a1a0cf15 100644 --- a/data/locale/de-DE.ini +++ b/data/locale/de-DE.ini @@ -466,7 +466,7 @@ AdvSceneSwitcher.action.source.type.refreshSettings="Aktualisieren der Quellenei AdvSceneSwitcher.action.source.type.pressSettingsButton="Drücken der Einstellungstaste" AdvSceneSwitcher.action.source.type.refreshSettings.tooltip="Kann verwendet werden, um Browser-, Medien- usw. Quellen zu aktualisieren" AdvSceneSwitcher.action.source.noSettingsButtons="Keine Buttons gefunden!" -AdvSceneSwitcher.action.source.entry="{{actions}}{{sources}}{{settingsButtons}}" +AdvSceneSwitcher.action.source.entry="{{actions}}{{sources}}{{settingsButtons}}{{deinterlaceMode}}{{deinterlaceOrder}}" AdvSceneSwitcher.action.source.warning="Warnung: Das globale Aktivieren und Deaktivieren von Quellen kann nicht über die OBS-Benutzeroberfläche gesteuert werden" AdvSceneSwitcher.action.source.getSettings="Aktuelle Einstellungen abfragen" AdvSceneSwitcher.action.media="Medien" diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 7d38e0a8..d99cd82c 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -528,10 +528,23 @@ AdvSceneSwitcher.action.source.type.settings="Set settings" AdvSceneSwitcher.action.source.type.refreshSettings="Refresh source settings" AdvSceneSwitcher.action.source.type.pressSettingsButton="Press settings button" AdvSceneSwitcher.action.source.type.refreshSettings.tooltip="Can be used to refresh browser, media, etc. sources" +AdvSceneSwitcher.action.source.type.deinterlaceMode="Set deinterlace mode" +AdvSceneSwitcher.action.source.type.deinterlaceOrder="Set deinterlace field order" AdvSceneSwitcher.action.source.noSettingsButtons="No buttons found!" -AdvSceneSwitcher.action.source.entry="{{actions}}{{sources}}{{settingsButtons}}" +AdvSceneSwitcher.action.source.entry="{{actions}}{{sources}}{{settingsButtons}}{{deinterlaceMode}}{{deinterlaceOrder}}" AdvSceneSwitcher.action.source.warning="Warning: Enabling and disabling sources globally cannot be controlled by the OBS UI\nYou might be looking for \"Scene item visibility\"" AdvSceneSwitcher.action.source.getSettings="Get current settings" +AdvSceneSwitcher.action.source.deinterlaceMode.disable="Disable" +AdvSceneSwitcher.action.source.deinterlaceMode.discard="Discard" +AdvSceneSwitcher.action.source.deinterlaceMode.retro="Retro" +AdvSceneSwitcher.action.source.deinterlaceMode.blend="Blend" +AdvSceneSwitcher.action.source.deinterlaceMode.blend2x="Blend 2x" +AdvSceneSwitcher.action.source.deinterlaceMode.linear="Linear" +AdvSceneSwitcher.action.source.deinterlaceMode.linear2x="Linear 2x" +AdvSceneSwitcher.action.source.deinterlaceMode.yadif="Yadif" +AdvSceneSwitcher.action.source.deinterlaceMode.yadif2x="Yadif 2x" +AdvSceneSwitcher.action.source.deinterlaceOrder.topFieldFirst="Top Field First" +AdvSceneSwitcher.action.source.deinterlaceOrder.bottomFieldFirst="Bottom Field First" AdvSceneSwitcher.action.media="Media" AdvSceneSwitcher.action.media.type.play="Play" AdvSceneSwitcher.action.media.type.pause="Pause" diff --git a/data/locale/es-ES.ini b/data/locale/es-ES.ini index 48961d8c..76b7a516 100644 --- a/data/locale/es-ES.ini +++ b/data/locale/es-ES.ini @@ -382,7 +382,7 @@ AdvSceneSwitcher.action.source="Fuente" AdvSceneSwitcher.action.source.type.enable="Habilitar" AdvSceneSwitcher.action.source.type.disable="Deshabilitar" AdvSceneSwitcher.action.source.type.settings="Establecer configuración" -AdvSceneSwitcher.action.source.entry="{{actions}}{{sources}}{{settingsButtons}}" +AdvSceneSwitcher.action.source.entry="{{actions}}{{sources}}{{settingsButtons}}{{deinterlaceMode}}{{deinterlaceOrder}}" AdvSceneSwitcher.action.source.warning="Advertencia: la IU de OBS no puede controlar la habilitación y deshabilitación global de fuentes" AdvSceneSwitcher.action.source.getSettings="Obtener la configuración actual" AdvSceneSwitcher.action.media="Medios" diff --git a/data/locale/tr-TR.ini b/data/locale/tr-TR.ini index eb2bbe73..9f4ae5d4 100644 --- a/data/locale/tr-TR.ini +++ b/data/locale/tr-TR.ini @@ -312,7 +312,7 @@ AdvSceneSwitcher.action.source="Kaynak" AdvSceneSwitcher.action.source.type.enable="Etkin" AdvSceneSwitcher.action.source.type.disable="Etkisiz" AdvSceneSwitcher.action.source.type.settings="Ayarları yap" -AdvSceneSwitcher.action.source.entry="{{actions}}{{sources}}{{settingsButtons}}" +AdvSceneSwitcher.action.source.entry="{{actions}}{{sources}}{{settingsButtons}}{{deinterlaceMode}}{{deinterlaceOrder}}" AdvSceneSwitcher.action.source.warning="Uyarı: Kaynakların global olarak etkinleştirilmesi ve devre dışı bırakılması, OBS UI tarafından kontrol edilemez" AdvSceneSwitcher.action.source.getSettings="Mevcut Ayarları yap" AdvSceneSwitcher.action.media="Medya" diff --git a/data/locale/zh-CN.ini b/data/locale/zh-CN.ini index ce94ce5c..a31c9ac1 100644 --- a/data/locale/zh-CN.ini +++ b/data/locale/zh-CN.ini @@ -517,7 +517,7 @@ AdvSceneSwitcher.action.source.type.refreshSettings="刷新源设置" AdvSceneSwitcher.action.source.type.pressSettingsButton="按下设置按钮" AdvSceneSwitcher.action.source.type.refreshSettings.tooltip="可用于刷新浏览器、媒体、源、etc" AdvSceneSwitcher.action.source.noSettingsButtons="未找到按钮!" -AdvSceneSwitcher.action.source.entry="{{actions}}{{sources}}{{settingsButtons}}" +AdvSceneSwitcher.action.source.entry="{{actions}}{{sources}}{{settingsButtons}}{{deinterlaceMode}}{{deinterlaceOrder}}" AdvSceneSwitcher.action.source.warning="警告:OBS UI无法控制全局启用和禁用源,注意,通过这个设置禁用,我测试,你必须通过这个在启用才行,不然点击小眼睛你无法显示!" AdvSceneSwitcher.action.source.getSettings="获取当前设置" AdvSceneSwitcher.action.media="媒体" diff --git a/src/macro-core/macro-action-source.cpp b/src/macro-core/macro-action-source.cpp index 09eda4d6..a43d3d9c 100644 --- a/src/macro-core/macro-action-source.cpp +++ b/src/macro-core/macro-action-source.cpp @@ -12,15 +12,50 @@ bool MacroActionSource::_registered = MacroActionFactory::Register( {MacroActionSource::Create, MacroActionSourceEdit::Create, "AdvSceneSwitcher.action.source"}); -const static std::map actionTypes = { - {SourceAction::ENABLE, "AdvSceneSwitcher.action.source.type.enable"}, - {SourceAction::DISABLE, "AdvSceneSwitcher.action.source.type.disable"}, - {SourceAction::SETTINGS, +const static std::map actionTypes = { + {MacroActionSource::Action::ENABLE, + "AdvSceneSwitcher.action.source.type.enable"}, + {MacroActionSource::Action::DISABLE, + "AdvSceneSwitcher.action.source.type.disable"}, + {MacroActionSource::Action::SETTINGS, "AdvSceneSwitcher.action.source.type.settings"}, - {SourceAction::REFRESH_SETTINGS, + {MacroActionSource::Action::REFRESH_SETTINGS, "AdvSceneSwitcher.action.source.type.refreshSettings"}, - {SourceAction::SETTINGS_BUTTON, + {MacroActionSource::Action::SETTINGS_BUTTON, "AdvSceneSwitcher.action.source.type.pressSettingsButton"}, + {MacroActionSource::Action::DEINTERLACE_MODE, + "AdvSceneSwitcher.action.source.type.deinterlaceMode"}, + {MacroActionSource::Action::DEINTERLACE_FIELD_ORDER, + "AdvSceneSwitcher.action.source.type.deinterlaceOrder"}, +}; + +const static std::map deinterlaceModes = { + {OBS_DEINTERLACE_MODE_DISABLE, + "AdvSceneSwitcher.action.source.deinterlaceMode.disable"}, + {OBS_DEINTERLACE_MODE_DISCARD, + "AdvSceneSwitcher.action.source.deinterlaceMode.disable"}, + {OBS_DEINTERLACE_MODE_RETRO, + "AdvSceneSwitcher.action.source.deinterlaceMode.retro"}, + {OBS_DEINTERLACE_MODE_BLEND, + "AdvSceneSwitcher.action.source.deinterlaceMode.blend"}, + {OBS_DEINTERLACE_MODE_BLEND_2X, + "AdvSceneSwitcher.action.source.deinterlaceMode.blend2x"}, + {OBS_DEINTERLACE_MODE_LINEAR, + "AdvSceneSwitcher.action.source.deinterlaceMode.linear"}, + {OBS_DEINTERLACE_MODE_LINEAR_2X, + "AdvSceneSwitcher.action.source.deinterlaceMode.linear2x"}, + {OBS_DEINTERLACE_MODE_YADIF, + "AdvSceneSwitcher.action.source.deinterlaceMode.yadif"}, + {OBS_DEINTERLACE_MODE_YADIF_2X, + "AdvSceneSwitcher.action.source.deinterlaceMode.yadif2x"}, +}; + +const static std::map + deinterlaceFieldOrders = { + {OBS_DEINTERLACE_FIELD_ORDER_TOP, + "AdvSceneSwitcher.action.source.deinterlaceOrder.topFieldFirst"}, + {OBS_DEINTERLACE_FIELD_ORDER_BOTTOM, + "AdvSceneSwitcher.action.source.deinterlaceOrder.bottomFieldFirst"}, }; static std::vector getSourceButtons(OBSWeakSource source) @@ -79,21 +114,27 @@ bool MacroActionSource::PerformAction() { auto s = obs_weak_source_get_source(_source.GetSource()); switch (_action) { - case SourceAction::ENABLE: + case Action::ENABLE: obs_source_set_enabled(s, true); break; - case SourceAction::DISABLE: + case Action::DISABLE: obs_source_set_enabled(s, false); break; - case SourceAction::SETTINGS: + case Action::SETTINGS: SetSourceSettings(s, _settings); break; - case SourceAction::REFRESH_SETTINGS: + case Action::REFRESH_SETTINGS: refreshSourceSettings(s); break; - case SourceAction::SETTINGS_BUTTON: + case Action::SETTINGS_BUTTON: pressSourceButton(_button, s); break; + case Action::DEINTERLACE_MODE: + obs_source_set_deinterlace_mode(s, _deinterlaceMode); + break; + case Action::DEINTERLACE_FIELD_ORDER: + obs_source_set_deinterlace_field_order(s, _deinterlaceOrder); + break; default: break; } @@ -120,6 +161,10 @@ bool MacroActionSource::Save(obs_data_t *obj) const obs_data_set_int(obj, "action", static_cast(_action)); _button.Save(obj); _settings.Save(obj, "settings"); + obs_data_set_int(obj, "deinterlaceMode", + static_cast(_deinterlaceMode)); + obs_data_set_int(obj, "deinterlaceOrder", + static_cast(_deinterlaceOrder)); return true; } @@ -127,9 +172,13 @@ bool MacroActionSource::Load(obs_data_t *obj) { MacroAction::Load(obj); _source.Load(obj); - _action = static_cast(obs_data_get_int(obj, "action")); + _action = static_cast(obs_data_get_int(obj, "action")); _button.Load(obj); _settings.Load(obj, "settings"); + _deinterlaceMode = static_cast( + obs_data_get_int(obj, "deinterlaceMode")); + _deinterlaceOrder = static_cast( + obs_data_get_int(obj, "deinterlaceOrder")); return true; } @@ -143,7 +192,7 @@ static inline void populateActionSelection(QComboBox *list) { for (auto &[actionType, name] : actionTypes) { list->addItem(obs_module_text(name.c_str())); - if (actionType == SourceAction::REFRESH_SETTINGS) { + if (actionType == MacroActionSource::Action::REFRESH_SETTINGS) { list->setItemData( list->count() - 1, obs_module_text( @@ -170,23 +219,44 @@ static inline void populateSourceButtonSelection(QComboBox *list, } } +static inline void populateDeinterlaceModeSelection(QComboBox *list) +{ + list->clear(); + for (const auto &[value, name] : deinterlaceModes) { + list->addItem(obs_module_text(name.c_str()), + static_cast(value)); + } +} + +static inline void populateDeinterlaceFieldOrderSelection(QComboBox *list) +{ + list->clear(); + for (const auto &[value, name] : deinterlaceFieldOrders) { + list->addItem(obs_module_text(name.c_str()), + static_cast(value)); + } +} + MacroActionSourceEdit::MacroActionSourceEdit( QWidget *parent, std::shared_ptr entryData) - : QWidget(parent) + : QWidget(parent), + _sources(new SourceSelectionWidget(this, QStringList(), true)), + _actions(new QComboBox()), + _settingsButtons(new QComboBox()), + _getSettings(new QPushButton(obs_module_text( + "AdvSceneSwitcher.action.source.getSettings"))), + _settings(new VariableTextEdit(this)), + _deinterlaceMode(new QComboBox()), + _deinterlaceOrder(new QComboBox()), + _warning(new QLabel( + obs_module_text("AdvSceneSwitcher.action.source.warning"))) { - _sources = new SourceSelectionWidget(this, QStringList(), true); - _actions = new QComboBox(); - _settingsButtons = new QComboBox(); - _getSettings = new QPushButton( - obs_module_text("AdvSceneSwitcher.action.source.getSettings")); - _settings = new VariableTextEdit(this); - _warning = new QLabel( - obs_module_text("AdvSceneSwitcher.action.source.warning")); - populateActionSelection(_actions); auto sources = GetSourceNames(); sources.sort(); _sources->SetSourceNameList(sources); + populateDeinterlaceModeSelection(_deinterlaceMode); + populateDeinterlaceFieldOrderSelection(_deinterlaceOrder); QWidget::connect(_actions, SIGNAL(currentIndexChanged(int)), this, SLOT(ActionChanged(int))); @@ -199,6 +269,10 @@ MacroActionSourceEdit::MacroActionSourceEdit( SLOT(GetSettingsClicked())); QWidget::connect(_settings, SIGNAL(textChanged()), this, SLOT(SettingsChanged())); + QWidget::connect(_deinterlaceMode, SIGNAL(currentIndexChanged(int)), + this, SLOT(DeinterlaceModeChanged(int))); + QWidget::connect(_deinterlaceOrder, SIGNAL(currentIndexChanged(int)), + this, SLOT(DeinterlaceOrderChanged(int))); QVBoxLayout *mainLayout = new QVBoxLayout; QHBoxLayout *entryLayout = new QHBoxLayout; @@ -209,6 +283,8 @@ MacroActionSourceEdit::MacroActionSourceEdit( {"{{settings}}", _settings}, {"{{getSettings}}", _getSettings}, {"{{settingsButtons}}", _settingsButtons}, + {"{{deinterlaceMode}}", _deinterlaceMode}, + {"{{deinterlaceOrder}}", _deinterlaceOrder}, }; PlaceWidgets(obs_module_text("AdvSceneSwitcher.action.source.entry"), entryLayout, widgetPlaceholders); @@ -238,10 +314,11 @@ void MacroActionSourceEdit::UpdateEntryData() _settingsButtons->setCurrentText( QString::fromStdString(_entryData->_button.ToString())); _settings->setPlainText(_entryData->_settings); + _deinterlaceMode->setCurrentIndex(_deinterlaceMode->findData( + static_cast(_entryData->_deinterlaceMode))); + _deinterlaceOrder->setCurrentIndex(_deinterlaceOrder->findData( + static_cast(_entryData->_deinterlaceOrder))); SetWidgetVisibility(); - - adjustSize(); - updateGeometry(); } void MacroActionSourceEdit::SourceChanged(const SourceSelection &source) @@ -267,7 +344,7 @@ void MacroActionSourceEdit::ActionChanged(int value) } auto lock = LockContext(); - _entryData->_action = static_cast(value); + _entryData->_action = static_cast(value); SetWidgetVisibility(); } @@ -305,17 +382,50 @@ void MacroActionSourceEdit::SettingsChanged() updateGeometry(); } +void MacroActionSourceEdit::DeinterlaceModeChanged(int idx) +{ + if (_loading || !_entryData) { + return; + } + + auto lock = LockContext(); + _entryData->_deinterlaceMode = static_cast( + _deinterlaceMode->itemData(idx).toInt()); +} + +void MacroActionSourceEdit::DeinterlaceOrderChanged(int idx) +{ + if (_loading || !_entryData) { + return; + } + + auto lock = LockContext(); + _entryData->_deinterlaceOrder = + static_cast( + _deinterlaceOrder->itemData(idx).toInt()); +} + void MacroActionSourceEdit::SetWidgetVisibility() { - const bool showSettings = _entryData->_action == SourceAction::SETTINGS; - const bool showWarning = _entryData->_action == SourceAction::ENABLE || - _entryData->_action == SourceAction::DISABLE; + const bool showSettings = _entryData->_action == + MacroActionSource::Action::SETTINGS; + const bool showWarning = + _entryData->_action == MacroActionSource::Action::ENABLE || + _entryData->_action == MacroActionSource::Action::DISABLE; _settings->setVisible(showSettings); _getSettings->setVisible(showSettings); _warning->setVisible(showWarning); - _settingsButtons->setVisible(_entryData->_action == - SourceAction::SETTINGS_BUTTON); + _settingsButtons->setVisible( + _entryData->_action == + MacroActionSource::Action::SETTINGS_BUTTON); + _deinterlaceMode->setVisible( + _entryData->_action == + MacroActionSource::Action::DEINTERLACE_MODE); + _deinterlaceOrder->setVisible( + _entryData->_action == + MacroActionSource::Action::DEINTERLACE_FIELD_ORDER); adjustSize(); + updateGeometry(); } bool SourceSettingButton::Save(obs_data_t *obj) const diff --git a/src/macro-core/macro-action-source.hpp b/src/macro-core/macro-action-source.hpp index 37cdedb2..89eebd81 100644 --- a/src/macro-core/macro-action-source.hpp +++ b/src/macro-core/macro-action-source.hpp @@ -10,14 +10,6 @@ namespace advss { -enum class SourceAction { - ENABLE, - DISABLE, - SETTINGS, - REFRESH_SETTINGS, - SETTINGS_BUTTON, -}; - struct SourceSettingButton { bool Save(obs_data_t *obj) const; bool Load(obs_data_t *obj); @@ -44,7 +36,20 @@ public: SourceSelection _source; SourceSettingButton _button; StringVariable _settings = ""; - SourceAction _action = SourceAction::ENABLE; + obs_deinterlace_mode _deinterlaceMode = OBS_DEINTERLACE_MODE_DISABLE; + obs_deinterlace_field_order _deinterlaceOrder = + OBS_DEINTERLACE_FIELD_ORDER_TOP; + + enum class Action { + ENABLE, + DISABLE, + SETTINGS, + REFRESH_SETTINGS, + SETTINGS_BUTTON, + DEINTERLACE_MODE, + DEINTERLACE_FIELD_ORDER, + }; + Action _action = Action::ENABLE; private: static bool _registered; @@ -73,6 +78,8 @@ private slots: void ButtonChanged(int idx); void GetSettingsClicked(); void SettingsChanged(); + void DeinterlaceModeChanged(int); + void DeinterlaceOrderChanged(int); signals: void HeaderInfoChanged(const QString &); @@ -82,6 +89,8 @@ protected: QComboBox *_settingsButtons; QPushButton *_getSettings; VariableTextEdit *_settings; + QComboBox *_deinterlaceMode; + QComboBox *_deinterlaceOrder; QLabel *_warning; std::shared_ptr _entryData;