Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 83 additions & 1 deletion downstream-keyer-dock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,9 @@ void obs_module_post_load(void)
obs_websocket_vendor_register_request(vendor, "dsk_get_scene", DownstreamKeyerDock::get_scene, nullptr);
obs_websocket_vendor_register_request(vendor, "dsk_select_scene", DownstreamKeyerDock::change_scene, nullptr);
obs_websocket_vendor_register_request(vendor, "dsk_add_scene", DownstreamKeyerDock::add_scene, nullptr);
obs_websocket_vendor_register_request(vendor, "dsk_add_pause_point", DownstreamKeyerDock::add_pause_point, nullptr);
obs_websocket_vendor_register_request(vendor, "dsk_remove_scene", DownstreamKeyerDock::remove_scene, nullptr);
obs_websocket_vendor_register_request(vendor, "dsk_remove_all_scenes", DownstreamKeyerDock::remove_all_scenes, nullptr);
obs_websocket_vendor_register_request(vendor, "dsk_set_tie", DownstreamKeyerDock::set_tie, nullptr);
obs_websocket_vendor_register_request(vendor, "dsk_set_transition", DownstreamKeyerDock::set_transition, nullptr);
obs_websocket_vendor_register_request(vendor, "dsk_add_exclude_scene", DownstreamKeyerDock::add_exclude_scene, nullptr);
Expand All @@ -283,7 +285,9 @@ void obs_module_unload()
obs_websocket_vendor_unregister_request(vendor, "remove_downstream_keyer");
obs_websocket_vendor_unregister_request(vendor, "dsk_select_scene");
obs_websocket_vendor_unregister_request(vendor, "dsk_add_scene");
obs_websocket_vendor_unregister_request(vendor, "dsk_add_pause_point");
obs_websocket_vendor_unregister_request(vendor, "dsk_remove_scene");
obs_websocket_vendor_unregister_request(vendor, "dsk_remove_all_scenes");
obs_websocket_vendor_unregister_request(vendor, "dsk_set_tie");
obs_websocket_vendor_unregister_request(vendor, "dsk_set_transition");
obs_websocket_vendor_unregister_request(vendor, "dsk_add_exclude_scene");
Expand Down Expand Up @@ -758,6 +762,21 @@ bool DownstreamKeyerDock::AddScene(QString dskName, QString sceneName, int inser
return false;
}

bool DownstreamKeyerDock::AddPausePoint(QString dskName, QString pauseName, int insertBeforeRow)
{
const int count = tabs->count();
for (int i = 0; i < count; i++) {
auto w = dynamic_cast<DownstreamKeyer *>(tabs->widget(i));
if (w->objectName() == dskName) {
if (w->AddPausePoint(pauseName, insertBeforeRow)) {
return true;
}
}
}
return false;
}


bool DownstreamKeyerDock::RemoveScene(QString dskName, QString sceneName)
{
const int count = tabs->count();
Expand All @@ -772,6 +791,19 @@ bool DownstreamKeyerDock::RemoveScene(QString dskName, QString sceneName)
return false;
}

bool DownstreamKeyerDock::RemoveAllScenes(QString dskName)
{
const int count = tabs->count();
for (int i = 0; i < count; i++) {
auto w = dynamic_cast<DownstreamKeyer *>(tabs->widget(i));
if (w->objectName() == dskName) {
w->RemoveAllScenes();
return true;
}
}
return false;
}

