Skip to content

Commit

Permalink
重构 transcode界面;
Browse files Browse the repository at this point in the history
  • Loading branch information
RealChuan committed Mar 13, 2024
1 parent 888d764 commit c9eea5b
Show file tree
Hide file tree
Showing 28 changed files with 807 additions and 209 deletions.
6 changes: 6 additions & 0 deletions examples/transcoder/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,12 @@ set(PROJECT_SOURCES
stautuswidget.hpp
styleditemdelegate.cc
styleditemdelegate.hpp
subtitleencodermodel.cc
subtitleencodermodel.hpp
subtitleencodertableview.cc
subtitleencodertableview.hpp
subtitleencoderwidget.cc
subtitleencoderwidget.hpp
videoencoderwidget.cc
videoencoderwidget.hpp)

Expand Down
42 changes: 37 additions & 5 deletions examples/transcoder/audioencodermodel.cc
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
#include "audioencodermodel.hpp"

#include <QApplication>
#include <QIcon>
#include <QStyle>

class AudioEncoderModel::AudioEncoderModelPrivate
{
public:
Expand All @@ -16,6 +20,8 @@ class AudioEncoderModel::AudioEncoderModelPrivate

Ffmpeg::EncodeContexts encodeContexts;
QStringList headers;

QIcon removeIcon = qApp->style()->standardIcon(QStyle::SP_TitleBarCloseButton);
};

