minor clip changes

This commit is contained in:
itsmattkc
2019-02-19 02:38:21 -08:00
parent 7efea428c7
commit efbe2d187a
6 changed files with 96 additions and 106 deletions
+32 -32
View File
@@ -378,7 +378,7 @@ void Timeline::add_transition() {
ClipPtr c = olive::ActiveSequence->clips.at(i);
if (c != nullptr && is_clip_selected(c, true)) {
int transition_to_add = (c->track < 0) ? TRANSITION_INTERNAL_CROSSDISSOLVE : TRANSITION_INTERNAL_LINEARFADE;
if (c->get_opening_transition() == nullptr) {
if (c->opening_transition == nullptr) {
ca->append(new AddTransitionCommand(c,
nullptr,
nullptr,
@@ -386,7 +386,7 @@ void Timeline::add_transition() {
olive::CurrentConfig.default_transition_length));
adding = true;
}
if (c->get_closing_transition() == nullptr) {
if (c->closing_transition == nullptr) {
ca->append(new AddTransitionCommand(nullptr,
c,
nullptr,
@@ -850,7 +850,7 @@ ClipPtr Timeline::split_clip(ComboAction* ca, bool transitions, int p, long fram
if (pre->timeline_in < frame && pre->timeline_out > frame) {
// duplicate clip without duplicating its transitions, we'll restore them later
ClipPtr post = ClipPtr(pre->copy(olive::ActiveSequence, false));
ClipPtr post = ClipPtr(pre->copy(olive::ActiveSequence));
long new_clip_length = frame - pre->timeline_in;
@@ -999,15 +999,15 @@ void Timeline::clean_up_selections(QVector<Selection>& areas) {
bool selection_contains_transition(const Selection& s, ClipPtr c, int type) {
if (type == kTransitionOpening) {
return c->get_opening_transition() != nullptr
&& s.out == c->timeline_in + c->get_opening_transition()->get_true_length()
&& ((c->get_opening_transition()->secondary_clip == nullptr && s.in == c->timeline_in)
|| (c->get_opening_transition()->secondary_clip != nullptr && s.in == c->timeline_in - c->get_opening_transition()->get_true_length()));
return c->opening_transition != nullptr
&& s.out == c->timeline_in + c->opening_transition->get_true_length()
&& ((c->opening_transition->secondary_clip == nullptr && s.in == c->timeline_in)
|| (c->opening_transition->secondary_clip != nullptr && s.in == c->timeline_in - c->opening_transition->get_true_length()));
} else {
return c->get_closing_transition() != nullptr
&& s.in == c->timeline_out - c->get_closing_transition()->get_true_length()
&& ((c->get_closing_transition()->secondary_clip == nullptr && s.out == c->timeline_out)
|| (c->get_closing_transition()->secondary_clip != nullptr && s.out == c->timeline_out + c->get_closing_transition()->get_true_length()));
return c->closing_transition != nullptr
&& s.in == c->timeline_out - c->closing_transition->get_true_length()
&& ((c->closing_transition->secondary_clip == nullptr && s.out == c->timeline_out)
|| (c->closing_transition->secondary_clip != nullptr && s.out == c->timeline_out + c->closing_transition->get_true_length()));
}
}
@@ -1044,22 +1044,22 @@ void Timeline::delete_areas_and_relink(ComboAction* ca, QVector<Selection>& area
// only out point is in deletion area
move_clip(ca, c, c->timeline_in, s.in, c->clip_in, c->track);
if (c->get_closing_transition() != nullptr) {
if (s.in < c->timeline_out - c->get_closing_transition()->get_true_length()) {
if (c->closing_transition != nullptr) {
if (s.in < c->timeline_out - c->closing_transition->get_true_length()) {
ca->append(new DeleteTransitionCommand(c->closing_transition));
} else {
ca->append(new ModifyTransitionCommand(c->closing_transition, c->get_closing_transition()->get_true_length() - (c->timeline_out - s.in)));
ca->append(new ModifyTransitionCommand(c->closing_transition, c->closing_transition->get_true_length() - (c->timeline_out - s.in)));
}
}
} else if (c->timeline_in < s.out && c->timeline_out > s.out) {
// only in point is in deletion area
move_clip(ca, c, s.out, c->timeline_out, c->clip_in + (s.out - c->timeline_in), c->track);
if (c->get_opening_transition() != nullptr) {
if (s.out > c->timeline_in + c->get_opening_transition()->get_true_length()) {
if (c->opening_transition != nullptr) {
if (s.out > c->timeline_in + c->opening_transition->get_true_length()) {
ca->append(new DeleteTransitionCommand(c->opening_transition));
} else {
ca->append(new ModifyTransitionCommand(c->opening_transition, c->get_opening_transition()->get_true_length() - (s.out - c->timeline_in)));
ca->append(new ModifyTransitionCommand(c->opening_transition, c->opening_transition->get_true_length() - (s.out - c->timeline_in)));
}
}
}
@@ -1596,11 +1596,11 @@ bool Timeline::snap_to_timeline(long* l, bool use_playhead, bool use_markers, bo
return true;
} else if (snap_to_point(c->timeline_out, l)) {
return true;
} else if (c->get_opening_transition() != nullptr
&& snap_to_point(c->timeline_in + c->get_opening_transition()->get_true_length(), l)) {
} else if (c->opening_transition != nullptr
&& snap_to_point(c->timeline_in + c->opening_transition->get_true_length(), l)) {
return true;
} else if (c->get_closing_transition() != nullptr
&& snap_to_point(c->timeline_out - c->get_closing_transition()->get_true_length(), l)) {
} else if (c->closing_transition != nullptr
&& snap_to_point(c->timeline_out - c->closing_transition->get_true_length(), l)) {
return true;
} else {
// try to snap to clip markers
@@ -2075,26 +2075,26 @@ void move_clip(ComboAction* ca, ClipPtr c, long iin, long iout, long iclip_in, i
if (verify_transitions) {
// if this is a shared transition, and the corresponding clip will be moved away somehow
if (c->get_opening_transition() != nullptr
&& c->get_opening_transition()->secondary_clip != nullptr
&& c->get_opening_transition()->secondary_clip->timeline_out != iin) {
if (c->opening_transition != nullptr
&& c->opening_transition->secondary_clip != nullptr
&& c->opening_transition->secondary_clip->timeline_out != iin) {
// separate transition
ca->append(new SetPointer(reinterpret_cast<void**>(&c->get_opening_transition()->secondary_clip), nullptr));
ca->append(new SetPointer(reinterpret_cast<void**>(&c->opening_transition->secondary_clip), nullptr));
ca->append(new AddTransitionCommand(nullptr,
c->get_opening_transition()->secondary_clip,
c->get_opening_transition(),
c->opening_transition->secondary_clip,
c->opening_transition,
nullptr,
0));
}
if (c->get_closing_transition() != nullptr
&& c->get_closing_transition()->secondary_clip != nullptr
&& c->get_closing_transition()->parent_clip->timeline_in != iout) {
if (c->closing_transition != nullptr
&& c->closing_transition->secondary_clip != nullptr
&& c->closing_transition->parent_clip->timeline_in != iout) {
// separate transition
ca->append(new SetPointer(reinterpret_cast<void**>(&c->get_closing_transition()->secondary_clip), nullptr));
ca->append(new SetPointer(reinterpret_cast<void**>(&c->closing_transition->secondary_clip), nullptr));
ca->append(new AddTransitionCommand(nullptr,
c,
c->get_closing_transition(),
c->closing_transition,
nullptr,
0));
}
+6 -6
View File
@@ -71,28 +71,28 @@ void apply_audio_effects(ClipPtr c, double timecode_start, AVFrame* frame, int n
EffectPtr e = c->effects.at(j);
if (e->is_enabled()) e->process_audio(timecode_start, timecode_end, frame->data[0], nb_bytes, 2);
}
if (c->get_opening_transition() != nullptr) {
if (c->opening_transition != nullptr) {
if (c->media != nullptr && c->media->get_type() == MEDIA_TYPE_FOOTAGE) {
double transition_start = (c->get_clip_in_with_transition() / c->sequence->frame_rate);
double transition_end = (c->get_clip_in_with_transition() + c->get_opening_transition()->get_length()) / c->sequence->frame_rate;
double transition_end = (c->get_clip_in_with_transition() + c->opening_transition->get_length()) / c->sequence->frame_rate;
if (timecode_end < transition_end) {
double adjustment = transition_end - transition_start;
double adjusted_range_start = (timecode_start - transition_start) / adjustment;
double adjusted_range_end = (timecode_end - transition_start) / adjustment;
c->get_opening_transition()->process_audio(adjusted_range_start, adjusted_range_end, frame->data[0], nb_bytes, kTransitionOpening);
c->opening_transition->process_audio(adjusted_range_start, adjusted_range_end, frame->data[0], nb_bytes, kTransitionOpening);
}
}
}
if (c->get_closing_transition() != nullptr) {
if (c->closing_transition != nullptr) {
if (c->media != nullptr && c->media->get_type() == MEDIA_TYPE_FOOTAGE) {
long length_with_transitions = c->get_timeline_out_with_transition() - c->get_timeline_in_with_transition();
double transition_start = (c->get_clip_in_with_transition() + length_with_transitions - c->get_closing_transition()->get_length()) / c->sequence->frame_rate;
double transition_start = (c->get_clip_in_with_transition() + length_with_transitions - c->closing_transition->get_length()) / c->sequence->frame_rate;
double transition_end = (c->get_clip_in_with_transition() + length_with_transitions) / c->sequence->frame_rate;
if (timecode_start > transition_start) {
double adjustment = transition_end - transition_start;
double adjusted_range_start = (timecode_start - transition_start) / adjustment;
double adjusted_range_end = (timecode_end - transition_start) / adjustment;
c->get_closing_transition()->process_audio(adjusted_range_start, adjusted_range_end, frame->data[0], nb_bytes, kTransitionClosing);
c->closing_transition->process_audio(adjusted_range_start, adjusted_range_end, frame->data[0], nb_bytes, kTransitionClosing);
}
}
}
+7 -15
View File
@@ -60,7 +60,7 @@ Clip::Clip(SequencePtr s) :
reset();
}
ClipPtr Clip::copy(SequencePtr s, bool duplicate_transitions) {
ClipPtr Clip::copy(SequencePtr s) {
ClipPtr copy(new Clip(s));
copy->enabled = enabled;
@@ -168,14 +168,6 @@ QVector<Marker> &Clip::get_markers() {
return markers;
}
TransitionPtr Clip::get_opening_transition() {
return opening_transition;
}
TransitionPtr Clip::get_closing_transition() {
return closing_transition;
}
Clip::~Clip() {
if (open) {
close_clip(ClipPtr(this), true);
@@ -186,25 +178,25 @@ Clip::~Clip() {
}
long Clip::get_clip_in_with_transition() {
if (get_opening_transition() != nullptr && get_opening_transition()->secondary_clip != nullptr) {
if (opening_transition != nullptr && opening_transition->secondary_clip != nullptr) {
// we must be the secondary clip, so return (timeline in - length)
return clip_in - get_opening_transition()->get_true_length();
return clip_in - opening_transition->get_true_length();
}
return clip_in;
}
long Clip::get_timeline_in_with_transition() {
if (get_opening_transition() != nullptr && get_opening_transition()->secondary_clip != nullptr) {
if (opening_transition != nullptr && opening_transition->secondary_clip != nullptr) {
// we must be the secondary clip, so return (timeline in - length)
return timeline_in - get_opening_transition()->get_true_length();
return timeline_in - opening_transition->get_true_length();
}
return timeline_in;
}
long Clip::get_timeline_out_with_transition() {
if (get_closing_transition() != nullptr && get_closing_transition()->secondary_clip != nullptr) {
if (closing_transition != nullptr && closing_transition->secondary_clip != nullptr) {
// we must be the primary clip, so return (timeline out + length2)
return timeline_out + get_closing_transition()->get_true_length();
return timeline_out + closing_transition->get_true_length();
} else {
return timeline_out;
}
+1 -3
View File
@@ -51,7 +51,7 @@ class Clip {
public:
Clip(SequencePtr s);
~Clip();
ClipPtr copy(SequencePtr s, bool duplicate_transitions = true);
ClipPtr copy(SequencePtr s);
void reset_audio();
void reset();
void refresh();
@@ -96,9 +96,7 @@ public:
QList<EffectPtr> effects;
QVector<int> linked;
TransitionPtr opening_transition;
TransitionPtr get_opening_transition();
TransitionPtr closing_transition;
TransitionPtr get_closing_transition();
// media handling
AVFormatContext* formatCtx;
+7 -7
View File
@@ -421,18 +421,18 @@ GLuint compose_sequence(ComposeSequenceParams &params) {
}
// if the clip has an opening transition, process that now
if (c->get_opening_transition() != nullptr) {
if (c->opening_transition != nullptr) {
int transition_progress = playhead - c->get_timeline_in_with_transition();
if (transition_progress < c->get_opening_transition()->get_length()) {
process_effect(c, c->get_opening_transition(), double(transition_progress)/double(c->get_opening_transition()->get_length()), coords, textureID, fbo_switcher, params.texture_failed, kTransitionOpening);
if (transition_progress < c->opening_transition->get_length()) {
process_effect(c, c->opening_transition, double(transition_progress)/double(c->opening_transition->get_length()), coords, textureID, fbo_switcher, params.texture_failed, kTransitionOpening);
}
}
// if the clip has a closing transition, process that now
if (c->get_closing_transition() != nullptr) {
int transition_progress = playhead - (c->get_timeline_out_with_transition() - c->get_closing_transition()->get_length());
if (transition_progress >= 0 && transition_progress < c->get_closing_transition()->get_length()) {
process_effect(c, c->get_closing_transition(), double(transition_progress)/double(c->get_closing_transition()->get_length()), coords, textureID, fbo_switcher, params.texture_failed, kTransitionClosing);
if (c->closing_transition != nullptr) {
int transition_progress = playhead - (c->get_timeline_out_with_transition() - c->closing_transition->get_length());
if (transition_progress >= 0 && transition_progress < c->closing_transition->get_length()) {
process_effect(c, c->closing_transition, double(transition_progress)/double(c->closing_transition->get_length()), coords, textureID, fbo_switcher, params.texture_failed, kTransitionClosing);
}
}
+43 -43
View File
@@ -698,20 +698,20 @@ void TimelineWidget::mousePressEvent(QMouseEvent *event) {
s.track = clip->track;
// select the transition only
if (panel_timeline->transition_select == kTransitionOpening && clip->get_opening_transition() != nullptr) {
if (panel_timeline->transition_select == kTransitionOpening && clip->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->opening_transition->secondary_clip != nullptr) {
s.in -= clip->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_in + clip->opening_transition->get_true_length();
} else if (panel_timeline->transition_select == kTransitionClosing && clip->closing_transition != nullptr) {
s.in = clip->timeline_out - clip->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->closing_transition->secondary_clip != nullptr) {
s.out += clip->closing_transition->get_true_length();
}
}
olive::ActiveSequence->selections.append(s);
@@ -736,19 +736,19 @@ void TimelineWidget::mousePressEvent(QMouseEvent *event) {
if (panel_timeline->tool == TIMELINE_TOOL_POINTER) {
if (panel_timeline->transition_select == kTransitionOpening) {
// move the selection to only select the transitoin
s.out = clip->timeline_in + clip->get_opening_transition()->get_true_length();
s.out = clip->timeline_in + clip->opening_transition->get_true_length();
// if the transition is a "shared" transition, adjust the selection to select both sides
if (clip->get_opening_transition()->secondary_clip != nullptr) {
s.in -= clip->get_opening_transition()->get_true_length();
if (clip->opening_transition->secondary_clip != nullptr) {
s.in -= clip->opening_transition->get_true_length();
}
} else if (panel_timeline->transition_select == kTransitionClosing) {
// move the selection to only select the transitoin
s.in = clip->timeline_out - clip->get_closing_transition()->get_true_length();
s.in = clip->timeline_out - clip->closing_transition->get_true_length();
// if the transition is a "shared" transition, adjust the selection to select both sides
if (clip->get_closing_transition()->secondary_clip != nullptr) {
s.out += clip->get_closing_transition()->get_true_length();
if (clip->closing_transition->secondary_clip != nullptr) {
s.out += clip->closing_transition->get_true_length();
}
}
}
@@ -866,24 +866,24 @@ void make_room_for_transition(ComboAction* ca,
// make room for transition
if (type == kTransitionOpening) {
if (delete_old_transitions && c->get_opening_transition() != nullptr) {
if (delete_old_transitions && c->opening_transition != nullptr) {
ca->append(new DeleteTransitionCommand(c->opening_transition));
}
if (c->get_closing_transition() != nullptr) {
if (c->closing_transition != nullptr) {
if (transition_end >= c->timeline_out) {
ca->append(new DeleteTransitionCommand(c->closing_transition));
} else if (transition_end > c->timeline_out - c->get_closing_transition()->get_true_length()) {
} else if (transition_end > c->timeline_out - c->closing_transition->get_true_length()) {
ca->append(new ModifyTransitionCommand(c->closing_transition, c->timeline_out - transition_end));
}
}
} else {
if (delete_old_transitions && c->get_closing_transition() != nullptr) {
if (delete_old_transitions && c->closing_transition != nullptr) {
ca->append(new DeleteTransitionCommand(c->closing_transition));
}
if (c->get_opening_transition() != nullptr) {
if (c->opening_transition != nullptr) {
if (transition_start <= c->timeline_in) {
ca->append(new DeleteTransitionCommand(c->opening_transition));
} else if (transition_start < c->timeline_in + c->get_opening_transition()->get_true_length()) {
} else if (transition_start < c->timeline_in + c->opening_transition->get_true_length()) {
ca->append(new ModifyTransitionCommand(c->opening_transition, transition_start - c->timeline_in));
}
}
@@ -1259,7 +1259,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) {
// if the user was moving a transition
bool is_opening_transition = (g.transition == c->get_opening_transition());
bool is_opening_transition = (g.transition == c->opening_transition);
long new_transition_length = g.out - g.in;
if (g.transition->secondary_clip != nullptr) new_transition_length >>= 1;
ca->append(
@@ -1560,15 +1560,15 @@ void TimelineWidget::init_ghosts() {
g.in = g.old_in = c->timeline_in;
g.out = g.old_out = c->timeline_out;
g.ghost_length = g.old_out - g.old_in;
} else if (g.transition == c->get_opening_transition()) {
} else if (g.transition == c->opening_transition) {
g.in = g.old_in = c->get_timeline_in_with_transition();
g.ghost_length = c->get_opening_transition()->get_length();
g.ghost_length = c->opening_transition->get_length();
g.out = g.old_out = g.in + g.ghost_length;
} else if (g.transition == c->get_closing_transition()) {
} else if (g.transition == c->closing_transition) {
g.out = g.old_out = c->get_timeline_out_with_transition();
g.ghost_length = c->get_closing_transition()->get_length();
g.ghost_length = c->closing_transition->get_length();
g.in = g.old_in = g.out - g.ghost_length;
g.clip_in = g.old_clip_in = c->clip_in + c->getLength() - c->get_closing_transition()->get_true_length();
g.clip_in = g.old_clip_in = c->clip_in + c->getLength() - c->closing_transition->get_true_length();
}
// used for trim ops
@@ -1896,7 +1896,7 @@ void TimelineWidget::update_ghosts(const QPoint& mouse_pos, bool lock_frame) {
g.out = g.old_out + frame_diff;
if (g.transition != nullptr
&& g.transition == olive::ActiveSequence->clips.at(g.clip)->get_opening_transition()) {
&& g.transition == olive::ActiveSequence->clips.at(g.clip)->opening_transition) {
g.clip_in = g.old_clip_in + frame_diff;
}
@@ -2162,7 +2162,7 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) {
// check if a transition is selected (prioritize transition selection)
// (only the pointer tool supports moving transitions)
if (panel_timeline->tool == TIMELINE_TOOL_POINTER
&& (c->get_opening_transition() != nullptr || c->get_closing_transition() != nullptr)) {
&& (c->opening_transition != nullptr || c->closing_transition != nullptr)) {
// check if any selections contain a whole transition
for (int j=0;j<olive::ActiveSequence->selections.size();j++) {
@@ -2172,13 +2172,13 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) {
if (s.track == c->track) {
if (selection_contains_transition(s, c, kTransitionOpening)) {
g.transition = c->get_opening_transition();
g.transition = c->opening_transition;
add = true;
break;
} else if (selection_contains_transition(s, c, kTransitionClosing)) {
g.transition = c->get_closing_transition();
g.transition = c->closing_transition;
add = true;
break;
@@ -2542,13 +2542,13 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) {
tooltip_clip = i;
// check if the cursor is specifically hovering over one of the clip's transitions
if (c->get_opening_transition() != nullptr
&& panel_timeline->cursor_frame <= c->timeline_in + c->get_opening_transition()->get_true_length()) {
if (c->opening_transition != nullptr
&& panel_timeline->cursor_frame <= c->timeline_in + c->opening_transition->get_true_length()) {
panel_timeline->transition_select = kTransitionOpening;
} else if (c->get_closing_transition() != nullptr
&& panel_timeline->cursor_frame >= c->timeline_out - c->get_closing_transition()->get_true_length()) {
} else if (c->closing_transition != nullptr
&& panel_timeline->cursor_frame >= c->timeline_out - c->closing_transition->get_true_length()) {
panel_timeline->transition_select = kTransitionClosing;
@@ -2596,10 +2596,10 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) {
if (panel_timeline->tool == TIMELINE_TOOL_POINTER) {
// if the clip has an opening transition
if (c->get_opening_transition() != nullptr) {
if (c->opening_transition != nullptr) {
// cache the timeline frame where the transition ends
long transition_point = c->timeline_in + c->get_opening_transition()->get_true_length();
long transition_point = c->timeline_in + c->opening_transition->get_true_length();
// check if the cursor is hovering around it (within the threshold)
if (transition_point > mouse_frame_lower && transition_point < mouse_frame_upper) {
@@ -2617,10 +2617,10 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) {
}
// if the clip has a closing transition
if (c->get_closing_transition() != nullptr) {
if (c->closing_transition != nullptr) {
// cache the timeline frame where the transition starts
long transition_point = c->timeline_out - c->get_closing_transition()->get_true_length();
long transition_point = c->timeline_out - c->closing_transition->get_true_length();
// check if the cursor is hovering around it (within the threshold)
if (transition_point > mouse_frame_lower && transition_point < mouse_frame_upper) {
@@ -2838,7 +2838,7 @@ void draw_waveform(ClipPtr clip, const FootageStream* ms, long media_length, QPa
}
void draw_transition(QPainter& p, ClipPtr c, const QRect& clip_rect, QRect& text_rect, int transition_type) {
TransitionPtr t = (transition_type == kTransitionOpening) ? c->get_opening_transition() : c->get_closing_transition();
TransitionPtr t = (transition_type == kTransitionOpening) ? c->opening_transition : c->closing_transition;
if (t != nullptr) {
QColor transition_color(255, 0, 0, 16);
int transition_width = getScreenPointFromFrame(panel_timeline->zoom, t->get_true_length());
@@ -2988,13 +2988,13 @@ void TimelineWidget::paintEvent(QPaintEvent*) {
int thumb_y = p.fontMetrics().height()+olive::timeline::kClipTextPadding+olive::timeline::kClipTextPadding;
if (thumb_x < width() && thumb_y < height()) {
int space_for_thumb = clip_rect.width()-1;
if (clip->get_opening_transition() != nullptr) {
int ot_width = getScreenPointFromFrame(panel_timeline->zoom, clip->get_opening_transition()->get_true_length());
if (clip->opening_transition != nullptr) {
int ot_width = getScreenPointFromFrame(panel_timeline->zoom, clip->opening_transition->get_true_length());
thumb_x += ot_width;
space_for_thumb -= ot_width;
}
if (clip->get_closing_transition() != nullptr) {
space_for_thumb -= getScreenPointFromFrame(panel_timeline->zoom, clip->get_closing_transition()->get_true_length());
if (clip->closing_transition != nullptr) {
space_for_thumb -= getScreenPointFromFrame(panel_timeline->zoom, clip->closing_transition->get_true_length());
}
int thumb_height = clip_rect.height()-thumb_y;
int thumb_width = qRound(thumb_height*(double(ms->video_preview.width())/double(ms->video_preview.height())));