many project window enhancements

This commit is contained in:
itsmattkc
2018-07-15 12:31:10 +01:00
parent fdc9506eb3
commit a614803b6c
11 changed files with 417 additions and 164 deletions
+61 -19
View File
@@ -6,6 +6,7 @@
#include "panels/viewer.h"
#include "panels/panels.h"
#include "playback/playback.h"
#include "project/undo.h"
#include <QDragEnterEvent>
#include <QMimeData>
@@ -71,6 +72,7 @@ void SourceTable::dragMoveEvent(QDragMoveEvent *event) {
void SourceTable::dropEvent(QDropEvent* event) {
const QMimeData* mimeData = event->mimeData();
if (mimeData->hasUrls()) {
// drag files in from outside
QList<QUrl> urls = mimeData->urls();
if (!urls.isEmpty()) {
QStringList paths;
@@ -82,33 +84,73 @@ void SourceTable::dropEvent(QDropEvent* event) {
}
event->acceptProposedAction();
} else {
QTreeWidgetItem* item = itemAt(event->pos());
if (item == NULL || (item != NULL && panel_project->get_type_from_tree(item) == MEDIA_TYPE_FOLDER)) {
QList<QTreeWidgetItem*> items = selectedItems();
for (int i=0;i<items.size();i++) {
QTreeWidgetItem* s = items.at(i);
// dragging files within project
QVector<QTreeWidgetItem*> move_items;
QTreeWidgetItem* drop_item = itemAt(event->pos());
// if we dragged to the root OR dragged to a folder
if (drop_item == NULL || (drop_item != NULL && panel_project->get_type_from_tree(drop_item) == MEDIA_TYPE_FOLDER)) {
QList<QTreeWidgetItem*> selected_items = selectedItems();
for (int i=0;i<selected_items.size();i++) {
QTreeWidgetItem* s = selected_items.at(i);
bool ignore = false;
if (s->parent() == NULL) {
takeTopLevelItem(indexOfTopLevelItem(s));
} else {
if (s->parent() != NULL) {
// if child belongs to a selected parent, assume the user is just moving the parent and ignore the child
for (int j=0;j<items.size();j++) {
if (s->parent() == items.at(j)) {
ignore = true;
break;
QTreeWidgetItem* par = s->parent();
while (par != NULL) {
for (int j=0;j<selected_items.size();j++) {
if (par == selected_items.at(j)) {
ignore = true;
break;
}
}
par = par->parent();
}
if (!ignore) s->parent()->takeChild(s->parent()->indexOfChild(s));
}
if (!ignore) {
if (item == NULL) {
addTopLevelItem(s);
} else {
item->addChild(s);
}
move_items.append(s);
}
}
project_changed = true;
if (move_items.size() > 0) {
MediaMove* mm = new MediaMove(this);
mm->to = drop_item;
mm->items = move_items;
undo_stack.push(mm);
project_changed = true;
}
}
}
}
MediaMove::MediaMove(SourceTable *s) : table(s) {}
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));
}
if (froms.at(i) == NULL) {
table->addTopLevelItem(items.at(i));
} else {
froms.at(i)->addChild(items.at(i));
}
}
}
void MediaMove::redo() {
for (int i=0;i<items.size();i++) {
QTreeWidgetItem* parent = items.at(i)->parent();
froms.append(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));
}
}
}