X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=futatabi%2Fclip_list.cpp;h=c586b1a93dcd719db43e79221a24324d1fd74533;hb=b168e72fcdcd17be5c578f2232e40c2347c3ff98;hp=14f083e91268984c043ac652cd74ff19b39cccc9;hpb=9b7d691b4cc5db7dbfc18c82e86c1207fcac4722;p=nageru diff --git a/futatabi/clip_list.cpp b/futatabi/clip_list.cpp index 14f083e..c586b1a 100644 --- a/futatabi/clip_list.cpp +++ b/futatabi/clip_list.cpp @@ -1,7 +1,7 @@ #include "clip_list.h" #include "mainwindow.h" -#include "timebase.h" +#include "shared/timebase.h" #include "ui_mainwindow.h" #include @@ -58,7 +58,7 @@ int ClipList::columnCount(const QModelIndex &parent) const { 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 @@ -105,15 +105,13 @@ QVariant ClipList::data(const QModelIndex &parent, int role) 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 ""; + } } } @@ -133,6 +131,7 @@ QVariant PlayList::data(const QModelIndex &parent, int role) const case Column::OUT: case Column::DURATION: case Column::FADE_TIME: + case Column::SPEED: return Qt::AlignRight + Qt::AlignVCenter; case Column::CAMERA: return Qt::AlignCenter; @@ -194,6 +193,13 @@ QVariant PlayList::data(const QModelIndex &parent, int role) const 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 ""; } @@ -213,16 +219,12 @@ QVariant ClipList::headerData(int section, Qt::Orientation orientation, int role 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 ""; + } } } @@ -248,6 +250,8 @@ QVariant PlayList::headerData(int section, Qt::Orientation orientation, int role return "Description"; case Column::FADE_TIME: return "Fade time"; + case Column::SPEED: + return "Speed"; default: return ""; } @@ -261,13 +265,9 @@ Qt::ItemFlags ClipList::flags(const QModelIndex &index) const 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; } } @@ -284,7 +284,7 @@ Qt::ItemFlags PlayList::flags(const QModelIndex &index) const 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; @@ -301,17 +301,12 @@ bool ClipList::setData(const QModelIndex &index, const QVariant &value, int role 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; } } @@ -334,7 +329,7 @@ bool PlayList::setData(const QModelIndex &index, const QVariant &value, int role 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; @@ -351,6 +346,16 @@ bool PlayList::setData(const QModelIndex &index, const QVariant &value, int role 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; } @@ -405,7 +410,7 @@ void PlayList::move_clips(size_t first, size_t last, int delta) 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(); } @@ -415,6 +420,19 @@ void PlayList::emit_data_changed(size_t row) 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; @@ -459,11 +477,16 @@ Clip deserialize_clip(const ClipProto &clip_proto) 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; } @@ -471,11 +494,12 @@ void serialize_clip(const Clip &clip, ClipProto *clip_proto) { 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