Cleanup PartDownloader

Tue, 15 Nov 2016 17:37:31 +0200

author
Teemu Piippo <teemu@hecknology.net>
date
Tue, 15 Nov 2016 17:37:31 +0200
changeset 1046
f4a7b56c7eb2
parent 1045
f726f8f49c7e
child 1047
3b01de77b009

Cleanup PartDownloader

src/partdownloader.cpp file | annotate | diff | comparison | revisions
src/partdownloader.h file | annotate | diff | comparison | revisions
--- a/src/partdownloader.cpp	Tue Nov 15 17:12:50 2016 +0200
+++ b/src/partdownloader.cpp	Tue Nov 15 17:37:31 2016 +0200
@@ -30,19 +30,19 @@
 #include "glRenderer.h"
 #include "documentmanager.h"
 
-ConfigOption (QString DownloadFilePath)
-ConfigOption (bool GuessDownloadPaths = true)
+ConfigOption(QString DownloadFilePath)
+ConfigOption(bool GuessDownloadPaths = true)
 ConfigOption (bool AutoCloseDownloadDialog = true)
 
 const char* g_unofficialLibraryURL = "http://ldraw.org/library/unofficial/";
 
-PartDownloader::PartDownloader (QWidget* parent) :
-	QDialog (parent),
-	HierarchyElement (parent),
-	ui (*new Ui_PartDownloader),
-	m_source (SourceType (0))
+PartDownloader::PartDownloader (QWidget* parent)
+    : QDialog(parent)
+    , HierarchyElement(parent)
+    , ui(*new Ui_PartDownloader)
+    , m_source(SourceType{})
 {
-	ui.setupUi (this);
+	ui.setupUi(this);
 
 #ifdef USE_QT5
 	ui.progressTable->horizontalHeader()->setSectionResizeMode (QHeaderView::Stretch);
@@ -50,11 +50,11 @@
 	ui.progressTable->horizontalHeader()->setResizeMode (PartLabelColumn, QHeaderView::Stretch);
 #endif
 
-	m_downloadButton = new QPushButton (tr ("Download"));
-	ui.buttonBox->addButton (m_downloadButton, QDialogButtonBox::ActionRole);
-	button (Abort)->setEnabled (false);
-	connect (ui.source, SIGNAL (currentIndexChanged (int)), this, SLOT (sourceChanged (int)));
-	connect (ui.buttonBox, SIGNAL (clicked (QAbstractButton*)), this, SLOT (buttonClicked (QAbstractButton*)));
+	m_downloadButton = new QPushButton {tr("Download")};
+	ui.buttonBox->addButton(m_downloadButton, QDialogButtonBox::ActionRole);
+	button(Abort)->setEnabled(false);
+	connect(ui.source, SIGNAL(currentIndexChanged(int)), this, SLOT(sourceChanged(int)));
+	connect(ui.buttonBox, SIGNAL(clicked(QAbstractButton*)), this, SLOT(buttonClicked(QAbstractButton*)));
 }
 
 PartDownloader::~PartDownloader()
@@ -69,94 +69,93 @@
 	if (path.isEmpty() or not QDir (path).exists())
 	{
 		QMessageBox::information(this, "Notice", "Please input a path for files to download.");
-		path = QFileDialog::getExistingDirectory (this, "Path for downloaded files:");
+		path = QFileDialog::getExistingDirectory(this, "Path for downloaded files:");
 
 		if (path.isEmpty())
 			reject();
 		else
-			m_config->setDownloadFilePath (path);
+			m_config->setDownloadFilePath(path);
 	}
 }
 
 QString PartDownloader::url()
 {
-	QString destination;
-
 	switch (sourceType())
 	{
 	case PartsTracker:
-		destination = ui.filename->text();
-		modifyDestination (destination);
-		ui.filename->setText (destination);
-		return g_unofficialLibraryURL + destination;
+		{
+			QString destination;
+			destination = ui.filename->text();
+			modifyDestination(destination);
+			ui.filename->setText(destination);
+			return g_unofficialLibraryURL + destination;
+		}
 
 	case CustomURL:
 		return ui.filename->text();
 	}
 
-	// Shouldn't happen
 	return "";
 }
 
