X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=clip_list.cpp;h=14f083e91268984c043ac652cd74ff19b39cccc9;hb=3795723be95f2fe82f3c8b8b45b1a905b2c811fd;hp=2f805756003264470a37b25682e12db736c1ac3f;hpb=58b5adcca3af1abbf4c69b00853bee037bb7fec7;p=nageru diff --git a/clip_list.cpp b/clip_list.cpp index 2f80575..14f083e 100644 --- a/clip_list.cpp +++ b/clip_list.cpp @@ -1,13 +1,13 @@ +#include "clip_list.h" + #include "mainwindow.h" +#include "timebase.h" +#include "ui_mainwindow.h" #include #include #include -#include "clip_list.h" -#include "timebase.h" -#include "ui_mainwindow.h" - using namespace std; string pts_to_string(int64_t pts) @@ -40,27 +40,36 @@ string duration_to_string(int64_t pts_diff) return buf; } -int ClipList::rowCount(const QModelIndex &parent) const { - if (parent.isValid()) return 0; +int ClipList::rowCount(const QModelIndex &parent) const +{ + if (parent.isValid()) + return 0; return clips.size(); } -int PlayList::rowCount(const QModelIndex &parent) const { - if (parent.isValid()) return 0; +int PlayList::rowCount(const QModelIndex &parent) const +{ + if (parent.isValid()) + return 0; return clips.size(); } -int ClipList::columnCount(const QModelIndex &parent) const { - if (parent.isValid()) return 0; +int ClipList::columnCount(const QModelIndex &parent) const +{ + if (parent.isValid()) + return 0; return int(Column::NUM_COLUMNS); } -int PlayList::columnCount(const QModelIndex &parent) const { - if (parent.isValid()) return 0; +int PlayList::columnCount(const QModelIndex &parent) const +{ + if (parent.isValid()) + return 0; return int(Column::NUM_COLUMNS); } -QVariant ClipList::data(const QModelIndex &parent, int role) const { +QVariant ClipList::data(const QModelIndex &parent, int role) const +{ if (!parent.isValid()) return QVariant(); const int row = parent.row(), column = parent.column(); @@ -108,7 +117,8 @@ QVariant ClipList::data(const QModelIndex &parent, int role) const { } } -QVariant PlayList::data(const QModelIndex &parent, int role) const { +QVariant PlayList::data(const QModelIndex &parent, int role) const +{ if (!parent.isValid()) return QVariant(); const int row = parent.row(), column = parent.column(); @@ -122,6 +132,7 @@ QVariant PlayList::data(const QModelIndex &parent, int role) const { case Column::IN: case Column::OUT: case Column::DURATION: + case Column::FADE_TIME: return Qt::AlignRight + Qt::AlignVCenter; case Column::CAMERA: return Qt::AlignCenter; @@ -131,7 +142,10 @@ QVariant PlayList::data(const QModelIndex &parent, int role) const { } if (role == Qt::BackgroundRole) { if (Column(column) == Column::PLAYING) { - if (row == currently_playing_index) { + auto it = current_progress.find(row); + if (it != current_progress.end()) { + double play_progress = it->second; + // This only really works well for the first column, for whatever odd Qt reason. QLinearGradient grad(QPointF(0, 0), QPointF(1, 0)); grad.setCoordinateMode(grad.QGradient::ObjectBoundingMode); @@ -154,7 +168,7 @@ QVariant PlayList::data(const QModelIndex &parent, int role) const { switch (Column(column)) { case Column::PLAYING: - return (row == currently_playing_index) ? "→" : ""; + return current_progress.count(row) ? "→" : ""; case Column::IN: return QString::fromStdString(pts_to_string(clips[row].pts_in)); case Column::OUT: @@ -173,12 +187,20 @@ QVariant PlayList::data(const QModelIndex &parent, int role) const { return qlonglong(clips[row].stream_idx + 1); case Column::DESCRIPTION: return QString::fromStdString(clips[row].descriptions[clips[row].stream_idx]); + case Column::FADE_TIME: { + stringstream ss; + ss.imbue(locale("C")); + ss.precision(3); + ss << fixed << clips[row].fade_time_seconds; + return QString::fromStdString(ss.str()); + } default: return ""; } } -QVariant ClipList::headerData(int section, Qt::Orientation orientation, int role) const { +QVariant ClipList::headerData(int section, Qt::Orientation orientation, int role) const +{ if (role != Qt::DisplayRole) return QVariant(); if (orientation != Qt::Horizontal) @@ -204,7 +226,8 @@ QVariant ClipList::headerData(int section, Qt::Orientation orientation, int role } } -QVariant PlayList::headerData(int section, Qt::Orientation orientation, int role) const { +QVariant PlayList::headerData(int section, Qt::Orientation orientation, int role) const +{ if (role != Qt::DisplayRole) return QVariant(); if (orientation != Qt::Horizontal) @@ -223,6 +246,8 @@ QVariant PlayList::headerData(int section, Qt::Orientation orientation, int role return "Camera"; case Column::DESCRIPTION: return "Description"; + case Column::FADE_TIME: + return "Fade time"; default: return ""; } @@ -258,6 +283,7 @@ Qt::ItemFlags PlayList::flags(const QModelIndex &index) const switch (Column(column)) { case Column::DESCRIPTION: case Column::CAMERA: + case Column::FADE_TIME: return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable; return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable; default: @@ -315,6 +341,16 @@ bool PlayList::setData(const QModelIndex &index, const QVariant &value, int role emit_data_changed(row); return true; } + case Column::FADE_TIME: { + bool ok; + double val = value.toDouble(&ok); + if (!ok || !(val >= 0.0)) { + return false; + } + clips[row].fade_time_seconds = val; + emit_data_changed(row); + return true; + } default: return false; } @@ -358,7 +394,7 @@ void PlayList::move_clips(size_t first, size_t last, int delta) beginMoveRows(QModelIndex(), first, last, QModelIndex(), first - 1); rotate(clips.begin() + first - 1, clips.begin() + first, clips.begin() + last + 1); } else { - beginMoveRows(QModelIndex(), first, last, QModelIndex(), first + (last-first+1) + 1); + beginMoveRows(QModelIndex(), first, last, QModelIndex(), first + (last - first + 1) + 1); first = clips.size() - first - 1; last = clips.size() - last - 1; rotate(clips.rbegin() + last - 1, clips.rbegin() + last, clips.rbegin() + first + 1); @@ -398,6 +434,24 @@ void PlayList::set_currently_playing(int index, double progress) } } +void PlayList::set_progress(const map &progress) +{ + const int column = int(Column::PLAYING); + map old_progress = move(this->current_progress); + this->current_progress = progress; + + for (auto it : old_progress) { + size_t index = it.first; + if (current_progress.count(index) == 0) { + emit dataChanged(this->index(index, column), this->index(index, column)); + } + } + for (auto it : current_progress) { + size_t index = it.first; + emit dataChanged(this->index(index, column), this->index(index, column)); + } +} + namespace { Clip deserialize_clip(const ClipProto &clip_proto) @@ -409,6 +463,7 @@ Clip deserialize_clip(const ClipProto &clip_proto) clip.descriptions[camera_idx] = clip_proto.description(camera_idx); } clip.stream_idx = clip_proto.stream_idx(); + clip.fade_time_seconds = clip_proto.fade_time_seconds(); return clip; } @@ -420,6 +475,7 @@ void serialize_clip(const Clip &clip, ClipProto *clip_proto) *clip_proto->add_description() = clip.descriptions[camera_idx]; } clip_proto->set_stream_idx(clip.stream_idx); + clip_proto->set_fade_time_seconds(clip.fade_time_seconds); } } // namespace