massive rewrite of project data system

This commit is contained in:
itsmattkc
2018-12-13 14:29:09 +11:00
parent 6c3197aac6
commit ac1cb9d14f
44 changed files with 2562 additions and 2158 deletions
+66 -100
View File
@@ -15,13 +15,14 @@
#include "ui/sourcetable.h"
#include "project/effect.h"
#include "project/transition.h"
#include "io/media.h"
#include "project/footage.h"
#include "playback/cacher.h"
#include "ui/labelslider.h"
#include "ui/viewerwidget.h"
#include "project/marker.h"
#include "mainwindow.h"
#include "io/clipboard.h"
#include "project/media.h"
#include "debug.h"
QUndoStack undo_stack;
@@ -169,7 +170,7 @@ void SetTimelineInOutCommand::undo() {
// footage viewer functions
if (seq->wrapper_sequence) {
Media* m = static_cast<Media*>(seq->clips.at(0)->media);
Footage* m = seq->clips.at(0)->media->to_footage();
m->using_inout = old_enabled;
m->in = old_in;
m->out = old_out;
@@ -189,7 +190,7 @@ void SetTimelineInOutCommand::redo() {
// footage viewer functions
if (seq->wrapper_sequence) {
Media* m = static_cast<Media*>(seq->clips.at(0)->media);
Footage* m = seq->clips.at(0)->media->to_footage();
m->using_inout = new_enabled;
m->in = new_in;
m->out = new_out;
@@ -340,7 +341,7 @@ void DeleteTransitionCommand::redo() {
mainWindow->setWindowModified(true);
}
NewSequenceCommand::NewSequenceCommand(QTreeWidgetItem *s, QTreeWidgetItem* iparent) :
NewSequenceCommand::NewSequenceCommand(Media *s, Media* iparent) :
seq(s),
parent(iparent),
done(false),
@@ -353,7 +354,7 @@ NewSequenceCommand::~NewSequenceCommand() {
void NewSequenceCommand::undo() {
if (parent == NULL) {
panel_project->source_table->takeTopLevelItem(panel_project->source_table->indexOfTopLevelItem(seq));
project_model.removeTopLevelItem(seq);
} else {
parent->removeChild(seq);
}
@@ -363,45 +364,38 @@ void NewSequenceCommand::undo() {
void NewSequenceCommand::redo() {
if (parent == NULL) {
panel_project->source_table->addTopLevelItem(seq);
project_model.addTopLevelItem(seq);
} else {
parent->addChild(seq);
parent->appendChild(seq);
}
done = true;
mainWindow->setWindowModified(true);
}
AddMediaCommand::AddMediaCommand(QTreeWidgetItem* iitem, QTreeWidgetItem* iparent) :
AddMediaCommand::AddMediaCommand(Media* iitem, Media* iparent) :
item(iitem),
parent(iparent),
done(false),
old_project_changed(mainWindow->isWindowModified())
{}
{
if (parent == NULL) parent = project_model.get_root();
}
AddMediaCommand::~AddMediaCommand() {
if (!done) {
panel_project->delete_media(item);
if (item->data(0, Qt::UserRole + 5) != 0) delete reinterpret_cast<MediaThrobber*>(item->data(0, Qt::UserRole + 5).value<quintptr>());
delete item;
}
}
void AddMediaCommand::undo() {
if (parent == NULL) {
panel_project->source_table->takeTopLevelItem(panel_project->source_table->indexOfTopLevelItem(item));
} else {
parent->removeChild(item);
}
parent->removeChild(item);
done = false;
mainWindow->setWindowModified(old_project_changed);
}
void AddMediaCommand::redo() {
if (parent == NULL) {
panel_project->source_table->addTopLevelItem(item);
} else {
parent->addChild(item);
}
parent->appendChild(item);
project_model.update_data();
/* Here we force the source_table to sort itself.
*
@@ -419,32 +413,33 @@ void AddMediaCommand::redo() {
* I guess I'm "supposed" to use a Modelviewviewmodel instead,
* which I'll probably have to switch to soon anyway. So perhaps
* this will be a non-issue soon.
*/
panel_project->source_table->setSortingEnabled(false);
panel_project->source_table->setSortingEnabled(true);
panel_project->source_table->setSortingEnabled(true);*/
done = true;
mainWindow->setWindowModified(true);
}
DeleteMediaCommand::DeleteMediaCommand(QTreeWidgetItem* i) :
DeleteMediaCommand::DeleteMediaCommand(const QModelIndex& i) :
item(i),
parent(i.parent()),
old_project_changed(mainWindow->isWindowModified())
{}
DeleteMediaCommand::~DeleteMediaCommand() {
if (done) {
panel_project->delete_media(item);
if (item->data(0, Qt::UserRole + 5) != 0) delete reinterpret_cast<MediaThrobber*>(item->data(0, Qt::UserRole + 5).value<quintptr>());
delete item;
Media* m = static_cast<Media*>(item.internalPointer());
delete m;
}
}
void DeleteMediaCommand::undo() {
if (parent == NULL) {
panel_project->source_table->addTopLevelItem(item);
Media* m = static_cast<Media*>(item.internalPointer());
if (!parent.isValid()) {
project_model.addTopLevelItem(m);
} else {
parent->addChild(item);
static_cast<Media*>(parent.internalPointer())->appendChild(m);
}
mainWindow->setWindowModified(old_project_changed);
@@ -452,14 +447,14 @@ void DeleteMediaCommand::undo() {
}
void DeleteMediaCommand::redo() {
parent = item->parent();
if (parent == NULL) {
panel_project->source_table->takeTopLevelItem(panel_project->source_table->indexOfTopLevelItem(item));
Media* m = static_cast<Media*>(item.internalPointer());
if (!parent.isValid()) {
project_model.removeTopLevelItem(m);
} else {
parent->removeChild(item);
static_cast<Media*>(parent.internalPointer())->removeChild(m);
}
project_model.update_data();
mainWindow->setWindowModified(true);
done = true;
}
@@ -601,25 +596,24 @@ void CheckboxCommand::redo() {
mainWindow->setWindowModified(true);
}
ReplaceMediaCommand::ReplaceMediaCommand(QTreeWidgetItem* i, QString s) :
ReplaceMediaCommand::ReplaceMediaCommand(Media* i, QString s) :
item(i),
new_filename(s),
old_project_changed(mainWindow->isWindowModified())
{
media = get_footage_from_tree(item);
old_filename = media->url;
old_filename = item->to_footage()->url;
}
void ReplaceMediaCommand::replace(QString& filename) {
// close any clips currently using this media
QVector<Sequence*> all_sequences = panel_project->list_all_project_sequences();
QVector<Media*> all_sequences = panel_project->list_all_project_sequences();
for (int i=0;i<all_sequences.size();i++) {
Sequence* s = all_sequences.at(i);
Sequence* s = all_sequences.at(i)->to_sequence();
for (int j=0;j<s->clips.size();j++) {
Clip* c = s->clips.at(j);
if (c != NULL && c->media == media && c->open) {
if (c != NULL && c->media == item && c->open) {
close_clip(c);
if (c->media_type == MEDIA_TYPE_FOOTAGE) c->cacher->wait();
if (c->media != NULL && c->media->get_type() == MEDIA_TYPE_FOOTAGE) c->cacher->wait();
c->replaced = true;
}
}
@@ -643,11 +637,9 @@ void ReplaceMediaCommand::redo() {
mainWindow->setWindowModified(true);
}
ReplaceClipMediaCommand::ReplaceClipMediaCommand(void *a, void *b, int c, int d, bool e) :
ReplaceClipMediaCommand::ReplaceClipMediaCommand(Media *a, Media *b, bool e) :
old_media(a),
new_media(b),
old_type(c),
new_type(d),
new_media(b),
preserve_clip_ins(e),
old_project_changed(mainWindow->isWindowModified())
{}
@@ -661,7 +653,7 @@ void ReplaceClipMediaCommand::replace(bool undo) {
Clip* c = clips.at(i);
if (c->open) {
close_clip(c);
if (c->media_type == MEDIA_TYPE_FOOTAGE) c->cacher->wait();
if (c->media != NULL && c->media->get_type() == MEDIA_TYPE_FOOTAGE) c->cacher->wait();
}
if (undo) {
@@ -669,16 +661,14 @@ void ReplaceClipMediaCommand::replace(bool undo) {
c->clip_in = old_clip_ins.at(i);
}
c->media = old_media;
c->media_type = old_type;
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_type = new_type;
c->media = new_media;
}
c->replaced = true;
@@ -695,6 +685,7 @@ void ReplaceClipMediaCommand::undo() {
void ReplaceClipMediaCommand::redo() {
replace(false);
update_ui(true);
mainWindow->setWindowModified(true);
}
@@ -737,61 +728,40 @@ MediaMove::MediaMove(SourceTable *s) : table(s), old_project_changed(mainWindow-
void MediaMove::undo() {
for (int i=0;i<items.size();i++) {
if (to == NULL) {
table->takeTopLevelItem(table->indexOfTopLevelItem(items.at(i)));
} else {
to->removeChild(items.at(i));
}
}
for (int i=0;i<items.size();i++) {
if (froms.at(i) == NULL) {
table->addTopLevelItem(items.at(i));
} else {
froms.at(i)->addChild(items.at(i));
}
}
to->removeChild(items.at(i));
froms.at(i)->appendChild(items.at(i));
}
mainWindow->setWindowModified(old_project_changed);
}
void MediaMove::redo() {
if (to == NULL) to = project_model.get_root();
froms.resize(items.size());
for (int i=0;i<items.size();i++) {
QTreeWidgetItem* parent = items.at(i)->parent();
Media* parent = items.at(i)->parentItem();
froms[i] = parent;
if (parent == NULL) {
table->takeTopLevelItem(table->indexOfTopLevelItem(items.at(i)));
} else {
parent->removeChild(items.at(i));
}
if (to == NULL) {
table->addTopLevelItem(items.at(i));
} else {
to->addChild(items.at(i));
}
}
for (int i=0;i<items.size();i++) {
if (to == NULL) {
table->addTopLevelItem(items.at(i));
} else {
to->addChild(items.at(i));
}
}
parent->removeChild(items.at(i));
to->appendChild(items.at(i));
}
project_model.update_data();
mainWindow->setWindowModified(true);
}
MediaRename::MediaRename() : done(true), old_project_changed(mainWindow->isWindowModified()) {}
MediaRename::MediaRename(Media* iitem, QString ito) :
item(iitem),
from(iitem->get_name()),
to(ito),
old_project_changed(mainWindow->isWindowModified())
{}
void MediaRename::undo() {
item->setText(0, from);
done = false;
mainWindow->setWindowModified(old_project_changed);
item->set_name(from);
mainWindow->setWindowModified(old_project_changed);
}
void MediaRename::redo() {
if (!done) {
item->setText(0, to);
}
mainWindow->setWindowModified(true);
item->set_name(to);
mainWindow->setWindowModified(true);
}
KeyframeMove::KeyframeMove() : old_project_changed(mainWindow->isWindowModified()) {}
@@ -1138,7 +1108,7 @@ void SetEnableCommand::redo() {
mainWindow->setWindowModified(true);
}
EditSequenceCommand::EditSequenceCommand(QTreeWidgetItem* i, Sequence *s) :
EditSequenceCommand::EditSequenceCommand(Media* i, Sequence *s) :
item(i),
seq(s),
old_project_changed(mainWindow->isWindowModified()),
@@ -1175,11 +1145,8 @@ void EditSequenceCommand::redo() {
}
void EditSequenceCommand::update() {
// update name
item->setText(0, seq->name);
// update tooltip
set_sequence_of_tree(item, seq);
item->set_sequence(seq);
for (int i=0;i<seq->clips.size();i++) {
// TODO shift in/out/clipin points to match new frame rate
@@ -1237,9 +1204,8 @@ void CloseAllClipsCommand::redo() {
closeActiveClips(sequence, true);
}
UpdateFootageTooltip::UpdateFootageTooltip(QTreeWidgetItem *i, Media *m) :
item(i),
media(m)
UpdateFootageTooltip::UpdateFootageTooltip(Media *i) :
item(i)
{}
void UpdateFootageTooltip::undo() {
@@ -1247,7 +1213,7 @@ void UpdateFootageTooltip::undo() {
}
void UpdateFootageTooltip::redo() {
update_footage_tooltip(item, media);
item->update_tooltip();
}
MoveEffectCommand::MoveEffectCommand() :