From c81714fe7378fbee61fc3486774bf35ce4064a94 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 30 Dec 2018 22:12:47 +1100 Subject: [PATCH] fixed ripple breaking dual transitions --- dialogs/speeddialog.cpp | 18 +- panels/timeline.cpp | 23 +- panels/timeline.h | 1 + project/undo.cpp | 601 +++++++++++++++++++--------------------- project/undo.h | 340 +++++++++++------------ ui/timelinewidget.cpp | 23 +- 6 files changed, 481 insertions(+), 525 deletions(-) diff --git a/dialogs/speeddialog.cpp b/dialogs/speeddialog.cpp index 0efcb45d1..c48baacd3 100644 --- a/dialogs/speeddialog.cpp +++ b/dialogs/speeddialog.cpp @@ -84,12 +84,12 @@ void SpeedDialog::run() { clip_percent = c->speed; if (c->track < 0) { bool process_video = true; - if (c->media != NULL && c->media->get_type() == MEDIA_TYPE_FOOTAGE) { - Footage* m = c->media->to_footage(); - FootageStream* ms = m->get_stream_from_file_index(true, c->media_stream); - if (ms != NULL && ms->infinite_length) { - process_video = false; - } + if (c->media != NULL && c->media->get_type() == MEDIA_TYPE_FOOTAGE) { + Footage* m = c->media->to_footage(); + FootageStream* ms = m->get_stream_from_file_index(true, c->media_stream); + if (ms != NULL && ms->infinite_length) { + process_video = false; + } } if (process_video) { @@ -313,7 +313,7 @@ void set_speed(ComboAction* ca, Clip* c, double speed, bool ripple, long& ep, lo } ep = qMin(ep, c->timeline_out); lr = qMax(lr, proposed_out - c->timeline_out); - move_clip(ca, c, c->timeline_in, proposed_out, c->clip_in * multiplier, c->track); + move_clip(ca, c, c->timeline_in, proposed_out, c->clip_in * multiplier, c->track); c->refactor_frame_rate(ca, multiplier, false); @@ -345,7 +345,7 @@ void SpeedDialog::accept() { if (reverse->checkState() != Qt::PartiallyChecked && c->reverse != reverse->isChecked()) { long new_clip_in = (c->getMaximumLength() - (c->getLength() + c->clip_in)); - move_clip(ca, c, c->timeline_in, c->timeline_out, new_clip_in, c->track); + move_clip(ca, c, c->timeline_in, c->timeline_out, new_clip_in, c->track); c->clip_in = new_clip_in; ca->append(new SetBool(&c->reverse, reverse->isChecked())); } @@ -398,7 +398,7 @@ void SpeedDialog::accept() { } if (ripple->isChecked()) { - ca->append(new RippleCommand(clips.at(0)->sequence, earliest_point, longest_ripple)); + ripple_clips(ca, clips.at(0)->sequence, earliest_point, longest_ripple); } sel_command->new_data = sequence->selections; diff --git a/panels/timeline.cpp b/panels/timeline.cpp index c498bdaea..a7075989c 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -144,6 +144,19 @@ void Timeline::next_cut() { if (seek_enabled) panel_sequence_viewer->seek(n_cut); } +void ripple_clips(ComboAction* ca, Sequence *s, long point, long length, const QVector& ignore) { + for (int i=0;iclips.size();i++) { + if (!ignore.contains(i)) { + Clip* c = s->clips.at(i); + if (c != NULL) { + if (c->timeline_in >= point) { + move_clip(ca, c, c->timeline_in + length, c->timeline_out + length, c->clip_in, c->track, true); + } + } + } + } +} + void Timeline::toggle_show_all() { showing_all = !showing_all; if (showing_all) { @@ -487,7 +500,7 @@ void Timeline::delete_in_out(bool ripple) { } ComboAction* ca = new ComboAction(); delete_areas_and_relink(ca, areas); - if (ripple) ca->append(new RippleCommand(sequence, sequence->workarea_in, sequence->workarea_in - sequence->workarea_out)); + if (ripple) ripple_clips(ca, sequence, sequence->workarea_in, sequence->workarea_in - sequence->workarea_out); ca->append(new SetTimelineInOutCommand(sequence, false, 0, 0)); undo_stack.push(ca); update_ui(true); @@ -546,7 +559,7 @@ void Timeline::delete_selection(QVector& selections, bool ripple_dele } if (can_ripple) { - ca->append(new RippleCommand(sequence, ripple_point, -ripple_length)); + ripple_clips(ca, sequence, ripple_point, -ripple_length); panel_sequence_viewer->seek(ripple_point-1); } } @@ -930,7 +943,7 @@ void Timeline::paste(bool insert) { if (insert) { split_cache.clear(); split_all_clips_at_point(ca, sequence->playhead); - ca->append(new RippleCommand(sequence, paste_start, paste_end - paste_start)); + ripple_clips(ca, sequence, paste_start, paste_end - paste_start); } else { delete_areas_and_relink(ca, delete_areas); } @@ -1095,7 +1108,7 @@ void Timeline::ripple_to_in_point(bool in, bool ripple) { // trim and move clips around the in point delete_areas_and_relink(ca, areas); - if (ripple) ca->append(new RippleCommand(sequence, in_point+1, -1)); + if (ripple) ripple_clips(ca, sequence, in_point+1, -1); } else { push_undo = false; } @@ -1114,7 +1127,7 @@ void Timeline::ripple_to_in_point(bool in, bool ripple) { // trim and move clips around the in point delete_areas_and_relink(ca, areas); - if (ripple) ca->append(new RippleCommand(sequence, in_point, (in) ? (in_point - sequence->playhead) : (sequence->playhead - in_point))); + if (ripple) ripple_clips(ca, sequence, in_point, (in) ? (in_point - sequence->playhead) : (sequence->playhead - in_point)); } if (push_undo) { diff --git a/panels/timeline.h b/panels/timeline.h index 3f1a79bc2..9ebd96cf4 100644 --- a/panels/timeline.h +++ b/panels/timeline.h @@ -41,6 +41,7 @@ long getFrameFromScreenPoint(double zoom, int x); void draw_selection_rectangle(QPainter& painter, const QRect& rect); bool selection_contains_transition(const Selection& s, Clip* c, int type); void move_clip(ComboAction *ca, Clip *c, long iin, long iout, long iclip_in, int itrack, bool verify_transitions = true); +void ripple_clips(ComboAction *ca, Sequence* s, long point, long length, const QVector& ignore = QVector()); struct Ghost { int clip; diff --git a/project/undo.cpp b/project/undo.cpp index 8e9132d82..27914fa47 100644 --- a/project/undo.cpp +++ b/project/undo.cpp @@ -30,31 +30,31 @@ QUndoStack undo_stack; ComboAction::ComboAction() {} ComboAction::~ComboAction() { - for (int i=0;i=0;i--) { - commands.at(i)->undo(); - } + for (int i=commands.size()-1;i>=0;i--) { + commands.at(i)->undo(); + } for (int i=0;iundo(); } } void ComboAction::redo() { - for (int i=0;iredo(); - } + for (int i=0;iredo(); + } for (int i=0;iredo(); } } void ComboAction::append(QUndoCommand* u) { - commands.append(u); + commands.append(u); } void ComboAction::appendPost(QUndoCommand* u) { @@ -62,50 +62,50 @@ void ComboAction::appendPost(QUndoCommand* u) { } MoveClipAction::MoveClipAction(Clip *c, long iin, long iout, long iclip_in, int itrack) : - clip(c), + clip(c), old_in(c->timeline_in), old_out(c->timeline_out), old_clip_in(c->clip_in), old_track(c->track), - new_in(iin), - new_out(iout), - new_clip_in(iclip_in), + new_in(iin), + new_out(iout), + new_clip_in(iclip_in), new_track(itrack), old_project_changed(mainWindow->isWindowModified()) {} void MoveClipAction::undo() { - clip->timeline_in = old_in; - clip->timeline_out = old_out; - clip->clip_in = old_clip_in; - clip->track = old_track; + clip->timeline_in = old_in; + clip->timeline_out = old_out; + clip->clip_in = old_clip_in; + clip->track = old_track; mainWindow->setWindowModified(old_project_changed); } void MoveClipAction::redo() { - clip->timeline_in = new_in; - clip->timeline_out = new_out; - clip->clip_in = new_clip_in; - clip->track = new_track; + clip->timeline_in = new_in; + clip->timeline_out = new_out; + clip->clip_in = new_clip_in; + clip->track = new_track; mainWindow->setWindowModified(true); } DeleteClipAction::DeleteClipAction(Sequence* s, int clip) : - seq(s), + seq(s), index(clip), old_project_changed(mainWindow->isWindowModified()) {} DeleteClipAction::~DeleteClipAction() { - if (ref != NULL) delete ref; + if (ref != NULL) delete ref; } void DeleteClipAction::undo() { // restore ref to clip - seq->clips[index] = ref; - ref = NULL; + seq->clips[index] = ref; + ref = NULL; // restore links to this clip for (int i=linkClipIndex.size()-1;i>=0;i--) { @@ -117,11 +117,11 @@ void DeleteClipAction::undo() { void DeleteClipAction::redo() { // remove ref to clip - ref = seq->clips.at(index); - if (ref->open) { - close_clip(ref); - } - seq->clips[index] = NULL; + ref = seq->clips.at(index); + if (ref->open) { + close_clip(ref); + } + seq->clips[index] = NULL; // delete link to this clip linkClipIndex.clear(); @@ -143,261 +143,261 @@ void DeleteClipAction::redo() { } ChangeSequenceAction::ChangeSequenceAction(Sequence* s) : - new_sequence(s) + new_sequence(s) {} void ChangeSequenceAction::undo() { - set_sequence(old_sequence); + set_sequence(old_sequence); } void ChangeSequenceAction::redo() { - old_sequence = sequence; - set_sequence(new_sequence); + old_sequence = sequence; + set_sequence(new_sequence); } SetTimelineInOutCommand::SetTimelineInOutCommand(Sequence *s, bool enabled, long in, long out) : - seq(s), - new_enabled(enabled), - new_in(in), + seq(s), + new_enabled(enabled), + new_in(in), new_out(out), old_project_changed(mainWindow->isWindowModified()) {} void SetTimelineInOutCommand::undo() { - seq->using_workarea = old_enabled; - seq->workarea_in = old_in; - seq->workarea_out = old_out; + seq->using_workarea = old_enabled; + seq->workarea_in = old_in; + seq->workarea_out = old_out; - // footage viewer functions - if (seq->wrapper_sequence) { - Footage* m = seq->clips.at(0)->media->to_footage(); - m->using_inout = old_enabled; - m->in = old_in; - m->out = old_out; - } + // footage viewer functions + if (seq->wrapper_sequence) { + Footage* m = seq->clips.at(0)->media->to_footage(); + m->using_inout = old_enabled; + m->in = old_in; + m->out = old_out; + } mainWindow->setWindowModified(old_project_changed); } void SetTimelineInOutCommand::redo() { - old_enabled = seq->using_workarea; - old_in = seq->workarea_in; - old_out = seq->workarea_out; + old_enabled = seq->using_workarea; + old_in = seq->workarea_in; + old_out = seq->workarea_out; - seq->using_workarea = new_enabled; - seq->workarea_in = new_in; - seq->workarea_out = new_out; + seq->using_workarea = new_enabled; + seq->workarea_in = new_in; + seq->workarea_out = new_out; - // footage viewer functions - if (seq->wrapper_sequence) { - Footage* m = seq->clips.at(0)->media->to_footage(); - m->using_inout = new_enabled; - m->in = new_in; - m->out = new_out; - } + // footage viewer functions + if (seq->wrapper_sequence) { + Footage* m = seq->clips.at(0)->media->to_footage(); + m->using_inout = new_enabled; + m->in = new_in; + m->out = new_out; + } mainWindow->setWindowModified(true); } AddEffectCommand::AddEffectCommand(Clip* c, Effect* e, const EffectMeta *m, int insert_pos) : - clip(c), - meta(m), - ref(e), - pos(insert_pos), + clip(c), + meta(m), + ref(e), + pos(insert_pos), done(false), old_project_changed(mainWindow->isWindowModified()) {} AddEffectCommand::~AddEffectCommand() { - if (!done && ref != NULL) delete ref; + if (!done && ref != NULL) delete ref; } void AddEffectCommand::undo() { - clip->effects.last()->close(); - if (pos < 0) { - clip->effects.removeLast(); - } else { - clip->effects.removeAt(pos); - } - done = false; + clip->effects.last()->close(); + if (pos < 0) { + clip->effects.removeLast(); + } else { + clip->effects.removeAt(pos); + } + done = false; mainWindow->setWindowModified(old_project_changed); } void AddEffectCommand::redo() { - if (ref == NULL) { + if (ref == NULL) { ref = create_effect(clip, meta); - } - if (pos < 0) { - clip->effects.append(ref); - } else { - clip->effects.insert(pos, ref); - } - done = true; + } + if (pos < 0) { + clip->effects.append(ref); + } else { + clip->effects.insert(pos, ref); + } + done = true; mainWindow->setWindowModified(true); } AddTransitionCommand::AddTransitionCommand(Clip* c, Clip *s, Transition* copy, const EffectMeta *itransition, int itype, int ilength) : - clip(c), - secondary(s), - transition_to_copy(copy), - transition(itransition), + clip(c), + secondary(s), + transition_to_copy(copy), + transition(itransition), type(itype), - length(ilength), + length(ilength), old_project_changed(mainWindow->isWindowModified()) {} void AddTransitionCommand::undo() { - clip->sequence->hard_delete_transition(clip, type); - if (secondary != NULL) secondary->sequence->hard_delete_transition(secondary, (type == TA_OPENING_TRANSITION) ? TA_CLOSING_TRANSITION : TA_OPENING_TRANSITION); + clip->sequence->hard_delete_transition(clip, type); + if (secondary != NULL) secondary->sequence->hard_delete_transition(secondary, (type == TA_OPENING_TRANSITION) ? TA_CLOSING_TRANSITION : TA_OPENING_TRANSITION); - if (type == TA_OPENING_TRANSITION) { - clip->opening_transition = old_ptransition; - if (secondary != NULL) secondary->closing_transition = old_stransition; - } else { - clip->closing_transition = old_ptransition; - if (secondary != NULL) secondary->opening_transition = old_stransition; - } + if (type == TA_OPENING_TRANSITION) { + clip->opening_transition = old_ptransition; + if (secondary != NULL) secondary->closing_transition = old_stransition; + } else { + clip->closing_transition = old_ptransition; + if (secondary != NULL) secondary->opening_transition = old_stransition; + } mainWindow->setWindowModified(old_project_changed); } void AddTransitionCommand::redo() { - if (type == TA_OPENING_TRANSITION) { - old_ptransition = clip->opening_transition; - clip->opening_transition = (transition_to_copy == NULL) ? create_transition(clip, secondary, transition) : transition_to_copy->copy(clip, NULL); - if (secondary != NULL) { - old_stransition = secondary->closing_transition; - secondary->closing_transition = clip->opening_transition; - } - if (length > 0) { - clip->get_opening_transition()->set_length(length); - } - } else { - old_ptransition = clip->closing_transition; - clip->closing_transition = (transition_to_copy == NULL) ? create_transition(clip, secondary, transition) : transition_to_copy->copy(clip, NULL); - if (secondary != NULL) { - old_stransition = secondary->opening_transition; - secondary->opening_transition = clip->closing_transition; - } - if (length > 0) { - clip->get_closing_transition()->set_length(length); - } - } + if (type == TA_OPENING_TRANSITION) { + old_ptransition = clip->opening_transition; + clip->opening_transition = (transition_to_copy == NULL) ? create_transition(clip, secondary, transition) : transition_to_copy->copy(clip, NULL); + if (secondary != NULL) { + old_stransition = secondary->closing_transition; + secondary->closing_transition = clip->opening_transition; + } + if (length > 0) { + clip->get_opening_transition()->set_length(length); + } + } else { + old_ptransition = clip->closing_transition; + clip->closing_transition = (transition_to_copy == NULL) ? create_transition(clip, secondary, transition) : transition_to_copy->copy(clip, NULL); + if (secondary != NULL) { + old_stransition = secondary->opening_transition; + secondary->opening_transition = clip->closing_transition; + } + if (length > 0) { + clip->get_closing_transition()->set_length(length); + } + } mainWindow->setWindowModified(true); } ModifyTransitionCommand::ModifyTransitionCommand(Clip* c, int itype, long ilength) : - clip(c), - type(itype), + clip(c), + type(itype), new_length(ilength), old_project_changed(mainWindow->isWindowModified()) {} void ModifyTransitionCommand::undo() { - Transition* t = (type == TA_OPENING_TRANSITION) ? clip->get_opening_transition() : clip->get_closing_transition(); - t->set_length(old_length); + Transition* t = (type == TA_OPENING_TRANSITION) ? clip->get_opening_transition() : clip->get_closing_transition(); + t->set_length(old_length); mainWindow->setWindowModified(old_project_changed); } void ModifyTransitionCommand::redo() { - Transition* t = (type == TA_OPENING_TRANSITION) ? clip->get_opening_transition() : clip->get_closing_transition(); - old_length = t->get_true_length(); - t->set_length(new_length); + Transition* t = (type == TA_OPENING_TRANSITION) ? clip->get_opening_transition() : clip->get_closing_transition(); + old_length = t->get_true_length(); + t->set_length(new_length); mainWindow->setWindowModified(true); } DeleteTransitionCommand::DeleteTransitionCommand(Sequence* s, int transition_index) : - seq(s), - index(transition_index), + seq(s), + index(transition_index), transition(NULL), - otc(NULL), - ctc(NULL), + otc(NULL), + ctc(NULL), old_project_changed(mainWindow->isWindowModified()) {} DeleteTransitionCommand::~DeleteTransitionCommand() { - if (transition != NULL) delete transition; + if (transition != NULL) delete transition; } void DeleteTransitionCommand::undo() { - seq->transitions[index] = transition; + seq->transitions[index] = transition; - if (otc != NULL) otc->opening_transition = index; - if (ctc != NULL) ctc->closing_transition = index; + if (otc != NULL) otc->opening_transition = index; + if (ctc != NULL) ctc->closing_transition = index; - transition = NULL; + transition = NULL; mainWindow->setWindowModified(old_project_changed); } void DeleteTransitionCommand::redo() { - for (int i=0;iclips.size();i++) { - Clip* c = seq->clips.at(i); - if (c != NULL) { - if (c->opening_transition == index) { - otc = c; - c->opening_transition = -1; - } - if (c->closing_transition == index) { - ctc = c; - c->closing_transition = -1; - } - } - } + for (int i=0;iclips.size();i++) { + Clip* c = seq->clips.at(i); + if (c != NULL) { + if (c->opening_transition == index) { + otc = c; + c->opening_transition = -1; + } + if (c->closing_transition == index) { + ctc = c; + c->closing_transition = -1; + } + } + } - transition = seq->transitions.at(index); - seq->transitions[index] = NULL; + transition = seq->transitions.at(index); + seq->transitions[index] = NULL; mainWindow->setWindowModified(true); } NewSequenceCommand::NewSequenceCommand(Media *s, Media* iparent) : - seq(s), - parent(iparent), + seq(s), + parent(iparent), done(false), old_project_changed(mainWindow->isWindowModified()) { - if (parent == NULL) parent = project_model.get_root(); + if (parent == NULL) parent = project_model.get_root(); } NewSequenceCommand::~NewSequenceCommand() { - if (!done) delete seq; + if (!done) delete seq; } void NewSequenceCommand::undo() { - project_model.removeChild(parent, seq); + project_model.removeChild(parent, seq); - done = false; + done = false; mainWindow->setWindowModified(old_project_changed); } void NewSequenceCommand::redo() { - project_model.appendChild(parent, seq); + project_model.appendChild(parent, seq); - done = true; + done = true; mainWindow->setWindowModified(true); } AddMediaCommand::AddMediaCommand(Media* iitem, Media *iparent) : - item(iitem), - parent(iparent), + item(iitem), + parent(iparent), done(false), old_project_changed(mainWindow->isWindowModified()) {} AddMediaCommand::~AddMediaCommand() { - if (!done) { - delete item; - } + if (!done) { + delete item; + } } void AddMediaCommand::undo() { - project_model.removeChild(parent, item); - done = false; + project_model.removeChild(parent, item); + done = false; mainWindow->setWindowModified(old_project_changed); } void AddMediaCommand::redo() { - project_model.appendChild(parent, item); + project_model.appendChild(parent, item); done = true; mainWindow->setWindowModified(true); @@ -405,92 +405,53 @@ void AddMediaCommand::redo() { DeleteMediaCommand::DeleteMediaCommand(Media* i) : item(i), - parent(i->parentItem()), + parent(i->parentItem()), old_project_changed(mainWindow->isWindowModified()) {} DeleteMediaCommand::~DeleteMediaCommand() { - if (done) { - delete item; + if (done) { + delete item; } } void DeleteMediaCommand::undo() { - project_model.appendChild(parent, item); + project_model.appendChild(parent, item); mainWindow->setWindowModified(old_project_changed); done = false; } void DeleteMediaCommand::redo() { - project_model.removeChild(parent, item); + project_model.removeChild(parent, item); mainWindow->setWindowModified(true); done = true; } -RippleCommand::RippleCommand(Sequence *s, long ipoint, long ilength) : - seq(s), - point(ipoint), - length(ilength), - old_project_changed(mainWindow->isWindowModified()) -{} - -void RippleCommand::undo() { - for (int i=0;itimeline_in -= length; - c->timeline_out -= length; - } - mainWindow->setWindowModified(old_project_changed); -} - -void RippleCommand::redo() { - rippled.clear(); - for (int j=0;jclips.size();j++) { - Clip* c = seq->clips.at(j); - bool found = false; - for (int i=0;itimeline_in >= point) { - c->timeline_in += length; - c->timeline_out += length; - rippled.append(c); - } - } - } - mainWindow->setWindowModified(true); -} - AddClipCommand::AddClipCommand(Sequence* s, QVector& add) : - seq(s), + seq(s), clips(add), old_project_changed(mainWindow->isWindowModified()) {} AddClipCommand::~AddClipCommand() { - for (int i=0;iclips.last(); panel_timeline->deselect_area(c->timeline_in, c->timeline_out, c->track); undone_clips.prepend(c); - if (c->open) close_clip(c); - seq->clips.removeLast(); - } + if (c->open) close_clip(c); + seq->clips.removeLast(); + } mainWindow->setWindowModified(old_project_changed); } @@ -509,8 +470,8 @@ void AddClipCommand::redo() { for (int j=0;jlinked.size();j++) { copy->linked[j] = original->linked.at(j) + linkOffset; } - if (original->opening_transition > -1) copy->opening_transition = original->get_opening_transition()->copy(copy, NULL); - if (original->closing_transition > -1) copy->closing_transition = original->get_closing_transition()->copy(copy, NULL); + if (original->opening_transition > -1) copy->opening_transition = original->get_opening_transition()->copy(copy, NULL); + if (original->closing_transition > -1) copy->closing_transition = original->get_closing_transition()->copy(copy, NULL); seq->clips.append(copy); } } @@ -520,32 +481,32 @@ void AddClipCommand::redo() { LinkCommand::LinkCommand() : link(true), old_project_changed(mainWindow->isWindowModified()) {} void LinkCommand::undo() { - for (int i=0;iclips.at(clips.at(i)); - if (link) { - c->linked.clear(); - } else { - c->linked = old_links.at(i); - } - } + if (link) { + c->linked.clear(); + } else { + c->linked = old_links.at(i); + } + } mainWindow->setWindowModified(old_project_changed); } void LinkCommand::redo() { - old_links.clear(); - for (int i=0;iclips.at(clips.at(i)); - if (link) { - for (int j=0;jlinked.append(clips.at(j)); - } - } - } else { - old_links.append(c->linked); - c->linked.clear(); - } - } + } + } + } else { + old_links.append(c->linked); + c->linked.clear(); + } + } mainWindow->setWindowModified(true); } @@ -554,15 +515,15 @@ CheckboxCommand::CheckboxCommand(QCheckBox* b) : box(b), checked(box->isChecked( CheckboxCommand::~CheckboxCommand() {} void CheckboxCommand::undo() { - box->setChecked(!checked); - done = false; + box->setChecked(!checked); + done = false; mainWindow->setWindowModified(old_project_changed); } void CheckboxCommand::redo() { - if (!done) { - box->setChecked(checked); - } + if (!done) { + box->setChecked(checked); + } mainWindow->setWindowModified(true); } @@ -571,19 +532,19 @@ ReplaceMediaCommand::ReplaceMediaCommand(Media* i, QString s) : new_filename(s), old_project_changed(mainWindow->isWindowModified()) { - old_filename = item->to_footage()->url; + old_filename = item->to_footage()->url; } void ReplaceMediaCommand::replace(QString& filename) { // close any clips currently using this media - QVector all_sequences = panel_project->list_all_project_sequences(); + QVector all_sequences = panel_project->list_all_project_sequences(); for (int i=0;ito_sequence(); - for (int j=0;jclips.size();j++) { - Clip* c = s->clips.at(j); - if (c != NULL && c->media == item && c->open) { + Sequence* s = all_sequences.at(i)->to_sequence(); + for (int j=0;jclips.size();j++) { + Clip* c = s->clips.at(j); + if (c != NULL && c->media == item && c->open) { close_clip(c); - if (c->media != NULL && c->media->get_type() == MEDIA_TYPE_FOOTAGE) c->cacher->wait(); + if (c->media != NULL && c->media->get_type() == MEDIA_TYPE_FOOTAGE) c->cacher->wait(); c->replaced = true; } } @@ -592,8 +553,8 @@ void ReplaceMediaCommand::replace(QString& filename) { // replace media QStringList files; files.append(filename); - item->to_footage()->ready_lock.lock(); - panel_project->process_file_list(files, false, item, NULL); + item->to_footage()->ready_lock.lock(); + panel_project->process_file_list(files, false, item, NULL); } void ReplaceMediaCommand::undo() { @@ -610,7 +571,7 @@ void ReplaceMediaCommand::redo() { ReplaceClipMediaCommand::ReplaceClipMediaCommand(Media *a, Media *b, bool e) : old_media(a), - new_media(b), + new_media(b), preserve_clip_ins(e), old_project_changed(mainWindow->isWindowModified()) {} @@ -624,7 +585,7 @@ void ReplaceClipMediaCommand::replace(bool undo) { Clip* c = clips.at(i); if (c->open) { close_clip(c); - if (c->media != NULL && c->media->get_type() == MEDIA_TYPE_FOOTAGE) c->cacher->wait(); + if (c->media != NULL && c->media->get_type() == MEDIA_TYPE_FOOTAGE) c->cacher->wait(); } if (undo) { @@ -632,14 +593,14 @@ void ReplaceClipMediaCommand::replace(bool undo) { c->clip_in = old_clip_ins.at(i); } - c->media = old_media; + c->media = old_media; } else { if (!preserve_clip_ins) { old_clip_ins.append(c->clip_in); c->clip_in = 0; } - c->media = new_media; + c->media = new_media; } c->replaced = true; @@ -656,7 +617,7 @@ void ReplaceClipMediaCommand::undo() { void ReplaceClipMediaCommand::redo() { replace(false); - update_ui(true); + update_ui(true); mainWindow->setWindowModified(true); } @@ -685,9 +646,9 @@ void EffectDeleteCommand::redo() { for (int i=0;ieffects.at(fx_id); - e->close(); - deleted_objects.append(e); + Effect* e = c->effects.at(fx_id); + e->close(); + deleted_objects.append(e); c->effects.removeAt(fx_id); } panel_effect_controls->reload_clips(); @@ -699,37 +660,37 @@ MediaMove::MediaMove() : old_project_changed(mainWindow->isWindowModified()) {} void MediaMove::undo() { for (int i=0;isetWindowModified(old_project_changed); } void MediaMove::redo() { - if (to == NULL) to = project_model.get_root(); + if (to == NULL) to = project_model.get_root(); froms.resize(items.size()); for (int i=0;iparentItem(); + Media* parent = items.at(i)->parentItem(); froms[i] = parent; - project_model.moveChild(items.at(i), to); - } + project_model.moveChild(items.at(i), to); + } mainWindow->setWindowModified(true); } MediaRename::MediaRename(Media* iitem, QString ito) : - item(iitem), - from(iitem->get_name()), - to(ito), - old_project_changed(mainWindow->isWindowModified()) + item(iitem), + from(iitem->get_name()), + to(ito), + old_project_changed(mainWindow->isWindowModified()) {} void MediaRename::undo() { - item->set_name(from); - mainWindow->setWindowModified(old_project_changed); + item->set_name(from); + mainWindow->setWindowModified(old_project_changed); } void MediaRename::redo() { - item->set_name(to); - mainWindow->setWindowModified(true); + item->set_name(to); + mainWindow->setWindowModified(true); } KeyframeMove::KeyframeMove() : old_project_changed(mainWindow->isWindowModified()) {} @@ -749,9 +710,9 @@ void KeyframeMove::redo() { } KeyframeDelete::KeyframeDelete() : - disable_keyframes_on_row(NULL), - old_project_changed(mainWindow->isWindowModified()), - sorted(false) + disable_keyframes_on_row(NULL), + old_project_changed(mainWindow->isWindowModified()), + sorted(false) {} void KeyframeDelete::undo() { @@ -828,7 +789,7 @@ KeyframeSet::KeyframeSet(EffectRow* r, int i, long t, bool justMadeKeyframe) : EffectField* field = row->field(i); if (index != -1) { if (field->type == EFFECT_FIELD_DOUBLE) { - old_values[i] = static_cast(field->ui_element)->getPreviousValue(); + old_values[i] = static_cast(field->ui_element)->getPreviousValue(); } else { old_values[i] = field->keyframe_data.at(index); } @@ -903,17 +864,17 @@ SetAutoscaleAction::SetAutoscaleAction() : {} void SetAutoscaleAction::undo() { - for (int i=0;iautoscale = !clips.at(i)->autoscale; - } + for (int i=0;iautoscale = !clips.at(i)->autoscale; + } panel_sequence_viewer->viewer_widget->update(); mainWindow->setWindowModified(old_project_changed); } void SetAutoscaleAction::redo() { - for (int i=0;iautoscale = !clips.at(i)->autoscale; - } + for (int i=0;iautoscale = !clips.at(i)->autoscale; + } panel_sequence_viewer->viewer_widget->update(); mainWindow->setWindowModified(true); } @@ -927,9 +888,9 @@ AddMarkerAction::AddMarkerAction(Sequence* s, long t, QString n) : void AddMarkerAction::undo() { if (index == -1) { - seq->markers.removeLast(); + seq->markers.removeLast(); } else { - seq->markers[index].name = old_name; + seq->markers[index].name = old_name; } mainWindow->setWindowModified(old_project_changed); @@ -937,8 +898,8 @@ void AddMarkerAction::undo() { void AddMarkerAction::redo() { index = -1; - for (int i=0;imarkers.size();i++) { - if (seq->markers.at(i).frame == time) { + for (int i=0;imarkers.size();i++) { + if (seq->markers.at(i).frame == time) { index = i; break; } @@ -947,10 +908,10 @@ void AddMarkerAction::redo() { if (index == -1) { Marker m; m.frame = time; - seq->markers.append(m); + seq->markers.append(m); } else { - old_name = seq->markers.at(index).name; - seq->markers[index].name = name; + old_name = seq->markers.at(index).name; + seq->markers[index].name = name; } mainWindow->setWindowModified(true); @@ -1040,22 +1001,22 @@ void SetBool::redo() { } SetSelectionsCommand::SetSelectionsCommand(Sequence* s) : - seq(s), + seq(s), done(true), old_project_changed(mainWindow->isWindowModified()) {} void SetSelectionsCommand::undo() { - seq->selections = old_data; - done = false; + seq->selections = old_data; + done = false; mainWindow->setWindowModified(old_project_changed); } void SetSelectionsCommand::redo() { - if (!done) { - seq->selections = new_data; - done = true; - } + if (!done) { + seq->selections = new_data; + done = true; + } mainWindow->setWindowModified(true); } @@ -1114,7 +1075,7 @@ void EditSequenceCommand::redo() { void EditSequenceCommand::update() { // update tooltip - item->set_sequence(seq); + item->set_sequence(seq); for (int i=0;iclips.size();i++) { // TODO shift in/out/clipin points to match new frame rate @@ -1131,36 +1092,36 @@ void EditSequenceCommand::update() { } SetInt::SetInt(int* pointer, int new_value) : - p(pointer), - oldval(*pointer), + p(pointer), + oldval(*pointer), newval(new_value), old_project_changed(mainWindow->isWindowModified()) {} void SetInt::undo() { - *p = oldval; + *p = oldval; mainWindow->setWindowModified(old_project_changed); } void SetInt::redo() { - *p = newval; + *p = newval; mainWindow->setWindowModified(true); } SetString::SetString(QString* pointer, QString new_value) : - p(pointer), - oldval(*pointer), + p(pointer), + oldval(*pointer), newval(new_value), old_project_changed(mainWindow->isWindowModified()) {} void SetString::undo() { - *p = oldval; + *p = oldval; mainWindow->setWindowModified(old_project_changed); } void SetString::redo() { - *p = newval; + *p = newval; mainWindow->setWindowModified(true); } @@ -1173,7 +1134,7 @@ void CloseAllClipsCommand::redo() { } UpdateFootageTooltip::UpdateFootageTooltip(Media *i) : - item(i) + item(i) {} void UpdateFootageTooltip::undo() { @@ -1181,7 +1142,7 @@ void UpdateFootageTooltip::undo() { } void UpdateFootageTooltip::redo() { - item->update_tooltip(); + item->update_tooltip(); } MoveEffectCommand::MoveEffectCommand() : @@ -1211,13 +1172,13 @@ RemoveClipsFromClipboard::~RemoveClipsFromClipboard() { } void RemoveClipsFromClipboard::undo() { - clipboard.insert(pos, clip); + clipboard.insert(pos, clip); done = false; } void RemoveClipsFromClipboard::redo() { - clip = static_cast(clipboard.at(pos)); - clipboard.removeAt(pos); + clip = static_cast(clipboard.at(pos)); + clipboard.removeAt(pos); done = true; } @@ -1240,26 +1201,26 @@ void RenameClipCommand::redo() { } SetPointer::SetPointer(void **pointer, void *data) : - p(pointer), - new_data(data), - old_changed(mainWindow->isWindowModified()) + p(pointer), + new_data(data), + old_changed(mainWindow->isWindowModified()) {} void SetPointer::undo() { - *p = old_data; - mainWindow->setWindowModified(old_changed); + *p = old_data; + mainWindow->setWindowModified(old_changed); } void SetPointer::redo() { - old_data = *p; - *p = new_data; - mainWindow->setWindowModified(true); + old_data = *p; + *p = new_data; + mainWindow->setWindowModified(true); } void ReloadEffectsCommand::undo() { - redo(); + redo(); } void ReloadEffectsCommand::redo() { - panel_effect_controls->reload_clips(); + panel_effect_controls->reload_clips(); } diff --git a/project/undo.h b/project/undo.h index 36be97d59..a52da2a1f 100644 --- a/project/undo.h +++ b/project/undo.h @@ -28,48 +28,48 @@ extern QUndoStack undo_stack; class ComboAction : public QUndoCommand { public: - ComboAction(); - ~ComboAction(); - void undo(); - void redo(); - void append(QUndoCommand* u); + ComboAction(); + ~ComboAction(); + void undo(); + void redo(); + void append(QUndoCommand* u); void appendPost(QUndoCommand* u); private: - QVector commands; + QVector commands; QVector post_commands; }; class MoveClipAction : public QUndoCommand { public: - MoveClipAction(Clip* c, long iin, long iout, long iclip_in, int itrack); - void undo(); - void redo(); + MoveClipAction(Clip* c, long iin, long iout, long iclip_in, int itrack); + void undo(); + void redo(); private: - Clip* clip; + Clip* clip; - long old_in; - long old_out; - long old_clip_in; - int old_track; + long old_in; + long old_out; + long old_clip_in; + int old_track; - long new_in; - long new_out; - long new_clip_in; - int new_track; + long new_in; + long new_out; + long new_clip_in; + int new_track; bool old_project_changed; }; class DeleteClipAction : public QUndoCommand { public: - DeleteClipAction(Sequence* s, int clip); - ~DeleteClipAction(); - void undo(); - void redo(); + DeleteClipAction(Sequence* s, int clip); + ~DeleteClipAction(); + void undo(); + void redo(); private: - Sequence* seq; - Clip* ref; - int index; + Sequence* seq; + Clip* ref; + int index; QVector linkClipIndex; QVector linkLinkIndex; @@ -79,207 +79,193 @@ private: class ChangeSequenceAction : public QUndoCommand { public: - ChangeSequenceAction(Sequence* s); - void undo(); - void redo(); + ChangeSequenceAction(Sequence* s); + void undo(); + void redo(); private: - Sequence* old_sequence; - Sequence* new_sequence; + Sequence* old_sequence; + Sequence* new_sequence; }; class AddEffectCommand : public QUndoCommand { public: - AddEffectCommand(Clip* c, Effect *e, const EffectMeta* m, int insert_pos = -1); - ~AddEffectCommand(); - void undo(); - void redo(); + AddEffectCommand(Clip* c, Effect *e, const EffectMeta* m, int insert_pos = -1); + ~AddEffectCommand(); + void undo(); + void redo(); private: - Clip* clip; + Clip* clip; const EffectMeta* meta; - Effect* ref; - int pos; - bool done; + Effect* ref; + int pos; + bool done; bool old_project_changed; }; class AddTransitionCommand : public QUndoCommand { public: - AddTransitionCommand(Clip* c, Clip* s, Transition *copy, const EffectMeta* itransition, int itype, int ilength); - void undo(); - void redo(); + AddTransitionCommand(Clip* c, Clip* s, Transition *copy, const EffectMeta* itransition, int itype, int ilength); + void undo(); + void redo(); private: - Clip* clip; - Clip* secondary; - Transition* transition_to_copy; + Clip* clip; + Clip* secondary; + Transition* transition_to_copy; const EffectMeta* transition; - int type; - int length; + int type; + int length; bool old_project_changed; - int old_ptransition; - int old_stransition; + int old_ptransition; + int old_stransition; }; class ModifyTransitionCommand : public QUndoCommand { public: - ModifyTransitionCommand(Clip* c, int itype, long ilength); - void undo(); - void redo(); + ModifyTransitionCommand(Clip* c, int itype, long ilength); + void undo(); + void redo(); private: - Clip* clip; - int type; - long new_length; - long old_length; + Clip* clip; + int type; + long new_length; + long old_length; bool old_project_changed; }; class DeleteTransitionCommand : public QUndoCommand { public: - DeleteTransitionCommand(Sequence* s, int transition_index); - ~DeleteTransitionCommand(); - void undo(); - void redo(); + DeleteTransitionCommand(Sequence* s, int transition_index); + ~DeleteTransitionCommand(); + void undo(); + void redo(); private: - Sequence* seq; - int index; - Transition* transition; - Clip* otc; - Clip* ctc; + Sequence* seq; + int index; + Transition* transition; + Clip* otc; + Clip* ctc; bool old_project_changed; }; class SetTimelineInOutCommand : public QUndoCommand { public: - SetTimelineInOutCommand(Sequence* s, bool enabled, long in, long out); - void undo(); - void redo(); + SetTimelineInOutCommand(Sequence* s, bool enabled, long in, long out); + void undo(); + void redo(); private: - Sequence* seq; + Sequence* seq; - bool old_enabled; - long old_in; - long old_out; + bool old_enabled; + long old_in; + long old_out; - bool new_enabled; - long new_in; - long new_out; + bool new_enabled; + long new_in; + long new_out; bool old_project_changed; }; class NewSequenceCommand : public QUndoCommand { public: - NewSequenceCommand(Media *s, Media* iparent); - ~NewSequenceCommand(); - void undo(); - void redo(); + NewSequenceCommand(Media *s, Media* iparent); + ~NewSequenceCommand(); + void undo(); + void redo(); private: - Media* seq; - Media* parent; - bool done; + Media* seq; + Media* parent; + bool done; bool old_project_changed; }; class AddMediaCommand : public QUndoCommand { public: - AddMediaCommand(Media* iitem, Media* iparent); - ~AddMediaCommand(); - void undo(); - void redo(); + AddMediaCommand(Media* iitem, Media* iparent); + ~AddMediaCommand(); + void undo(); + void redo(); private: - Media* item; - Media* parent; - bool done; + Media* item; + Media* parent; + bool done; bool old_project_changed; }; class DeleteMediaCommand : public QUndoCommand { public: - DeleteMediaCommand(Media *i); - ~DeleteMediaCommand(); - void undo(); - void redo(); + DeleteMediaCommand(Media *i); + ~DeleteMediaCommand(); + void undo(); + void redo(); private: - Media* item; - Media* parent; + Media* item; + Media* parent; bool old_project_changed; bool done; }; -class RippleCommand : public QUndoCommand { -public: - RippleCommand(Sequence* s, long ipoint, long ilength); - QVector ignore; - void undo(); - void redo(); -private: - Sequence* seq; - long point; - long length; - QVector rippled; - bool old_project_changed; -}; - class AddClipCommand : public QUndoCommand { public: - AddClipCommand(Sequence* s, QVector& add); - ~AddClipCommand(); - void undo(); - void redo(); + AddClipCommand(Sequence* s, QVector& add); + ~AddClipCommand(); + void undo(); + void redo(); private: - Sequence* seq; - QVector clips; + Sequence* seq; + QVector clips; QVector undone_clips; bool old_project_changed; }; class LinkCommand : public QUndoCommand { public: - LinkCommand(); - void undo(); + LinkCommand(); + void undo(); void redo(); Sequence* s; QVector clips; - bool link; + bool link; private: - QVector< QVector > old_links; + QVector< QVector > old_links; bool old_project_changed; }; class CheckboxCommand : public QUndoCommand { public: - CheckboxCommand(QCheckBox* b); - ~CheckboxCommand(); - void undo(); - void redo(); + CheckboxCommand(QCheckBox* b); + ~CheckboxCommand(); + void undo(); + void redo(); private: - QCheckBox* box; - bool checked; - bool done; + QCheckBox* box; + bool checked; + bool done; bool old_project_changed; }; class ReplaceMediaCommand : public QUndoCommand { public: - ReplaceMediaCommand(Media*, QString); + ReplaceMediaCommand(Media*, QString); void undo(); void redo(); private: - Media *item; + Media *item; QString old_filename; QString new_filename; - bool old_project_changed; + bool old_project_changed; void replace(QString& filename); }; class ReplaceClipMediaCommand : public QUndoCommand { public: - ReplaceClipMediaCommand(Media *, Media *, bool); + ReplaceClipMediaCommand(Media *, Media *, bool); void undo(); void redo(); QVector clips; private: - Media* old_media; - Media* new_media; + Media* old_media; + Media* new_media; bool preserve_clip_ins; bool old_project_changed; QVector old_clip_ins; @@ -302,26 +288,26 @@ private: class MediaMove : public QUndoCommand { public: - MediaMove(); - QVector items; - Media* to; + MediaMove(); + QVector items; + Media* to; void undo(); void redo(); private: - QVector froms; + QVector froms; bool old_project_changed; }; class MediaRename : public QUndoCommand { public: - MediaRename(Media* iitem, QString to); - void undo(); - void redo(); + MediaRename(Media* iitem, QString to); + void undo(); + void redo(); private: - bool old_project_changed; - Media* item; - QString from; - QString to; + bool old_project_changed; + Media* item; + QString from; + QString to; }; class KeyframeMove : public QUndoCommand { @@ -386,9 +372,9 @@ private: class SetAutoscaleAction : public QUndoCommand { public: SetAutoscaleAction(); - void undo(); - void redo(); - QVector clips; + void undo(); + void redo(); + QVector clips; private: bool old_project_changed; }; @@ -458,14 +444,14 @@ private: class SetSelectionsCommand : public QUndoCommand { public: - SetSelectionsCommand(Sequence *s); - void undo(); - void redo(); - QVector old_data; - QVector new_data; + SetSelectionsCommand(Sequence *s); + void undo(); + void redo(); + QVector old_data; + QVector new_data; private: - Sequence* seq; - bool done; + Sequence* seq; + bool done; bool old_project_changed; }; @@ -483,7 +469,7 @@ private: class EditSequenceCommand : public QUndoCommand { public: - EditSequenceCommand(Media *i, Sequence* s); + EditSequenceCommand(Media *i, Sequence* s); void undo(); void redo(); void update(); @@ -495,7 +481,7 @@ public: int audio_frequency; int audio_layout; private: - Media* item; + Media* item; Sequence* seq; bool old_project_changed; @@ -509,25 +495,25 @@ private: class SetInt : public QUndoCommand { public: - SetInt(int* pointer, int new_value); - void undo(); - void redo(); + SetInt(int* pointer, int new_value); + void undo(); + void redo(); private: - int* p; - int oldval; - int newval; + int* p; + int oldval; + int newval; bool old_project_changed; }; class SetString : public QUndoCommand { public: - SetString(QString* pointer, QString new_value); - void undo(); - void redo(); + SetString(QString* pointer, QString new_value); + void undo(); + void redo(); private: - QString* p; - QString oldval; - QString newval; + QString* p; + QString oldval; + QString newval; bool old_project_changed; }; @@ -539,11 +525,11 @@ public: class UpdateFootageTooltip : public QUndoCommand { public: - UpdateFootageTooltip(Media* i); + UpdateFootageTooltip(Media* i); void undo(); void redo(); private: - Media* item; + Media* item; }; class MoveEffectCommand : public QUndoCommand { @@ -585,20 +571,20 @@ private: class SetPointer : public QUndoCommand { public: - SetPointer(void** pointer, void* data); - void undo(); - void redo(); + SetPointer(void** pointer, void* data); + void undo(); + void redo(); private: - bool old_changed; - void** p; - void* new_data; - void* old_data; + bool old_changed; + void** p; + void* new_data; + void* old_data; }; class ReloadEffectsCommand : public QUndoCommand { public: - void undo(); - void redo(); + void undo(); + void redo(); }; #endif // UNDO_H diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index 3e517a01f..bebf82c2f 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -429,7 +429,7 @@ void insert_clips(ComboAction* ca) { long earliest_new_point = LONG_MAX; long latest_new_point = LONG_MIN; - QVector ignore_clips; + QVector ignore_clips; for (int i=0;ighosts.size();i++) { const Ghost& g = panel_timeline->ghosts.at(i); @@ -439,7 +439,7 @@ void insert_clips(ComboAction* ca) { latest_new_point = qMax(latest_new_point, g.out); if (g.clip >= 0) { - ignore_clips.append(sequence->clips.at(g.clip)); + ignore_clips.append(g.clip); } else { // don't try to close old gap if importing ripple_old_point = false; @@ -467,7 +467,7 @@ void insert_clips(ComboAction* ca) { // determine if we should close the gap the old clips left behind if (ripple_old_point && !((c->timeline_in < earliest_old_point && c->timeline_out <= earliest_old_point) || (c->timeline_in >= latest_old_point && c->timeline_out > latest_old_point)) - && !ignore_clips.contains(c)) { + && !ignore_clips.contains(i)) { ripple_old_point = false; } } @@ -476,17 +476,13 @@ void insert_clips(ComboAction* ca) { long ripple_length = (latest_new_point - earliest_new_point); - RippleCommand* rc = new RippleCommand(sequence, earliest_new_point, ripple_length); - rc->ignore = ignore_clips; - ca->append(rc); + ripple_clips(ca, sequence, earliest_new_point, ripple_length, ignore_clips); if (ripple_old_point) { // works for moving later clips earlier but not earlier to later long second_ripple_length = (earliest_old_point - latest_old_point); - RippleCommand* rc2 = new RippleCommand(sequence, latest_old_point, second_ripple_length); - rc2->ignore = ignore_clips; - ca->append(rc2); + ripple_clips(ca, sequence, latest_old_point, second_ripple_length, ignore_clips); if (earliest_old_point < earliest_new_point) { for (int i=0;ighosts.size();i++) { @@ -886,13 +882,13 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { ripple_length = first_ghost.old_out - panel_timeline->ghosts.at(0).out; ripple_point = first_ghost.old_out; } - QVector ignore_clips; + QVector ignore_clips; for (int i=0;ighosts.size();i++) { const Ghost& g = panel_timeline->ghosts.at(i); // push rippled clips forward if necessary if (panel_timeline->trim_in_point) { - ignore_clips.append(sequence->clips.at(g.clip)); + ignore_clips.append(g.clip); panel_timeline->ghosts[i].in += ripple_length; panel_timeline->ghosts[i].out += ripple_length; } @@ -901,9 +897,8 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { ripple_point = qMin(ripple_point, comp_point); } if (!panel_timeline->trim_in_point) ripple_length = -ripple_length; - RippleCommand* rc = new RippleCommand(sequence, ripple_point, ripple_length); - rc->ignore = ignore_clips; - ca->append(rc); + + ripple_clips(ca, sequence, ripple_point, ripple_length, ignore_clips); } if (panel_timeline->tool == TIMELINE_TOOL_POINTER