From 0d25519171e46b39aa3703dafadd815ecc3c47b7 Mon Sep 17 00:00:00 2001 From: APTX Date: Mon, 3 Jun 2013 01:44:25 +0200 Subject: [PATCH] Add new tab showing current Pending Requests. --- .../localmylist-management.pro | 1 + localmylist-management/registertabs.cpp | 2 + .../tabs/pendingrequesttab.cpp | 125 ++++++++++++++++++ .../tabs/pendingrequesttab.h | 43 ++++++ .../tabs/pendingrequesttab.ui | 82 ++++++++++++ localmylist/database.cpp | 21 +++ localmylist/database.h | 1 + 7 files changed, 275 insertions(+) create mode 100644 localmylist-management/tabs/pendingrequesttab.cpp create mode 100644 localmylist-management/tabs/pendingrequesttab.h create mode 100644 localmylist-management/tabs/pendingrequesttab.ui diff --git a/localmylist-management/localmylist-management.pro b/localmylist-management/localmylist-management.pro index 78845bc..60ca22b 100644 --- a/localmylist-management/localmylist-management.pro +++ b/localmylist-management/localmylist-management.pro @@ -24,6 +24,7 @@ SOURCES += main.cpp\ tabs/searchtab.cpp \ tabs/reportstab.cpp \ tabs/unknownfilestab.cpp \ + tabs/pendingrequesttab.cpp \ registertabs.cpp HEADERS += mainwindow.h \ diff --git a/localmylist-management/registertabs.cpp b/localmylist-management/registertabs.cpp index 41e7efb..1039af1 100644 --- a/localmylist-management/registertabs.cpp +++ b/localmylist-management/registertabs.cpp @@ -3,6 +3,7 @@ #include "tabs/searchtab.h" #include "tabs/reportstab.h" #include "tabs/unknownfilestab.h" +#include "tabs/pendingrequesttab.h" void registerTabs() { @@ -10,4 +11,5 @@ void registerTabs() TabWidget::registerTab(); TabWidget::registerTab(); TabWidget::registerTab(); + TabWidget::registerTab(); } diff --git a/localmylist-management/tabs/pendingrequesttab.cpp b/localmylist-management/tabs/pendingrequesttab.cpp new file mode 100644 index 0000000..ee1d5e2 --- /dev/null +++ b/localmylist-management/tabs/pendingrequesttab.cpp @@ -0,0 +1,125 @@ +#include "pendingrequesttab.h" +#include "ui_pendingrequesttab.h" + +#include + +#include "mylist.h" +#include "database.h" + +PendingRequestTab::PendingRequestTab(QWidget *parent) : + AbstractTabBase(parent), + ui(new Ui::PendingRequestTab) +{ + ui->setupUi(this); + setLabel(name()); +} + +PendingRequestTab::~PendingRequestTab() +{ + delete ui; +} + +QString PendingRequestTab::staticId() +{ + return "pending_request"; +} + +QString PendingRequestTab::name() +{ + return tr("Pending Requests"); +} + +void PendingRequestTab::init() +{ + model = new QSqlQueryModel(this); + ui->view->setSelectionBehavior(QAbstractItemView::SelectRows); + + connect(ui->retryButton, SIGNAL(clicked()), this, SLOT(resetFailCount())); + connect(ui->deleteButton, SIGNAL(clicked()), this, SLOT(deleteSelected())); +} + +void PendingRequestTab::activate() +{ + reload(); +} + +void PendingRequestTab::reload() +{ + QSqlQuery &q = LocalMyList::instance()->database()->prepare( + "SELECT aid, eid, fid, ed2k, size, " + " added, start, failed, connection_error_count, data_error_count " + " FROM pending_request " + " ORDER BY added ASC, start ASC "); + + LocalMyList::instance()->database()->exec(q); + model->setQuery(q); + ui->view->setModel(model); + ui->view->resizeColumnsToContents(); +} + +void PendingRequestTab::selectAll() +{ + ui->view->selectAll(); +} + +void PendingRequestTab::clearSelection() +{ + ui->view->clearSelection(); +} + +void PendingRequestTab::deleteSelected() +{ + QList requests = selectionToPendingRequestList(); + + if (!requests.count()) + return; + + { + LocalMyList::RaiiTransaction t(LocalMyList::instance()->database()); + for (const LocalMyList::PendingRequest &request : requests) + { + LocalMyList::instance()->database()->clearRequest(request); + } + t.commit(); + } + + reload(); +} + +void PendingRequestTab::resetFailCount() +{ + QList requests = selectionToPendingRequestList(); + + if (!requests.count()) + return; + + { + LocalMyList::RaiiTransaction t(LocalMyList::instance()->database()); + for (const LocalMyList::PendingRequest &request : requests) + { + LocalMyList::instance()->database()->resetPendingRequestErrorCount(request); + } + t.commit(); + } + reload(); +} + +QList PendingRequestTab::selectionToPendingRequestList() +{ + QList ret; + QModelIndexList selection = ui->view->selectionModel()->selectedRows(); + + for (const QModelIndex &idx : selection) + { + LocalMyList::PendingRequest pr; + pr.aid = idx.data().toInt(); + pr.eid = model->data(model->index(idx.row(), 1)).toInt(); + pr.fid = model->data(model->index(idx.row(), 2)).toInt(); + pr.ed2k = model->data(model->index(idx.row(), 3)).toByteArray(); + pr.size = model->data(model->index(idx.row(), 4)).toLongLong(); + + ret << pr; + } + + return ret; +} diff --git a/localmylist-management/tabs/pendingrequesttab.h b/localmylist-management/tabs/pendingrequesttab.h new file mode 100644 index 0000000..0ac5603 --- /dev/null +++ b/localmylist-management/tabs/pendingrequesttab.h @@ -0,0 +1,43 @@ +#ifndef PENDINGREQUESTTAB_H +#define PENDINGREQUESTTAB_H + +#include "abstracttab.h" +#include "databaseclasses.h" + +class QSqlQueryModel; + +namespace Ui { +class PendingRequestTab; +} + +class PendingRequestTab : public AbstractTabBase +{ + Q_OBJECT + +public: + explicit PendingRequestTab(QWidget *parent = 0); + ~PendingRequestTab(); + + static QString staticId(); + static QString name(); + + void init(); + void activate(); + + void reload(); + void selectAll(); + void clearSelection(); + +public slots: + void deleteSelected(); + void resetFailCount(); + +private: + QList selectionToPendingRequestList(); + + Ui::PendingRequestTab *ui; + + QSqlQueryModel *model; +}; + +#endif // PENDINGREQUESTTAB_H diff --git a/localmylist-management/tabs/pendingrequesttab.ui b/localmylist-management/tabs/pendingrequesttab.ui new file mode 100644 index 0000000..ddb8bdb --- /dev/null +++ b/localmylist-management/tabs/pendingrequesttab.ui @@ -0,0 +1,82 @@ + + + PendingRequestTab + + + + 0 + 0 + 864 + 552 + + + + Form + + + + 0 + + + 0 + + + + + + + + + + Select All + + + + + + + Clear Selection + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + For Selected: + + + + + + + Reset Fail Count + + + + + + + Delete + + + + + + + + + + diff --git a/localmylist/database.cpp b/localmylist/database.cpp index f366531..467738c 100644 --- a/localmylist/database.cpp +++ b/localmylist/database.cpp @@ -1423,6 +1423,27 @@ bool Database::clearPendingRequestDataErrors() return true; } +bool Database::resetPendingRequestErrorCount(const PendingRequest &request) +{ + QSqlQuery &q = prepare( + "UPDATE pending_request " + " SET start = NULL, failed = NULL, " + " connection_error_count = 0, " + " data_error_count = 0 " + " WHERE aid = :aid " + " AND eid = :eid " + " AND fid = :fid " + " AND ed2k = :ed2k " + " AND size = :size "); + q.bindValue(":aid", request.aid); + q.bindValue(":eid", request.eid); + q.bindValue(":fid", request.fid); + q.bindValue(":ed2k", (request.ed2k.isNull() ? QByteArray("") : request.ed2k).constData()); + q.bindValue(":size", request.size); + + return exec(q); +} + bool Database::clearFailedPendingMyListUpdateRequests(int minutes) { QSqlQuery &q = prepare( diff --git a/localmylist/database.h b/localmylist/database.h index 5a7d251..4669636 100644 --- a/localmylist/database.h +++ b/localmylist/database.h @@ -120,6 +120,7 @@ public slots: // TODO these are named wrong bool clearPendingRequestConnectionErrors(int minutes = 10); bool clearPendingRequestDataErrors(); + bool resetPendingRequestErrorCount(const LocalMyList::PendingRequest &request); bool clearFailedPendingMyListUpdateRequests(int minutes = 10); -- 2.52.0