Skip to content

Commit 4697943

Browse files
committed
Add close button to partner block
1 parent a8c48e8 commit 4697943

File tree

3 files changed

+97
-35
lines changed

3 files changed

+97
-35
lines changed

config-dialog.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -1306,7 +1306,9 @@ void OBSBasicSettings::SaveSettings()
13061306
so.stream_key = sk;
13071307
std::string service_name = "vertical_canvas_stream_service_";
13081308
service_name += std::to_string(idx);
1309-
so.service = obs_service_create("rtmp_custom", service_name.c_str(), nullptr, nullptr);
1309+
bool whip = strstr(so.stream_server.c_str(), "whip") != nullptr;
1310+
so.service = obs_service_create(whip ? "whip_custom" : "rtmp_custom", service_name.c_str(), nullptr,
1311+
nullptr);
13101312
canvasDock->streamOutputs.push_back(so);
13111313
}
13121314
canvasDock->streamOutputs[idx].name = server_names[idx]->text().toUtf8().constData();

vertical-canvas.cpp

+93-34
Original file line numberDiff line numberDiff line change
@@ -590,7 +590,7 @@ void vendor_request_unpause_recording(obs_data_t *request_data, obs_data_t *resp
590590
obs_data_set_bool(response_data, "success", false);
591591
}
592592

593-
update_info_t *verison_update_info = nullptr;
593+
update_info_t *version_update_info = nullptr;
594594

595595
bool version_info_downloaded(void *param, struct file_download_data *file)
596596
{
@@ -600,6 +600,10 @@ bool version_info_downloaded(void *param, struct file_download_data *file)
600600
for (const auto &it : canvas_docks) {
601601
QMetaObject::invokeMethod(it, "ApiInfo", Q_ARG(QString, QString::fromUtf8((const char *)file->buffer.array)));
602602
}
603+
if (version_update_info) {
604+
update_info_destroy(version_update_info);
605+
version_update_info = nullptr;
606+
}
603607
return true;
604608
}
605609

@@ -702,7 +706,7 @@ void obs_module_post_load(void)
702706
obs_websocket_vendor_register_request(vendor, "pause_recording", vendor_request_pause_recording, nullptr);
703707
obs_websocket_vendor_register_request(vendor, "unpause_recording", vendor_request_unpause_recording, nullptr);
704708

705-
verison_update_info = update_info_create_single("[Vertical Canvas]", "OBS", "https://api.aitum.tv/plugin/vertical",
709+
version_update_info = update_info_create_single("[Vertical Canvas]", "OBS", "https://api.aitum.tv/plugin/vertical",
706710
version_info_downloaded, nullptr);
707711
}
708712

@@ -729,7 +733,10 @@ void obs_module_unload(void)
729733
obs_websocket_vendor_unregister_request(vendor, "update_stream_server");
730734
}
731735
obs_frontend_remove_event_callback(frontend_event, nullptr);
732-
update_info_destroy(verison_update_info);
736+
if (version_update_info) {
737+
update_info_destroy(version_update_info);
738+
version_update_info = nullptr;
739+
}
733740
}
734741

735742
MODULE_EXPORT const char *obs_module_description(void)
@@ -999,7 +1006,7 @@ CanvasDock::CanvasDock(obs_data_t *settings, QWidget *parent)
9991006
obs_data_set_bool(settings, "backtrack", true);
10001007
first_time = true;
10011008
}
1002-
1009+
partnerBlockTime = (time_t)obs_data_get_int(settings, "partner_block");
10031010
hideScenes = !obs_data_get_bool(settings, "show_scenes");
10041011
canvas_width = (uint32_t)obs_data_get_int(settings, "width");
10051012
canvas_height = (uint32_t)obs_data_get_int(settings, "height");
@@ -6525,6 +6532,7 @@ obs_data_t *CanvasDock::SaveSettings()
65256532

65266533
obs_data_set_int(save_data, "width", canvas_width);
65276534
obs_data_set_int(save_data, "height", canvas_height);
6535+
obs_data_set_int(save_data, "partner_block", partnerBlockTime);
65286536
obs_data_set_bool(save_data, "show_scenes", !hideScenes);
65296537
obs_data_set_bool(save_data, "preview_disabled", preview_disabled);
65306538
obs_data_set_bool(save_data, "virtual_cam_warned", virtual_cam_warned);
@@ -7744,6 +7752,35 @@ void CanvasDock::Nudge(int dist, MoveDir dir)
77447752
obs_scene_enum_items(scene, nudge_callback, &offset);
77457753
}
77467754

