Skip to content

Commit 0c665fb

Browse files
Adds clickable sources in list, fixes memory leak in parent scenes popup menu. (#52)
1 parent a5de22c commit 0c665fb

File tree

2 files changed

+34
-35
lines changed

2 files changed

+34
-35
lines changed

src/quick-access.cpp

Lines changed: 32 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ QMenu *QuickAccessItem::_CreateSceneMenu()
292292
});
293293
wa->setDefaultWidget(t);
294294
popup->addAction(wa);
295-
295+
popup->setStyleSheet("QMenu { menu-scrollable: 1; }");
296296
auto getActionAfter = [](QMenu *menu, const QString &name) {
297297
QList<QAction *> actions = menu->actions();
298298

@@ -315,6 +315,15 @@ QMenu *QuickAccessItem::_CreateSceneMenu()
315315
QWidgetAction *popupItem = new QWidgetAction(this);
316316
QWidget *itemWidget = new QuickAccessSceneItem(this, sceneItem);
317317
popupItem->setDefaultWidget(itemWidget);
318+
popupItem->setParent(pop);
319+
320+
connect(popupItem, &QWidgetAction::triggered, this,
321+
[this, name]() {
322+
obs_source_t *sceneClicked =
323+
obs_get_source_by_name(name);
324+
obs_frontend_set_current_scene(sceneClicked);
325+
obs_source_release(sceneClicked);
326+
});
318327

319328
QAction *after = getActionAfter(pop, qname);
320329
pop->insertAction(after, popupItem);
@@ -324,6 +333,16 @@ QMenu *QuickAccessItem::_CreateSceneMenu()
324333
addSource(popup, src);
325334
}
326335

336+
connect(popup, &QMenu::hovered, this, [popup](QAction *act) {
337+
QList<QWidgetAction *> menuActions =
338+
popup->findChildren<QWidgetAction *>();
339+
for (auto menuAction : menuActions) {
340+
auto widget = static_cast<QuickAccessSceneItem *>(
341+
menuAction->defaultWidget());
342+
widget->setHighlight(menuAction == act);
343+
}
344+
});
345+
327346
return popup;
328347
}
329348

@@ -351,6 +370,7 @@ void QuickAccessItem::on_actionScenes_triggered()
351370
}
352371
_getSceneItems();
353372
_AddScenePopupMenu(QCursor::pos());
373+
obs_source_release(source);
354374
}
355375

356376
void QuickAccessItem::SwitchToScene()
@@ -1281,7 +1301,7 @@ QuickAccessSceneItem::QuickAccessSceneItem(QWidget *parent,
12811301

12821302
setAttribute(Qt::WA_TranslucentBackground);
12831303
setMouseTracking(true);
1284-
setStyleSheet("background: none");
1304+
//setStyleSheet("background: none");
12851305

12861306
QIcon icon;
12871307

@@ -1349,34 +1369,6 @@ QuickAccessSceneItem::QuickAccessSceneItem(QWidget *parent,
13491369
}
13501370

13511371
auto setItemVisible = [this](bool val) {
1352-
//obs_scene_t *scene = obs_sceneitem_get_scene(_sceneItem);
1353-
//obs_source_t *scenesource = obs_scene_get_source(scene);
1354-
//int64_t id = obs_sceneitem_get_id(_sceneItem);
1355-
//const char *name = obs_source_get_name(scenesource);
1356-
//const char *uuid = obs_source_get_uuid(scenesource);
1357-
//obs_source_t *source = obs_sceneitem_get_source(_sceneItem);
1358-
1359-
//auto undo_redo = [](const std::string &uuid, int64_t id,
1360-
// bool val) {
1361-
// auto s = obs_get_source_by_uuid(uuid.c_str());
1362-
// obs_scene_t *sc = obs_group_or_scene_from_source(s);
1363-
// obs_sceneitem_t *si =
1364-
// obs_scene_find_sceneitem_by_id(sc, id);
1365-
// if (si)
1366-
// obs_sceneitem_set_visible(si, val);
1367-
//};
1368-
1369-
//QString str = QTStr(val ? "Undo.ShowSceneItem"
1370-
// : "Undo.HideSceneItem");
1371-
1372-
//OBSBasic *main = OBSBasic::Get();
1373-
//main->undo_s.add_action(
1374-
// str.arg(obs_source_get_name(source), name),
1375-
// std::bind(undo_redo, std::placeholders::_1, id, !val),
1376-
// std::bind(undo_redo, std::placeholders::_1, id, val),
1377-
// uuid, uuid);
1378-
1379-
//QSignalBlocker sourcesSignalBlocker(this);
13801372
obs_sceneitem_set_visible(_sceneItem, val);
13811373
};
13821374
connect(_vis, &QAbstractButton::clicked, setItemVisible);
@@ -1392,11 +1384,17 @@ void QuickAccessSceneItem::on_actionTransform_triggered()
13921384
obs_frontend_open_sceneitem_edit_transform(_sceneItem);
13931385
}
13941386

1395-
void QuickAccessSceneItem::mouseReleaseEvent(QMouseEvent *e)
1387+
//void QuickAccessSceneItem::mouseReleaseEvent(QMouseEvent *e)
1388+
//{
1389+
// // This is to suppress mouse event propegating down
1390+
// // to QMenu.
1391+
// UNUSED_PARAMETER(e);
1392+
//}
1393+
1394+
void QuickAccessSceneItem::setHighlight(bool h)
13961395
{
1397-
// This is to suppress mouse event propegating down
1398-
// to QMenu.
1399-
UNUSED_PARAMETER(e);
1396+
setBackgroundRole(h ? QPalette::Highlight : QPalette::Window);
1397+
setAutoFillBackground(h);
14001398
}
14011399

14021400
bool AddSourceToWidget(void *data, obs_source_t *source)

src/quick-access.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ class QuickAccessSceneItem : public QWidget {
2424
public:
2525
QuickAccessSceneItem(QWidget *parent, obs_sceneitem_t *sceneItem);
2626
~QuickAccessSceneItem();
27-
void mouseReleaseEvent(QMouseEvent *e) override;
27+
void setHighlight(bool h);
28+
//void mouseReleaseEvent(QMouseEvent *e) override;
2829

2930
private:
3031
obs_sceneitem_t *_sceneItem = nullptr;

0 commit comments

Comments
 (0)