mirror of
https://github.com/obsproject/obs-studio.git
synced 2024-07-05 11:03:31 +00:00
Merge 5a9f9af9ad
into 9d67bf2662
This commit is contained in:
commit
3cbc0094d5
|
@ -318,7 +318,7 @@ Undo.Item.Redo="Redo %1"
|
|||
Undo.Sources.Multi="Delete %1 Sources"
|
||||
Undo.Filters="Filter Changes on '%1'"
|
||||
Undo.Filters.Paste.Single="Paste Filter '%1' to '%2'"
|
||||
Undo.Filters.Paste.Multiple="Copy Filters from '%1' to '%2'"
|
||||
Undo.Filters.Paste.Multiple="Paste %1 Filters to '%2'"
|
||||
Undo.Transform="Transform source(s) In '%1'"
|
||||
Undo.Transform.Paste="Paste Transformation in '%1'"
|
||||
Undo.Transform.Rotate="Rotation In '%1'"
|
||||
|
|
|
@ -945,7 +945,7 @@ void OBSBasicFilters::CustomContextMenu(const QPoint &pos, bool async)
|
|||
}
|
||||
|
||||
QAction *pasteAction = new QAction(QTStr("Paste"));
|
||||
pasteAction->setEnabled(main->copyFilter);
|
||||
pasteAction->setEnabled(!main->filtersClipboard.empty());
|
||||
connect(pasteAction, &QAction::triggered, this,
|
||||
&OBSBasicFilters::PasteFilter);
|
||||
pasteAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_V));
|
||||
|
@ -1165,26 +1165,13 @@ void OBSBasicFilters::CopyFilter()
|
|||
else
|
||||
filter = GetFilter(ui->effectFilters->currentRow(), false);
|
||||
|
||||
main->copyFilter = OBSGetWeakRef(filter);
|
||||
main->filtersClipboard.clear();
|
||||
main->filtersClipboard.push_back(OBSGetWeakRef(filter));
|
||||
}
|
||||
|
||||
void OBSBasicFilters::PasteFilter()
|
||||
{
|
||||
OBSSource filter = OBSGetStrongRef(main->copyFilter);
|
||||
if (!filter)
|
||||
return;
|
||||
|
||||
OBSDataArrayAutoRelease undo_array = obs_source_backup_filters(source);
|
||||
obs_source_copy_single_filter(source, filter);
|
||||
OBSDataArrayAutoRelease redo_array = obs_source_backup_filters(source);
|
||||
|
||||
const char *filterName = obs_source_get_name(filter);
|
||||
const char *sourceName = obs_source_get_name(source);
|
||||
QString text =
|
||||
QTStr("Undo.Filters.Paste.Single").arg(filterName, sourceName);
|
||||
|
||||
main->CreateFilterPasteUndoRedoAction(text, source, undo_array,
|
||||
redo_array);
|
||||
main->SourcePasteFilters(source);
|
||||
}
|
||||
|
||||
void OBSBasicFilters::delete_filter(OBSSource filter)
|
||||
|
|
|
@ -3926,8 +3926,7 @@ void OBSBasic::VolControlContextMenu()
|
|||
|
||||
copyFiltersAction.setEnabled(obs_source_filter_count(vol->GetSource()) >
|
||||
0);
|
||||
pasteFiltersAction.setEnabled(
|
||||
!obs_weak_source_expired(copyFiltersSource));
|
||||
pasteFiltersAction.setEnabled(!filtersClipboard.empty());
|
||||
|
||||
QMenu popup;
|
||||
vol->SetContextMenu(&popup);
|
||||
|
@ -5096,8 +5095,7 @@ void OBSBasic::ClearSceneData()
|
|||
prevFTBSource = nullptr;
|
||||
|
||||
clipboard.clear();
|
||||
copyFiltersSource = nullptr;
|
||||
copyFilter = nullptr;
|
||||
filtersClipboard.clear();
|
||||
|
||||
auto cb = [](void *, obs_source_t *source) {
|
||||
obs_source_remove(source);
|
||||
|
@ -5615,8 +5613,7 @@ void OBSBasic::on_scenes_customContextMenuRequested(const QPoint &pos)
|
|||
&OBSBasic::SceneCopyFilters);
|
||||
QAction *pasteFilters =
|
||||
new QAction(QTStr("Paste.Filters"), this);
|
||||
pasteFilters->setEnabled(
|
||||
!obs_weak_source_expired(copyFiltersSource));
|
||||
pasteFilters->setEnabled(!filtersClipboard.empty());
|
||||
connect(pasteFilters, &QAction::triggered, this,
|
||||
&OBSBasic::ScenePasteFilters);
|
||||
|
||||
|
@ -8634,8 +8631,8 @@ void OBSBasic::UpdateEditMenu()
|
|||
ui->actionPasteTransform->setEnabled(
|
||||
canTransformMultiple && hasCopiedTransform && videoCount > 0);
|
||||
ui->actionCopyFilters->setEnabled(filter_count > 0);
|
||||
ui->actionPasteFilters->setEnabled(
|
||||
!obs_weak_source_expired(copyFiltersSource) && totalCount > 0);
|
||||
ui->actionPasteFilters->setEnabled(!filtersClipboard.empty() &&
|
||||
totalCount > 0);
|
||||
ui->actionPasteRef->setEnabled(!!clipboard.size());
|
||||
ui->actionPasteDup->setEnabled(allowPastingDuplicate);
|
||||
|
||||
|
@ -10110,21 +10107,61 @@ void OBSBasic::on_actionPasteDup_triggered()
|
|||
redo_data);
|
||||
}
|
||||
|
||||
void OBSBasic::SourcePasteFilters(OBSSource source, OBSSource dstSource)
|
||||
void OBSBasic::SourceCopyFilters(OBSSource source)
|
||||
{
|
||||
if (source == dstSource)
|
||||
return;
|
||||
filtersClipboard.clear();
|
||||
filtersClipboard.reserve(obs_source_filter_count(source));
|
||||
obs_source_enum_filters(
|
||||
source,
|
||||
[](obs_source_t *, obs_source_t *filter, void *param) {
|
||||
auto filters =
|
||||
static_cast<std::vector<OBSWeakSource> *>(
|
||||
param);
|
||||
filters->push_back(OBSGetWeakRef(filter));
|
||||
},
|
||||
&filtersClipboard);
|
||||
ui->actionPasteFilters->setEnabled(true);
|
||||
}
|
||||
|
||||
void OBSBasic::SourcePasteFilters(OBSSource dstSource)
|
||||
{
|
||||
OBSDataArrayAutoRelease undo_array =
|
||||
obs_source_backup_filters(dstSource);
|
||||
obs_source_copy_filters(dstSource, source);
|
||||
|
||||
int copiedFiltersCount = 0;
|
||||
OBSSource copiedFilter = nullptr;
|
||||
for (auto &weakFilter : filtersClipboard) {
|
||||
if (obs_weak_source_expired(weakFilter)) {
|
||||
continue;
|
||||
}
|
||||
OBSSource filter = OBSGetStrongRef(weakFilter);
|
||||
obs_source_copy_single_filter(dstSource, filter);
|
||||
|
||||
if (copiedFiltersCount == 0) {
|
||||
copiedFilter = filter;
|
||||
}
|
||||
copiedFiltersCount++;
|
||||
}
|
||||
|
||||
if (copiedFiltersCount == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
OBSDataArrayAutoRelease redo_array =
|
||||
obs_source_backup_filters(dstSource);
|
||||
|
||||
const char *srcName = obs_source_get_name(source);
|
||||
const char *dstName = obs_source_get_name(dstSource);
|
||||
QString text =
|
||||
QTStr("Undo.Filters.Paste.Multiple").arg(srcName, dstName);
|
||||
|
||||
QString text;
|
||||
if (copiedFiltersCount == 1) {
|
||||
const char *filterName = obs_source_get_name(copiedFilter);
|
||||
text = QTStr("Undo.Filters.Paste.Single")
|
||||
.arg(filterName, dstName);
|
||||
} else {
|
||||
text = QTStr("Undo.Filters.Paste.Multiple")
|
||||
.arg(QString::number(copiedFiltersCount),
|
||||
dstName);
|
||||
}
|
||||
|
||||
CreateFilterPasteUndoRedoAction(text, dstSource, undo_array,
|
||||
redo_array);
|
||||
|
@ -10136,36 +10173,25 @@ void OBSBasic::AudioMixerCopyFilters()
|
|||
VolControl *vol = action->property("volControl").value<VolControl *>();
|
||||
obs_source_t *source = vol->GetSource();
|
||||
|
||||
copyFiltersSource = obs_source_get_weak_source(source);
|
||||
ui->actionPasteFilters->setEnabled(true);
|
||||
SourceCopyFilters(source);
|
||||
}
|
||||
|
||||
void OBSBasic::AudioMixerPasteFilters()
|
||||
{
|
||||
QAction *action = reinterpret_cast<QAction *>(sender());
|
||||
VolControl *vol = action->property("volControl").value<VolControl *>();
|
||||
obs_source_t *dstSource = vol->GetSource();
|
||||
|
||||
OBSSourceAutoRelease source =
|
||||
obs_weak_source_get_source(copyFiltersSource);
|
||||
|
||||
SourcePasteFilters(source.Get(), dstSource);
|
||||
OBSSource dstSource = vol->GetSource();
|
||||
SourcePasteFilters(dstSource);
|
||||
}
|
||||
|
||||
void OBSBasic::SceneCopyFilters()
|
||||
{
|
||||
copyFiltersSource = obs_source_get_weak_source(GetCurrentSceneSource());
|
||||
ui->actionPasteFilters->setEnabled(true);
|
||||
SourceCopyFilters(GetCurrentSceneSource());
|
||||
}
|
||||
|
||||
void OBSBasic::ScenePasteFilters()
|
||||
{
|
||||
OBSSourceAutoRelease source =
|
||||
obs_weak_source_get_source(copyFiltersSource);
|
||||
|
||||
OBSSource dstSource = GetCurrentSceneSource();
|
||||
|
||||
SourcePasteFilters(source.Get(), dstSource);
|
||||
SourcePasteFilters(GetCurrentSceneSource());
|
||||
}
|
||||
|
||||
void OBSBasic::on_actionCopyFilters_triggered()
|
||||
|
@ -10177,9 +10203,7 @@ void OBSBasic::on_actionCopyFilters_triggered()
|
|||
|
||||
OBSSource source = obs_sceneitem_get_source(item);
|
||||
|
||||
copyFiltersSource = obs_source_get_weak_source(source);
|
||||
|
||||
ui->actionPasteFilters->setEnabled(true);
|
||||
SourceCopyFilters(source);
|
||||
}
|
||||
|
||||
void OBSBasic::CreateFilterPasteUndoRedoAction(const QString &text,
|
||||
|
@ -10217,13 +10241,9 @@ void OBSBasic::CreateFilterPasteUndoRedoAction(const QString &text,
|
|||
|
||||
void OBSBasic::on_actionPasteFilters_triggered()
|
||||
{
|
||||
OBSSourceAutoRelease source =
|
||||
obs_weak_source_get_source(copyFiltersSource);
|
||||
|
||||
OBSSceneItem sceneItem = GetCurrentSceneItem();
|
||||
OBSSource dstSource = obs_sceneitem_get_source(sceneItem);
|
||||
|
||||
SourcePasteFilters(source.Get(), dstSource);
|
||||
SourcePasteFilters(dstSource);
|
||||
}
|
||||
|
||||
static void ConfirmColor(SourceTree *sources, const QColor &color,
|
||||
|
|
|
@ -245,7 +245,6 @@ private:
|
|||
ContextBarSize contextBarSize = ContextBarSize_Normal;
|
||||
|
||||
std::deque<SourceCopyInfo> clipboard;
|
||||
OBSWeakSourceAutoRelease copyFiltersSource;
|
||||
bool copyVisible = true;
|
||||
obs_transform_info copiedTransformInfo;
|
||||
obs_sceneitem_crop copiedCropInfo;
|
||||
|
@ -807,7 +806,6 @@ private slots:
|
|||
void on_actionPasteFilters_triggered();
|
||||
void AudioMixerCopyFilters();
|
||||
void AudioMixerPasteFilters();
|
||||
void SourcePasteFilters(OBSSource source, OBSSource dstSource);
|
||||
|
||||
void ColorChange();
|
||||
|
||||
|
@ -1015,7 +1013,9 @@ public:
|
|||
QIcon GetGroupIcon() const;
|
||||
QIcon GetSceneIcon() const;
|
||||
|
||||
OBSWeakSource copyFilter;
|
||||
std::vector<OBSWeakSource> filtersClipboard;
|
||||
void SourceCopyFilters(OBSSource source);
|
||||
void SourcePasteFilters(OBSSource dstSource);
|
||||
|
||||
void ShowStatusBarMessage(const QString &message);
|
||||
|
||||
|
|
Loading…
Reference in a new issue