# HG changeset patch # User Santeri Piippo # Date 1375458126 -10800 # Node ID be5746bf0f127e3540cd8c20a827102e032ee707 # Parent 6bdf2b3f4e00bf5b01804e60abf1a7eab50060ac added missing files diff -r 6bdf2b3f4e00 -r be5746bf0f12 src/download.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/download.cpp Fri Aug 02 18:42:06 2013 +0300 @@ -0,0 +1,162 @@ +/* + * LDForge: LDraw parts authoring CAD + * Copyright (C) 2013 Santeri Piippo + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "download.h" +#include "ui_downloadfrom.h" +#include "types.h" +#include "gui.h" +#include "build/moc_download.cpp" + +PartDownloader g_PartDownloader; + +constexpr const char* PartDownloader::k_OfficialURL, + *PartDownloader::k_UnofficialURL; + +// ============================================================================= +// ----------------------------------------------------------------------------- +void PartDownloader::download() { + PartDownloadPrompt* dlg = new PartDownloadPrompt; + dlg->exec(); +} + +// ============================================================================= +// ----------------------------------------------------------------------------- +PartDownloadPrompt::PartDownloadPrompt (QWidget* parent) : QDialog (parent) { + ui = new Ui_DownloadFrom; + ui->setupUi (this); + connect (ui->source, SIGNAL (currentIndexChanged (int)), this, SLOT (sourceChanged (int))); + connect (ui->buttonBox, SIGNAL (accepted()), this, SLOT (startDownload())); +} + +// ============================================================================= +// ----------------------------------------------------------------------------- +PartDownloadPrompt::~PartDownloadPrompt() { + delete ui; +} + +// ============================================================================= +// ----------------------------------------------------------------------------- +str PartDownloadPrompt::getURL() { + str fname; + Source src = (Source) ui->source->currentIndex(); + + switch (src) { + case OfficialLibrary: + case PartsTracker: + { + fname = ui->fname->text(); + + // Ensure .dat extension + if (fname.right (4) != ".dat") { + // Remove the existing extension, if any. It may be we're here over a + // typo in the .dat extension. + if (fname.lastIndexOf (".") >= fname.length() - 4) + fname.chop (fname.length() - fname.lastIndexOf (".")); + + fname += ".dat"; + } + + /* These sources have stuff only in 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 which can be followed by: + * - c** (composites) + * - d** (formed stickers) + * - a lowercase alphabetic letter for variants + * + * Subfiles 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. + */ + str partRegex = "^[0-9]+(c[0-9][0-9]+)*(d[0-9][0-9]+)*[a-z]?"; + str subpartRegex = partRegex + "s[0-9][0-9]+"; + + partRegex += "\\.dat$"; + subpartRegex += "\\.dat$"; + + if (QRegExp (subpartRegex).exactMatch (fname)) + fname.prepend ("parts/s/"); + elif (QRegExp (partRegex).exactMatch (fname)) + fname.prepend ("parts/"); + elif (fname.left (6) != "parts/" && fname.left (2) != "p/") + fname.prepend ("p/"); + } + + if (src == OfficialLibrary) + return str (PartDownloader::k_OfficialURL) + fname; + + return str (PartDownloader::k_UnofficialURL) + fname; + + case CustomURL: + return ui->fname->text(); + } + + // Shouldn't happen + return ""; +} + +// ============================================================================= +// ----------------------------------------------------------------------------- +void PartDownloadPrompt::sourceChanged (int i) { + if (i == CustomURL) + ui->fileNameLabel->setText (tr ("URL:")); + else + ui->fileNameLabel->setText (tr ("File name:")); +} + +void PartDownloadPrompt::startDownload() { + int row = ui->progress->rowCount(); + ui->progress->setEnabled (true); + ui->buttonBox->setEnabled (false); + ui->progress->insertRow (row); + + PartDownloadRequest* req = new PartDownloadRequest (getURL(), this); + req->setTableRow (row); + req->updateToTable(); +} + +// ============================================================================= +// ----------------------------------------------------------------------------- +PartDownloadRequest::PartDownloadRequest (str url, PartDownloadPrompt* parent) : + QObject (parent), + m_prompt (parent), + m_url (url) {} + +// ============================================================================= +// ----------------------------------------------------------------------------- +void PartDownloadRequest::updateToTable() { + QTableWidget* table = m_prompt->ui->progress; + QTableWidgetItem* urlItem = table->item (tableRow(), 0), + *progressItem = table->item (tableRow(), 1); + + if (!urlItem || !progressItem) { + urlItem = new QTableWidgetItem; + progressItem = new QTableWidgetItem; + + table->setItem (tableRow(), 0, urlItem); + table->setItem (tableRow(), 1, progressItem); + } + + urlItem->setText (m_url); + progressItem->setText ("---"); +} + +// ============================================================================= +// ----------------------------------------------------------------------------- +DEFINE_ACTION (DownloadFrom, 0) { + g_PartDownloader.download(); +} \ No newline at end of file diff -r 6bdf2b3f4e00 -r be5746bf0f12 src/download.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/download.h Fri Aug 02 18:42:06 2013 +0300 @@ -0,0 +1,83 @@ +/* + * LDForge: LDraw parts authoring CAD + * Copyright (C) 2013 Santeri Piippo + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef LDFORGE_DOWNLOAD_H +#define LDFORGE_DOWNLOAD_H + +#include +#include "common.h" + +class Ui_DownloadFrom; +class QNetworkAccessManager; +class QNetworkRequest; +class QNetworkReply; + +// ============================================================================= +// ----------------------------------------------------------------------------- +extern class PartDownloader { +public: + constexpr static const char* k_OfficialURL = "http://ldraw.org/library/official/", + *k_UnofficialURL = "http://ldraw.org/library/unofficial/"; + + PartDownloader() {} + void download(); + void operator()() { download(); } +} g_PartDownloader; + +// ============================================================================= +// ----------------------------------------------------------------------------- +class PartDownloadPrompt : public QDialog { + Q_OBJECT + +public: + enum Source { + OfficialLibrary, + PartsTracker, + CustomURL, + }; + + explicit PartDownloadPrompt (QWidget* parent = null); + virtual ~PartDownloadPrompt(); + str getURL(); + +public slots: + void sourceChanged (int i); + void startDownload(); + +protected: + Ui_DownloadFrom* ui; + friend class PartDownloadRequest; +}; + +// ============================================================================= +// ----------------------------------------------------------------------------- +class PartDownloadRequest : public QObject { + PROPERTY (int, tableRow, setTableRow) + +public: + explicit PartDownloadRequest (str url, PartDownloadPrompt* parent); + void updateToTable(); + +private: + PartDownloadPrompt* m_prompt; + str m_url; + QNetworkAccessManager* m_nam; + QNetworkReply* m_reply; +}; + +#endif // LDFORGE_DOWNLOAD_H \ No newline at end of file diff -r 6bdf2b3f4e00 -r be5746bf0f12 src/ui/downloadfrom.ui --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ui/downloadfrom.ui Fri Aug 02 18:42:06 2013 +0300 @@ -0,0 +1,161 @@ + + + DownloadFrom + + + + 0 + 0 + 406 + 319 + + + + Download from LDraw.org + + + + + + + 11 + 75 + true + + + + Download from LDraw.org + + + Qt::AlignCenter + + + + + + + QFormLayout::ExpandingFieldsGrow + + + + + Source: + + + + + + + + 0 + 0 + + + + + Official parts + + + + + Parts tracker + + + + + Custom URL + + + + + + + + File name: + + + + + + + + + + + + false + + + QAbstractItemView::NoEditTriggers + + + false + + + false + + + true + + + true + + + false + + + false + + + false + + + + URL + + + + 50 + false + + + + + + Status + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + rejected() + DownloadFrom + reject() + + + 322 + 312 + + + 286 + 274 + + + + +