summaryrefslogtreecommitdiffstats
path: root/archiveview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'archiveview.cpp')
-rw-r--r--archiveview.cpp104
1 files changed, 103 insertions, 1 deletions
diff --git a/archiveview.cpp b/archiveview.cpp
index f3656f7..c59130c 100644
--- a/archiveview.cpp
+++ b/archiveview.cpp
@@ -24,6 +24,12 @@
#include <QStandardItemModel>
#include <QFormLayout>
#include <QToolBar>
+#include <QMouseEvent>
+#include <QDrag>
+#include <QMimeData>
+#include <QDropEvent>
+#include <QApplication>
+#include <QDataStream>
#include "archiveview.h"
#include "archivecontroller.h"
@@ -152,6 +158,7 @@ ArchiveView::ArchiveView(QWidget *parent) : QWidget(parent) {
mainLayout->addWidget(mTreeSplitter);
setLayout(mainLayout);
+
initController();
}
@@ -267,7 +274,10 @@ void ArchiveView::initController(){
SmGlobals::instance()->setArchiveController(mController);
}
-ArchiveTree::ArchiveTree(QWidget *parent) : SmTreeView(parent) {}
+ArchiveTree::ArchiveTree(QWidget *parent) : SmTreeView(parent) {
+ setAcceptDrops(true);
+
+}
void ArchiveTree::setModel(ArchiveProxy *model){
mProxy = model;
@@ -440,6 +450,53 @@ void ArchiveTree::newPart(){
}
}
+void ArchiveTree::dragEnterEvent(QDragEnterEvent *e){
+ if(e->mimeData()->hasFormat("application/x-shemov-file")){
+ e->acceptProposedAction();
+ }else{
+ e->ignore();
+ }
+}
+
+void ArchiveTree::dragMoveEvent(QDragMoveEvent *e){
+ QModelIndex idx = indexAt(e->pos());
+ if(idx.isValid()){
+ int flags = idx.flags();
+ if(flags & Qt::ItemIsDropEnabled){
+ e->acceptProposedAction();
+ return;
+ }
+ }
+ e->ignore();
+ return;
+}
+
+void ArchiveTree::dropEvent(QDropEvent *e){
+ QDataStream stream(e->mimeData()->data("application/x-shemov-file"));
+ int size;
+ stream >> size;
+ QString question = QString(tr("Really move %1 items?")).arg(QString::number(size));
+ int retval = QMessageBox::question(this, tr("Question"), question);
+ if(retval == QMessageBox::Yes){
+ QModelIndex dropIdx = indexAt(e->pos());
+ if(dropIdx.isValid()){
+ int newPartId = dropIdx.data(ArchiveModel::SeriesPartIdRole).toInt();
+ ArchiveController *c = SmGlobals::instance()->archiveController();
+ QStringList md5Sums;
+ for(int i = 0; i < size; ++i){
+ QVariant md5;
+ stream >> md5;
+ md5Sums << md5.toString();
+ }
+ c->moveFilesToSeriespart(md5Sums, newPartId);
+ c->archiveFiles()->expandAll();
+ e->accept();
+ return;
+ }
+ }
+ e->ignore();
+}
+
void ArchiveTree::impossible(const QString msg){
QMessageBox::critical(this, tr("Error"), msg);
}
@@ -454,6 +511,51 @@ QModelIndex ArchiveTree::firstSelected(){
ArchiveFiles::ArchiveFiles(const QString &headerSettings, QWidget *parent) : SmTreeView(headerSettings, parent){
setEditTriggers(QAbstractItemView::NoEditTriggers);
+ setDragEnabled(true);
+}
+
+void ArchiveFiles::mousePressEvent(QMouseEvent *e){
+ if(e->button() == Qt::LeftButton){
+ mDragStartPos = e->pos();
+ }
+ return SmTreeView::mousePressEvent(e);
+}
+
+void ArchiveFiles::mouseMoveEvent(QMouseEvent *e){
+ if(!(e->buttons() & Qt::LeftButton)){
+ return;
+ }
+ if((e->pos() - mDragStartPos).manhattanLength() < qApp->startDragDistance()){
+ return;
+ }
+
+ QModelIndexList sel = selectionModel()->selectedRows();
+ if(sel.isEmpty()){
+ return;
+ }
+
+ QString files("<ul ul style=\"margin-left: -25; margin-top: 10px; margin-right: 10px; margin-bottom: 10px\">");
+ QByteArray dataBuf;
+ QDataStream stream(&dataBuf, QIODevice::WriteOnly);
+ stream << sel.size();
+ foreach(QModelIndex i, sel){
+ files.append("<li>");
+ files.append(i.data(ArchiveFilesModel::FilenameRole).toString());
+ stream << i.data(ArchiveFilesModel::Md5SumRole);
+ files.append("</li>");
+ }
+ files.append("</ul>");
+
+ QLabel dragLabel(files);
+ QPixmap dragPixmap(dragLabel.size());
+ dragLabel.render(&dragPixmap);
+
+ QDrag *drag = new QDrag(this);
+ QMimeData *mimeData = new QMimeData;
+ mimeData->setData("application/x-shemov-file", dataBuf);
+ drag->setMimeData(mimeData);
+ drag->setPixmap(dragPixmap);
+ drag->exec(Qt::MoveAction | Qt::CopyAction);
}
ArchiveProxy::ArchiveProxy(QObject *parent) : QSortFilterProxyModel(parent) {}