summaryrefslogtreecommitdiffstats
path: root/application/pages/global/WonkoPage.cpp
diff options
context:
space:
mode:
authorJan Dalheimer <jan@dalheimer.de>2016-04-06 23:09:30 +0200
committerPetr Mrázek <peterix@gmail.com>2016-04-30 23:59:23 +0200
commit00e5968bd28ab1df33b3a39dbac8cda99aa2a0d2 (patch)
treec930ca4f0edae9bb2bbd1a9ce2fddb2ca5a7bf32 /application/pages/global/WonkoPage.cpp
parent5ae3b2c11416eb897a08b0d9531843d0357332f8 (diff)
downloadMultiMC-00e5968bd28ab1df33b3a39dbac8cda99aa2a0d2.tar
MultiMC-00e5968bd28ab1df33b3a39dbac8cda99aa2a0d2.tar.gz
MultiMC-00e5968bd28ab1df33b3a39dbac8cda99aa2a0d2.tar.lz
MultiMC-00e5968bd28ab1df33b3a39dbac8cda99aa2a0d2.tar.xz
MultiMC-00e5968bd28ab1df33b3a39dbac8cda99aa2a0d2.zip
NOISSUE Add a skeleton of the wonko system
Diffstat (limited to 'application/pages/global/WonkoPage.cpp')
-rw-r--r--application/pages/global/WonkoPage.cpp240
1 files changed, 240 insertions, 0 deletions
diff --git a/application/pages/global/WonkoPage.cpp b/application/pages/global/WonkoPage.cpp
new file mode 100644
index 00000000..21de2347
--- /dev/null
+++ b/application/pages/global/WonkoPage.cpp
@@ -0,0 +1,240 @@
+/* Copyright 2015 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "WonkoPage.h"
+#include "ui_WonkoPage.h"
+
+#include <QDateTime>
+#include <QSortFilterProxyModel>
+#include <QRegularExpression>
+
+#include "dialogs/ProgressDialog.h"
+#include "VersionProxyModel.h"
+
+#include "wonko/WonkoIndex.h"
+#include "wonko/WonkoVersionList.h"
+#include "wonko/WonkoVersion.h"
+#include "Env.h"
+#include "MultiMC.h"
+
+static QString formatRequires(const WonkoVersionPtr &version)
+{
+ QStringList lines;
+ for (const WonkoReference &ref : version->requires())
+ {
+ const QString readable = ENV.wonkoIndex()->hasUid(ref.uid()) ? ENV.wonkoIndex()->getList(ref.uid())->humanReadable() : ref.uid();
+ if (ref.version().isEmpty())
+ {
+ lines.append(readable);
+ }
+ else
+ {
+ lines.append(QString("%1 (%2)").arg(readable, ref.version()));
+ }
+ }
+ return lines.join('\n');
+}
+
+WonkoPage::WonkoPage(QWidget *parent) :
+ QWidget(parent),
+ ui(new Ui::WonkoPage)
+{
+ ui->setupUi(this);
+ ui->tabWidget->tabBar()->hide();
+
+ m_fileProxy = new QSortFilterProxyModel(this);
+ m_fileProxy->setSortRole(Qt::DisplayRole);
+ m_fileProxy->setSortCaseSensitivity(Qt::CaseInsensitive);
+ m_fileProxy->setFilterCaseSensitivity(Qt::CaseInsensitive);
+ m_fileProxy->setFilterRole(Qt::DisplayRole);
+ m_fileProxy->setFilterKeyColumn(0);
+ m_fileProxy->sort(0);
+ m_fileProxy->setSourceModel(ENV.wonkoIndex().get());
+ ui->indexView->setModel(m_fileProxy);
+
+ m_filterProxy = new QSortFilterProxyModel(this);
+ m_filterProxy->setSortRole(WonkoVersionList::SortRole);
+ m_filterProxy->setFilterCaseSensitivity(Qt::CaseInsensitive);
+ m_filterProxy->setFilterRole(Qt::DisplayRole);
+ m_filterProxy->setFilterKeyColumn(0);
+ m_filterProxy->sort(0, Qt::DescendingOrder);
+ ui->versionsView->setModel(m_filterProxy);
+
+ m_versionProxy = new VersionProxyModel(this);
+ m_filterProxy->setSourceModel(m_versionProxy);
+
+ connect(ui->indexView->selectionModel(), &QItemSelectionModel::currentChanged, this, &WonkoPage::updateCurrentVersionList);
+ connect(ui->versionsView->selectionModel(), &QItemSelectionModel::currentChanged, this, &WonkoPage::updateVersion);
+ connect(m_filterProxy, &QSortFilterProxyModel::dataChanged, this, &WonkoPage::versionListDataChanged);
+
+ updateCurrentVersionList(QModelIndex());
+ updateVersion();
+}
+
+WonkoPage::~WonkoPage()
+{
+ delete ui;
+}
+
+QIcon WonkoPage::icon() const
+{
+ return MMC->getThemedIcon("looney");
+}
+
+void WonkoPage::on_refreshIndexBtn_clicked()
+{
+ ProgressDialog(this).execWithTask(ENV.wonkoIndex()->remoteUpdateTask());
+}
+void WonkoPage::on_refreshFileBtn_clicked()
+{
+ WonkoVersionListPtr list = ui->indexView->currentIndex().data(WonkoIndex::ListPtrRole).value<WonkoVersionListPtr>();
+ if (!list)
+ {
+ return;
+ }
+ ProgressDialog(this).execWithTask(list->remoteUpdateTask());
+}
+void WonkoPage::on_refreshVersionBtn_clicked()
+{
+ WonkoVersionPtr version = ui->versionsView->currentIndex().data(WonkoVersionList::WonkoVersionPtrRole).value<WonkoVersionPtr>();
+ if (!version)
+ {
+ return;
+ }
+ ProgressDialog(this).execWithTask(version->remoteUpdateTask());
+}
+
+void WonkoPage::on_fileSearchEdit_textChanged(const QString &search)
+{
+ if (search.isEmpty())
+ {
+ m_fileProxy->setFilterFixedString(QString());
+ }
+ else
+ {
+ QStringList parts = search.split(' ');
+ std::transform(parts.begin(), parts.end(), parts.begin(), &QRegularExpression::escape);
+ m_fileProxy->setFilterRegExp(".*" + parts.join(".*") + ".*");
+ }
+}
+void WonkoPage::on_versionSearchEdit_textChanged(const QString &search)
+{
+ if (search.isEmpty())
+ {
+ m_filterProxy->setFilterFixedString(QString());
+ }
+ else
+ {
+ QStringList parts = search.split(' ');
+ std::transform(parts.begin(), parts.end(), parts.begin(), &QRegularExpression::escape);
+ m_filterProxy->setFilterRegExp(".*" + parts.join(".*") + ".*");
+ }
+}
+
+void WonkoPage::updateCurrentVersionList(const QModelIndex &index)
+{
+ if (index.isValid())
+ {
+ WonkoVersionListPtr list = index.data(WonkoIndex::ListPtrRole).value<WonkoVersionListPtr>();
+ ui->versionsBox->setEnabled(true);
+ ui->refreshFileBtn->setEnabled(true);
+ ui->fileUidLabel->setEnabled(true);
+ ui->fileUid->setText(list->uid());
+ ui->fileNameLabel->setEnabled(true);
+ ui->fileName->setText(list->name());
+ m_versionProxy->setSourceModel(list.get());
+ ui->refreshFileBtn->setText(tr("Refresh %1").arg(list->humanReadable()));
+
+ if (!list->isLocalLoaded())
+ {
+ std::unique_ptr<Task> task = list->localUpdateTask();
+ connect(task.get(), &Task::finished, this, [this, list]()
+ {
+ if (list->count() == 0 && !list->isRemoteLoaded())
+ {
+ ProgressDialog(this).execWithTask(list->remoteUpdateTask());
+ }
+ });
+ ProgressDialog(this).execWithTask(task);
+ }
+ }
+ else
+ {
+ ui->versionsBox->setEnabled(false);
+ ui->refreshFileBtn->setEnabled(false);
+ ui->fileUidLabel->setEnabled(false);
+ ui->fileUid->clear();
+ ui->fileNameLabel->setEnabled(false);
+ ui->fileName->clear();
+ m_versionProxy->setSourceModel(nullptr);
+ ui->refreshFileBtn->setText(tr("Refresh ___"));
+ }
+}
+
+void WonkoPage::versionListDataChanged(const QModelIndex &tl, const QModelIndex &br)
+{
+ if (QItemSelection(tl, br).contains(ui->versionsView->currentIndex()))
+ {
+ updateVersion();
+ }
+}
+
+void WonkoPage::updateVersion()
+{
+ WonkoVersionPtr version = std::dynamic_pointer_cast<WonkoVersion>(
+ ui->versionsView->currentIndex().data(WonkoVersionList::VersionPointerRole).value<BaseVersionPtr>());
+ if (version)
+ {
+ ui->refreshVersionBtn->setEnabled(true);
+ ui->versionVersionLabel->setEnabled(true);
+ ui->versionVersion->setText(version->version());
+ ui->versionTimeLabel->setEnabled(true);
+ ui->versionTime->setText(version->time().toString("yyyy-MM-dd HH:mm"));
+ ui->versionTypeLabel->setEnabled(true);
+ ui->versionType->setText(version->type());
+ ui->versionRequiresLabel->setEnabled(true);
+ ui->versionRequires->setText(formatRequires(version));
+ ui->refreshVersionBtn->setText(tr("Refresh %1").arg(version->version()));
+ }
+ else
+ {
+ ui->refreshVersionBtn->setEnabled(false);
+ ui->versionVersionLabel->setEnabled(false);
+ ui->versionVersion->clear();
+ ui->versionTimeLabel->setEnabled(false);
+ ui->versionTime->clear();
+ ui->versionTypeLabel->setEnabled(false);
+ ui->versionType->clear();
+ ui->versionRequiresLabel->setEnabled(false);
+ ui->versionRequires->clear();
+ ui->refreshVersionBtn->setText(tr("Refresh ___"));
+ }
+}
+
+void WonkoPage::opened()
+{
+ if (!ENV.wonkoIndex()->isLocalLoaded())
+ {
+ std::unique_ptr<Task> task = ENV.wonkoIndex()->localUpdateTask();
+ connect(task.get(), &Task::finished, this, [this]()
+ {
+ if (!ENV.wonkoIndex()->isRemoteLoaded())
+ {
+ ProgressDialog(this).execWithTask(ENV.wonkoIndex()->remoteUpdateTask());
+ }
+ });
+ ProgressDialog(this).execWithTask(task);
+ }
+}