bool DownstreamKeyerDock::SetTie(QString dskName, bool tie)
{
const int count = tabs->count();
Expand Down Expand Up @@ -997,8 +1029,40 @@ void DownstreamKeyerDock::add_scene(obs_data_t *request_data, obs_data_t *respon
obs_data_set_bool(response_data, "success",
dsk->AddScene(QString::fromUtf8(dsk_name), QString::fromUtf8(scene_name), insertBeforeRow));
}
void DownstreamKeyerDock::add_pause_point(obs_data_t *request_data,
obs_data_t *response_data, void *param)
{
UNUSED_PARAMETER(param);
const char *viewName = obs_data_get_string(request_data, "view_name");
if (_dsks.find(viewName) == _dsks.end()) {
obs_data_set_string(response_data, "error",
"'view_name' not found");
obs_data_set_bool(response_data, "success", false);
return;
}
auto dsk = _dsks[viewName];
const char *dsk_name = obs_data_get_string(request_data, "dsk_name");
const char *pause_name = obs_data_get_string(request_data, "pause_name");
int insert_before_row = obs_data_get_int(request_data, "insert_before_row");
if (!pause_name || !strlen(pause_name)) {
obs_data_set_string(response_data, "error",
"'pause_name' name too short");
obs_data_set_bool(response_data, "success", false);
return;
}
if (!dsk_name || !strlen(dsk_name)) {
obs_data_set_string(response_data, "error",
"'dsk_name' not set");

void DownstreamKeyerDock::remove_scene(obs_data_t *request_data, obs_data_t *response_data, void *param)
obs_data_set_bool(response_data, "success", false);
return;
}
obs_data_set_bool(response_data, "success",
dsk->AddPausePoint(QString::fromUtf8(dsk_name), QString::fromUtf8(pause_name),
insert_before_row));
}
void DownstreamKeyerDock::remove_scene(obs_data_t *request_data,
obs_data_t *response_data, void *param)
{
UNUSED_PARAMETER(param);
const char *viewName = obs_data_get_string(request_data, "view_name");
Expand All @@ -1022,6 +1086,24 @@ void DownstreamKeyerDock::remove_scene(obs_data_t *request_data, obs_data_t *res
}
obs_data_set_bool(response_data, "success", dsk->RemoveScene(QString::fromUtf8(dsk_name), QString::fromUtf8(scene_name)));
}
void DownstreamKeyerDock::remove_all_scenes(obs_data_t *request_data, obs_data_t *response_data, void *param)
{
UNUSED_PARAMETER(param);
const char *viewName = obs_data_get_string(request_data, "view_name");
if (_dsks.find(viewName) == _dsks.end()) {
obs_data_set_string(response_data, "error", "'view_name' not found");
obs_data_set_bool(response_data, "success", false);
return;
}
auto dsk = _dsks[viewName];
const char *dsk_name = obs_data_get_string(request_data, "dsk_name");
if (!dsk_name || !strlen(dsk_name)) {
obs_data_set_string(response_data, "error", "'dsk_name' not set");
obs_data_set_bool(response_data, "success", false);
return;
}
obs_data_set_bool(response_data, "success", dsk->RemoveAllScenes(QString::fromUtf8(dsk_name)));
}

void DownstreamKeyerDock::set_tie(obs_data_t *request_data, obs_data_t *response_data, void *param)
{
Expand Down
6 changes: 5 additions & 1 deletion downstream-keyer-dock.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@ class DownstreamKeyerDock : public QFrame {
QString GetScene(QString dskName);
bool SwitchDSK(QString dskName, QString sceneName);
bool AddScene(QString dskName, QString sceneName, int insertBeforeRow);
bool AddPausePoint(QString dskName, QString pauseName, int insertBeforeRow);
bool RemoveScene(QString dskName, QString sceneName);
bool RemoveAllScenes(QString dskName);
bool SetTie(QString dskName, bool tie);
bool SetTransition(const QString &chars, const char *transition, int duration, transitionType tt);
bool AddExcludeScene(QString dskName, const char *sceneName);
Expand Down Expand Up @@ -60,10 +62,12 @@ private slots:
static void get_downstream_keyer(obs_data_t *request_data, obs_data_t *response_data, void *param);
static void add_downstream_keyer(obs_data_t *request_data, obs_data_t *response_data, void *param);
static void remove_downstream_keyer(obs_data_t *request_data, obs_data_t *response_data, void *param);
static void get_scene(obs_data_t *request_data, obs_data_t *response_data, void *param);
static void change_scene(obs_data_t *request_data, obs_data_t *response_data, void *param);
static void add_scene(obs_data_t *request_data, obs_data_t *response_data, void *param);
static void get_scene(obs_data_t *request_data, obs_data_t *response_data, void *param);
static void add_pause_point(obs_data_t *request_data, obs_data_t *response_data, void *param);
static void remove_scene(obs_data_t *request_data, obs_data_t *response_data, void *param);
static void remove_all_scenes(obs_data_t *request_data, obs_data_t *response_data, void *param);
static void set_tie(obs_data_t *request_data, obs_data_t *response_data, void *param);
static void set_transition(obs_data_t *request_data, obs_data_t *response_data, void *param);
static void add_exclude_scene(obs_data_t *request_data, obs_data_t *response_data, void *param);
Expand Down
78 changes: 76 additions & 2 deletions downstream-keyer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,14 @@ DownstreamKeyer::DownstreamKeyer(int channel, QString name, obs_view_t *v, obs_c
connect(actionAddScene, SIGNAL(triggered()), this, SLOT(on_actionAddScene_triggered()));
scenesToolbar->addAction(actionAddScene);

auto actionAddPause = new QAction(this);
actionAddPause->setObjectName(QStringLiteral("actionAddPause"));
actionAddPause->setProperty("themeID", "pauseIconSmall");
actionAddPause->setProperty("class", "icon-media-pause");
actionAddPause->setText(QT_UTF8(obs_module_text("Add Pause")));
connect(actionAddPause, SIGNAL(triggered()), this, SLOT(on_actionAddPausePoint_triggered()));
scenesToolbar->addAction(actionAddPause);

auto actionRemoveScene = new QAction(this);
actionRemoveScene->setObjectName(QStringLiteral("actionRemoveScene"));
actionRemoveScene->setShortcutContext(Qt::WidgetWithChildrenShortcut);
Expand Down Expand Up @@ -100,8 +108,8 @@ DownstreamKeyer::DownstreamKeyer(int channel, QString name, obs_view_t *v, obs_c

auto actionSceneNull = new QAction(this);
actionSceneNull->setObjectName(QStringLiteral("actionSceneNull"));
actionSceneNull->setProperty("themeID", "pauseIconSmall");
actionSceneNull->setProperty("class", "icon-media-pause");
actionSceneNull->setProperty("themeID", "stopIconSmall");
actionSceneNull->setProperty("class", "icon-media-stop");
actionSceneNull->setText(QT_UTF8(obs_module_text("None")));
connect(actionSceneNull, SIGNAL(triggered()), this, SLOT(on_actionSceneNull_triggered()));
scenesToolbar->addAction(actionSceneNull);
Expand Down Expand Up @@ -248,6 +256,28 @@ void DownstreamKeyer::on_actionAddScene_triggered()

obs_source_release(scene);
}
void DownstreamKeyer::on_actionAddPausePoint_triggered() {
// add a message box in...
std::string pause_name = "Give pause a unique name";

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not translatable at the moment, use obs_module_text

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for that call out.

I also realized I probably wasn't using obs_module_text correctly elsewhere so I've fixed that too.

I've updated the en-US locale file to use Add="Add Scene" and AddPause="Add Pause"

this will avoid breaking "Add" for existing languages. (I don't trust my grammar to try to update the existing translations)

if (NameDialog::AskForName(this, pause_name)) {

auto pauseName2 = pause_name;
int alreadyExistsCounter = scenesList->findItems(QT_UTF8(pauseName2), Qt::MatchFixedString).count();
while (alreadyExistsCounter > 0) {
/* Add (2), (3), etc as needed. */
pauseName2 = pause_name + " (" + std::to_string((alreadyExistsCounter+1)) + ")";
if (scenesList->findItems(QT_UTF8(pauseName2), Qt::MatchFixedString).count() == 0) {
alreadyExistsCounter = 0;
} else {
alreadyExistsCounter++;
}

}
const auto currentRow = scenesList->currentRow();
add_pause_point(QT_UTF8(pauseName2),currentRow);
}

}

void DownstreamKeyer::on_actionRemoveScene_triggered()
{
Expand Down Expand Up @@ -970,6 +1000,50 @@ bool DownstreamKeyer::AddScene(QString scene_name, int insertBeforeRow)
obs_source_release(s);
return false;
}
void DownstreamKeyer::add_pause_point(QString pause_name, int insertBeforeRow)
{
const auto item = new QListWidgetItem(pause_name);
int scenesListCount = scenesList->count();
if ((insertBeforeRow > scenesListCount) || (insertBeforeRow < 0)) {
insertBeforeRow = scenesListCount;
}
scenesList->insertItem(insertBeforeRow, item);

std::string enable_hotkey = obs_module_text("EnableDSK");
enable_hotkey += " ";
enable_hotkey += QT_TO_UTF8(objectName());
std::string disable_hotkey = obs_module_text("DisableDSK");
disable_hotkey += " ";
disable_hotkey += QT_TO_UTF8(objectName());
uint64_t h = obs_hotkey_pair_register_source(
nullptr, enable_hotkey.c_str(), enable_hotkey.c_str(),
disable_hotkey.c_str(), disable_hotkey.c_str(),
enable_DSK_hotkey, disable_DSK_hotkey, this, this);

if (h != OBS_INVALID_HOTKEY_PAIR_ID) {
item->setData(Qt::UserRole, static_cast<uint>(h));
}
}


bool DownstreamKeyer::AddPausePoint(QString pause_name, int insertBeforeRow)
{
add_pause_point(pause_name, insertBeforeRow);
return true;

}


bool DownstreamKeyer::RemoveAllScenes()
{
while (scenesList->count()) {
const auto item = scenesList->item(0);
scenesList->removeItemWidget(item);
obs_hotkey_pair_unregister(item->data(Qt::UserRole).toUInt());
delete item;
}
return true;
}

bool DownstreamKeyer::RemoveScene(QString scene_name)
{
Expand Down
8 changes: 6 additions & 2 deletions downstream-keyer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@
#include <QToolBar>
#include <QWidget>
#include <set>

#include "obs.h"
#include "name-dialog.hpp"
#include "obs-websocket-api.h"
#include "obs.h"

typedef void (*get_transitions_callback_t)(void *data, struct obs_frontend_source_list *sources);

Expand Down Expand Up @@ -65,6 +65,7 @@ class DownstreamKeyer : public QWidget {

private slots:
void on_actionAddScene_triggered();
void on_actionAddPausePoint_triggered();
void on_actionRemoveScene_triggered();
void on_actionSceneUp_triggered();
void on_actionSceneDown_triggered();
Expand Down Expand Up @@ -95,7 +96,10 @@ private slots:
bool SwitchToScene(QString scene_name);
void add_scene(QString scene_name, obs_source_t *s, int insertBeforeRow);
bool AddScene(QString scene_name, int insertBeforeRow);
void add_pause_point(QString pause_name, int insertBeforeRow);
bool AddPausePoint(QString pause_name, int insertBeforeRow);
bool RemoveScene(QString scene_name);
bool RemoveAllScenes();
void SetTie(bool tie);
void SetOutputChannel(int outputChannel);
};