further work on timeline rewrite

This commit is contained in:
itsmattkc
2019-03-31 10:36:01 +11:00
parent 8e95210b22
commit f40b744dd4
23 changed files with 660 additions and 533 deletions
+90 -8
View File
@@ -1,6 +1,8 @@
#include "track.h"
#include "timeline/clip.h"
#include "timeline/tracklist.h"
#include "timeline/sequence.h"
int olive::timeline::kTrackDefaultHeight = 40;
int olive::timeline::kTrackMinHeight = 30;
@@ -30,20 +32,29 @@ Track *Track::copy(TrackList *parent)
return t;
}
Sequence *Track::sequence()
{
return parent_->GetParent();
}
TrackList *Track::track_list()
{
return parent_;
}
void Track::Save(QXmlStreamWriter &stream)
{
stream.writeStartElement("track");
for (int j=0;j<clips_.size();j++) {
Clip* c = clips_.at(j).get();
if (c != nullptr) {
stream.writeStartElement("clip");
stream.writeAttribute("id", QString::number(j));
c->Save(stream);
stream.writeStartElement("clip");
stream.writeAttribute("id", QString::number(c->load_id));
stream.writeEndElement(); // clip
}
c->Save(stream);
stream.writeEndElement(); // clip
}
stream.writeEndElement(); // track
@@ -93,9 +104,49 @@ void Track::ResizeClipArray(int new_size)
clips_.resize(new_size);
}
QVector<ClipPtr> Track::GetAllClips()
QVector<Clip*> Track::GetAllClips()
{
return clips_;
QVector<Clip*> clips;
clips.resize(clips_.size());
for (int i=0;i<clips_.size();i++) {
clips[i] = clips_.at(i).get();
}
return clips;
}
QVector<Clip *> Track::GetSelectedClips(bool containing)
{
QVector<Clip*> selected_clips;
for (int i=0;i<clips_.size();i++) {
Clip* c = clips_.at(i).get();
if (IsClipSelected(c, containing)) {
selected_clips.append(c);
}
}
return selected_clips;
}
ClipPtr Track::GetClipObjectFromRawPtr(Clip *c)
{
for (int i=0;i<clips_.size();i++) {
if (clips_.at(i).get() == c) {
return clips_.at(i);
}
}
// Assert here since we shouldn't be calling this function ever
Q_ASSERT(false);
}
int Track::Index()
{
return parent_->IndexOfTrack(this);
}
bool Track::IsClipSelected(int clip_index, bool containing)
@@ -157,6 +208,37 @@ bool Track::IsTransitionSelected(Transition *t)
return false;
}
void Track::TidySelections()
{
for (int i=0;i<areas.size();i++) {
Selection& s = areas[i];
for (int j=0;j<areas.size();j++) {
if (i != j) {
Selection& ss = areas[j];
if (s.track == ss.track) {
bool remove = false;
if (s.in < ss.in && s.out > ss.out) {
// do nothing
} else if (s.in >= ss.in && s.out <= ss.out) {
remove = true;
} else if (s.in <= ss.out && s.out > ss.out) {
ss.out = s.out;
remove = true;
} else if (s.out >= ss.in && s.in < ss.in) {
ss.in = s.in;
remove = true;
}
if (remove) {
areas.removeAt(i);
i--;
break;
}
}
}
}
}
}
void Track::ClearSelections()
{
selections_.clear();