From 866c49bffdd3bf345499c222460c2edb7cc3371b Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Wed, 17 Aug 2022 20:48:14 +0200 Subject: [PATCH] Add websocket action --- src/macro-core/macro-action-websocket.cpp | 114 ++++++++++++++++++++++ src/macro-core/macro-action-websocket.hpp | 62 ++++++++++++ 2 files changed, 176 insertions(+) create mode 100644 src/macro-core/macro-action-websocket.cpp create mode 100644 src/macro-core/macro-action-websocket.hpp diff --git a/src/macro-core/macro-action-websocket.cpp b/src/macro-core/macro-action-websocket.cpp new file mode 100644 index 00000000..db7b09d3 --- /dev/null +++ b/src/macro-core/macro-action-websocket.cpp @@ -0,0 +1,114 @@ +#include "macro-action-websocket.hpp" +#include "advanced-scene-switcher.hpp" +#include "utility.hpp" + +const std::string MacroActionWebsocket::id = "websocket"; + +bool MacroActionWebsocket::_registered = MacroActionFactory::Register( + MacroActionWebsocket::id, + {MacroActionWebsocket::Create, MacroActionWebsocketEdit::Create, + "AdvSceneSwitcher.action.websocket"}); + +bool MacroActionWebsocket::PerformAction() +{ + auto connection = GetConnectionByName(_connection); + if (!connection) { + return true; + } + connection->SendMsg(_message); + return true; +} + +void MacroActionWebsocket::LogAction() +{ + vblog(LOG_INFO, "sent msg \"%s\" via \"%s\"", _message.c_str(), + _connection.c_str()); +} + +bool MacroActionWebsocket::Save(obs_data_t *obj) +{ + MacroAction::Save(obj); + obs_data_set_string(obj, "message", _message.c_str()); + obs_data_set_string(obj, "connection", _connection.c_str()); + return true; +} + +bool MacroActionWebsocket::Load(obs_data_t *obj) +{ + MacroAction::Load(obj); + _message = obs_data_get_string(obj, "message"); + _connection = obs_data_get_string(obj, "connection"); + return true; +} + +std::string MacroActionWebsocket::GetShortDesc() +{ + return _connection; +} + +MacroActionWebsocketEdit::MacroActionWebsocketEdit( + QWidget *parent, std::shared_ptr entryData) + : QWidget(parent), + _message(new ResizingPlainTextEdit(this)), + _connection(new ConnectionSelection(this)) +{ + QWidget::connect(_message, SIGNAL(textChanged()), this, + SLOT(MessageChanged())); + QWidget::connect(_connection, SIGNAL(SelectionChanged(const QString &)), + this, + SLOT(ConnectionSelectionChanged(const QString &))); + + auto *connectionLayout = new QHBoxLayout; + std::unordered_map widgetPlaceholders = { + {"{{connection}}", _connection}, + }; + placeWidgets(obs_module_text("AdvSceneSwitcher.action.websocket.entry"), + connectionLayout, widgetPlaceholders); + + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->addLayout(connectionLayout); + mainLayout->addWidget(_message); + setLayout(mainLayout); + + _entryData = entryData; + UpdateEntryData(); + _loading = false; +} + +void MacroActionWebsocketEdit::UpdateEntryData() +{ + if (!_entryData) { + return; + } + + _message->setPlainText(QString::fromStdString(_entryData->_message)); + _connection->SetConnection(_entryData->_connection); + + adjustSize(); + updateGeometry(); +} + +void MacroActionWebsocketEdit::MessageChanged() +{ + if (_loading || !_entryData) { + return; + } + + std::lock_guard lock(switcher->m); + _entryData->_message = _message->toPlainText().toUtf8().constData(); + + adjustSize(); + updateGeometry(); +} + +void MacroActionWebsocketEdit::ConnectionSelectionChanged( + const QString &connection) +{ + if (_loading || !_entryData) { + return; + } + + std::lock_guard lock(switcher->m); + _entryData->_connection = connection.toStdString(); + emit(HeaderInfoChanged(connection)); +} diff --git a/src/macro-core/macro-action-websocket.hpp b/src/macro-core/macro-action-websocket.hpp new file mode 100644 index 00000000..1d69d2b1 --- /dev/null +++ b/src/macro-core/macro-action-websocket.hpp @@ -0,0 +1,62 @@ +#pragma once +#include "macro-action-edit.hpp" +#include "connection-manager.hpp" +#include "resizing-text-edit.hpp" + +#include +#include +#include +#include + +class MacroActionWebsocket : public MacroAction { +public: + MacroActionWebsocket(Macro *m) : MacroAction(m) {} + bool PerformAction(); + void LogAction(); + bool Save(obs_data_t *obj); + bool Load(obs_data_t *obj); + std::string GetShortDesc(); + std::string GetId() { return id; }; + static std::shared_ptr Create(Macro *m) + { + return std::make_shared(m); + } + + std::string _message = obs_module_text("AdvSceneSwitcher.enterText"); + std::string _connection; + +private: + static bool _registered; + static const std::string id; +}; + +class MacroActionWebsocketEdit : public QWidget { + Q_OBJECT + +public: + MacroActionWebsocketEdit( + QWidget *parent, + std::shared_ptr entryData = nullptr); + void UpdateEntryData(); + static QWidget *Create(QWidget *parent, + std::shared_ptr action) + { + return new MacroActionWebsocketEdit( + parent, std::dynamic_pointer_cast( + action)); + } + +private slots: + void MessageChanged(); + void ConnectionSelectionChanged(const QString &); +signals: + void HeaderInfoChanged(const QString &); + +protected: + std::shared_ptr _entryData; + +private: + ResizingPlainTextEdit *_message; + ConnectionSelection *_connection; + bool _loading = true; +};