7755+
void RemoveWidget(QWidget *widget);
7756+
7757+
void RemoveLayoutItem(QLayoutItem *item)
7758+
{
7759+
if (!item)
7760+
return;
7761+
RemoveWidget(item->widget());
7762+
if (item->layout()) {
7763+
while (QLayoutItem *item2 = item->layout()->takeAt(0))
7764+
RemoveLayoutItem(item2);
7765+
}
7766+
delete item;
7767+
}
7768+
7769+
void RemoveWidget(QWidget *widget)
7770+
{
7771+
if (!widget)
7772+
return;
7773+
if (widget->layout()) {
7774+
auto l = widget->layout();
7775+
QLayoutItem *item;
7776+
while (l->count() > 0 && (item = l->takeAt(0))) {
7777+
RemoveLayoutItem(item);
7778+
}
7779+
delete l;
7780+
}
7781+
delete widget;
7782+
}
7783+
77477784
void CanvasDock::ApiInfo(QString info)
77487785
{
77497786
auto d = obs_data_create_from_json(info.toUtf8().constData());
@@ -7764,40 +7801,62 @@ void CanvasDock::ApiInfo(QString info)
77647801
configButton->setStyleSheet(QString::fromUtf8("background: rgb(192,128,0);"));
77657802
}
77667803
}
7767-
obs_data_array_t *blocks = obs_data_get_array(data_obj, "partnerBlocks");
7768-
size_t count = obs_data_array_count(blocks);
7769-
for (size_t i = count; i > 0; i--) {
7770-
obs_data_t *block = obs_data_array_item(blocks, i - 1);
7771-
auto block_type = obs_data_get_string(block, "type");
7772-
if (strcmp(block_type, "LINK") == 0) {
7773-
auto button = new QPushButton(QString::fromUtf8(obs_data_get_string(block, "label")));
7774-
button->setStyleSheet(QString::fromUtf8(obs_data_get_string(block, "qss")));
7775-
auto url = QString::fromUtf8(obs_data_get_string(block, "data"));
7776-
connect(button, &QPushButton::clicked, [url] { QDesktopServices::openUrl(QUrl(url)); });
7777-
auto buttonRow = new QHBoxLayout;
7778-
buttonRow->addWidget(button);
7779-
mainLayout->insertLayout(2, buttonRow, 0);
7780-
} else if (strcmp(block_type, "IMAGE") == 0) {
7781-
auto image_data = QString::fromUtf8(obs_data_get_string(block, "data"));
7782-
if (image_data.startsWith("data:image/")) {
7783-
auto pos = image_data.indexOf(";");
7784-
auto format = image_data.mid(11, pos - 11);
7785-
QImage image;
7786-
if (image.loadFromData(QByteArray::fromBase64(image_data.mid(pos + 7).toUtf8().constData()),
7787-
format.toUtf8().constData())) {
7788-
auto label = new AspectRatioPixmapLabel;
7789-
label->setPixmap(QPixmap::fromImage(image));
7790-
label->setAlignment(Qt::AlignCenter);
7791-
label->setStyleSheet(QString::fromUtf8(obs_data_get_string(block, "qss")));
7792-
auto labelRow = new QHBoxLayout;
7793-
labelRow->addWidget(label, 1, Qt::AlignCenter);
7794-
mainLayout->insertLayout(2, labelRow, 0);
7804+
time_t current_time = time(nullptr);
7805+
if (current_time < partnerBlockTime || current_time - partnerBlockTime > 1209600) {
7806+
obs_data_array_t *blocks = obs_data_get_array(data_obj, "partnerBlocks");
7807+
size_t count = obs_data_array_count(blocks);
7808+
size_t added_count = 0;
7809+
for (size_t i = count; i > 0; i--) {
7810+
obs_data_t *block = obs_data_array_item(blocks, i - 1);
7811+
auto block_type = obs_data_get_string(block, "type");
7812+
QBoxLayout *layout = nullptr;
7813+
if (strcmp(block_type, "LINK") == 0) {
7814+
auto button = new QPushButton(QString::fromUtf8(obs_data_get_string(block, "label")));
7815+
button->setStyleSheet(QString::fromUtf8(obs_data_get_string(block, "qss")));
7816+
auto url = QString::fromUtf8(obs_data_get_string(block, "data"));
7817+
connect(button, &QPushButton::clicked, [url] { QDesktopServices::openUrl(QUrl(url)); });
7818+
auto buttonRow = new QHBoxLayout;
7819+
buttonRow->addWidget(button);
7820+
layout = buttonRow;
7821+
7822+
} else if (strcmp(block_type, "IMAGE") == 0) {
7823+
auto image_data = QString::fromUtf8(obs_data_get_string(block, "data"));
7824+
if (image_data.startsWith("data:image/")) {
7825+
auto pos = image_data.indexOf(";");
7826+
auto format = image_data.mid(11, pos - 11);
7827+
QImage image;
7828+
if (image.loadFromData(QByteArray::fromBase64(image_data.mid(pos + 7).toUtf8().constData()),
7829+
format.toUtf8().constData())) {
7830+
auto label = new AspectRatioPixmapLabel;
7831+
label->setPixmap(QPixmap::fromImage(image));
7832+
label->setAlignment(Qt::AlignCenter);
7833+
label->setStyleSheet(QString::fromUtf8(obs_data_get_string(block, "qss")));
7834+
auto labelRow = new QHBoxLayout;
7835+
labelRow->addWidget(label, 1, Qt::AlignCenter);
7836+
layout = labelRow;
7837+
}
7838+
}
7839+
}
7840+
if (layout) {
7841+
added_count++;
7842+
if (i == 1) {
7843+
auto closeButton = new QPushButton("🞫");
7844+
connect(closeButton, &QPushButton::clicked, [this, added_count] {
7845+
for (size_t j = 0; j < added_count; j++) {
7846+
auto item = mainLayout->takeAt(2);
7847+
RemoveLayoutItem(item);
7848+
}
7849+
partnerBlockTime = time(nullptr);
7850+
SaveSettings();
7851+
});
7852+
layout->addWidget(closeButton);
77957853
}
7854+
mainLayout->insertLayout(2, layout, 0);
77967855
}
7856+
obs_data_release(block);
77977857
}
7798-
obs_data_release(block);
7858+
obs_data_array_release(blocks);
77997859
}
7800-
obs_data_array_release(blocks);
78017860
obs_data_release(data_obj);
78027861
}
78037862

vertical-canvas.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ class CanvasDock : public QFrame {
102102
std::vector<OBSSource> transitions;
103103
std::vector<OBSProjector *> projectors;
104104
std::unique_ptr<OBSEventFilter> eventFilter;
105+
time_t partnerBlockTime = 0;
105106

106107
std::vector<obs_sceneitem_t *> hoveredPreviewItems;
107108
std::vector<obs_sceneitem_t *> selectedItems;

0 commit comments

Comments
 (0)