mirror of
https://github.com/obsproject/obs-studio.git
synced 2024-09-19 20:32:15 +02:00
UI: Add ability to reorder filters by drag & drop
This adds the ability for filters to be dragged and dropped to be reordered, similar to scenes and sources.
This commit is contained in:
parent
243d4d42e9
commit
f2f4582141
@ -1,4 +1,5 @@
|
|||||||
#include "focus-list.hpp"
|
#include "focus-list.hpp"
|
||||||
|
#include <QDragMoveEvent>
|
||||||
|
|
||||||
FocusList::FocusList(QWidget *parent) : QListWidget(parent) {}
|
FocusList::FocusList(QWidget *parent) : QListWidget(parent) {}
|
||||||
|
|
||||||
@ -8,3 +9,19 @@ void FocusList::focusInEvent(QFocusEvent *event)
|
|||||||
|
|
||||||
emit GotFocus();
|
emit GotFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FocusList::dragMoveEvent(QDragMoveEvent *event)
|
||||||
|
{
|
||||||
|
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
|
||||||
|
QPoint pos = event->position().toPoint();
|
||||||
|
#else
|
||||||
|
QPoint pos = event->pos();
|
||||||
|
#endif
|
||||||
|
int itemRow = row(itemAt(pos));
|
||||||
|
|
||||||
|
if ((itemRow == currentRow() + 1) ||
|
||||||
|
(currentRow() == count() - 1 && itemRow == -1))
|
||||||
|
event->ignore();
|
||||||
|
else
|
||||||
|
QListWidget::dragMoveEvent(event);
|
||||||
|
}
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
#include <QListWidget>
|
#include <QListWidget>
|
||||||
|
|
||||||
|
class QDragMoveEvent;
|
||||||
|
|
||||||
class FocusList : public QListWidget {
|
class FocusList : public QListWidget {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
@ -10,6 +12,7 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
void focusInEvent(QFocusEvent *event) override;
|
void focusInEvent(QFocusEvent *event) override;
|
||||||
|
virtual void dragMoveEvent(QDragMoveEvent *event) override;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void GotFocus();
|
void GotFocus();
|
||||||
|
@ -72,6 +72,15 @@
|
|||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
<number>1</number>
|
<number>1</number>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="dragEnabled">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="dragDropMode">
|
||||||
|
<enum>QAbstractItemView::InternalMove</enum>
|
||||||
|
</property>
|
||||||
|
<property name="defaultDropAction">
|
||||||
|
<enum>Qt::TargetMoveAction</enum>
|
||||||
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
@ -285,6 +294,15 @@
|
|||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
<number>1</number>
|
<number>1</number>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="dragEnabled">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="dragDropMode">
|
||||||
|
<enum>QAbstractItemView::InternalMove</enum>
|
||||||
|
</property>
|
||||||
|
<property name="defaultDropAction">
|
||||||
|
<enum>Qt::TargetMoveAction</enum>
|
||||||
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
|
@ -103,6 +103,11 @@ OBSBasicFilters::OBSBasicFilters(QWidget *parent, OBSSource source_)
|
|||||||
connect(ui->buttonBox->button(QDialogButtonBox::RestoreDefaults),
|
connect(ui->buttonBox->button(QDialogButtonBox::RestoreDefaults),
|
||||||
SIGNAL(clicked()), this, SLOT(ResetFilters()));
|
SIGNAL(clicked()), this, SLOT(ResetFilters()));
|
||||||
|
|
||||||
|
connect(ui->asyncFilters->model(), &QAbstractItemModel::rowsMoved, this,
|
||||||
|
&OBSBasicFilters::FiltersMoved);
|
||||||
|
connect(ui->effectFilters->model(), &QAbstractItemModel::rowsMoved,
|
||||||
|
this, &OBSBasicFilters::FiltersMoved);
|
||||||
|
|
||||||
uint32_t caps = obs_source_get_output_flags(source);
|
uint32_t caps = obs_source_get_output_flags(source);
|
||||||
bool audio = (caps & OBS_SOURCE_AUDIO) != 0;
|
bool audio = (caps & OBS_SOURCE_AUDIO) != 0;
|
||||||
bool audioOnly = (caps & OBS_SOURCE_VIDEO) == 0;
|
bool audioOnly = (caps & OBS_SOURCE_VIDEO) == 0;
|
||||||
@ -1276,3 +1281,28 @@ void OBSBasicFilters::delete_filter(OBSSource filter)
|
|||||||
redo, undo_data, redo_data, false);
|
redo, undo_data, redo_data, false);
|
||||||
obs_source_filter_remove(source, filter);
|
obs_source_filter_remove(source, filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OBSBasicFilters::FiltersMoved(const QModelIndex &, int srcIdxStart, int,
|
||||||
|
const QModelIndex &, int)
|
||||||
|
{
|
||||||
|
QListWidget *list = isAsync ? ui->asyncFilters : ui->effectFilters;
|
||||||
|
int neighborIdx = 0;
|
||||||
|
|
||||||
|
if (srcIdxStart < list->currentRow())
|
||||||
|
neighborIdx = list->currentRow() - 1;
|
||||||
|
else if (srcIdxStart > list->currentRow())
|
||||||
|
neighborIdx = list->currentRow() + 1;
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (neighborIdx > list->count() - 1)
|
||||||
|
neighborIdx = list->count() - 1;
|
||||||
|
else if (neighborIdx < 0)
|
||||||
|
neighborIdx = 0;
|
||||||
|
|
||||||
|
OBSSource neighbor = GetFilter(neighborIdx, isAsync);
|
||||||
|
size_t idx = obs_source_filter_get_index(source, neighbor);
|
||||||
|
|
||||||
|
OBSSource filter = GetFilter(list->currentRow(), isAsync);
|
||||||
|
obs_source_filter_set_index(source, filter, idx);
|
||||||
|
}
|
||||||
|
@ -121,6 +121,10 @@ private slots:
|
|||||||
void CopyFilter();
|
void CopyFilter();
|
||||||
void PasteFilter();
|
void PasteFilter();
|
||||||
|
|
||||||
|
void FiltersMoved(const QModelIndex &srcParent, int srcIdxStart,
|
||||||
|
int srcIdxEnd, const QModelIndex &dstParent,
|
||||||
|
int dstIdx);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
OBSBasicFilters(QWidget *parent, OBSSource source_);
|
OBSBasicFilters(QWidget *parent, OBSSource source_);
|
||||||
~OBSBasicFilters();
|
~OBSBasicFilters();
|
||||||
|
Loading…
Reference in New Issue
Block a user