AudioEncoderModel::AudioEncoderModel(QObject *parent)
Expand Down Expand Up @@ -54,10 +60,12 @@ auto AudioEncoderModel::data(const QModelIndex &index, int role) const -> QVaria
case Qt::DisplayRole:
case Qt::EditRole: { //双击为空需添加
switch (col) {
case Property::ID: return row;
case Property::ID: return data.streamIndex;
case Property::SourceInfo: return data.sourceInfo;
case Property::Encoder: return data.codecInfo().displayName;
case Property::ChannelLayout: return data.chLayout().channelName;
case Property::Bitrate: return data.bitrate;
case Property::SampleRate: return data.sampleRate;
case Property::Crf: return data.crf;
case Property::Profile: {
auto profile = data.profile();
Expand All @@ -69,6 +77,12 @@ auto AudioEncoderModel::data(const QModelIndex &index, int role) const -> QVaria
default: break;
}
break;
case Qt::DecorationRole:
switch (col) {
case Property::Remove: return d_ptr->removeIcon;
default: break;
}
break;
case Qt::UserRole: return QVariant::fromValue(data);
}
default: break;
Expand Down Expand Up @@ -105,8 +119,16 @@ auto AudioEncoderModel::setData(const QModelIndex &index, const QVariant &value,
} break;
case Property::Bitrate:
data.maxBitrate = data.minBitrate = data.bitrate = value.toInt();
emit dataChanged(index, index);
break;
case Property::SampleRate:
data.sampleRate = value.toInt();
emit dataChanged(index, index);
break;
case Property::Crf:
data.crf = value.toInt();
emit dataChanged(index, index);
break;
case Property::Crf: data.crf = value.toInt();
case Property::Profile: {
auto profile = value.toInt();
if (data.profile().profile != profile) {
Expand All @@ -129,8 +151,11 @@ auto AudioEncoderModel::flags(const QModelIndex &index) const -> Qt::ItemFlags
return {};
}
auto flags = QAbstractTableModel::flags(index);
if (index.column() != Property::ID) {
flags |= Qt::ItemIsEditable;
switch (index.column()) {
case Property::ID:
case Property::SourceInfo:
case Property::Remove: break;
default: flags |= Qt::ItemIsEditable; break;
}
return flags;
}
Expand Down Expand Up @@ -158,7 +183,14 @@ void AudioEncoderModel::setDatas(const Ffmpeg::EncodeContexts &encodeContexts)
endResetModel();
}

Ffmpeg::EncodeContexts AudioEncoderModel::datas() const
auto AudioEncoderModel::datas() const -> Ffmpeg::EncodeContexts
{
return d_ptr->encodeContexts;
}

void AudioEncoderModel::remove(const QModelIndex &index)
{
beginRemoveRows(index.parent(), index.row(), index.row());
d_ptr->encodeContexts.removeAt(index.row());
endRemoveRows();
}
27 changes: 20 additions & 7 deletions examples/transcoder/audioencodermodel.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,17 @@ class AudioEncoderModel : public QAbstractTableModel
{
Q_OBJECT
public:
enum Property { ID, Encoder, ChannelLayout, Bitrate, Crf, Profile };
enum Property {
ID,
SourceInfo,
Encoder,
ChannelLayout,
Bitrate,
SampleRate,
Crf,
Profile,
Remove
};
Q_ENUM(Property);

explicit AudioEncoderModel(QObject *parent = nullptr);
Expand All @@ -18,18 +28,21 @@ class AudioEncoderModel : public QAbstractTableModel
[[nodiscard]] auto rowCount(const QModelIndex &parent = QModelIndex()) const -> int override;
[[nodiscard]] auto columnCount(const QModelIndex &parent = QModelIndex()) const -> int override;

[[nodiscard]] QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
[[nodiscard]] auto data(const QModelIndex &index, int role = Qt::DisplayRole) const
-> QVariant override;
auto setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)
-> bool override;

[[nodiscard]] Qt::ItemFlags flags(const QModelIndex &index) const override;
[[nodiscard]] auto flags(const QModelIndex &index) const -> Qt::ItemFlags override;

[[nodiscard]] QVariant headerData(int section,
Qt::Orientation orientation,
int role = Qt::DisplayRole) const override;
[[nodiscard]] auto headerData(int section,
Qt::Orientation orientation,
int role = Qt::DisplayRole) const -> QVariant override;

void setDatas(const Ffmpeg::EncodeContexts &encodeContexts);
Ffmpeg::EncodeContexts datas() const;
[[nodiscard]] auto datas() const -> Ffmpeg::EncodeContexts;

void remove(const QModelIndex &index);

private:
class AudioEncoderModelPrivate;
Expand Down
57 changes: 48 additions & 9 deletions examples/transcoder/audioencodertableview.cc
Original file line number Diff line number Diff line change
Expand Up @@ -23,20 +23,53 @@ AudioEncoderTableView::AudioEncoderTableView(QWidget *parent)
, d_ptr(new AudioEncoderTableViewPrivate(this))
{
setupUI();
buildConnect();
}

AudioEncoderTableView::~AudioEncoderTableView() {}
AudioEncoderTableView::~AudioEncoderTableView() = default;

void AudioEncoderTableView::setDatas(const Ffmpeg::EncodeContexts &encodeContexts)
{
d_ptr->model->setDatas(encodeContexts);
}

Ffmpeg::EncodeContexts AudioEncoderTableView::datas() const
auto AudioEncoderTableView::datas() const -> Ffmpeg::EncodeContexts
{
return d_ptr->model->datas();
}

void AudioEncoderTableView::onRemoved(const QModelIndex &index)
{
d_ptr->model->remove(index);
}

void AudioEncoderTableView::onResize()
{
setColumnWidth(AudioEncoderModel::Property::ID, 50);
setColumnWidth(AudioEncoderModel::Property::SourceInfo, this->width() / 5 - 10);
setColumnWidth(AudioEncoderModel::Property::ChannelLayout, 100);
setColumnWidth(AudioEncoderModel::Property::Bitrate, 100);
setColumnWidth(AudioEncoderModel::Property::SampleRate, 100);
setColumnWidth(AudioEncoderModel::Property::Crf, 50);
setColumnWidth(AudioEncoderModel::Property::Profile, 100);
setColumnWidth(AudioEncoderModel::Property::Remove, 50);

auto width = this->width() - columnWidth(AudioEncoderModel::Property::ID)
- columnWidth(AudioEncoderModel::Property::SourceInfo)
- columnWidth(AudioEncoderModel::Property::ChannelLayout)
- columnWidth(AudioEncoderModel::Property::Bitrate)
- columnWidth(AudioEncoderModel::Property::SampleRate)
- columnWidth(AudioEncoderModel::Property::Crf)
- columnWidth(AudioEncoderModel::Property::Profile) - 50 - 10;
setColumnWidth(AudioEncoderModel::Property::Encoder, width);
}

void AudioEncoderTableView::resizeEvent(QResizeEvent *event)
{
QTableView::resizeEvent(event);
QMetaObject::invokeMethod(this, &AudioEncoderTableView::onResize, Qt::QueuedConnection);
}

void AudioEncoderTableView::setupUI()
{
setModel(d_ptr->model);
Expand All @@ -50,18 +83,24 @@ void AudioEncoderTableView::setupUI()
horizontalHeader()->setDefaultSectionSize(120);
horizontalHeader()->setMinimumSectionSize(60);
horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
horizontalHeader()->setSectionResizeMode(AudioEncoderModel::Property::Encoder,
QHeaderView::Stretch);
setIconSize(QSize(20, 20));

setItemDelegateForColumn(AudioEncoderModel::Property::Encoder, new AudioEncoderDelegate(this));
setItemDelegateForColumn(AudioEncoderModel::Property::ChannelLayout,
new ChannelLayoutDelegate(this));
setItemDelegateForColumn(AudioEncoderModel::Property::SampleRate, new SampleRateDelegate(this));
setItemDelegateForColumn(AudioEncoderModel::Property::Profile, new ProfileDelegate(this));
auto *removedDelegate = new RemovedDelegate(this);
connect(removedDelegate, &RemovedDelegate::removed, this, &AudioEncoderTableView::onRemoved);
setItemDelegateForColumn(AudioEncoderModel::Property::Remove, removedDelegate);
}

setColumnWidth(AudioEncoderModel::Property::ID, 50);
setColumnWidth(AudioEncoderModel::Property::ChannelLayout, 100);
setColumnWidth(AudioEncoderModel::Property::Bitrate, 100);
setColumnWidth(AudioEncoderModel::Property::Crf, 50);
setColumnWidth(AudioEncoderModel::Property::Profile, 100);
void AudioEncoderTableView::buildConnect()
{
connect(
d_ptr->model,
&AudioEncoderModel::dataChanged,
this,
[this] { update(); },
Qt::QueuedConnection);
}
11 changes: 10 additions & 1 deletion examples/transcoder/audioencodertableview.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,24 @@

class AudioEncoderTableView : public QTableView
{
Q_OBJECT
public:
explicit AudioEncoderTableView(QWidget *parent = nullptr);
~AudioEncoderTableView() override;

void setDatas(const Ffmpeg::EncodeContexts &encodeContexts);
Ffmpeg::EncodeContexts datas() const;
[[nodiscard]] auto datas() const -> Ffmpeg::EncodeContexts;

private slots:
void onRemoved(const QModelIndex &index);
void onResize();

protected:
void resizeEvent(QResizeEvent *event) override;

private:
void setupUI();
void buildConnect();

class AudioEncoderTableViewPrivate;
QScopedPointer<AudioEncoderTableViewPrivate> d_ptr;
Expand Down
Loading

0 comments on commit c9eea5b

Please sign in to comment.