-void PartDownloader::modifyDestination (QString& dest) const
+void PartDownloader::modifyDestination(QString& destination) const
 {
-	dest = dest.simplified();
+	destination = destination.simplified();
 
 	// If the user doesn't want us to guess, stop right here.
 	if (not m_config->guessDownloadPaths())
 		return;
 
 	// Ensure .dat extension
-	if (dest.right (4) != ".dat")
+	if (destination.right (4) != ".dat")
 	{
-		// Remove the existing extension, if any. It may be we're here over a
-		// typo in the .dat extension.
-		const int dotpos = dest.lastIndexOf (".");
+		// Remove the existing extension, if any. It may be we're here over a typo in the .dat extension.
+		int dotPosition = destination.lastIndexOf(".");
 
-		if ((dotpos != -1) and (dotpos >= dest.length() - 4))
-			dest.chop (dest.length() - dotpos);
+		if ((dotPosition != -1) and (dotPosition >= destination.length() - 4))
+			destination.chop (destination.length() - dotPosition);
 
-		dest += ".dat";
+		destination += ".dat";
 	}
 
-	// If the part starts with s\ or s/, then use parts/s/. Same goes with
-	// 48\ and p/48/.
-	if (isOneOf (dest.left (2), "s\\", "s/"))
+	// If the part starts with s\ or s/, then use parts/s/. Same goes with 48\ and p/48/.
+	if (isOneOf(destination.left(2), "s\\", "s/"))
 	{
-		dest.remove (0, 2);
-		dest.prepend ("parts/s/");
+		destination.remove(0, 2);
+		destination.prepend("parts/s/");
 	}
-	else if (isOneOf (dest.left (3), "48\\", "48/"))
+	else if (isOneOf(destination.left(3), "48\\", "48/"))
 	{
-		dest.remove (0, 3);
-		dest.prepend ("p/48/");
+		destination.remove(0, 3);
+		destination.prepend("p/48/");
 	}
 
 	/* Try determine where to put this part. We have four directories:
-	   parts/, parts/s/, p/, and p/48/. If we haven't already specified
-	   either parts/ or p/, we need to add it automatically. Part files
-	   are numbers wit a possible u prefix for parts with unknown number
-	   which can be followed by any of:
-	   - c** (composites)
-	   - d** (formed stickers)
-	   - p** (patterns)
-	   - a lowercase alphabetic letter for variants
-
-	   Subfiles (usually) have an s** prefix, in which case we use parts/s/.
-	   Note that the regex starts with a '^' so it won't catch already fully
-	   given part file names. */
+	 * parts/, parts/s/, p/, and p/48/. If we haven't already specified
+	 * either parts/ or p/, we need to add it automatically. Part files
+	 * are numbers wit a possible u prefix for parts with unknown number
+	 * which can be followed by any of:
+	 * - c** (composites)
+	 * - d** (formed stickers)
+	 * - p** (patterns)
+	 * - a lowercase alphabetic letter for variants
+	 *
+	 * Subfiles (usually) have an s** prefix, in which case we use parts/s/.
+	 * Note that the regex starts with a '^' so it won't catch already fully
+	 * given part file names.
+	 */
 	QString partRegex = "^u?[0-9]+(c[0-9][0-9]+)*(d[0-9][0-9]+)*[a-z]?(p[0-9a-z][0-9a-z]+)*";
 	QString subpartRegex = partRegex + "s[0-9][0-9]+";
 
 	partRegex += "\\.dat$";
 	subpartRegex += "\\.dat$";
 
-	if (QRegExp (subpartRegex).exactMatch (dest))
-		dest.prepend ("parts/s/");
-	else if (QRegExp (partRegex).exactMatch (dest))
-		dest.prepend ("parts/");
-	else if (not dest.startsWith ("parts/") and not dest.startsWith ("p/"))
-		dest.prepend ("p/");
+	if (QRegExp {subpartRegex}.exactMatch(destination))
+		destination.prepend("parts/s/");
+	else if (QRegExp {partRegex}.exactMatch(destination))
+		destination.prepend("parts/");
+	else if (not destination.startsWith("parts/") and not destination.startsWith("p/"))
+		destination.prepend("p/");
 }
 
 PartDownloader::SourceType PartDownloader::sourceType() const
@@ -164,86 +163,86 @@
 	return m_source;
 }
 
-void PartDownloader::setSourceType (SourceType src)
+void PartDownloader::setSourceType(SourceType src)
 {
 	m_source = src;
-	ui.source->setCurrentIndex (int (src));
+	ui.source->setCurrentIndex(int {src});
 }
 
