Skip to content

Commit 4b88571

Browse files
Adds update dock properties button to dock toolbar. (#56)
* Adds update dock properties button to right side of dock toolbars. * Button opens a dialog which allows the users to change dock settings and dock name. * Fixes #42
1 parent 69e48a9 commit 4b88571

File tree

5 files changed

+180
-26
lines changed

5 files changed

+180
-26
lines changed

src/quick-access-dock.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,15 @@ QuickAccessDock::~QuickAccessDock()
6565
}
6666
}
6767

68+
void QuickAccessDock::SetName(std::string name)
69+
{
70+
_dockName = name;
71+
auto d = parentWidget();
72+
if (d) {
73+
d->setWindowTitle(name.c_str());
74+
}
75+
}
76+
6877
void QuickAccessDock::CleanupSourceHandlers()
6978
{
7079
if (_widget) {

src/quick-access-dock.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class QuickAccessDock : public QWidget {
2828
inline void SetFilters(bool on) { _showFilters = on; }
2929
inline void SetScenes(bool on) { _showScenes = on; }
3030
inline void SetClickableScenes(bool on) { _clickableScenes = on; }
31+
void SetName(std::string name);
3132
inline QDockWidget *GetDockWidget() { return _dockWidget; }
3233
void SwitchingSceneCollections(bool state) { _switchingSC = state; }
3334
void SetItemsButtonVisibility();

src/quick-access-utility.cpp

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -240,18 +240,10 @@ void QuickAccessUtility::CreateDock(CreateDockFormData data)
240240
auto dockData = obs_data_create();
241241
obs_data_set_string(dockData, "dock_name", data.dockName.c_str());
242242
obs_data_set_string(dockData, "dock_type", data.dockType.c_str());
243-
#if LIBOBS_API_VER >= MAKE_SEMANTIC_VERSION(29, 1, 0)
243+
244244
char *dockId = os_generate_uuid();
245245
obs_data_set_string(dockData, "dock_id", dockId);
246246
bfree(dockId);
247-
#else
248-
unsigned seed =
249-
std::chrono::system_clock::now().time_since_epoch().count();
250-
std::mt19937 rng(seed);
251-
unsigned v = rng();
252-
std::string dockId = std::to_string(v);
253-
obs_data_set_string(dockData, "dock_id", dockId.c_str());
254-
#endif
255247

256248
obs_data_set_bool(dockData, "show_properties", data.showProperties);
257249
obs_data_set_bool(dockData, "show_filters", data.showFilters);
@@ -688,6 +680,7 @@ void CreateDockDialog::on_create_dock()
688680
formData.showFilters = _showFilters->isChecked();
689681
formData.showScenes = _showScenes->isChecked();
690682
formData.clickableScenes = _clickThroughScenes->isChecked();
683+
formData.clickableScenes = _clickThroughScenes->isChecked();
691684
qau->CreateDock(formData);
692685
done(DialogCode::Accepted);
693686
}

src/quick-access.cpp

Lines changed: 137 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <QDialog>
1919
#include <QMouseEvent>
2020
#include <QInputDialog>
21+
#include <QMainWindow>
2122

2223
#include <algorithm>
2324
#include "version.h"
@@ -585,13 +586,12 @@ QuickAccess::QuickAccess(QWidget *parent, QuickAccessDock *dock, QString name)
585586
}
586587

587588
layout->addWidget(_sourceList);
589+
_actionsToolbar = new QToolBar(this);
590+
_actionsToolbar->setObjectName(QStringLiteral("actionsToolbar"));
591+
_actionsToolbar->setIconSize(QSize(16, 16));
592+
_actionsToolbar->setFloatable(false);
588593

589594
if (_dock->GetType() == "Manual") {
590-
_actionsToolbar = new QToolBar(this);
591-
_actionsToolbar->setObjectName(
592-
QStringLiteral("actionsToolbar"));
593-
_actionsToolbar->setIconSize(QSize(16, 16));
594-
_actionsToolbar->setFloatable(false);
595595

596596
_actionAddSource = new QAction(this);
597597
_actionAddSource->setObjectName(
@@ -635,24 +635,36 @@ QuickAccess::QuickAccess(QWidget *parent, QuickAccessDock *dock, QString name)
635635
SLOT(on_actionSourceDown_triggered()));
636636
_actionsToolbar->addAction(_actionSourceDown);
637637

638-
// Themes need the QAction dynamic properties
639-
for (QAction *x : _actionsToolbar->actions()) {
640-
QWidget *temp = _actionsToolbar->widgetForAction(x);
641-
642-
for (QByteArray &y : x->dynamicPropertyNames()) {
643-
temp->setProperty(y, x->property(y));
644-
}
645-
}
646-
647638
_actionRemoveSource->setEnabled(false);
648639
_actionSourceUp->setEnabled(false);
649640
_actionSourceDown->setEnabled(false);
641+
}
650642

651-
layout->addWidget(_actionsToolbar);
652-
layout->addItem(new QSpacerItem(150, 0, QSizePolicy::Fixed,
653-
QSizePolicy::Minimum));
643+
QWidget *spacer = new QWidget();
644+
spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
645+
_actionsToolbar->addWidget(spacer);
646+
647+
_actionDockProperties = new QAction(this);
648+
_actionDockProperties->setObjectName(QStringLiteral("actionSourceUp"));
649+
_actionDockProperties->setProperty("themeID", "propertiesIconSmall");
650+
_actionDockProperties->setText(QT_UTF8(obs_module_text("Dock Props")));
651+
connect(_actionDockProperties, SIGNAL(triggered()), this,
652+
SLOT(on_actionDockProperties_triggered()));
653+
_actionsToolbar->addAction(_actionDockProperties);
654+
655+
// Themes need the QAction dynamic properties
656+
for (QAction *x : _actionsToolbar->actions()) {
657+
QWidget *temp = _actionsToolbar->widgetForAction(x);
658+
659+
for (QByteArray &y : x->dynamicPropertyNames()) {
660+
temp->setProperty(y, x->property(y));
661+
}
654662
}
655663

664+
layout->addWidget(_actionsToolbar);
665+
layout->addItem(new QSpacerItem(150, 0, QSizePolicy::Fixed,
666+
QSizePolicy::Minimum));
667+
656668
if (_dock->GetType() == "Dynamic") {
657669
QuickAccess::SceneChangeCallback(
658670
OBS_FRONTEND_EVENT_SCENE_CHANGED, this);
@@ -740,6 +752,9 @@ void QuickAccess::_LoadDynamicScenes()
740752
_dynamicScenes.clear();
741753
_sourceList->clear();
742754

755+
//obs_source_t *dsk = obs_get_output_source(8);
756+
//const char *dsk_name = obs_source_get_name(dsk);
757+
//obs_source_release(dsk);
743758
obs_source_t *current = obs_weak_source_get_source(_current);
744759
obs_scene_t *currentScene = obs_scene_from_source(current);
745760
obs_scene_enum_items(currentScene, QuickAccess::DynAddSceneItems, this);
@@ -1168,6 +1183,14 @@ void QuickAccess::on_actionRemoveSource_triggered()
11681183
}
11691184
}
11701185

