diff --git a/src/GUI.cpp b/src/GUI.cpp index 4a04fde68..eb5d2ae4d 100644 --- a/src/GUI.cpp +++ b/src/GUI.cpp @@ -598,8 +598,28 @@ void GUI::dragEnterEvent(QDragEnterEvent *event) { foreach(const QString &mime, event->mimeData()->formats()){ qDebug("mimeData: %s", mime.toLocal8Bit().data()); } - if (event->mimeData()->hasFormat(QString::fromUtf8("text/plain")) || event->mimeData()->hasFormat(QString::fromUtf8("text/uri-list"))) { - event->acceptProposedAction(); + if (event->mimeData()->hasFormat("application/x-qstandarditemmodeldatalist")) { + if(childAt(event->pos()) == transferListFilters) { + qDebug("DragEnterEvent: torrent to filter list, accepting..."); + event->acceptProposedAction(); + } + } else { + if (event->mimeData()->hasFormat(QString::fromUtf8("text/plain")) || event->mimeData()->hasFormat(QString::fromUtf8("text/uri-list"))) { + event->acceptProposedAction(); + } + } +} + +void GUI::dragMoveEvent(QDragMoveEvent *event) { + if (event->mimeData()->hasFormat("application/x-qstandarditemmodeldatalist")) { + if(childAt(event->pos()) == transferListFilters) { + qDebug("DragMoveEvent: torrent to filter list, accepting..."); + event->acceptProposedAction(); + } + } else { + if (event->mimeData()->hasFormat(QString::fromUtf8("text/plain")) || event->mimeData()->hasFormat(QString::fromUtf8("text/uri-list"))) { + event->acceptProposedAction(); + } } } diff --git a/src/GUI.h b/src/GUI.h index 86b1fe212..b454150ed 100644 --- a/src/GUI.h +++ b/src/GUI.h @@ -97,6 +97,7 @@ class GUI : public QMainWindow, private Ui::MainWindow{ // GUI related slots void dropEvent(QDropEvent *event); void dragEnterEvent(QDragEnterEvent *event); + void dragMoveEvent(QDragMoveEvent *event); void toggleVisibility(QSystemTrayIcon::ActivationReason e); void on_actionAbout_triggered(); void on_actionCreate_torrent_triggered(); diff --git a/src/transferlistfilterswidget.h b/src/transferlistfilterswidget.h index 57cbb86a2..9bdfdae31 100644 --- a/src/transferlistfilterswidget.h +++ b/src/transferlistfilterswidget.h @@ -39,10 +39,43 @@ #include #include #include +#include #include "transferlistdelegate.h" #include "transferlistwidget.h" +class LabelFiltersList: public QListWidget { + Q_OBJECT + +public: + LabelFiltersList(QWidget *parent): QListWidget(parent){ + // Accept drop + setAcceptDrops(true); + } + +signals: + void torrentDropped(int label_row); + +protected: + void dragMoveEvent(QDragMoveEvent* event) { + //qDebug("filters, dragmoveevent"); + if(itemAt(event->pos()) && row(itemAt(event->pos())) > 0) { + //qDebug("Name: %s", itemAt(event->pos())->text().toLocal8Bit().data()); + event->acceptProposedAction(); + } else { + event->ignore(); + } + } + + void dropEvent(QDropEvent *event) { + qDebug("Drop Event in labels list"); + if(itemAt(event->pos())) { + emit torrentDropped(row(itemAt(event->pos()))); + } + event->ignore(); + } +}; + class TransferListFiltersWidget: public QFrame { Q_OBJECT @@ -50,7 +83,7 @@ private: QStringList customLabels; QList labelCounters; QListWidget* statusFilters; - QListWidget* labelFilters; + LabelFiltersList* labelFilters; QVBoxLayout* vLayout; TransferListWidget *transferList; int nb_labeled; @@ -60,9 +93,9 @@ public: TransferListFiltersWidget(QWidget *parent, TransferListWidget *transferList): QFrame(parent), transferList(transferList), nb_labeled(0), nb_torrents(0) { // Construct lists vLayout = new QVBoxLayout(); - statusFilters = new QListWidget(); + statusFilters = new QListWidget(this); vLayout->addWidget(statusFilters); - labelFilters = new QListWidget(); + labelFilters = new LabelFiltersList(this); vLayout->addWidget(labelFilters); setLayout(vLayout); // Limit status filters list height @@ -90,8 +123,10 @@ public: connect(statusFilters, SIGNAL(currentRowChanged(int)), transferList, SLOT(applyStatusFilter(int))); connect(transferList, SIGNAL(torrentStatusUpdate(uint,uint,uint,uint)), this, SLOT(updateTorrentNumbers(uint, uint, uint, uint))); connect(labelFilters, SIGNAL(currentRowChanged(int)), this, SLOT(applyLabelFilter(int))); + connect(labelFilters, SIGNAL(torrentDropped(int)), this, SLOT(torrentDropped(int))); connect(transferList, SIGNAL(torrentAdded(QModelIndex)), this, SLOT(torrentAdded(QModelIndex))); connect(transferList, SIGNAL(torrentAboutToBeRemoved(QModelIndex)), this, SLOT(torrentAboutToBeDeleted(QModelIndex))); + connect(transferList, SIGNAL(torrentChangedLabel(QString,QString)), this, SLOT(torrentChangedLabel(QString, QString))); // Load settings loadSettings(); @@ -153,6 +188,16 @@ protected slots: statusFilters->item(FILTER_INACTIVE)->setData(Qt::DisplayRole, tr("Inactive")+" ("+QString::number(nb_inactive)+")"); } + void torrentDropped(int row) { + Q_ASSERT(row > 0); + if(row == 1) { + transferList->setSelectionLabel(""); + } else { + QString label = customLabels.at(row-2); + transferList->setSelectionLabel(label); + } + } + void addLabel(QString label) { if(label.trimmed().isEmpty()) return; if(customLabels.contains(label)) return; @@ -214,12 +259,14 @@ protected slots: } void torrentChangedLabel(QString old_label, QString new_label) { + qDebug("Torrent label changed from %s to %s", old_label.toLocal8Bit().data(), new_label.toLocal8Bit().data()); if(!old_label.isEmpty()) { int i = customLabels.indexOf(old_label); int new_count = labelCounters[i]-1; Q_ASSERT(new_count >= 0); labelCounters.replace(i, new_count); labelFilters->item(i+2)->setText(old_label + " ("+ QString::number(new_count) +")"); + --nb_labeled; } if(!new_label.isEmpty()) { if(!customLabels.contains(new_label)) @@ -228,7 +275,9 @@ protected slots: int new_count = labelCounters[i]+1; labelCounters.replace(i, new_count); labelFilters->item(i+2)->setText(new_label + " ("+ QString::number(new_count) +")"); + ++nb_labeled; } + updateStickyLabelCounters(); } void torrentAdded(QModelIndex index) { diff --git a/src/transferlistwidget.cpp b/src/transferlistwidget.cpp index 0b77c5c14..38d31163c 100644 --- a/src/transferlistwidget.cpp +++ b/src/transferlistwidget.cpp @@ -52,7 +52,6 @@ TransferListWidget::TransferListWidget(QWidget *parent, GUI *main_window, Bittorrent *_BTSession): QTreeView(parent), BTSession(_BTSession), main_window(main_window) { - QSettings settings("qBittorrent", "qBittorrent"); // Create and apply delegate listDelegate = new TransferListDelegate(this); @@ -103,6 +102,7 @@ TransferListWidget::TransferListWidget(QWidget *parent, GUI *main_window, Bittor setSelectionMode(QAbstractItemView::ExtendedSelection); setItemsExpandable(false); setAutoScroll(true); + setDragDropMode(QAbstractItemView::DragOnly); hideColumn(TR_PRIORITY); //hideColumn(TR_LABEL); diff --git a/src/transferlistwidget.h b/src/transferlistwidget.h index 56758dd8e..51f92a59e 100644 --- a/src/transferlistwidget.h +++ b/src/transferlistwidget.h @@ -88,7 +88,6 @@ protected slots: #endif void toggleSelectedTorrentsSequentialDownload(); void toggleSelectedFirstLastPiecePrio(); - void setSelectionLabel(QString label); void askNewLabelForSelection(); void setRowColor(int row, QColor color); @@ -96,6 +95,7 @@ public slots: void refreshList(); void addTorrent(QTorrentHandle& h); void setFinished(QTorrentHandle &h); + void setSelectionLabel(QString label); void setRefreshInterval(int t); void startSelectedTorrents(); void startAllTorrents();