|
@@ -573,6 +573,32 @@ void OBSBasic::CreateSourcePopupMenu(int idx, bool preview)
|
|
|
delete colorSelect;
|
|
|
delete deinterlaceMenu;
|
|
|
|
|
|
+ OBSSceneItem sceneItem;
|
|
|
+ obs_source_t *source;
|
|
|
+ uint32_t flags;
|
|
|
+ bool isAsyncVideo = false;
|
|
|
+ bool hasAudio = false;
|
|
|
+ bool hasVideo = false;
|
|
|
+
|
|
|
+ bool sourceSelected = idx != -1;
|
|
|
+
|
|
|
+ if (sourceSelected) {
|
|
|
+ sceneItem = ui->sources->Get(idx);
|
|
|
+ source = obs_sceneitem_get_source(sceneItem);
|
|
|
+ flags = obs_source_get_output_flags(source);
|
|
|
+ isAsyncVideo = (flags & OBS_SOURCE_ASYNC_VIDEO) == OBS_SOURCE_ASYNC_VIDEO;
|
|
|
+ hasAudio = (flags & OBS_SOURCE_AUDIO) == OBS_SOURCE_AUDIO;
|
|
|
+ hasVideo = (flags & OBS_SOURCE_VIDEO) == OBS_SOURCE_VIDEO;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Add new source
|
|
|
+ QPointer<QMenu> addSourceMenu = CreateAddSourcePopupMenu();
|
|
|
+ if (addSourceMenu) {
|
|
|
+ popup.addMenu(addSourceMenu);
|
|
|
+ popup.addSeparator();
|
|
|
+ }
|
|
|
+
|
|
|
+ // Preview menu entries
|
|
|
if (preview) {
|
|
|
QAction *action =
|
|
|
popup.addAction(QTStr("Basic.Main.PreviewConextMenu.Enable"), this, &OBSBasic::TogglePreview);
|
|
@@ -584,79 +610,76 @@ void OBSBasic::CreateSourcePopupMenu(int idx, bool preview)
|
|
|
popup.addAction(ui->actionLockPreview);
|
|
|
popup.addMenu(ui->scalingMenu);
|
|
|
|
|
|
- previewProjectorSource = new QMenu(QTStr("PreviewProjector"));
|
|
|
+ popup.addSeparator();
|
|
|
+ }
|
|
|
+
|
|
|
+ // Projector menu entries
|
|
|
+ if (preview) {
|
|
|
+ previewProjectorSource = new QMenu(QTStr("Projector.Open.Preview"));
|
|
|
AddProjectorMenuMonitors(previewProjectorSource, this, &OBSBasic::OpenPreviewProjector);
|
|
|
+ previewProjectorSource->addSeparator();
|
|
|
+ previewProjectorSource->addAction(QTStr("Projector.Window"), this, &OBSBasic::OpenPreviewWindow);
|
|
|
|
|
|
popup.addMenu(previewProjectorSource);
|
|
|
+ }
|
|
|
|
|
|
- QAction *previewWindow = popup.addAction(QTStr("PreviewWindow"), this, &OBSBasic::OpenPreviewWindow);
|
|
|
-
|
|
|
- popup.addAction(previewWindow);
|
|
|
+ if (hasVideo) {
|
|
|
+ sourceProjector = new QMenu(QTStr("Projector.Open.Source"));
|
|
|
+ AddProjectorMenuMonitors(sourceProjector, this, &OBSBasic::OpenSourceProjector);
|
|
|
+ sourceProjector->addSeparator();
|
|
|
+ sourceProjector->addAction(QTStr("Projector.Window"), this, &OBSBasic::OpenSourceWindow);
|
|
|
|
|
|
- popup.addAction(QTStr("Screenshot.Preview"), this, &OBSBasic::ScreenshotScene);
|
|
|
-
|
|
|
- popup.addSeparator();
|
|
|
+ popup.addMenu(sourceProjector);
|
|
|
}
|
|
|
|
|
|
- QPointer<QMenu> addSourceMenu = CreateAddSourcePopupMenu();
|
|
|
- if (addSourceMenu)
|
|
|
- popup.addMenu(addSourceMenu);
|
|
|
-
|
|
|
- if (ui->sources->MultipleBaseSelected()) {
|
|
|
- popup.addSeparator();
|
|
|
- popup.addAction(QTStr("Basic.Main.GroupItems"), ui->sources, &SourceTree::GroupSelectedItems);
|
|
|
+ popup.addSeparator();
|
|
|
|
|
|
- } else if (ui->sources->GroupsSelected()) {
|
|
|
- popup.addSeparator();
|
|
|
- popup.addAction(QTStr("Basic.Main.Ungroup"), ui->sources, &SourceTree::UngroupSelectedGroups);
|
|
|
+ // Screenshot menu entries
|
|
|
+ if (preview) {
|
|
|
+ popup.addAction(QTStr("Screenshot.Preview"), this, &OBSBasic::ScreenshotScene);
|
|
|
}
|
|
|
|
|
|
- popup.addSeparator();
|
|
|
- popup.addAction(ui->actionCopySource);
|
|
|
- popup.addAction(ui->actionPasteRef);
|
|
|
- popup.addAction(ui->actionPasteDup);
|
|
|
- popup.addSeparator();
|
|
|
+ if (hasVideo) {
|
|
|
+ popup.addAction(QTStr("Screenshot.Source"), this, &OBSBasic::ScreenshotSelectedSource);
|
|
|
+ }
|
|
|
|
|
|
- popup.addSeparator();
|
|
|
- popup.addAction(ui->actionCopyFilters);
|
|
|
- popup.addAction(ui->actionPasteFilters);
|
|
|
popup.addSeparator();
|
|
|
|
|
|
- if (idx != -1) {
|
|
|
- if (addSourceMenu)
|
|
|
+ if (sourceSelected) {
|
|
|
+ // Sources list menu entries
|
|
|
+ if (!preview) {
|
|
|
+ colorMenu = new QMenu(QTStr("ChangeBG"));
|
|
|
+ colorWidgetAction = new QWidgetAction(colorMenu);
|
|
|
+ colorSelect = new ColorSelect(colorMenu);
|
|
|
+ popup.addMenu(AddBackgroundColorMenu(colorMenu, colorWidgetAction, colorSelect, sceneItem));
|
|
|
+
|
|
|
+ if (hasAudio) {
|
|
|
+ QAction *actionHideMixer =
|
|
|
+ popup.addAction(QTStr("HideMixer"), this, &OBSBasic::ToggleHideMixer);
|
|
|
+ actionHideMixer->setCheckable(true);
|
|
|
+ actionHideMixer->setChecked(SourceMixerHidden(source));
|
|
|
+ }
|
|
|
popup.addSeparator();
|
|
|
+ }
|
|
|
|
|
|
- OBSSceneItem sceneItem = ui->sources->Get(idx);
|
|
|
- obs_source_t *source = obs_sceneitem_get_source(sceneItem);
|
|
|
- uint32_t flags = obs_source_get_output_flags(source);
|
|
|
- bool isAsyncVideo = (flags & OBS_SOURCE_ASYNC_VIDEO) == OBS_SOURCE_ASYNC_VIDEO;
|
|
|
- bool hasAudio = (flags & OBS_SOURCE_AUDIO) == OBS_SOURCE_AUDIO;
|
|
|
- bool hasVideo = (flags & OBS_SOURCE_VIDEO) == OBS_SOURCE_VIDEO;
|
|
|
-
|
|
|
- colorMenu = new QMenu(QTStr("ChangeBG"));
|
|
|
- colorWidgetAction = new QWidgetAction(colorMenu);
|
|
|
- colorSelect = new ColorSelect(colorMenu);
|
|
|
- popup.addMenu(AddBackgroundColorMenu(colorMenu, colorWidgetAction, colorSelect, sceneItem));
|
|
|
- popup.addAction(renameSource);
|
|
|
- popup.addAction(ui->actionRemoveSource);
|
|
|
- popup.addSeparator();
|
|
|
-
|
|
|
- popup.addMenu(ui->orderMenu);
|
|
|
-
|
|
|
- if (hasVideo)
|
|
|
- popup.addMenu(ui->transformMenu);
|
|
|
+ // Scene item menu entries
|
|
|
+ if (hasVideo && source) {
|
|
|
+ scaleFilteringMenu = new QMenu(QTStr("ScaleFiltering"));
|
|
|
+ popup.addMenu(AddScaleFilteringMenu(scaleFilteringMenu, sceneItem));
|
|
|
+ blendingModeMenu = new QMenu(QTStr("BlendingMode"));
|
|
|
+ popup.addMenu(AddBlendingModeMenu(blendingModeMenu, sceneItem));
|
|
|
+ blendingMethodMenu = new QMenu(QTStr("BlendingMethod"));
|
|
|
+ popup.addMenu(AddBlendingMethodMenu(blendingMethodMenu, sceneItem));
|
|
|
+ if (isAsyncVideo) {
|
|
|
+ deinterlaceMenu = new QMenu(QTStr("Deinterlacing"));
|
|
|
+ popup.addMenu(AddDeinterlacingMenu(deinterlaceMenu, source));
|
|
|
+ }
|
|
|
|
|
|
- popup.addSeparator();
|
|
|
+ popup.addMenu(CreateVisibilityTransitionMenu(true));
|
|
|
+ popup.addMenu(CreateVisibilityTransitionMenu(false));
|
|
|
|
|
|
- if (hasAudio) {
|
|
|
- QAction *actionHideMixer =
|
|
|
- popup.addAction(QTStr("HideMixer"), this, &OBSBasic::ToggleHideMixer);
|
|
|
- actionHideMixer->setCheckable(true);
|
|
|
- actionHideMixer->setChecked(SourceMixerHidden(source));
|
|
|
popup.addSeparator();
|
|
|
- }
|
|
|
|
|
|
- if (hasVideo) {
|
|
|
QAction *resizeOutput = popup.addAction(QTStr("ResizeOutputSizeOfSource"), this,
|
|
|
&OBSBasic::ResizeOutputSizeOfSource);
|
|
|
|
|
@@ -667,41 +690,54 @@ void OBSBasic::CreateSourcePopupMenu(int idx, bool preview)
|
|
|
|
|
|
if (width < 32 || height < 32)
|
|
|
resizeOutput->setEnabled(false);
|
|
|
+ }
|
|
|
|
|
|
- scaleFilteringMenu = new QMenu(QTStr("ScaleFiltering"));
|
|
|
- popup.addMenu(AddScaleFilteringMenu(scaleFilteringMenu, sceneItem));
|
|
|
- blendingModeMenu = new QMenu(QTStr("BlendingMode"));
|
|
|
- popup.addMenu(AddBlendingModeMenu(blendingModeMenu, sceneItem));
|
|
|
- blendingMethodMenu = new QMenu(QTStr("BlendingMethod"));
|
|
|
- popup.addMenu(AddBlendingMethodMenu(blendingMethodMenu, sceneItem));
|
|
|
- if (isAsyncVideo) {
|
|
|
- deinterlaceMenu = new QMenu(QTStr("Deinterlacing"));
|
|
|
- popup.addMenu(AddDeinterlacingMenu(deinterlaceMenu, source));
|
|
|
- }
|
|
|
+ popup.addSeparator();
|
|
|
+
|
|
|
+ popup.addMenu(ui->orderMenu);
|
|
|
+
|
|
|
+ if (hasVideo) {
|
|
|
+ popup.addMenu(ui->transformMenu);
|
|
|
+ }
|
|
|
+
|
|
|
+ popup.addSeparator();
|
|
|
|
|
|
+ // Source grouping
|
|
|
+ if (ui->sources->MultipleBaseSelected()) {
|
|
|
popup.addSeparator();
|
|
|
+ popup.addAction(QTStr("Basic.Main.GroupItems"), ui->sources, &SourceTree::GroupSelectedItems);
|
|
|
|
|
|
- popup.addMenu(CreateVisibilityTransitionMenu(true));
|
|
|
- popup.addMenu(CreateVisibilityTransitionMenu(false));
|
|
|
+ } else if (ui->sources->GroupsSelected()) {
|
|
|
popup.addSeparator();
|
|
|
+ popup.addAction(QTStr("Basic.Main.Ungroup"), ui->sources, &SourceTree::UngroupSelectedGroups);
|
|
|
+ }
|
|
|
+ popup.addSeparator();
|
|
|
|
|
|
- sourceProjector = new QMenu(QTStr("SourceProjector"));
|
|
|
- AddProjectorMenuMonitors(sourceProjector, this, &OBSBasic::OpenSourceProjector);
|
|
|
- popup.addMenu(sourceProjector);
|
|
|
- popup.addAction(QTStr("SourceWindow"), this, &OBSBasic::OpenSourceWindow);
|
|
|
+ popup.addAction(ui->actionCopySource);
|
|
|
+ popup.addAction(ui->actionPasteRef);
|
|
|
+ popup.addAction(ui->actionPasteDup);
|
|
|
+ popup.addSeparator();
|
|
|
|
|
|
- popup.addAction(QTStr("Screenshot.Source"), this, &OBSBasic::ScreenshotSelectedSource);
|
|
|
+ if (hasVideo || hasAudio) {
|
|
|
+ popup.addAction(ui->actionCopyFilters);
|
|
|
+ popup.addAction(ui->actionPasteFilters);
|
|
|
+ popup.addSeparator();
|
|
|
}
|
|
|
|
|
|
+ popup.addAction(ui->actionRemoveSource);
|
|
|
+ popup.addAction(renameSource);
|
|
|
popup.addSeparator();
|
|
|
|
|
|
- if (flags & OBS_SOURCE_INTERACTION)
|
|
|
+ if (flags && flags & OBS_SOURCE_INTERACTION)
|
|
|
popup.addAction(QTStr("Interact"), this, &OBSBasic::on_actionInteract_triggered);
|
|
|
|
|
|
popup.addAction(QTStr("Filters"), this, [&]() { OpenFilters(); });
|
|
|
QAction *action =
|
|
|
popup.addAction(QTStr("Properties"), this, &OBSBasic::on_actionSourceProperties_triggered);
|
|
|
action->setEnabled(obs_source_configurable(source));
|
|
|
+ } else {
|
|
|
+ popup.addAction(ui->actionPasteRef);
|
|
|
+ popup.addAction(ui->actionPasteDup);
|
|
|
}
|
|
|
|
|
|
popup.exec(QCursor::pos());
|