many project window enhancements
This commit is contained in:
+61
-19
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user