1186+
void QuickAccess::on_actionDockProperties_triggered()
1187+
{
1188+
const auto main_window =
1189+
static_cast<QMainWindow *>(obs_frontend_get_main_window());
1190+
UpdateDockDialog *dockDialog = new UpdateDockDialog(_dock, main_window);
1191+
dockDialog->show();
1192+
}
1193+
11711194
void QuickAccess::on_actionSourceUp_triggered()
11721195
{
11731196
int index = _sourceList->currentRow();
@@ -1408,6 +1431,103 @@ void QuickAccessSceneItem::setHighlight(bool h)
14081431
setAutoFillBackground(h);
14091432
}
14101433

1434+
UpdateDockDialog::UpdateDockDialog(QuickAccessDock *dock, QWidget *parent)
1435+
: QDialog(parent),
1436+
_dock(dock)
1437+
{
1438+
setWindowModality(Qt::WindowModal);
1439+
setAttribute(Qt::WA_DeleteOnClose, true);
1440+
setWindowTitle(QString("Add Quick Access Dock"));
1441+
setMinimumWidth(400);
1442+
setMinimumHeight(300);
1443+
int labelWidth = 120;
1444+
_layout = new QVBoxLayout();
1445+
1446+
// Form layout
1447+
_layout2 = new QVBoxLayout();
1448+
1449+
auto layoutName = new QHBoxLayout();
1450+
1451+
auto inputLabel = new QLabel(this);
1452+
inputLabel->setText("Dock Name:");
1453+
inputLabel->setFixedWidth(labelWidth);
1454+
1455+
_inputName = new QLineEdit(this);
1456+
_inputName->setPlaceholderText("Dock Name");
1457+
_inputName->setText(_dock->GetName().c_str());
1458+
_inputName->connect(_inputName, &QLineEdit::textChanged,
1459+
[this](const QString text) {
1460+
_buttonBox->button(QDialogButtonBox::Ok)
1461+
->setEnabled(text.length() > 0);
1462+
});
1463+
1464+
layoutName->addWidget(inputLabel);
1465+
layoutName->addWidget(_inputName);
1466+
1467+
_layout2->addItem(layoutName);
1468+
1469+
auto optionsLabel = new QLabel(this);
1470+
optionsLabel->setText("Dock Options:");
1471+
_layout2->addWidget(optionsLabel);
1472+
1473+
_showProperties = new QCheckBox(this);
1474+
_showProperties->setText("Show Properties?");
1475+
_showProperties->setChecked(_dock->ShowProperties());
1476+
_layout2->addWidget(_showProperties);
1477+
1478+
_showFilters = new QCheckBox(this);
1479+
_showFilters->setText("Show Filters?");
1480+
_showFilters->setChecked(_dock->ShowFilters());
1481+
_layout2->addWidget(_showFilters);
1482+
1483+
_showScenes = new QCheckBox(this);
1484+
_showScenes->setText("Show Parent Scenes?");
1485+
_showScenes->setChecked(_dock->ShowScenes());
1486+
_layout2->addWidget(_showScenes);
1487+
1488+
_clickThroughScenes = new QCheckBox(this);
1489+
_clickThroughScenes->setText("Clickable Scenes?");
1490+
_clickThroughScenes->setChecked(_dock->ClickableScenes());
1491+
_layout2->addWidget(_clickThroughScenes);
1492+
1493+
_buttonBox = new QDialogButtonBox(this);
1494+
_buttonBox->setStandardButtons(QDialogButtonBox::Cancel |
1495+
QDialogButtonBox::Ok);
1496+
1497+
connect(_buttonBox, SIGNAL(accepted()), this, SLOT(on_update_dock()));
1498+
connect(_buttonBox, SIGNAL(rejected()), this, SLOT(on_cancel()));
1499+
1500+
_layout->addItem(_layout2);
1501+
1502+
// Spacer to push buttons to bottom of widget
1503+
QWidget *spacer = new QWidget(this);
1504+
spacer->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
1505+
spacer->setVisible(true);
1506+
_layout->addWidget(spacer);
1507+
1508+
_layout->addWidget(_buttonBox);
1509+
1510+
setLayout(_layout);
1511+
}
1512+
1513+
void UpdateDockDialog::on_update_dock()
1514+
{
1515+
blog(LOG_INFO, "Update Dock");
1516+
_dock->SetName(QT_TO_UTF8(_inputName->text()));
1517+
_dock->SetProperties(_showProperties->isChecked());
1518+
_dock->SetFilters(_showFilters->isChecked());
1519+
_dock->SetScenes(_showScenes->isChecked());
1520+
_dock->SetClickableScenes(_clickThroughScenes->isChecked());
1521+
_dock->SetItemsButtonVisibility();
1522+
done(DialogCode::Accepted);
1523+
}
1524+
1525+
void UpdateDockDialog::on_cancel()
1526+
{
1527+
blog(LOG_INFO, "Cancel");
1528+
done(DialogCode::Rejected);
1529+
}
1530+
14111531
bool AddSourceToWidget(void *data, obs_source_t *source)
14121532
{
14131533
auto qa = static_cast<QuickAccess *>(data);

src/quick-access.hpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
#include <QPushButton>
1212
#include <QToolBar>
1313
#include <QHBoxLayout>
14+
#include <QDialog>
15+
#include <QDialogButtonBox>
16+
#include <QComboBox>
1417

1518
#include <vector>
1619
#include <set>
@@ -146,6 +149,7 @@ class QuickAccess : public QWidget {
146149
QAction *_actionRemoveSource = nullptr;
147150
QAction *_actionSourceUp = nullptr;
148151
QAction *_actionSourceDown = nullptr;
152+
QAction *_actionDockProperties = nullptr;
149153
QDialog *CreateAddSourcePopupMenu();
150154
obs_weak_source_t *_current = nullptr;
151155
signal_handler_t *source_signal_handler = nullptr;
@@ -173,7 +177,34 @@ private slots:
173177
void on_actionRemoveSource_triggered();
174178
void on_actionSourceUp_triggered();
175179
void on_actionSourceDown_triggered();
180+
void on_actionDockProperties_triggered();
176181
void on_sourceList_itemSelectionChanged();
177182
};
178183

184+
class UpdateDockDialog : public QDialog {
185+
Q_OBJECT
186+
public:
187+
UpdateDockDialog(QuickAccessDock *dock, QWidget *parent = nullptr);
188+
189+
private:
190+
QuickAccessDock *_dock = nullptr;
191+
QLayout *_layout = nullptr;
192+
QLayout *_layout2 = nullptr;
193+
//QLabel* _labelName = nullptr;
194+
QLineEdit *_inputName = nullptr;
195+
196+
//QLabel* _labelType = nullptr;
197+
QComboBox *_inputType = nullptr;
198+
199+
QCheckBox *_showProperties = nullptr;
200+
QCheckBox *_showFilters = nullptr;
201+
QCheckBox *_showScenes = nullptr;
202+
QCheckBox *_clickThroughScenes = nullptr;
203+
204+
QDialogButtonBox *_buttonBox = nullptr;
205+
private slots:
206+
void on_update_dock();
207+
void on_cancel();
208+
};
209+
179210
bool AddSourceToWidget(void *data, obs_source_t *source);

0 commit comments

Comments
 (0)