#include "clip_list.h"
#include "mainwindow.h"
-#include "timebase.h"
+#include "shared/timebase.h"
#include "ui_mainwindow.h"
#include <math.h>
{
if (parent.isValid())
return 0;
- return int(Column::NUM_COLUMNS);
+ return int(Column::NUM_NON_CAMERA_COLUMNS) + num_cameras;
}
int PlayList::columnCount(const QModelIndex &parent) const
} else {
return QVariant();
}
- case Column::CAMERA_1:
- case Column::CAMERA_2:
- case Column::CAMERA_3:
- case Column::CAMERA_4: {
- unsigned stream_idx = column - int(Column::CAMERA_1);
- return QString::fromStdString(clips[row].descriptions[stream_idx]);
- }
default:
- return "";
+ if (is_camera_column(column)) {
+ unsigned stream_idx = column - int(Column::CAMERA_1);
+ return QString::fromStdString(clips[row].descriptions[stream_idx]);
+ } else {
+ return "";
+ }
}
}
case Column::OUT:
case Column::DURATION:
case Column::FADE_TIME:
+ case Column::SPEED:
return Qt::AlignRight + Qt::AlignVCenter;
case Column::CAMERA:
return Qt::AlignCenter;
ss << fixed << clips[row].fade_time_seconds;
return QString::fromStdString(ss.str());
}
+ case Column::SPEED: {
+ stringstream ss;
+ ss.imbue(locale("C"));
+ ss.precision(3);
+ ss << fixed << clips[row].speed;
+ return QString::fromStdString(ss.str());
+ }
default:
return "";
}
return "Out";
case Column::DURATION:
return "Duration";
- case Column::CAMERA_1:
- return "Camera 1";
- case Column::CAMERA_2:
- return "Camera 2";
- case Column::CAMERA_3:
- return "Camera 3";
- case Column::CAMERA_4:
- return "Camera 4";
default:
- return "";
+ if (is_camera_column(section)) {
+ return QString::fromStdString("Camera " + to_string(section - int(Column::CAMERA_1) + 1));
+ } else {
+ return "";
+ }
}
}
return "Description";
case Column::FADE_TIME:
return "Fade time";
+ case Column::SPEED:
+ return "Speed";
default:
return "";
}
if (size_t(row) >= clips.size())
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
- switch (Column(column)) {
- case Column::CAMERA_1:
- case Column::CAMERA_2:
- case Column::CAMERA_3:
- case Column::CAMERA_4:
+ if (is_camera_column(column)) {
return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsDragEnabled;
- default:
+ } else {
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
}
}
case Column::DESCRIPTION:
case Column::CAMERA:
case Column::FADE_TIME:
- return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable;
+ case Column::SPEED:
return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable;
default:
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
if (size_t(row) >= clips.size())
return false;
- switch (Column(column)) {
- case Column::CAMERA_1:
- case Column::CAMERA_2:
- case Column::CAMERA_3:
- case Column::CAMERA_4: {
+ if (is_camera_column(column)) {
unsigned stream_idx = column - int(Column::CAMERA_1);
clips[row].descriptions[stream_idx] = value.toString().toStdString();
emit_data_changed(row);
return true;
- }
- default:
+ } else {
return false;
}
}
case Column::CAMERA: {
bool ok;
int camera_idx = value.toInt(&ok);
- if (!ok || camera_idx < 1 || camera_idx > NUM_CAMERAS) {
+ if (!ok || camera_idx < 1 || camera_idx > int(num_cameras)) {
return false;
}
clips[row].stream_idx = camera_idx - 1;
emit_data_changed(row);
return true;
}
+ case Column::SPEED: {
+ bool ok;
+ double val = value.toDouble(&ok);
+ if (!ok || !(val >= 0.001)) {
+ return false;
+ }
+ clips[row].speed = val;
+ emit_data_changed(row);
+ return true;
+ }
default:
return false;
}
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_NON_CAMERA_COLUMNS) + num_cameras));
emit any_content_changed();
}
emit any_content_changed();
}
+void ClipList::change_num_cameras(size_t num_cameras)
+{
+ assert(num_cameras >= this->num_cameras);
+ if (num_cameras == this->num_cameras) {
+ return;
+ }
+
+ beginInsertColumns(QModelIndex(), int(Column::NUM_NON_CAMERA_COLUMNS) + this->num_cameras, int(Column::NUM_NON_CAMERA_COLUMNS) + num_cameras - 1);
+ this->num_cameras = num_cameras;
+ endInsertColumns();
+ emit any_content_changed();
+}
+
void PlayList::set_currently_playing(int index, double progress)
{
int old_index = currently_playing_index;
Clip clip;
clip.pts_in = clip_proto.pts_in();
clip.pts_out = clip_proto.pts_out();
- for (int camera_idx = 0; camera_idx < min(clip_proto.description_size(), NUM_CAMERAS); ++camera_idx) {
+ for (int camera_idx = 0; camera_idx < min(clip_proto.description_size(), MAX_STREAMS); ++camera_idx) {
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();
+ if (clip_proto.speed() < 0.001) {
+ clip.speed = 0.5; // Default.
+ } else {
+ clip.speed = clip_proto.speed();
+ }
return clip;
}
{
clip_proto->set_pts_in(clip.pts_in);
clip_proto->set_pts_out(clip.pts_out);
- for (int camera_idx = 0; camera_idx < NUM_CAMERAS; ++camera_idx) {
+ for (int camera_idx = 0; camera_idx < MAX_STREAMS; ++camera_idx) {
*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);
+ clip_proto->set_speed(clip.speed);
}
} // namespace