-void PartDownloader::sourceChanged (int i)
+void PartDownloader::sourceChanged(int sourceType)
 {
-	if (i == CustomURL)
-		ui.fileNameLabel->setText (tr ("URL:"));
+	if (sourceType == CustomURL)
+		ui.fileNameLabel->setText(tr("URL:"));
 	else
-		ui.fileNameLabel->setText (tr ("File name:"));
+		ui.fileNameLabel->setText(tr("File name:"));
 
-	m_source = SourceType (i);
+	m_source = static_cast<SourceType>(sourceType);
 }
 
-void PartDownloader::buttonClicked (QAbstractButton* btn)
+void PartDownloader::buttonClicked(QAbstractButton* button)
 {
-	if (btn == button (Close))
+	if (button == this->button(Close))
 	{
 		reject();
 	}
-	else if (btn == button (Abort))
+	else if (button == this->button(Abort))
 	{
 		m_isAborted = true;
 
-		for (PartDownloadRequest* req : m_requests)
-			req->abort();
+		for (PartDownloadRequest* request : m_requests)
+			request->abort();
 	}
-	else if (btn == button (Download))
+	else if (button == this->button(Download))
 	{
-		QString dest = ui.filename->text();
+		QString destination = ui.filename->text();
 		setPrimaryFile (nullptr);
 		m_isAborted = false;
 
 		if (sourceType() == CustomURL)
-			dest = Basename (url());
+			destination = Basename(url());
 
-		modifyDestination (dest);
+		modifyDestination(destination);
 
-		if (QFile::exists (downloadPath() + DIRSLASH + dest))
+		if (QFile::exists(downloadPath() + DIRSLASH + destination))
 		{
-			const QString overwritemsg = format (tr ("%1 already exists in download directory. Overwrite?"), dest);
-			if (not Confirm (tr ("Overwrite?"), overwritemsg))
+			QString message = format(tr("%1 already exists in download directory. Overwrite?"), destination);
+			if (not Confirm(tr("Overwrite?"), message))
 				return;
 		}
 
-		downloadFile (dest, url(), true);
+		downloadFile (destination, url(), true);
 	}
 }
 
-void PartDownloader::downloadFile (QString dest, QString url, bool primary)
+void PartDownloader::downloadFile(QString destination, QString url, bool isPrimary)
 {
 	int row = ui.progressTable->rowCount();
 
 	// Don't download files repeadetly.
-	if (m_filesToDownload.indexOf (dest) != -1)
-		return;
-
-	print ("Downloading %1 from %2\n", dest, url);
-	modifyDestination (dest);
-	PartDownloadRequest* req = new PartDownloadRequest (url, dest, primary, this);
-	m_filesToDownload << dest;
-	m_requests << req;
-	ui.progressTable->insertRow (row);
-	req->setTableRow (row);
-	req->updateToTable();
-	m_downloadButton->setEnabled (false);
-	ui.progressTable->setEnabled (true);
-	ui.filename->setEnabled (false);
-	ui.source->setEnabled (false);
-	button (Close)->setEnabled (false);
-	button (Abort)->setEnabled (true);
-	button (Download)->setEnabled (false);
+	if (not m_filesToDownload.contains(destination))
+	{
+		print ("Downloading %1 from %2\n", destination, url);
+		modifyDestination (destination);
+		PartDownloadRequest* request = new PartDownloadRequest {url, destination, isPrimary, this};
+		m_filesToDownload << destination;
+		m_requests << request;
+		ui.progressTable->insertRow(row);
+		request->setTableRow(row);
+		request->updateToTable();
+		m_downloadButton->setEnabled(false);
+		ui.progressTable->setEnabled(true);
+		ui.filename->setEnabled(false);
+		ui.source->setEnabled(false);
+		button(Close)->setEnabled(false);
+		button(Abort)->setEnabled(true);
+		button(Download)->setEnabled(false);
+	}
 }
 
 void PartDownloader::downloadFromPartsTracker (QString file)
 {
-	modifyDestination (file);
-	downloadFile (file, g_unofficialLibraryURL + file, false);
+	modifyDestination(file);
+	downloadFile(file, g_unofficialLibraryURL + file, false);
 }
 
 void PartDownloader::checkIfFinished()
@@ -251,25 +250,24 @@
 	bool failed = isAborted();
 
 	// If there is some download still working, we're not finished.
-	for (PartDownloadRequest* req : m_requests)
+	for (PartDownloadRequest* request : m_requests)
 	{
-		if (not req->isFinished())
+		if (not request->isFinished())
 			return;
 
-		if (req->failed())
-			failed = true;
+		failed |= request->failed();
 	}
 
