numerous keyframe improvements

This commit is contained in:
itsmattkc
2019-01-04 21:01:36 +11:00
parent b36f54c11d
commit a2eef2e829
13 changed files with 217 additions and 64 deletions
+45 -52
View File
@@ -16,6 +16,7 @@
#include "ui/clickablelabel.h"
#include "ui/resizablescrollbar.h"
#include "ui/rectangleselect.h"
#include "project/keyframe.h"
#include <QMouseEvent>
#include <QtMath>
@@ -165,23 +166,7 @@ void KeyframeView::update_keys() {
}
void KeyframeView::delete_selected_keyframes() {
ComboAction* ca = new ComboAction();
bool del = false;
for (int i=0;i<selected_keyframes.size();i++) {
// TODO these need to be sorted
ca->append(new KeyframeDelete(selected_fields.at(i), selected_keyframes.at(i)));
del = true;
}
if (del) {
undo_stack.push(ca);
selected_keyframes.clear();
selected_fields.clear();
update_keys();
panel_sequence_viewer->viewer_widget->update();
} else {
delete ca;
}
delete_keyframes(selected_fields, selected_keyframes);
}
void KeyframeView::set_x_scroll(int s) {
@@ -201,6 +186,8 @@ void KeyframeView::resize_move(double d) {
void KeyframeView::mousePressEvent(QMouseEvent *event) {
rect_select_x = event->x();
rect_select_y = event->y();
rect_select_w = 0;
rect_select_h = 0;
if (panel_timeline->tool == TIMELINE_TOOL_HAND || event->buttons() & Qt::MiddleButton) {
scroll_drag = true;
@@ -244,7 +231,11 @@ void KeyframeView::mousePressEvent(QMouseEvent *event) {
}
bool already_selected = false;
keys_selected = false;
if (keyframe_index > -1) already_selected = keyframeIsSelected(rows.at(row_index)->field(field_index), keyframe_index);
if (keyframe_index > -1) {
already_selected = keyframeIsSelected(rows.at(row_index)->field(field_index), keyframe_index);
} else {
select_rect = true;
}
if (!already_selected) {
if (!(event->modifiers() & Qt::ShiftModifier)) {
selected_fields.clear();
@@ -274,10 +265,11 @@ void KeyframeView::mousePressEvent(QMouseEvent *event) {
for (int i=0;i<selected_fields.size();i++) {
old_key_vals.append(selected_fields.at(i)->keyframes.at(selected_keyframes.at(i)).time);
}
keys_selected = true;
}
rect_select_offset = selected_fields.size();
update_keys();
if (event->button() == Qt::LeftButton) {
@@ -298,7 +290,40 @@ void KeyframeView::mouseMoveEvent(QMouseEvent* event) {
rect_select_y = event->pos().y();
} else if (mousedown) {
int mouse_x = event->x() + x_scroll;
if (keys_selected) {
if (select_rect) {
// do a rect select
selected_fields.resize(rect_select_offset);
selected_keyframes.resize(rect_select_offset);
rect_select_w = event->x() - rect_select_x;
rect_select_h = event->y() - rect_select_y;
int min_row = qMin(rect_select_y, event->y())-KEYFRAME_SIZE;
int max_row = qMax(rect_select_y, event->y())+KEYFRAME_SIZE;
long frame_start = getFrameFromScreenPoint(panel_effect_controls->zoom, rect_select_x+x_scroll);
long frame_end = getFrameFromScreenPoint(panel_effect_controls->zoom, mouse_x);
long min_frame = qMin(frame_start, frame_end)-KEYFRAME_SIZE;
long max_frame = qMax(frame_start, frame_end)+KEYFRAME_SIZE;
for (int i=0;i<rowY.size();i++) {
if (rowY.at(i) >= min_row && rowY.at(i) <= max_row) {
EffectRow* row = rows.at(i);
for (int k=0;k<row->fieldCount();k++) {
EffectField* field = row->field(k);
for (int j=0;j<field->keyframes.size();j++) {
long keyframe_frame = adjust_row_keyframe(row, field->keyframes.at(j).time);
if (!keyframeIsSelected(field, j) && keyframe_frame >= min_frame && keyframe_frame <= max_frame) {
selected_fields.append(field);
selected_keyframes.append(j);
}
}
}
}
}
update_keys();
} else if (keys_selected) {
// move keyframes
long frame_diff = getFrameFromScreenPoint(panel_effect_controls->zoom, mouse_x) - drag_frame_start;
@@ -345,38 +370,6 @@ void KeyframeView::mouseMoveEvent(QMouseEvent* event) {
dragging = true;
update_ui(false);
} else {
// do a rect select
rect_select_w = event->x() - rect_select_x;
rect_select_h = event->y() - rect_select_y;
int min_row = qMin(rect_select_y, event->y())-KEYFRAME_SIZE;
int max_row = qMax(rect_select_y, event->y())+KEYFRAME_SIZE;
long frame_start = getFrameFromScreenPoint(panel_effect_controls->zoom, rect_select_x+x_scroll);
long frame_end = getFrameFromScreenPoint(panel_effect_controls->zoom, mouse_x);
long min_frame = qMin(frame_start, frame_end)-KEYFRAME_SIZE;
long max_frame = qMax(frame_start, frame_end)+KEYFRAME_SIZE;
for (int i=0;i<rowY.size();i++) {
if (rowY.at(i) >= min_row && rowY.at(i) <= max_row) {
EffectRow* row = rows.at(i);
for (int k=0;k<row->fieldCount();k++) {
EffectField* field = row->field(k);
for (int j=0;j<field->keyframes.size();j++) {
long keyframe_frame = adjust_row_keyframe(row, field->keyframes.at(j).time);
if (!keyframeIsSelected(field, j) && keyframe_frame >= min_frame && keyframe_frame <= max_frame) {
selected_fields.append(field);
selected_keyframes.append(j);
}
}
}
}
}
select_rect = true;
update_keys();
}
}
}