#include <vector>
#include "clip_list.h"
+#include "timebase.h"
#include "ui_mainwindow.h"
using namespace std;
string pts_to_string(int64_t pts)
{
- // FIXME: This depends on a fixed timebase.
- int64_t t = lrint((pts / 12800.0) * 1e3); // In milliseconds.
+ int64_t t = lrint((pts / double(TIMEBASE)) * 1e3); // In milliseconds.
int ms = t % 1000;
t /= 1000;
int sec = t % 60;
string duration_to_string(int64_t pts_diff)
{
- // FIXME: This depends on a fixed timebase.
- int64_t t = lrint((pts_diff / 12800.0) * 1e3); // In milliseconds.
+ int64_t t = lrint((pts_diff / double(TIMEBASE)) * 1e3); // In milliseconds.
int ms = t % 1000;
t /= 1000;
int sec = t % 60;
}
}
- if (role != Qt::DisplayRole)
+ if (role != Qt::DisplayRole && role != Qt::EditRole)
return QVariant();
switch (Column(column)) {
return Qt::AlignLeft + Qt::AlignVCenter;
}
}
+ if (role == Qt::BackgroundRole) {
+ if (Column(column) == Column::PLAYING) {
+ if (row == currently_playing_index) {
+ // 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);
+ grad.setColorAt(0.0f, QColor::fromRgbF(0.0f, 0.0f, 1.0f, 0.2f));
+ grad.setColorAt(play_progress, QColor::fromRgbF(0.0f, 0.0f, 1.0f, 0.2f));
+ if (play_progress + 0.01f <= 1.0f) {
+ grad.setColorAt(play_progress + 0.01f, QColor::fromRgbF(0.0f, 0.0f, 1.0f, 0.0f));
+ }
+ return QBrush(grad);
+ } else {
+ return QVariant();
+ }
+ } else {
+ return QVariant();
+ }
+ }
- if (role != Qt::DisplayRole)
+ if (role != Qt::DisplayRole && role != Qt::EditRole)
return QVariant();
switch (Column(column)) {
}
}
+Qt::ItemFlags PlayList::flags(const QModelIndex &index) const
+{
+ if (!index.isValid())
+ return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
+ const int row = index.row(), column = index.column();
+ if (size_t(row) >= clips.size())
+ return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
+
+ switch (Column(column)) {
+ case Column::DESCRIPTION:
+ case Column::CAMERA:
+ return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable;
+ return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable;
+ default:
+ return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
+ }
+}
+
bool ClipList::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (!index.isValid() || role != Qt::EditRole) {
}
}
+bool PlayList::setData(const QModelIndex &index, const QVariant &value, int role)
+{
+ if (!index.isValid() || role != Qt::EditRole) {
+ return false;
+ }
+
+ const int row = index.row(), column = index.column();
+ if (size_t(row) >= clips.size())
+ return false;
+
+ switch (Column(column)) {
+ case Column::DESCRIPTION:
+ clips[row].descriptions[clips[row].stream_idx] = value.toString().toStdString();
+ emit_data_changed(row);
+ return true;
+ case Column::CAMERA: {
+ bool ok;
+ int camera_idx = value.toInt(&ok);
+ if (!ok || camera_idx < 1 || camera_idx > NUM_CAMERAS) {
+ return false;
+ }
+ clips[row].stream_idx = camera_idx - 1;
+ emit_data_changed(row);
+ return true;
+ }
+ default:
+ return false;
+ }
+}
+
void ClipList::add_clip(const Clip &clip)
{
beginInsertRows(QModelIndex(), clips.size(), clips.size());
endInsertRows();
}
+void PlayList::duplicate_clips(size_t first, size_t last)
+{
+ beginInsertRows(QModelIndex(), first, last);
+ clips.insert(clips.begin() + first, clips.begin() + first, clips.begin() + last + 1);
+ endInsertRows();
+}
+
+void PlayList::erase_clips(size_t first, size_t last)
+{
+ beginRemoveRows(QModelIndex(), first, last);
+ clips.erase(clips.begin() + first, clips.begin() + last + 1);
+ endRemoveRows();
+}
+
+void PlayList::move_clips(size_t first, size_t last, int delta)
+{
+ if (delta == -1) {
+ 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);
+ first = clips.size() - first - 1;
+ last = clips.size() - last - 1;
+ rotate(clips.rbegin() + last - 1, clips.rbegin() + last, clips.rbegin() + first + 1);
+ }
+ endMoveRows();
+}
+
void ClipList::emit_data_changed(size_t row)
{
emit dataChanged(index(row, 0), index(row, int(Column::NUM_COLUMNS)));
emit dataChanged(index(row, 0), index(row, int(Column::NUM_COLUMNS)));
}
-void PlayList::set_currently_playing(int index)
+void PlayList::set_currently_playing(int index, double progress)
{
int old_index = currently_playing_index;
+ int column = int(Column::PLAYING);
if (index != old_index) {
currently_playing_index = index;
+ play_progress = progress;
if (old_index != -1) {
- emit_data_changed(old_index);
+ emit dataChanged(this->index(old_index, column), this->index(old_index, column));
}
if (index != -1) {
- emit_data_changed(index);
+ emit dataChanged(this->index(index, column), this->index(index, column));
}
+ } else if (index != -1 && fabs(progress - play_progress) > 1e-3) {
+ play_progress = progress;
+ emit dataChanged(this->index(index, column), this->index(index, column));
}
}