diff --git a/effects/effect.cpp b/effects/effect.cpp index 1ca4fab0f..f92ba6f63 100644 --- a/effects/effect.cpp +++ b/effects/effect.cpp @@ -453,7 +453,8 @@ EffectRow::EffectRow(Effect *parent, QGridLayout *uilayout, const QString &n, in label = new QLabel(name); ui->addWidget(label, row, 0); - keyframe_enable = new QPushButton(); + keyframe_enable = new QPushButton(QIcon(":/icons/clock.png"), ""); + keyframe_enable->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed); keyframe_enable->setCheckable(true); keyframe_enable->setToolTip("Enable Keyframes"); connect(keyframe_enable, SIGNAL(clicked(bool)), this, SLOT(set_keyframe_enabled(bool))); diff --git a/icons/clock.png b/icons/clock.png new file mode 100644 index 000000000..da7b5763a Binary files /dev/null and b/icons/clock.png differ diff --git a/icons/icons.qrc b/icons/icons.qrc index 8109114ec..64b3fc6f8 100644 --- a/icons/icons.qrc +++ b/icons/icons.qrc @@ -40,5 +40,6 @@ olive-splash.png add-button.png add-button-disabled.png + clock.png diff --git a/mainwindow.cpp b/mainwindow.cpp index 8d7495494..66bfcf790 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -333,7 +333,7 @@ void MainWindow::on_action_Paste_triggered() } void MainWindow::autorecover_interval() { - if (project_changed) { + if (isWindowModified()) { panel_project->save_project(true); qDebug() << "[INFO] Auto-recovery project saved"; } @@ -362,7 +362,7 @@ bool MainWindow::save_project() { } bool MainWindow::can_close_project() { - if (project_changed) { + if (isWindowModified()) { QMessageBox* m = new QMessageBox( QMessageBox::Question, "Unsaved Project", diff --git a/panels/project.cpp b/panels/project.cpp index d82a5c19a..b3fe873f0 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -39,7 +39,6 @@ extern "C" { #define MAXIMUM_RECENT_PROJECTS 10 QString autorecovery_filename; -bool project_changed = false; QString project_url = ""; QStringList recent_projects; QString recent_proj_file; @@ -594,7 +593,7 @@ void Project::new_project() { // clear existing project set_sequence(NULL); clear(); - project_changed = false; + mainWindow->setWindowModified(false); } QTreeWidgetItem* Project::find_loaded_folder_by_id(int id) { @@ -978,7 +977,7 @@ void Project::load_project() { if (open_seq != NULL) set_sequence(open_seq); panel_timeline->redraw_all_clips(false); - project_changed = false; + mainWindow->setWindowModified(false); } else { new_project(); } @@ -1179,7 +1178,7 @@ void Project::save_project(bool autorecovery) { if (!autorecovery) { add_recent_project(project_url); - project_changed = false; + mainWindow->setWindowModified(false); } } diff --git a/panels/project.h b/panels/project.h index 6c7a32d9f..d52c089bd 100644 --- a/panels/project.h +++ b/panels/project.h @@ -24,7 +24,6 @@ class Project; } extern QString autorecovery_filename; -extern bool project_changed; extern QString project_url; extern QStringList recent_projects; extern QString recent_proj_file; diff --git a/project/undo.cpp b/project/undo.cpp index 3b1ae82d5..d1d770aae 100644 --- a/project/undo.cpp +++ b/project/undo.cpp @@ -20,6 +20,7 @@ #include "ui/labelslider.h" #include "ui/viewerwidget.h" #include "project/marker.h" +#include "mainwindow.h" QUndoStack undo_stack; @@ -57,7 +58,7 @@ MoveClipAction::MoveClipAction(Clip *c, long iin, long iout, long iclip_in, int new_out(iout), new_clip_in(iclip_in), new_track(itrack), - old_project_changed(project_changed) + old_project_changed(mainWindow->isWindowModified()) {} void MoveClipAction::undo() { @@ -66,7 +67,7 @@ void MoveClipAction::undo() { clip->clip_in = old_clip_in; clip->track = old_track; - project_changed = old_project_changed; + mainWindow->setWindowModified(old_project_changed); } void MoveClipAction::redo() { @@ -75,13 +76,13 @@ void MoveClipAction::redo() { clip->clip_in = new_clip_in; clip->track = new_track; - project_changed = true; + mainWindow->setWindowModified(true); } DeleteClipAction::DeleteClipAction(Sequence* s, int clip) : seq(s), index(clip), - old_project_changed(project_changed) + old_project_changed(mainWindow->isWindowModified()) {} DeleteClipAction::~DeleteClipAction() { @@ -98,7 +99,7 @@ void DeleteClipAction::undo() { seq->clips.at(linkClipIndex.at(i))->linked.insert(linkLinkIndex.at(i), index); } - project_changed = old_project_changed; + mainWindow->setWindowModified(old_project_changed); } void DeleteClipAction::redo() { @@ -122,7 +123,7 @@ void DeleteClipAction::redo() { } } - project_changed = true; + mainWindow->setWindowModified(true); } ChangeSequenceAction::ChangeSequenceAction(Sequence* s) : @@ -143,7 +144,7 @@ SetTimelineInOutCommand::SetTimelineInOutCommand(Sequence *s, bool enabled, long new_enabled(enabled), new_in(in), new_out(out), - old_project_changed(project_changed) + old_project_changed(mainWindow->isWindowModified()) {} void SetTimelineInOutCommand::undo() { @@ -151,7 +152,7 @@ void SetTimelineInOutCommand::undo() { seq->workarea_in = old_in; seq->workarea_out = old_out; - project_changed = old_project_changed; + mainWindow->setWindowModified(old_project_changed); } void SetTimelineInOutCommand::redo() { @@ -163,7 +164,7 @@ void SetTimelineInOutCommand::redo() { seq->workarea_in = new_in; seq->workarea_out = new_out; - project_changed = true; + mainWindow->setWindowModified(true); } AddEffectCommand::AddEffectCommand(Clip* c, int ieffect) : @@ -171,7 +172,7 @@ AddEffectCommand::AddEffectCommand(Clip* c, int ieffect) : effect(ieffect), ref(NULL), done(false), - old_project_changed(project_changed) + old_project_changed(mainWindow->isWindowModified()) {} AddEffectCommand::~AddEffectCommand() { @@ -181,7 +182,7 @@ AddEffectCommand::~AddEffectCommand() { void AddEffectCommand::undo() { clip->effects.removeLast(); done = false; - project_changed = old_project_changed; + mainWindow->setWindowModified(old_project_changed); } void AddEffectCommand::redo() { @@ -190,14 +191,14 @@ void AddEffectCommand::redo() { } clip->effects.append(ref); done = true; - project_changed = true; + mainWindow->setWindowModified(true); } AddTransitionCommand::AddTransitionCommand(Clip* c, int itransition, int itype) : clip(c), transition(itransition), type(itype), - old_project_changed(project_changed) + old_project_changed(mainWindow->isWindowModified()) {} void AddTransitionCommand::undo() { @@ -208,7 +209,7 @@ void AddTransitionCommand::undo() { delete clip->closing_transition; clip->closing_transition = NULL; } - project_changed = old_project_changed; + mainWindow->setWindowModified(old_project_changed); } void AddTransitionCommand::redo() { @@ -217,14 +218,14 @@ void AddTransitionCommand::redo() { } else { clip->closing_transition = create_transition(transition, clip); } - project_changed = true; + mainWindow->setWindowModified(true); } ModifyTransitionCommand::ModifyTransitionCommand(Clip* c, int itype, long ilength) : clip(c), type(itype), new_length(ilength), - old_project_changed(project_changed) + old_project_changed(mainWindow->isWindowModified()) {} void ModifyTransitionCommand::undo() { @@ -233,7 +234,7 @@ void ModifyTransitionCommand::undo() { } else { clip->closing_transition->length = old_length; } - project_changed = old_project_changed; + mainWindow->setWindowModified(old_project_changed); } void ModifyTransitionCommand::redo() { @@ -244,14 +245,14 @@ void ModifyTransitionCommand::redo() { old_length = clip->closing_transition->length; clip->closing_transition->length = new_length; } - project_changed = true; + mainWindow->setWindowModified(true); } DeleteTransitionCommand::DeleteTransitionCommand(Clip* c, int itype) : clip(c), type(itype), transition(NULL), - old_project_changed(project_changed) + old_project_changed(mainWindow->isWindowModified()) {} DeleteTransitionCommand::~DeleteTransitionCommand() { @@ -265,7 +266,7 @@ void DeleteTransitionCommand::undo() { clip->closing_transition = transition; } transition = NULL; - project_changed = old_project_changed; + mainWindow->setWindowModified(old_project_changed); } void DeleteTransitionCommand::redo() { @@ -276,14 +277,14 @@ void DeleteTransitionCommand::redo() { transition = clip->closing_transition; clip->closing_transition = NULL; } - project_changed = true; + mainWindow->setWindowModified(true); } NewSequenceCommand::NewSequenceCommand(QTreeWidgetItem *s, QTreeWidgetItem* iparent) : seq(s), parent(iparent), done(false), - old_project_changed(project_changed) + old_project_changed(mainWindow->isWindowModified()) {} NewSequenceCommand::~NewSequenceCommand() { @@ -297,7 +298,7 @@ void NewSequenceCommand::undo() { parent->removeChild(seq); } done = false; - project_changed = old_project_changed; + mainWindow->setWindowModified(old_project_changed); } void NewSequenceCommand::redo() { @@ -307,14 +308,14 @@ void NewSequenceCommand::redo() { parent->addChild(seq); } done = true; - project_changed = true; + mainWindow->setWindowModified(true); } AddMediaCommand::AddMediaCommand(QTreeWidgetItem* iitem, QTreeWidgetItem* iparent) : item(iitem), parent(iparent), done(false), - old_project_changed(project_changed) + old_project_changed(mainWindow->isWindowModified()) {} AddMediaCommand::~AddMediaCommand() { @@ -331,7 +332,7 @@ void AddMediaCommand::undo() { parent->removeChild(item); } done = false; - project_changed = old_project_changed; + mainWindow->setWindowModified(old_project_changed); } void AddMediaCommand::redo() { @@ -341,12 +342,12 @@ void AddMediaCommand::redo() { parent->addChild(item); } done = true; - project_changed = true; + mainWindow->setWindowModified(true); } DeleteMediaCommand::DeleteMediaCommand(QTreeWidgetItem* i) : item(i), - old_project_changed(project_changed) + old_project_changed(mainWindow->isWindowModified()) {} DeleteMediaCommand::~DeleteMediaCommand() { @@ -361,7 +362,7 @@ void DeleteMediaCommand::undo() { parent->addChild(item); } - old_project_changed = project_changed; + mainWindow->setWindowModified(old_project_changed); } void DeleteMediaCommand::redo() { @@ -373,14 +374,14 @@ void DeleteMediaCommand::redo() { parent->removeChild(item); } - project_changed = true; + mainWindow->setWindowModified(true); } RippleCommand::RippleCommand(Sequence *s, long ipoint, long ilength) : seq(s), point(ipoint), length(ilength), - old_project_changed(project_changed) + old_project_changed(mainWindow->isWindowModified()) {} void RippleCommand::undo() { @@ -389,7 +390,7 @@ void RippleCommand::undo() { c->timeline_in -= length; c->timeline_out -= length; } - project_changed = old_project_changed; + mainWindow->setWindowModified(old_project_changed); } void RippleCommand::redo() { @@ -412,13 +413,13 @@ void RippleCommand::redo() { } } } - project_changed = true; + mainWindow->setWindowModified(true); } AddClipCommand::AddClipCommand(Sequence* s, QVector& add) : seq(s), clips(add), - old_project_changed(project_changed) + old_project_changed(mainWindow->isWindowModified()) {} AddClipCommand::~AddClipCommand() { @@ -432,7 +433,7 @@ void AddClipCommand::undo() { delete seq->clips.last(); seq->clips.removeLast(); } - project_changed = old_project_changed; + mainWindow->setWindowModified(old_project_changed); } void AddClipCommand::redo() { @@ -447,7 +448,7 @@ void AddClipCommand::redo() { } seq->clips.append(copy); } - project_changed = true; + mainWindow->setWindowModified(true); } /* @@ -461,7 +462,7 @@ TimelineAction::TimelineAction() : change_seq(false), ripple_enabled(false), change_in_out(false), - old_project_changed(project_changed) + old_project_changed(mainWindow->isWindowModified()) {} TimelineAction::~TimelineAction() { @@ -749,7 +750,7 @@ void TimelineAction::undo() { set_sequence(old_seq); } - project_changed = old_project_changed; + mainWindow->setWindowModified(old_project_changed); done = false; } @@ -974,12 +975,12 @@ void TimelineAction::redo() { set_sequence(new_seq); } - project_changed = true; + mainWindow->setWindowModified(true); done = true; }*/ -LinkCommand::LinkCommand() : link(true), old_project_changed(project_changed) {} +LinkCommand::LinkCommand() : link(true), old_project_changed(mainWindow->isWindowModified()) {} void LinkCommand::undo() { for (int i=0;ilinked = old_links.at(i); } } - project_changed = old_project_changed; + mainWindow->setWindowModified(old_project_changed); } void LinkCommand::redo() { @@ -1008,30 +1009,30 @@ void LinkCommand::redo() { c->linked.clear(); } } - project_changed = true; + mainWindow->setWindowModified(true); } -CheckboxCommand::CheckboxCommand(QCheckBox* b) : box(b), checked(box->isChecked()), done(true), old_project_changed(project_changed) {} +CheckboxCommand::CheckboxCommand(QCheckBox* b) : box(b), checked(box->isChecked()), done(true), old_project_changed(mainWindow->isWindowModified()) {} CheckboxCommand::~CheckboxCommand() {} void CheckboxCommand::undo() { box->setChecked(!checked); done = false; - project_changed = old_project_changed; + mainWindow->setWindowModified(old_project_changed); } void CheckboxCommand::redo() { if (!done) { box->setChecked(checked); } - project_changed = true; + mainWindow->setWindowModified(true); } ReplaceMediaCommand::ReplaceMediaCommand(QTreeWidgetItem* i, QString s) : item(i), new_filename(s), - old_project_changed(project_changed) + old_project_changed(mainWindow->isWindowModified()) { media = get_footage_from_tree(item); old_filename = media->url; @@ -1061,13 +1062,13 @@ void ReplaceMediaCommand::replace(QString& filename) { void ReplaceMediaCommand::undo() { replace(old_filename); - project_changed = old_project_changed; + mainWindow->setWindowModified(old_project_changed); } void ReplaceMediaCommand::redo() { replace(new_filename); - project_changed = true; + mainWindow->setWindowModified(true); } ReplaceClipMediaCommand::ReplaceClipMediaCommand(void *a, void *b, int c, int d, bool e) : @@ -1076,7 +1077,7 @@ ReplaceClipMediaCommand::ReplaceClipMediaCommand(void *a, void *b, int c, int d, old_type(c), new_type(d), preserve_clip_ins(e), - old_project_changed(project_changed) + old_project_changed(mainWindow->isWindowModified()) {} void ReplaceClipMediaCommand::replace(bool undo) { @@ -1116,16 +1117,16 @@ void ReplaceClipMediaCommand::replace(bool undo) { void ReplaceClipMediaCommand::undo() { replace(true); - project_changed = old_project_changed; + mainWindow->setWindowModified(old_project_changed); } void ReplaceClipMediaCommand::redo() { replace(false); - project_changed = true; + mainWindow->setWindowModified(true); } -EffectDeleteCommand::EffectDeleteCommand() : done(false), old_project_changed(project_changed) {} +EffectDeleteCommand::EffectDeleteCommand() : done(false), old_project_changed(mainWindow->isWindowModified()) {} EffectDeleteCommand::~EffectDeleteCommand() { if (done) { @@ -1142,7 +1143,7 @@ void EffectDeleteCommand::undo() { } panel_effect_controls->reload_clips(); done = false; - project_changed = old_project_changed; + mainWindow->setWindowModified(old_project_changed); } void EffectDeleteCommand::redo() { @@ -1155,10 +1156,10 @@ void EffectDeleteCommand::redo() { } panel_effect_controls->reload_clips(); done = true; - project_changed = true; + mainWindow->setWindowModified(true); } -MediaMove::MediaMove(SourceTable *s) : table(s), old_project_changed(project_changed) {} +MediaMove::MediaMove(SourceTable *s) : table(s), old_project_changed(mainWindow->isWindowModified()) {} void MediaMove::undo() { for (int i=0;iaddChild(items.at(i)); } } - project_changed = old_project_changed; + mainWindow->setWindowModified(old_project_changed); } void MediaMove::redo() { @@ -1191,41 +1192,41 @@ void MediaMove::redo() { to->addChild(items.at(i)); } } - project_changed = true; + mainWindow->setWindowModified(true); } -MediaRename::MediaRename() : done(true), old_project_changed(project_changed) {} +MediaRename::MediaRename() : done(true), old_project_changed(mainWindow->isWindowModified()) {} void MediaRename::undo() { item->setText(0, from); done = false; - project_changed = old_project_changed; + mainWindow->setWindowModified(old_project_changed); } void MediaRename::redo() { if (!done) { item->setText(0, to); } - project_changed = true; + mainWindow->setWindowModified(true); } -KeyframeMove::KeyframeMove() : old_project_changed(project_changed) {} +KeyframeMove::KeyframeMove() : old_project_changed(mainWindow->isWindowModified()) {} void KeyframeMove::undo() { for (int i=0;ikeyframe_times[keyframes.at(i)] -= movement; } - project_changed = old_project_changed; + mainWindow->setWindowModified(old_project_changed); } void KeyframeMove::redo() { for (int i=0;ikeyframe_times[keyframes.at(i)] += movement; } - project_changed = true; + mainWindow->setWindowModified(true); } -KeyframeDelete::KeyframeDelete() : old_project_changed(project_changed), disable_keyframes_on_row(NULL), sorted(false) {} +KeyframeDelete::KeyframeDelete() : old_project_changed(mainWindow->isWindowModified()), disable_keyframes_on_row(NULL), sorted(false) {} void KeyframeDelete::undo() { if (disable_keyframes_on_row != NULL) disable_keyframes_on_row->setKeyframing(true); @@ -1244,7 +1245,7 @@ void KeyframeDelete::undo() { } } - project_changed = old_project_changed; + mainWindow->setWindowModified(old_project_changed); } void KeyframeDelete::redo() { @@ -1282,12 +1283,12 @@ void KeyframeDelete::redo() { } if (disable_keyframes_on_row != NULL) disable_keyframes_on_row->setKeyframing(false); - project_changed = true; + mainWindow->setWindowModified(true); sorted = true; } KeyframeSet::KeyframeSet(EffectRow* r, int i, long t, bool justMadeKeyframe) : - old_project_changed(project_changed), + old_project_changed(mainWindow->isWindowModified()), row(r), index(i), time(t), @@ -1326,7 +1327,7 @@ void KeyframeSet::undo() { } } - project_changed = old_project_changed; + mainWindow->setWindowModified(old_project_changed); done = false; } @@ -1345,7 +1346,7 @@ void KeyframeSet::redo() { } row->setKeyframing(true); - project_changed = true; + mainWindow->setWindowModified(true); done = true; } @@ -1383,7 +1384,7 @@ AddMarkerAction::AddMarkerAction(Sequence* s, long t, QString n) : seq(s), time(t), name(n), - old_project_changed(project_changed) + old_project_changed(mainWindow->isWindowModified()) {} void AddMarkerAction::undo() { @@ -1393,7 +1394,7 @@ void AddMarkerAction::undo() { sequence->markers[index].name = old_name; } - project_changed = old_project_changed; + mainWindow->setWindowModified(old_project_changed); } void AddMarkerAction::redo() { @@ -1414,7 +1415,7 @@ void AddMarkerAction::redo() { sequence->markers[index].name = name; } - project_changed = true; + mainWindow->setWindowModified(true); } MoveMarkerAction::MoveMarkerAction(Marker* m, long o, long n) : diff --git a/ui/comboboxex.cpp b/ui/comboboxex.cpp index 2a05fb5c7..8b04dd378 100644 --- a/ui/comboboxex.cpp +++ b/ui/comboboxex.cpp @@ -2,24 +2,26 @@ #include "project/undo.h" #include "panels/project.h" +#include "mainwindow.h" #include #include + class ComboBoxExCommand : public QUndoCommand { public: ComboBoxExCommand(ComboBoxEx* obj, int old_index, int new_index) : - combobox(obj), old_val(old_index), new_val(new_index), done(true), old_project_changed(project_changed) {} + combobox(obj), old_val(old_index), new_val(new_index), done(true), old_project_changed(mainWindow->isWindowModified()) {} void undo() { combobox->setCurrentIndex(old_val); done = false; - project_changed = old_project_changed; + mainWindow->setWindowModified(old_project_changed); } void redo() { if (!done) { combobox->setCurrentIndex(new_val); } - project_changed = true; + mainWindow->setWindowModified(true); } private: ComboBoxEx* combobox; diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index 46e84bac7..2204fa781 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #define MAX_TEXT_WIDTH 20 @@ -43,7 +44,42 @@ TimelineWidget::TimelineWidget(QWidget *parent) : QWidget(parent) { connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(show_context_menu(const QPoint&))); } +void TimelineWidget::right_click_ripple() { + bool can_ripple = true; + + // validate the ripple + for (int i=0;iclips.size();i++) { + Clip* c = sequence->clips.at(i); + if (c->timeline_in > rc_ripple_min) { + for (int j=0;jclips.size();j++) { + Clip* cc = sequence->clips.at(j); + if (cc->track == c->track) { + if (cc->timeline_out == c->timeline_in) { + can_ripple = false; + break; + } else if (cc->timeline_out < c->timeline_in) { + long validator = (c->timeline_in - (rc_ripple_max - rc_ripple_min)) - cc->timeline_out; + if (validator < 0) { + rc_ripple_min = cc->timeline_out; + rc_ripple_max = c->timeline_in; + } + } + } + } + } + } + + if (can_ripple) { + undo_stack.push(new RippleCommand(sequence, rc_ripple_min, rc_ripple_min - rc_ripple_max)); + panel_timeline->redraw_all_clips(true); + } +} + void TimelineWidget::show_context_menu(const QPoint& pos) { + // hack because sometimes right clicking doesn't trigger mouseReleaseEvent + panel_timeline->rect_select_init = false; + panel_timeline->rect_select_proc = false; + QMenu menu(this); QAction* undoAction = menu.addAction("&Undo"); @@ -55,6 +91,38 @@ void TimelineWidget::show_context_menu(const QPoint& pos) { menu.addSeparator(); if (sequence->selections.size() == 0) { + panel_timeline->cursor_frame = panel_timeline->getTimelineFrameFromScreenPoint(pos.x()); + panel_timeline->cursor_track = getTrackFromScreenPoint(pos.y()); + + bool can_ripple_delete = true; + bool at_end_of_sequence = true; + rc_ripple_min = LONG_MIN; + rc_ripple_max = LONG_MAX; + + for (int i=0;iclips.size();i++) { + Clip* c = sequence->clips.at(i); + if (c != NULL) { + if (c->timeline_in > panel_timeline->cursor_frame || c->timeline_out > panel_timeline->cursor_frame) { + at_end_of_sequence = false; + } + if (c->track == panel_timeline->cursor_track) { + if (c->timeline_in <= panel_timeline->cursor_frame && c->timeline_out >= panel_timeline->cursor_frame) { + can_ripple_delete = false; + break; + } else if (c->timeline_out < panel_timeline->cursor_frame) { + rc_ripple_min = qMax(rc_ripple_min, c->timeline_out); + } else if (c->timeline_in > panel_timeline->cursor_frame) { + rc_ripple_max = qMin(rc_ripple_max, c->timeline_in); + } + } + } + } + + if (can_ripple_delete && !at_end_of_sequence) { + QAction* ripple_delete_action = menu.addAction("&Ripple Delete"); + connect(ripple_delete_action, SIGNAL(triggered(bool)), this, SLOT(right_click_ripple())); + } + menu.addAction("Sequence settings coming soon..."); } else { QAction* cutAction = menu.addAction("C&ut"); @@ -1588,6 +1656,9 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { } } } + if (cursor_contains_clip) { + QToolTip::showText(mapToGlobal(event->pos()), "HOVER OVER CLIP"); + } if (found) { setCursor(Qt::SizeHorCursor); } else { @@ -1835,7 +1906,13 @@ void TimelineWidget::redraw_clips() { int underline_width = qMin(text_rect.width() - 1, clip_painter.fontMetrics().width(clip->name)); clip_painter.drawLine(text_rect.x(), underline_y, text_rect.x() + underline_width, underline_y); } - clip_painter.drawText(text_rect, 0, clip->name, &text_rect); + QString name = clip->name; + if (clip->speed != 1.0 || clip->reverse) { + name += " ("; + if (clip->reverse) name += "-"; + name += QString::number(clip->speed*100) + "%)"; + } + clip_painter.drawText(text_rect, 0, name, &text_rect); } // bottom right gray diff --git a/ui/timelinewidget.h b/ui/timelinewidget.h index 7ee1d3a2a..b047ce20f 100644 --- a/ui/timelinewidget.h +++ b/ui/timelinewidget.h @@ -64,11 +64,16 @@ private: double predicted_new_frame_rate; int predicted_audio_freq; int predicted_audio_layout; + + // used for "right click ripple" + long rc_ripple_min; + long rc_ripple_max; signals: public slots: private slots: + void right_click_ripple(); void show_context_menu(const QPoint& pos); void toggle_autoscale(); };