This commit is contained in:
Sebastian Beckmann 2024-06-27 11:04:08 +02:00 committed by GitHub
commit 3cbc0094d5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 67 additions and 60 deletions

View file

@ -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'"

View file

@ -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)

View file

@ -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,

View file

@ -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);