From 8e7ca3652fd5de86919e078141f3e7af1d34f1de Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 7 Oct 2018 11:25:08 +1100 Subject: [PATCH] added keyframe button, moved to windowModified --- effects/effect.cpp | 3 +- icons/clock.png | Bin 0 -> 5665 bytes icons/icons.qrc | 1 + mainwindow.cpp | 4 +- panels/project.cpp | 7 +- panels/project.h | 1 - project/undo.cpp | 145 +++++++++++++++++++++--------------------- ui/comboboxex.cpp | 8 ++- ui/timelinewidget.cpp | 79 ++++++++++++++++++++++- ui/timelinewidget.h | 5 ++ 10 files changed, 169 insertions(+), 84 deletions(-) create mode 100644 icons/clock.png 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 0000000000000000000000000000000000000000..da7b5763a97f3eca4c9dfdf602d467c5345a89a8 GIT binary patch literal 5665 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

IC``-Jo`=lxDzLxBk%<5({=jLPo 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 zxR14QR^VLolive-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(); };