-	for (PartDownloadRequest* req : m_requests)
-		delete req;
+	for (PartDownloadRequest* request : m_requests)
+		delete request;
 
 	m_requests.clear();
 
 	if (primaryFile())
 		emit primaryFileDownloaded();
 
-	for (LDDocument* f : m_files)
-		f->reloadAllSubfiles();
+	for (LDDocument* file : m_files)
+		file->reloadAllSubfiles();
 
 	if (m_config->autoCloseDownloadDialog() and not failed)
 	{
@@ -279,31 +277,32 @@
 	else
 	{
 		// Allow the prompt be closed now.
-		button (Abort)->setEnabled (false);
-		button (Close)->setEnabled (true);
+		button(Abort)->setEnabled(false);
+		button(Close)->setEnabled(true);
 	}
 }
 
-QPushButton* PartDownloader::button (PartDownloader::Button i)
+QAbstractButton* PartDownloader::button(PartDownloader::Button which)
 {
-	switch (i)
+	switch (which)
 	{
-		case Download:
-			return m_downloadButton;
+	case Download:
+		return m_downloadButton;
 
-		case Abort:
-			return qobject_cast<QPushButton*> (ui.buttonBox->button (QDialogButtonBox::Abort));
+	case Abort:
+		return ui.buttonBox->button(QDialogButtonBox::Abort);
 
-		case Close:
-			return qobject_cast<QPushButton*> (ui.buttonBox->button (QDialogButtonBox::Close));
+	case Close:
+		return ui.buttonBox->button(QDialogButtonBox::Close);
+
+	default:
+		return nullptr;
 	}
-
-	return nullptr;
 }
 
-void PartDownloader::addFile (LDDocument* f)
+void PartDownloader::addFile(LDDocument* file)
 {
-	m_files << f;
+	m_files.append(file);
 }
 
 bool PartDownloader::isAborted() const
@@ -326,7 +325,7 @@
 	QString path = m_config->downloadFilePath();
 
 	if (DIRSLASH[0] != '/')
-		path.replace (DIRSLASH, "/");
+		path.replace(DIRSLASH, "/");
 
 	return path;
 }
--- a/src/partdownloader.h	Tue Nov 15 17:12:50 2016 +0200
+++ b/src/partdownloader.h	Tue Nov 15 17:37:31 2016 +0200
@@ -25,11 +25,12 @@
 class LDDocument;
 class QFile;
 class PartDownloadRequest;
-class Ui_DownloadFrom;
+class Ui_PartDownloader;
 class QNetworkAccessManager;
 class QNetworkRequest;
 class QNetworkReply;
 class QAbstractButton;
+class QTableWidget;
 
 class PartDownloader : public QDialog, public HierarchyElement
 {
@@ -55,36 +56,37 @@
 		ProgressColumn,
 	};
 
-	using RequestList = QList<PartDownloadRequest*>;
-
-	explicit PartDownloader (QWidget* parent = nullptr);
+	explicit PartDownloader(QWidget* parent = nullptr);
 	virtual ~PartDownloader();
 
-	void addFile (LDDocument* f);
-	QPushButton* button (Button i);
-	Q_SLOT void buttonClicked (QAbstractButton* btn);
-	Q_SLOT void checkIfFinished();
+	void addFile(LDDocument* file);
+	QAbstractButton *button(Button which);
 	void checkValidPath();
-	void downloadFile (QString dest, QString url, bool primary);
+	void downloadFile (QString dest, QString url, bool isPrimary);
 	void downloadFromPartsTracker (QString file);
 	QString downloadPath();
 	bool isAborted() const;
 	void modifyDestination (QString& dest) const;
 	LDDocument* primaryFile() const;
-	class QTableWidget* progressTable() const;
+	QTableWidget* progressTable() const;
 	void setPrimaryFile (LDDocument* document);
 	void setSourceType (SourceType src);
-	Q_SLOT void sourceChanged (int i);
 	SourceType sourceType() const;
 	QString url();
 
+public slots:
+	void buttonClicked (QAbstractButton* btn);
+	void checkIfFinished();
+	void sourceChanged (int i);
+
+
 signals:
 	void primaryFileDownloaded();
 
 private:
-	class Ui_PartDownloader& ui;
+	Ui_PartDownloader& ui;
 	QStringList m_filesToDownload;
-	RequestList m_requests;
+	QList<PartDownloadRequest*> m_requests;
 	QPushButton* m_downloadButton;
 	SourceType m_source;
 	QList<LDDocument*> m_files;

mercurial