small timeline cleanup
This commit is contained in:
+20
-20
@@ -30,40 +30,40 @@
|
||||
|
||||
class Sequence {
|
||||
public:
|
||||
Sequence();
|
||||
~Sequence();
|
||||
SequencePtr copy();
|
||||
QString name;
|
||||
void getTrackLimits(int* video_tracks, int* audio_tracks);
|
||||
Sequence();
|
||||
~Sequence();
|
||||
SequencePtr copy();
|
||||
QString name;
|
||||
void getTrackLimits(int* video_tracks, int* audio_tracks);
|
||||
long getEndFrame();
|
||||
int width;
|
||||
int height;
|
||||
double frame_rate;
|
||||
int audio_frequency;
|
||||
int audio_layout;
|
||||
int width;
|
||||
int height;
|
||||
double frame_rate;
|
||||
int audio_frequency;
|
||||
int audio_layout;
|
||||
|
||||
void RefreshClips(Media* m = nullptr);
|
||||
|
||||
QVector<Selection> selections;
|
||||
long playhead;
|
||||
QVector<Selection> selections;
|
||||
long playhead;
|
||||
|
||||
bool using_workarea;
|
||||
long workarea_in;
|
||||
long workarea_out;
|
||||
bool using_workarea;
|
||||
long workarea_in;
|
||||
long workarea_out;
|
||||
|
||||
bool wrapper_sequence;
|
||||
bool wrapper_sequence;
|
||||
|
||||
int save_id;
|
||||
int save_id;
|
||||
|
||||
QVector<Marker> markers;
|
||||
QVector<ClipPtr> clips;
|
||||
QVector<Marker> markers;
|
||||
QVector<ClipPtr> clips;
|
||||
};
|
||||
|
||||
using SequencePtr = std::shared_ptr<Sequence>;
|
||||
|
||||
// static variable for the currently active sequence
|
||||
namespace olive {
|
||||
extern SequencePtr ActiveSequence;
|
||||
extern SequencePtr ActiveSequence;
|
||||
}
|
||||
|
||||
#endif // SEQUENCE_H
|
||||
|
||||
+108
-32
@@ -673,7 +673,7 @@ void TimelineWidget::mousePressEvent(QMouseEvent *event) {
|
||||
// if the user clicks a selected clip while holding shift, deselect the clip
|
||||
panel_timeline->deselect_area(clip->timeline_in, clip->timeline_out, clip->track);
|
||||
|
||||
// if the user isn't holding alt, also deselect all of its links
|
||||
// if the user isn't holding alt, also deselect all of its links as well
|
||||
if (!alt) {
|
||||
for (int i=0;i<clip->linked.size();i++) {
|
||||
ClipPtr link = olive::ActiveSequence->clips.at(clip->linked.at(i));
|
||||
@@ -681,9 +681,11 @@ void TimelineWidget::mousePressEvent(QMouseEvent *event) {
|
||||
}
|
||||
}
|
||||
|
||||
} else if (panel_timeline->tool == TIMELINE_TOOL_POINTER && panel_timeline->transition_select != kTransitionNone) {
|
||||
|
||||
} else if (panel_timeline->tool == TIMELINE_TOOL_POINTER
|
||||
&& panel_timeline->transition_select != kTransitionNone) {
|
||||
|
||||
// if the clip was selected by then the user clicked a transition, de-select the clip and its links
|
||||
// and select the transition only
|
||||
|
||||
panel_timeline->deselect_area(clip->timeline_in, clip->timeline_out, clip->track);
|
||||
|
||||
@@ -695,14 +697,22 @@ void TimelineWidget::mousePressEvent(QMouseEvent *event) {
|
||||
Selection s;
|
||||
s.track = clip->track;
|
||||
|
||||
// select the transition only
|
||||
if (panel_timeline->transition_select == kTransitionOpening && clip->get_opening_transition() != nullptr) {
|
||||
s.in = clip->timeline_in;
|
||||
if (clip->get_opening_transition()->secondary_clip != nullptr) s.in -= clip->get_opening_transition()->get_true_length();
|
||||
|
||||
if (clip->get_opening_transition()->secondary_clip != nullptr) {
|
||||
s.in -= clip->get_opening_transition()->get_true_length();
|
||||
}
|
||||
|
||||
s.out = clip->timeline_in + clip->get_opening_transition()->get_true_length();
|
||||
} else if (panel_timeline->transition_select == kTransitionClosing && clip->get_closing_transition() != nullptr) {
|
||||
s.in = clip->timeline_out - clip->get_closing_transition()->get_true_length();
|
||||
s.out = clip->timeline_out;
|
||||
if (clip->get_closing_transition()->secondary_clip != nullptr) s.out += clip->get_closing_transition()->get_true_length();
|
||||
|
||||
if (clip->get_closing_transition()->secondary_clip != nullptr) {
|
||||
s.out += clip->get_closing_transition()->get_true_length();
|
||||
}
|
||||
}
|
||||
olive::ActiveSequence->selections.append(s);
|
||||
}
|
||||
@@ -1150,18 +1160,29 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) {
|
||||
} else if (panel_timeline->transition_tool_proc) {
|
||||
const Ghost& g = panel_timeline->ghosts.at(0);
|
||||
|
||||
// if the transition is greater than 0 length (if it is 0, we make nothing)
|
||||
if (g.in != g.out) {
|
||||
|
||||
// get transition length
|
||||
long transition_start = qMin(g.in, g.out);
|
||||
long transition_end = qMax(g.in, g.out);
|
||||
|
||||
|
||||
ClipPtr pre = olive::ActiveSequence->clips.at(g.clip);
|
||||
ClipPtr post = pre;
|
||||
|
||||
make_room_for_transition(ca, pre, panel_timeline->transition_tool_type, transition_start, transition_end, true);
|
||||
|
||||
if (panel_timeline->transition_tool_post_clip > -1) {
|
||||
// post_clip == -1 means this will be just one transition on one clip rather than a shared transition
|
||||
// between two clips
|
||||
|
||||
post = olive::ActiveSequence->clips.at(panel_timeline->transition_tool_post_clip);
|
||||
int opposite_type = (panel_timeline->transition_tool_type == kTransitionOpening) ? kTransitionClosing : kTransitionOpening;
|
||||
|
||||
// get opposite transition type
|
||||
int opposite_type = (panel_timeline->transition_tool_type == kTransitionOpening) ?
|
||||
kTransitionClosing : kTransitionOpening;
|
||||
|
||||
make_room_for_transition(
|
||||
ca,
|
||||
post,
|
||||
@@ -1180,7 +1201,9 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) {
|
||||
}
|
||||
|
||||
if (transition_start < post->timeline_in || transition_end > pre->timeline_out) {
|
||||
// delete shit over there and extend timeline in
|
||||
// if the user extended the transition beyond the clip's boundaries, delete the content there and extend
|
||||
// the clip to fill these new boundaries
|
||||
|
||||
QVector<Selection> areas;
|
||||
Selection s;
|
||||
s.track = post->track;
|
||||
@@ -2111,17 +2134,13 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) {
|
||||
panel_timeline->rect_select_rect.setBottom(event->pos().y());
|
||||
}
|
||||
|
||||
long frame_start = panel_timeline->drag_frame_start;
|
||||
long frame_end = panel_timeline->cursor_frame;
|
||||
long frame_min = qMin(frame_start, frame_end);
|
||||
long frame_max = qMax(frame_start, frame_end);
|
||||
long frame_min = qMin(panel_timeline->drag_frame_start, panel_timeline->cursor_frame);
|
||||
long frame_max = qMax(panel_timeline->drag_frame_start, panel_timeline->cursor_frame);
|
||||
|
||||
int track_start = panel_timeline->drag_track_start;
|
||||
int track_end = panel_timeline->cursor_track;
|
||||
|
||||
int track_min = qMin(track_start, track_end);
|
||||
int track_max = qMax(track_start, track_end);
|
||||
int track_min = qMin(panel_timeline->drag_track_start, panel_timeline->cursor_track);
|
||||
int track_max = qMax(panel_timeline->drag_track_start, panel_timeline->cursor_track);
|
||||
|
||||
// determine which clips are in this rectangular selection
|
||||
QVector<ClipPtr> selected_clips;
|
||||
for (int i=0;i<olive::ActiveSequence->clips.size();i++) {
|
||||
ClipPtr clip = olive::ActiveSequence->clips.at(i);
|
||||
@@ -2130,6 +2149,8 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) {
|
||||
clip->track <= track_max &&
|
||||
!(clip->timeline_in < frame_min && clip->timeline_out < frame_min) &&
|
||||
!(clip->timeline_in > frame_max && clip->timeline_out > frame_max)) {
|
||||
|
||||
// create a group of the clip (and its links if alt is not pressed)
|
||||
QVector<ClipPtr> session_clips;
|
||||
session_clips.append(clip);
|
||||
|
||||
@@ -2139,9 +2160,11 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) {
|
||||
}
|
||||
}
|
||||
|
||||
// for each of these clips, see if clip has already been added -
|
||||
// this can easily happen due to adding linked clips
|
||||
for (int j=0;j<session_clips.size();j++) {
|
||||
// see if clip has already been added - this can easily happen due to adding linked clips
|
||||
bool found = false;
|
||||
|
||||
ClipPtr c = session_clips.at(j);
|
||||
for (int k=0;k<selected_clips.size();k++) {
|
||||
if (selected_clips.at(k) == c) {
|
||||
@@ -2149,6 +2172,8 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// if the clip isn't already in the selection add it
|
||||
if (!found) {
|
||||
selected_clips.append(c);
|
||||
}
|
||||
@@ -2156,6 +2181,7 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) {
|
||||
}
|
||||
}
|
||||
|
||||
// add each of the selected clips to the main sequence's selections
|
||||
olive::ActiveSequence->selections.resize(selected_clips.size() + panel_timeline->selection_offset);
|
||||
for (int i=0;i<selected_clips.size();i++) {
|
||||
Selection& s = olive::ActiveSequence->selections[i+panel_timeline->selection_offset];
|
||||
@@ -2167,9 +2193,12 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) {
|
||||
|
||||
panel_timeline->repaint_timeline();
|
||||
} else {
|
||||
|
||||
// set up rectangle selecting
|
||||
panel_timeline->rect_select_rect.setX(event->pos().x());
|
||||
|
||||
if (bottom_align) {
|
||||
// bottom aligned widgets start with 0 at the bottom and go down to a negative number
|
||||
panel_timeline->rect_select_rect.setY(event->pos().y() - height());
|
||||
} else {
|
||||
panel_timeline->rect_select_rect.setY(event->pos().y());
|
||||
@@ -2179,10 +2208,13 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) {
|
||||
panel_timeline->rect_select_rect.setHeight(0);
|
||||
|
||||
panel_timeline->rect_select_proc = true;
|
||||
|
||||
}
|
||||
} else if (current_tool_shows_cursor()) {
|
||||
// redraw because we have a cursor
|
||||
|
||||
// we're not currently performing an action (click is not pressed), but redraw because we have an on-screen cursor
|
||||
panel_timeline->repaint_timeline();
|
||||
|
||||
} else if (panel_timeline->tool == TIMELINE_TOOL_POINTER ||
|
||||
panel_timeline->tool == TIMELINE_TOOL_RIPPLE ||
|
||||
panel_timeline->tool == TIMELINE_TOOL_ROLLING) {
|
||||
@@ -2386,21 +2418,37 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) {
|
||||
}
|
||||
}
|
||||
} else if (panel_timeline->tool == TIMELINE_TOOL_SLIP) {
|
||||
|
||||
// we're not currently performing any slipping, all we do here is set the cursor if mouse is hovering over a
|
||||
// cursor
|
||||
if (getClipIndexFromCoords(panel_timeline->cursor_frame, panel_timeline->cursor_track) > -1) {
|
||||
setCursor(Qt::SizeHorCursor);
|
||||
} else {
|
||||
unsetCursor();
|
||||
}
|
||||
|
||||
} else if (panel_timeline->tool == TIMELINE_TOOL_TRANSITION) {
|
||||
|
||||
if (panel_timeline->transition_tool_init) {
|
||||
|
||||
// the transition tool has started
|
||||
|
||||
if (panel_timeline->transition_tool_proc) {
|
||||
|
||||
// ghosts have been set up, so just run update
|
||||
update_ghosts(event->pos(), event->modifiers() & Qt::ShiftModifier);
|
||||
|
||||
} else {
|
||||
|
||||
// transition tool is being used but ghosts haven't been set up yet, set them up now
|
||||
ClipPtr c = olive::ActiveSequence->clips.at(panel_timeline->transition_tool_pre_clip);
|
||||
|
||||
Ghost g;
|
||||
|
||||
g.in = g.old_in = g.out = g.old_out = (panel_timeline->transition_tool_type == kTransitionOpening) ? c->timeline_in : c->timeline_out;
|
||||
g.in = g.old_in = g.out = g.old_out = (panel_timeline->transition_tool_type == kTransitionOpening) ?
|
||||
c->timeline_in
|
||||
: c->timeline_out;
|
||||
|
||||
g.track = c->track;
|
||||
g.clip = panel_timeline->transition_tool_pre_clip;
|
||||
g.media_stream = panel_timeline->transition_tool_type;
|
||||
@@ -2410,31 +2458,59 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) {
|
||||
|
||||
panel_timeline->transition_tool_proc = true;
|
||||
}
|
||||
} else {
|
||||
int mouse_clip = getClipIndexFromCoords(panel_timeline->cursor_frame, panel_timeline->cursor_track);
|
||||
if (mouse_clip > -1) {
|
||||
ClipPtr c = olive::ActiveSequence->clips.at(mouse_clip);
|
||||
if (same_sign(c->track, panel_timeline->transition_tool_side)) {
|
||||
panel_timeline->transition_tool_pre_clip = mouse_clip;
|
||||
long halfway = c->timeline_in + (c->getLength()/2);
|
||||
long between_range = getFrameFromScreenPoint(panel_timeline->zoom, TRANSITION_BETWEEN_RANGE) + 1;
|
||||
|
||||
if (panel_timeline->cursor_frame > halfway) {
|
||||
} else {
|
||||
|
||||
// transition tool has been selected but is not yet active, so we show screen feedback to the user on
|
||||
// possible transitions
|
||||
|
||||
int mouse_clip = getClipIndexFromCoords(panel_timeline->cursor_frame, panel_timeline->cursor_track);
|
||||
|
||||
// set default transition tool references to no clip
|
||||
panel_timeline->transition_tool_pre_clip = -1;
|
||||
panel_timeline->transition_tool_post_clip = -1;
|
||||
|
||||
if (mouse_clip > -1) {
|
||||
|
||||
// cursor is hovering over a clip
|
||||
|
||||
ClipPtr c = olive::ActiveSequence->clips.at(mouse_clip);
|
||||
|
||||
// check if the clip and transition are both the same sign (meaning video/audio are the same)
|
||||
if (same_sign(c->track, panel_timeline->transition_tool_side)) {
|
||||
|
||||
// set "pre" clip to the hovered clip
|
||||
panel_timeline->transition_tool_pre_clip = mouse_clip;
|
||||
|
||||
// set whether the transition is opening or closing based on whether the cursor is on the left half
|
||||
// or right half of the clip
|
||||
if (panel_timeline->cursor_frame > (c->timeline_in + (c->getLength()/2))) {
|
||||
panel_timeline->transition_tool_type = kTransitionClosing;
|
||||
} else {
|
||||
panel_timeline->transition_tool_type = kTransitionOpening;
|
||||
}
|
||||
|
||||
panel_timeline->transition_tool_post_clip = -1;
|
||||
// the range within which the transition tool will assume the user wants to make a shared transition
|
||||
// between two clips rather than just one transition on one clip
|
||||
long between_range = getFrameFromScreenPoint(panel_timeline->zoom, TRANSITION_BETWEEN_RANGE) + 1;
|
||||
|
||||
// if the cursor is within this range, set the post_clip to be the next clip touching
|
||||
//
|
||||
// getClipIndexFromCoords() will automatically set to -1 if there's no clip there which means the
|
||||
// end result will be the same as not setting a clip here at all
|
||||
if (panel_timeline->cursor_frame < c->timeline_in + between_range) {
|
||||
|
||||
// get clip touching to the left
|
||||
panel_timeline->transition_tool_post_clip = getClipIndexFromCoords(c->timeline_in-1, c->track);
|
||||
|
||||
} else if (panel_timeline->cursor_frame > c->timeline_out - between_range) {
|
||||
|
||||
// get clip touching to the right
|
||||
panel_timeline->transition_tool_post_clip = getClipIndexFromCoords(c->timeline_out+1, c->track);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
} else {
|
||||
panel_timeline->transition_tool_pre_clip = -1;
|
||||
panel_timeline->transition_tool_post_clip = -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user