diff options
author | Petr Mrázek <peterix@gmail.com> | 2014-05-11 23:48:01 +0200 |
---|---|---|
committer | Petr Mrázek <peterix@gmail.com> | 2014-06-09 01:38:30 +0200 |
commit | 439e17b149918df3fd11e0ee74f10d302a1e45cd (patch) | |
tree | e464e04c4e8960f6287b76718953f22bfef8dbd2 | |
parent | 8c71a5d61f20642711bff081be9be3807418e618 (diff) | |
download | MultiMC-439e17b149918df3fd11e0ee74f10d302a1e45cd.tar MultiMC-439e17b149918df3fd11e0ee74f10d302a1e45cd.tar.gz MultiMC-439e17b149918df3fd11e0ee74f10d302a1e45cd.tar.lz MultiMC-439e17b149918df3fd11e0ee74f10d302a1e45cd.tar.xz MultiMC-439e17b149918df3fd11e0ee74f10d302a1e45cd.zip |
Add back legacy mod edit, add checksums for all legacy jars
-rw-r--r-- | CMakeLists.txt | 71 | ||||
-rw-r--r-- | gui/dialogs/InstanceEditDialog.cpp | 38 | ||||
-rw-r--r-- | gui/dialogs/InstanceEditDialog.ui | 5 | ||||
-rw-r--r-- | gui/dialogs/LegacyModEditDialog.cpp | 393 | ||||
-rw-r--r-- | gui/dialogs/LegacyModEditDialog.h | 78 | ||||
-rw-r--r-- | gui/dialogs/LegacyModEditDialog.ui | 354 | ||||
-rw-r--r-- | gui/dialogs/ModEditDialogCommon.cpp | 40 | ||||
-rw-r--r-- | gui/dialogs/ModEditDialogCommon.h | 9 | ||||
-rw-r--r-- | logic/LegacyInstance.cpp | 3 | ||||
-rw-r--r-- | logic/minecraft/MinecraftVersion.h | 3 | ||||
-rw-r--r-- | logic/minecraft/MinecraftVersionList.cpp | 1 | ||||
-rw-r--r-- | resources/versions/minecraft.json | 81 |
12 files changed, 1005 insertions, 71 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 57b6352f..15aaa773 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -292,43 +292,49 @@ SET(MULTIMC_SOURCES gui/ConsoleWindow.cpp # GUI - dialogs - gui/dialogs/SettingsDialog.h - gui/dialogs/SettingsDialog.cpp - gui/dialogs/CopyInstanceDialog.h - gui/dialogs/CopyInstanceDialog.cpp - gui/dialogs/NewInstanceDialog.cpp - gui/dialogs/ProgressDialog.h - gui/dialogs/ProgressDialog.cpp - gui/dialogs/AboutDialog.h gui/dialogs/AboutDialog.cpp - gui/dialogs/VersionSelectDialog.h - gui/dialogs/VersionSelectDialog.cpp - gui/dialogs/LwjglSelectDialog.h - gui/dialogs/LwjglSelectDialog.cpp - gui/dialogs/InstanceSettings.h - gui/dialogs/InstanceSettings.cpp - gui/dialogs/IconPickerDialog.h - gui/dialogs/IconPickerDialog.cpp - gui/dialogs/InstanceEditDialog.h - gui/dialogs/InstanceEditDialog.cpp - gui/dialogs/EditNotesDialog.h - gui/dialogs/EditNotesDialog.cpp - gui/dialogs/CustomMessageBox.h + gui/dialogs/AboutDialog.h + gui/dialogs/AccountListDialog.cpp + gui/dialogs/AccountListDialog.h + gui/dialogs/AccountSelectDialog.cpp + gui/dialogs/AccountSelectDialog.h + gui/dialogs/CopyInstanceDialog.cpp + gui/dialogs/CopyInstanceDialog.h gui/dialogs/CustomMessageBox.cpp - gui/dialogs/EditAccountDialog.h + gui/dialogs/CustomMessageBox.h gui/dialogs/EditAccountDialog.cpp - gui/dialogs/LoginDialog.h + gui/dialogs/EditAccountDialog.h + gui/dialogs/EditNotesDialog.cpp + gui/dialogs/EditNotesDialog.h + gui/dialogs/IconPickerDialog.cpp + gui/dialogs/IconPickerDialog.h + gui/dialogs/InstanceEditDialog.cpp + gui/dialogs/InstanceEditDialog.h + gui/dialogs/InstanceSettings.cpp + gui/dialogs/InstanceSettings.h + gui/dialogs/LegacyModEditDialog.cpp + gui/dialogs/LegacyModEditDialog.h gui/dialogs/LoginDialog.cpp - gui/dialogs/AccountListDialog.h - gui/dialogs/AccountListDialog.cpp - gui/dialogs/AccountSelectDialog.h - gui/dialogs/AccountSelectDialog.cpp - gui/dialogs/UpdateDialog.h - gui/dialogs/UpdateDialog.cpp - gui/dialogs/ScreenshotDialog.h - gui/dialogs/ScreenshotDialog.cpp - gui/dialogs/NotificationDialog.h + gui/dialogs/LoginDialog.h + gui/dialogs/LwjglSelectDialog.cpp + gui/dialogs/LwjglSelectDialog.h + gui/dialogs/ModEditDialogCommon.cpp + gui/dialogs/ModEditDialogCommon.h + gui/dialogs/NewInstanceDialog.cpp + gui/dialogs/NewInstanceDialog.h gui/dialogs/NotificationDialog.cpp + gui/dialogs/NotificationDialog.h + gui/dialogs/ProgressDialog.cpp + gui/dialogs/ProgressDialog.h + gui/dialogs/ScreenshotDialog.cpp + gui/dialogs/ScreenshotDialog.h + gui/dialogs/SettingsDialog.cpp + gui/dialogs/SettingsDialog.h + gui/dialogs/UpdateDialog.cpp + gui/dialogs/UpdateDialog.h + gui/dialogs/VersionSelectDialog.cpp + gui/dialogs/VersionSelectDialog.h + # GUI - widgets gui/widgets/Common.cpp @@ -599,6 +605,7 @@ SET(MULTIMC_UIS gui/dialogs/AboutDialog.ui gui/dialogs/VersionSelectDialog.ui gui/dialogs/LwjglSelectDialog.ui + gui/dialogs/LegacyModEditDialog.ui gui/dialogs/InstanceSettings.ui gui/dialogs/ProgressDialog.ui gui/dialogs/IconPickerDialog.ui diff --git a/gui/dialogs/InstanceEditDialog.cpp b/gui/dialogs/InstanceEditDialog.cpp index 010410fd..5bd923e3 100644 --- a/gui/dialogs/InstanceEditDialog.cpp +++ b/gui/dialogs/InstanceEditDialog.cpp @@ -29,6 +29,7 @@ #include "gui/Platform.h" #include "gui/dialogs/CustomMessageBox.h" #include "gui/dialogs/VersionSelectDialog.h" +#include "gui/dialogs/ModEditDialogCommon.h" #include "gui/dialogs/ProgressDialog.h" #include "InstanceSettings.h" @@ -52,43 +53,6 @@ #include <QString> #include <QUrl> -bool lastfirst(QModelIndexList &list, int &first, int &last) -{ - if (!list.size()) - return false; - first = last = list[0].row(); - for (auto item : list) - { - int row = item.row(); - if (row < first) - first = row; - if (row > last) - last = row; - } - return true; -} - -void showWebsiteForMod(QWidget *parentDlg, Mod &m) -{ - QString url = m.homeurl(); - if (url.size()) - { - // catch the cases where the protocol is missing - if (!url.startsWith("http")) - { - url = "http://" + url; - } - QDesktopServices::openUrl(url); - } - else - { - CustomMessageBox::selectable( - parentDlg, QObject::tr("How sad!"), - QObject::tr("The mod author didn't provide a website link for this mod."), - QMessageBox::Warning); - } -} - InstanceEditDialog::InstanceEditDialog(OneSixInstance *inst, QWidget *parent) : QDialog(parent), ui(new Ui::InstanceEditDialog), m_inst(inst) { diff --git a/gui/dialogs/InstanceEditDialog.ui b/gui/dialogs/InstanceEditDialog.ui index 85e93686..a079d3c6 100644 --- a/gui/dialogs/InstanceEditDialog.ui +++ b/gui/dialogs/InstanceEditDialog.ui @@ -53,8 +53,11 @@ <property name="horizontalScrollBarPolicy"> <enum>Qt::ScrollBarAlwaysOff</enum> </property> - <attribute name="headerVisible"> + <property name="headerHidden"> <bool>false</bool> + </property> + <attribute name="headerVisible"> + <bool>true</bool> </attribute> </widget> </item> diff --git a/gui/dialogs/LegacyModEditDialog.cpp b/gui/dialogs/LegacyModEditDialog.cpp new file mode 100644 index 00000000..20e1a98c --- /dev/null +++ b/gui/dialogs/LegacyModEditDialog.cpp @@ -0,0 +1,393 @@ +/* Copyright 2013 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 "MultiMC.h" +#include "LegacyModEditDialog.h" +#include "ModEditDialogCommon.h" +#include "VersionSelectDialog.h" +#include "ProgressDialog.h" +#include "ui_LegacyModEditDialog.h" +#include "logic/ModList.h" +#include "logic/forge/ForgeVersionList.h" +#include "gui/Platform.h" + +#include <pathutils.h> +#include <QFileDialog> +//#include <QMessageBox> +#include <QDebug> +#include <QEvent> +#include <QKeyEvent> + +LegacyModEditDialog::LegacyModEditDialog(LegacyInstance *inst, QWidget *parent) + : QDialog(parent), ui(new Ui::LegacyModEditDialog), m_inst(inst) +{ + MultiMCPlatform::fixWM_CLASS(this); + ui->setupUi(this); + + // Jar mods + { + ensureFolderPathExists(m_inst->jarModsDir()); + m_jarmods = m_inst->jarModList(); + ui->jarModsTreeView->setModel(m_jarmods.get()); +#ifndef Q_OS_LINUX + // FIXME: internal DnD causes segfaults later + ui->jarModsTreeView->setDragDropMode(QAbstractItemView::DragDrop); + // FIXME: DnD is glitched with contiguous (we move only first item in selection) + ui->jarModsTreeView->setSelectionMode(QAbstractItemView::SingleSelection); +#endif + ui->jarModsTreeView->installEventFilter(this); + m_jarmods->startWatching(); + auto smodel = ui->jarModsTreeView->selectionModel(); + connect(smodel, SIGNAL(currentChanged(QModelIndex, QModelIndex)), + SLOT(jarCurrent(QModelIndex, QModelIndex))); + } + // Core mods + { + ensureFolderPathExists(m_inst->coreModsDir()); + m_coremods = m_inst->coreModList(); + ui->coreModsTreeView->setModel(m_coremods.get()); + ui->coreModsTreeView->installEventFilter(this); + m_coremods->startWatching(); + auto smodel = ui->coreModsTreeView->selectionModel(); + connect(smodel, SIGNAL(currentChanged(QModelIndex, QModelIndex)), + SLOT(coreCurrent(QModelIndex, QModelIndex))); + } + // Loader mods + { + ensureFolderPathExists(m_inst->loaderModsDir()); + m_mods = m_inst->loaderModList(); + ui->loaderModTreeView->setModel(m_mods.get()); + ui->loaderModTreeView->installEventFilter(this); + m_mods->startWatching(); + auto smodel = ui->loaderModTreeView->selectionModel(); + connect(smodel, SIGNAL(currentChanged(QModelIndex, QModelIndex)), + SLOT(loaderCurrent(QModelIndex, QModelIndex))); + } + // texture packs + { + ensureFolderPathExists(m_inst->texturePacksDir()); + m_texturepacks = m_inst->texturePackList(); + ui->texPackTreeView->setModel(m_texturepacks.get()); + ui->texPackTreeView->installEventFilter(this); + m_texturepacks->startWatching(); + } +} + +LegacyModEditDialog::~LegacyModEditDialog() +{ + m_mods->stopWatching(); + m_coremods->stopWatching(); + m_jarmods->stopWatching(); + m_texturepacks->stopWatching(); + delete ui; +} + +bool LegacyModEditDialog::coreListFilter(QKeyEvent *keyEvent) +{ + switch (keyEvent->key()) + { + case Qt::Key_Delete: + on_rmCoreBtn_clicked(); + return true; + case Qt::Key_Plus: + on_addCoreBtn_clicked(); + return true; + default: + break; + } + return QDialog::eventFilter(ui->coreModsTreeView, keyEvent); +} + +bool LegacyModEditDialog::jarListFilter(QKeyEvent *keyEvent) +{ + switch (keyEvent->key()) + { + case Qt::Key_Up: + { + if (keyEvent->modifiers() & Qt::ControlModifier) + { + on_moveJarUpBtn_clicked(); + return true; + } + break; + } + case Qt::Key_Down: + { + if (keyEvent->modifiers() & Qt::ControlModifier) + { + on_moveJarDownBtn_clicked(); + return true; + } + break; + } + case Qt::Key_Delete: + on_rmJarBtn_clicked(); + return true; + case Qt::Key_Plus: + on_addJarBtn_clicked(); + return true; + default: + break; + } + return QDialog::eventFilter(ui->jarModsTreeView, keyEvent); +} + +bool LegacyModEditDialog::loaderListFilter(QKeyEvent *keyEvent) +{ + switch (keyEvent->key()) + { + case Qt::Key_Delete: + on_rmModBtn_clicked(); + return true; + case Qt::Key_Plus: + on_addModBtn_clicked(); + return true; + default: + break; + } + return QDialog::eventFilter(ui->loaderModTreeView, keyEvent); +} + +bool LegacyModEditDialog::texturePackListFilter(QKeyEvent *keyEvent) +{ + switch (keyEvent->key()) + { + case Qt::Key_Delete: + on_rmTexPackBtn_clicked(); + return true; + case Qt::Key_Plus: + on_addTexPackBtn_clicked(); + return true; + default: + break; + } + return QDialog::eventFilter(ui->texPackTreeView, keyEvent); +} + +bool LegacyModEditDialog::eventFilter(QObject *obj, QEvent *ev) +{ + if (ev->type() != QEvent::KeyPress) + { + return QDialog::eventFilter(obj, ev); + } + QKeyEvent *keyEvent = static_cast<QKeyEvent *>(ev); + if (obj == ui->jarModsTreeView) + return jarListFilter(keyEvent); + if (obj == ui->coreModsTreeView) + return coreListFilter(keyEvent); + if (obj == ui->loaderModTreeView) + return loaderListFilter(keyEvent); + if (obj == ui->texPackTreeView) + return texturePackListFilter(keyEvent); + return QDialog::eventFilter(obj, ev); +} + +void LegacyModEditDialog::on_addCoreBtn_clicked() +{ + //: Title of core mod selection dialog + QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("Select Core Mods")); + for (auto filename : fileNames) + { + m_coremods->stopWatching(); + m_coremods->installMod(QFileInfo(filename)); + m_coremods->startWatching(); + } +} +void LegacyModEditDialog::on_addForgeBtn_clicked() +{ + VersionSelectDialog vselect(MMC->forgelist().get(), tr("Select Forge version"), this); + vselect.setExactFilter(1, m_inst->intendedVersionId()); + if (vselect.exec() && vselect.selectedVersion()) + { + ForgeVersionPtr forge = + std::dynamic_pointer_cast<ForgeVersion>(vselect.selectedVersion()); + if (!forge) + return; + auto entry = MMC->metacache()->resolveEntry("minecraftforge", forge->filename()); + if (entry->stale) + { + NetJob *fjob = new NetJob("Forge download"); + fjob->addNetAction(CacheDownload::make(forge->universal_url, entry)); + ProgressDialog dlg(this); + dlg.exec(fjob); + if (dlg.result() == QDialog::Accepted) + { + m_jarmods->stopWatching(); + m_jarmods->installMod(QFileInfo(entry->getFullPath())); + m_jarmods->startWatching(); + } + else + { + // failed to download forge :/ + } + } + else + { + m_jarmods->stopWatching(); + m_jarmods->installMod(QFileInfo(entry->getFullPath())); + m_jarmods->startWatching(); + } + } +} +void LegacyModEditDialog::on_addJarBtn_clicked() +{ + //: Title of jar mod selection dialog + QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("Select Jar Mods")); + for (auto filename : fileNames) + { + m_jarmods->stopWatching(); + m_jarmods->installMod(QFileInfo(filename)); + m_jarmods->startWatching(); + } +} +void LegacyModEditDialog::on_addModBtn_clicked() +{ + //: Title of regular mod selection dialog + QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("Select Loader Mods")); + for (auto filename : fileNames) + { + m_mods->stopWatching(); + m_mods->installMod(QFileInfo(filename)); + m_mods->startWatching(); + } +} +void LegacyModEditDialog::on_addTexPackBtn_clicked() +{ + //: Title of texture pack selection dialog + QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("Select Texture Packs")); + for (auto filename : fileNames) + { + m_texturepacks->stopWatching(); + m_texturepacks->installMod(QFileInfo(filename)); + m_texturepacks->startWatching(); + } +} + +void LegacyModEditDialog::on_moveJarDownBtn_clicked() +{ + int first, last; + auto list = ui->jarModsTreeView->selectionModel()->selectedRows(); + + if (!lastfirst(list, first, last)) + return; + + m_jarmods->moveModsDown(first, last); +} +void LegacyModEditDialog::on_moveJarUpBtn_clicked() +{ + int first, last; + auto list = ui->jarModsTreeView->selectionModel()->selectedRows(); + + if (!lastfirst(list, first, last)) + return; + m_jarmods->moveModsUp(first, last); +} +void LegacyModEditDialog::on_rmCoreBtn_clicked() +{ + int first, last; + auto list = ui->coreModsTreeView->selectionModel()->selectedRows(); + + if (!lastfirst(list, first, last)) + return; + m_coremods->stopWatching(); + m_coremods->deleteMods(first, last); + m_coremods->startWatching(); +} +void LegacyModEditDialog::on_rmJarBtn_clicked() +{ + int first, last; + auto list = ui->jarModsTreeView->selectionModel()->selectedRows(); + + if (!lastfirst(list, first, last)) + return; + m_jarmods->stopWatching(); + m_jarmods->deleteMods(first, last); + m_jarmods->startWatching(); +} +void LegacyModEditDialog::on_rmModBtn_clicked() +{ + int first, last; + auto list = ui->loaderModTreeView->selectionModel()->selectedRows(); + + if (!lastfirst(list, first, last)) + return; + m_mods->stopWatching(); + m_mods->deleteMods(first, last); + m_mods->startWatching(); +} +void LegacyModEditDialog::on_rmTexPackBtn_clicked() +{ + int first, last; + auto list = ui->texPackTreeView->selectionModel()->selectedRows(); + + if (!lastfirst(list, first, last)) + return; + m_texturepacks->stopWatching(); + m_texturepacks->deleteMods(first, last); + m_texturepacks->startWatching(); +} +void LegacyModEditDialog::on_viewCoreBtn_clicked() +{ + openDirInDefaultProgram(m_inst->coreModsDir(), true); +} +void LegacyModEditDialog::on_viewModBtn_clicked() +{ + openDirInDefaultProgram(m_inst->loaderModsDir(), true); +} +void LegacyModEditDialog::on_viewTexPackBtn_clicked() +{ + openDirInDefaultProgram(m_inst->texturePacksDir(), true); +} + +void LegacyModEditDialog::on_buttonBox_rejected() +{ + close(); +} + +void LegacyModEditDialog::jarCurrent(QModelIndex current, QModelIndex previous) +{ + if (!current.isValid()) + { + ui->jarMIFrame->clear(); + return; + } + int row = current.row(); + Mod &m = m_jarmods->operator[](row); + ui->jarMIFrame->updateWithMod(m); +} + +void LegacyModEditDialog::coreCurrent(QModelIndex current, QModelIndex previous) +{ + if (!current.isValid()) + { + ui->coreMIFrame->clear(); + return; + } + int row = current.row(); + Mod &m = m_coremods->operator[](row); + ui->coreMIFrame->updateWithMod(m); +} + +void LegacyModEditDialog::loaderCurrent(QModelIndex current, QModelIndex previous) +{ + if (!current.isValid()) + { + ui->loaderMIFrame->clear(); + return; + } + int row = current.row(); + Mod &m = m_mods->operator[](row); + ui->loaderMIFrame->updateWithMod(m); +} diff --git a/gui/dialogs/LegacyModEditDialog.h b/gui/dialogs/LegacyModEditDialog.h new file mode 100644 index 00000000..d5582aef --- /dev/null +++ b/gui/dialogs/LegacyModEditDialog.h @@ -0,0 +1,78 @@ +/* Copyright 2013 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. + */ + +#pragma once + +#include <QDialog> +#include "logic/LegacyInstance.h" +#include <logic/net/NetJob.h> + +namespace Ui +{ +class LegacyModEditDialog; +} + +class LegacyModEditDialog : public QDialog +{ + Q_OBJECT + +public: + explicit LegacyModEditDialog(LegacyInstance *inst, QWidget *parent = 0); + ~LegacyModEditDialog(); + +private +slots: + + void on_addJarBtn_clicked(); + void on_rmJarBtn_clicked(); + void on_addForgeBtn_clicked(); + void on_moveJarUpBtn_clicked(); + void on_moveJarDownBtn_clicked(); + + void on_addCoreBtn_clicked(); + void on_rmCoreBtn_clicked(); + void on_viewCoreBtn_clicked(); + + void on_addModBtn_clicked(); + void on_rmModBtn_clicked(); + void on_viewModBtn_clicked(); + + void on_addTexPackBtn_clicked(); + void on_rmTexPackBtn_clicked(); + void on_viewTexPackBtn_clicked(); + + // Questionable: SettingsDialog doesn't need this for some reason? + void on_buttonBox_rejected(); + + void jarCurrent(QModelIndex current, QModelIndex previous); + void coreCurrent(QModelIndex current, QModelIndex previous); + void loaderCurrent(QModelIndex current, QModelIndex previous); + +protected: + bool eventFilter(QObject *obj, QEvent *ev); + bool jarListFilter(QKeyEvent *ev); + bool coreListFilter(QKeyEvent *ev); + bool loaderListFilter(QKeyEvent *ev); + bool texturePackListFilter(QKeyEvent *ev); + +private: + Ui::LegacyModEditDialog *ui; + std::shared_ptr<ModList> m_mods; + std::shared_ptr<ModList> m_coremods; + std::shared_ptr<ModList> m_jarmods; + std::shared_ptr<ModList> m_texturepacks; + LegacyInstance *m_inst; + NetJobPtr forgeJob; +}; diff --git a/gui/dialogs/LegacyModEditDialog.ui b/gui/dialogs/LegacyModEditDialog.ui new file mode 100644 index 00000000..52336847 --- /dev/null +++ b/gui/dialogs/LegacyModEditDialog.ui @@ -0,0 +1,354 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>LegacyModEditDialog</class> + <widget class="QDialog" name="LegacyModEditDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>542</width> + <height>431</height> + </rect> + </property> + <property name="windowTitle"> + <string>Edit Mods</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QTabWidget" name="tabWidget"> + <property name="currentIndex"> + <number>0</number> + </property> + <widget class="QWidget" name="convertTab"> + <attribute name="title"> + <string>Upgrade</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_5"> + <item> + <widget class="QTextBrowser" name="textBrowser"> + <property name="html"> + <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Bitstream Vera Sans'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:18pt; font-weight:600;">New format is available</span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">MultiMC now supports old Minecraft versions in the new (OneSix) instance format. The old format won't be getting any new features and only the most critical bugfixes. As a consequence, you should upgrade this instance.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The upgrade will create a new instance with the same contents as the current one, in the new format. The original instance will remain untouched, in case anything goes wrong in the process.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Please report any issues on our <a href="https://github.com/MultiMC/MultiMC5/issues"><img src=":/icons/multimc/22x22/bug.png" /></a><a href="https://github.com/MultiMC/MultiMC5/issues"><span style=" text-decoration: underline; color:#68a0df;">github issues page</span></a>.</p></body></html></string> + </property> + <property name="openExternalLinks"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QCommandLinkButton" name="upgradeButton"> + <property name="text"> + <string>Start the upgrade!</string> + </property> + </widget> + </item> + </layout> + </widget> + <widget class="QWidget" name="jarTab"> + <attribute name="title"> + <string>Jar Mods</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="ModListView" name="jarModsTreeView"> + <property name="verticalScrollBarPolicy"> + <enum>Qt::ScrollBarAlwaysOn</enum> + </property> + <property name="horizontalScrollBarPolicy"> + <enum>Qt::ScrollBarAlwaysOff</enum> + </property> + </widget> + </item> + <item> + <layout class="QVBoxLayout" name="jarModsButtonBox"> + <item> + <widget class="QPushButton" name="addJarBtn"> + <property name="text"> + <string>&Add</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="rmJarBtn"> + <property name="text"> + <string>&Remove</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="addForgeBtn"> + <property name="text"> + <string>MCForge</string> + </property> + </widget> + </item> + <item> + <spacer name="jarModsButtonSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="moveJarUpBtn"> + <property name="text"> + <string>Move &Up</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="moveJarDownBtn"> + <property name="text"> + <string>Move &Down</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </item> + <item> + <widget class="MCModInfoFrame" name="jarMIFrame"> + <property name="frameShadow"> + <enum>QFrame::Plain</enum> + </property> + </widget> + </item> + </layout> + </widget> + <widget class="QWidget" name="coreTab"> + <attribute name="title"> + <string>Core Mods</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <widget class="ModListView" name="coreModsTreeView"> + <property name="dragDropMode"> + <enum>QAbstractItemView::DropOnly</enum> + </property> + </widget> + </item> + <item> + <layout class="QVBoxLayout" name="coreModsButtonBox"> + <item> + <widget class="QPushButton" name="addCoreBtn"> + <property name="text"> + <string>&Add</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="rmCoreBtn"> + <property name="text"> + <string>&Remove</string> + </property> + </widget> + </item> + <item> + <spacer name="coreModsButtonSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="viewCoreBtn"> + <property name="text"> + <string>&View Folder</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </item> + <item> + <widget class="MCModInfoFrame" name="coreMIFrame"> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + </widget> + </item> + </layout> + </widget> + <widget class="QWidget" name="modTab"> + <attribute name="title"> + <string>Loader Mods</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_4"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="ModListView" name="loaderModTreeView"> + <property name="acceptDrops"> + <bool>true</bool> + </property> + <property name="dragDropMode"> + <enum>QAbstractItemView::DropOnly</enum> + </property> + </widget> + </item> + <item> + <layout class="QVBoxLayout" name="mlModsButtonBox"> + <item> + <widget class="QPushButton" name="addModBtn"> + <property name="text"> + <string>&Add</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="rmModBtn"> + <property name="text"> + <string>&Remove</string> + </property> + </widget> + </item> + <item> + <spacer name="mlModsButtonSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="viewModBtn"> + <property name="text"> + <string>&View Folder</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </item> + <item> + <widget class="MCModInfoFrame" name="loaderMIFrame"> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + </widget> + </item> + </layout> + </widget> + <widget class="QWidget" name="texPackTab"> + <property name="acceptDrops"> + <bool>false</bool> + </property> + <attribute name="title"> + <string>Texture Packs</string> + </attribute> + <layout class="QHBoxLayout" name="horizontalLayout_4"> + <item> + <widget class="ModListView" name="texPackTreeView"> + <property name="acceptDrops"> + <bool>true</bool> + </property> + <property name="dragDropMode"> + <enum>QAbstractItemView::DropOnly</enum> + </property> + </widget> + </item> + <item> + <layout class="QVBoxLayout" name="texturePacksButtonBox"> + <item> + <widget class="QPushButton" name="addTexPackBtn"> + <property name="text"> + <string>&Add</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="rmTexPackBtn"> + <property name="text"> + <string>&Remove</string> + </property> + </widget> + </item> + <item> + <spacer name="texturePacksButtonSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="viewTexPackBtn"> + <property name="text"> + <string>&View Folder</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="standardButtons"> + <set>QDialogButtonBox::Close</set> + </property> + </widget> + </item> + </layout> + </widget> + <customwidgets> + <customwidget> + <class>ModListView</class> + <extends>QTreeView</extends> + <header>gui/widgets/ModListView.h</header> + </customwidget> + <customwidget> + <class>MCModInfoFrame</class> + <extends>QFrame</extends> + <header>gui/widgets/MCModInfoFrame.h</header> + <container>1</container> + </customwidget> + </customwidgets> + <resources> + <include location="../../resources/multimc/multimc.qrc"/> + </resources> + <connections/> +</ui> diff --git a/gui/dialogs/ModEditDialogCommon.cpp b/gui/dialogs/ModEditDialogCommon.cpp new file mode 100644 index 00000000..35942374 --- /dev/null +++ b/gui/dialogs/ModEditDialogCommon.cpp @@ -0,0 +1,40 @@ +#include "ModEditDialogCommon.h" +#include "CustomMessageBox.h" +#include <QUrl> + +bool lastfirst(QModelIndexList &list, int &first, int &last) +{ + if (!list.size()) + return false; + first = last = list[0].row(); + for (auto item : list) + { + int row = item.row(); + if (row < first) + first = row; + if (row > last) + last = row; + } + return true; +} + +void showWebsiteForMod(QWidget *parentDlg, Mod &m) +{ + QString url = m.homeurl(); + if (url.size()) + { + // catch the cases where the protocol is missing + if (!url.startsWith("http")) + { + url = "http://" + url; + } + QDesktopServices::openUrl(url); + } + else + { + CustomMessageBox::selectable( + parentDlg, QObject::tr("How sad!"), + QObject::tr("The mod author didn't provide a website link for this mod."), + QMessageBox::Warning); + } +}
\ No newline at end of file diff --git a/gui/dialogs/ModEditDialogCommon.h b/gui/dialogs/ModEditDialogCommon.h new file mode 100644 index 00000000..3ccfbf6b --- /dev/null +++ b/gui/dialogs/ModEditDialogCommon.h @@ -0,0 +1,9 @@ +#pragma once +#include <QModelIndex> +#include <QDesktopServices> +#include <QWidget> +#include <logic/Mod.h> + +bool lastfirst(QModelIndexList &list, int &first, int &last); + +void showWebsiteForMod(QWidget *parentDlg, Mod &m); diff --git a/logic/LegacyInstance.cpp b/logic/LegacyInstance.cpp index bc4d2cfc..279282e3 100644 --- a/logic/LegacyInstance.cpp +++ b/logic/LegacyInstance.cpp @@ -28,6 +28,7 @@ #include "logic/MinecraftProcess.h" #include "logic/LegacyUpdate.h" #include "logic/icons/IconList.h" +#include <gui/dialogs/LegacyModEditDialog.h> LegacyInstance::LegacyInstance(const QString &rootDir, SettingsObject *settings, QObject *parent) @@ -136,7 +137,7 @@ std::shared_ptr<ModList> LegacyInstance::texturePackList() QDialog *LegacyInstance::createModEditDialog(QWidget *parent) { - return nullptr; + return new LegacyModEditDialog(this, parent); } QString LegacyInstance::jarModsDir() const diff --git a/logic/minecraft/MinecraftVersion.h b/logic/minecraft/MinecraftVersion.h index 422b4cea..43ac68e1 100644 --- a/logic/minecraft/MinecraftVersion.h +++ b/logic/minecraft/MinecraftVersion.h @@ -92,6 +92,9 @@ public: /* data */ QString m_updateTimeString; QDateTime m_updateTime; + /// MD5 hash of the minecraft jar + QString m_jarChecksum; + /// order of this file... default = -2 int order = -2; diff --git a/logic/minecraft/MinecraftVersionList.cpp b/logic/minecraft/MinecraftVersionList.cpp index e012330e..8d7c18d5 100644 --- a/logic/minecraft/MinecraftVersionList.cpp +++ b/logic/minecraft/MinecraftVersionList.cpp @@ -157,6 +157,7 @@ void MinecraftVersionList::loadBuiltinList() mcVersion->m_type = versionTypeStr; mcVersion->m_appletClass = versionObj.value("appletClass").toString(""); mcVersion->m_mainClass = versionObj.value("mainClass").toString(""); + mcVersion->m_jarChecksum = versionObj.value("checksum").toString(""); mcVersion->m_processArguments = versionObj.value("processArguments").toString("legacy"); if (versionObj.contains("+traits")) { diff --git a/resources/versions/minecraft.json b/resources/versions/minecraft.json index 1c6928c6..d543383c 100644 --- a/resources/versions/minecraft.json +++ b/resources/versions/minecraft.json @@ -2,6 +2,7 @@ "versions": [ { "id": "1.5.2", + "checksum": "6897c3287fb971c9f362eb3ab20f5ddd", "releaseTime": "2013-04-25T17:45:00+02:00", "type": "release", "processArguments": "legacy", @@ -9,6 +10,7 @@ }, { "id": "1.5.1", + "checksum": "5c1219d869b87d233de3033688ec7567", "releaseTime": "2013-03-20T12:00:00+02:00", "type": "release", "processArguments": "legacy", @@ -16,6 +18,7 @@ }, { "id": "1.5", + "checksum": "fd11cbc5b01aae1d62cff0145171f3d9", "releaseTime": "2013-03-07T00:00:00+02:00", "type": "snapshot", "processArguments": "legacy", @@ -23,6 +26,7 @@ }, { "id": "1.4.7", + "checksum": "8e80fb01b321c6b3c7efca397a3eea35", "releaseTime": "2012-12-28T00:00:00+02:00", "type": "release", "processArguments": "legacy", @@ -30,6 +34,7 @@ }, { "id": "1.4.6", + "checksum": "48677dc4c2b98c29918722b5ab27b4fd", "releaseTime": "2012-12-20T00:00:00+02:00", "type": "release", "processArguments": "legacy", @@ -37,6 +42,7 @@ }, { "id": "1.4.5", + "checksum": "b15e2b2b6b4629f0d99a95b6b44412a0", "releaseTime": "2012-11-20T00:00:00+02:00", "type": "release", "processArguments": "legacy", @@ -44,6 +50,7 @@ }, { "id": "1.4.4", + "checksum": "7aa46c8058cba2f38e9d2ddddcc77c72", "releaseTime": "2012-11-14T00:00:00+02:00", "type": "release", "processArguments": "legacy", @@ -51,6 +58,7 @@ }, { "id": "1.4.3", + "checksum": "9cc3295931edb6339f22989fe1b612a6", "releaseTime": "2012-11-01T00:00:00+02:00", "type": "snapshot", "processArguments": "legacy", @@ -58,6 +66,7 @@ }, { "id": "1.4.2", + "checksum": "771175c01778ea67395bc6919a5a9dc5", "releaseTime": "2012-10-25T00:00:00+02:00", "type": "release", "processArguments": "legacy", @@ -65,6 +74,7 @@ }, { "id": "1.4.1", + "checksum": "542621a5298659dc65f383f35170fc4c", "releaseTime": "2012-10-23T00:00:00+02:00", "type": "snapshot", "processArguments": "legacy", @@ -72,6 +82,7 @@ }, { "id": "1.4", + "checksum": "32a654388b54d3e4bb29c1a46e7d6a12", "releaseTime": "2012-10-19T00:00:00+02:00", "type": "snapshot", "processArguments": "legacy", @@ -79,6 +90,7 @@ }, { "id": "1.3.2", + "checksum": "969699f13e5bbe7f12e40ac4f32b7d9a", "releaseTime": "2012-08-16T00:00:00+02:00", "type": "release", "processArguments": "legacy", @@ -86,6 +98,7 @@ }, { "id": "1.3.1", + "checksum": "266ccbc9798afd2eadf3d6c01b4c562a", "releaseTime": "2012-08-01T00:00:00+02:00", "type": "release", "processArguments": "legacy", @@ -93,6 +106,7 @@ }, { "id": "1.3", + "checksum": "a6effac1eaccf5d429aae340cf95ed5d", "releaseTime": "2012-07-26T00:00:00+02:00", "type": "snapshot", "processArguments": "legacy", @@ -100,6 +114,7 @@ }, { "id": "1.2.5", + "checksum": "8e8778078a175a33603a585257f28563", "releaseTime": "2012-03-30T00:00:00+02:00", "type": "release", "processArguments": "legacy", @@ -107,6 +122,7 @@ }, { "id": "1.2.4", + "checksum": "25423eab6d8707f96cc6ad8a21a7250a", "releaseTime": "2012-03-22T00:00:00+02:00", "type": "release", "processArguments": "legacy", @@ -114,6 +130,7 @@ }, { "id": "1.2.3", + "checksum": "12f6c4b1bdcc63f029e3c088a364b8e4", "releaseTime": "2012-03-02T00:00:00+02:00", "type": "release", "processArguments": "legacy", @@ -121,6 +138,7 @@ }, { "id": "1.2.2", + "checksum": "6189e96efaea11e5164b4a4755574324", "releaseTime": "2012-03-01T00:00:01+02:00", "type": "release", "processArguments": "legacy", @@ -128,6 +146,7 @@ }, { "id": "1.2.1", + "checksum": "97067a603eba2b6eb75d3194f81f6bcd", "releaseTime": "2012-03-01T00:00:00+02:00", "type": "release", "processArguments": "legacy", @@ -135,6 +154,7 @@ }, { "id": "1.1", + "checksum": "e92302d2acdba7c97e0d8df1e10d2006", "releaseTime": "2012-01-12T00:00:00+02:00", "type": "release", "processArguments": "legacy", @@ -142,6 +162,7 @@ }, { "id": "1.0", + "checksum": "3820d222b95d0b8c520d9596a756a6e6", "releaseTime": "2011-11-18T00:00:00+02:00", "type": "release", "processArguments": "legacy", @@ -149,6 +170,7 @@ }, { "id": "b1.8.1", + "checksum": "f8c5a2ccd3bc996792bbe436d8cc08bc", "releaseTime": "2011-09-19T00:00:00+02:00", "type": "old_beta", "processArguments": "legacy", @@ -156,6 +178,7 @@ }, { "id": "b1.8", + "checksum": "a59a9fd4c726a573b0a2bdd10d857f59", "releaseTime": "2011-09-15T00:00:00+02:00", "type": "old_beta", "processArguments": "legacy", @@ -163,6 +186,7 @@ }, { "id": "b1.7.3", + "checksum": "eae3353fdaa7e10a59b4cb5b45bfa10d", "releaseTime": "2011-07-08T00:00:00+02:00", "type": "old_beta", "processArguments": "legacy", @@ -170,6 +194,7 @@ }, { "id": "b1.7.2", + "checksum": "dd9215ab1141170d4871f42bff4ab302", "releaseTime": "2011-07-01T00:00:00+02:00", "type": "old_beta", "processArguments": "legacy", @@ -177,6 +202,7 @@ }, { "id": "b1.7", + "checksum": "682419e9ed1a236c3067822d53cda1e4", "releaseTime": "2011-06-30T00:00:00+02:00", "type": "old_beta", "processArguments": "legacy", @@ -184,6 +210,7 @@ }, { "id": "b1.6.6", + "checksum": "ce80072464433cd5b05d505aa8ff29d1", "releaseTime": "2011-05-31T00:00:00+02:00", "type": "old_beta", "processArguments": "legacy", @@ -191,6 +218,7 @@ }, { "id": "b1.6.5", + "checksum": "2aba888864b32038c8d22ee5df71b7c8", "releaseTime": "2011-05-28T00:00:00+02:00", "type": "old_beta", "processArguments": "legacy", @@ -198,6 +226,7 @@ }, { "id": "b1.6.4", + "checksum": "5c4df6f120336f113180698613853dba", "releaseTime": "2011-05-26T00:00:04+02:00", "type": "old_beta", "processArguments": "legacy", @@ -205,6 +234,7 @@ }, { "id": "b1.6.3", + "checksum": "efc2becca965e4f8feb5b4210c6a4fd1", "releaseTime": "2011-05-26T00:00:03+02:00", "type": "old_beta", "processArguments": "legacy", @@ -212,6 +242,7 @@ }, { "id": "b1.6.2", + "checksum": "01330b1c930102a683a4dd8d792e632e", "releaseTime": "2011-05-26T00:00:02+02:00", "type": "old_beta", "processArguments": "legacy", @@ -219,6 +250,7 @@ }, { "id": "b1.6.1", + "checksum": "a7e82c441a57ef4068c533f4d777336a", "releaseTime": "2011-05-26T00:00:01+02:00", "type": "old_beta", "processArguments": "legacy", @@ -226,6 +258,7 @@ }, { "id": "b1.6", + "checksum": "d531e221227a65392259d3141893280d", "releaseTime": "2011-05-26T00:00:00+02:00", "type": "old_beta", "processArguments": "legacy", @@ -233,6 +266,7 @@ }, { "id": "b1.5_01", + "checksum": "d02fa9998e30693d8d989d5f88cf0040", "releaseTime": "2011-04-20T00:00:00+02:00", "type": "old_beta", "processArguments": "legacy", @@ -240,6 +274,7 @@ }, { "id": "b1.5", + "checksum": "24289130902822d73f8722b52bc07cdb", "releaseTime": "2011-04-19T00:00:00+02:00", "type": "old_beta", "processArguments": "legacy", @@ -247,6 +282,7 @@ }, { "id": "b1.4_01", + "checksum": "9379e54b581ba4ef3acc3e326e87db91", "releaseTime": "2011-04-05T00:00:00+02:00", "type": "old_beta", "processArguments": "legacy", @@ -254,6 +290,7 @@ }, { "id": "b1.4", + "checksum": "71e64b61175b371ed148b385f2d14ebf", "releaseTime": "2011-03-31T00:00:00+02:00", "type": "old_beta", "processArguments": "legacy", @@ -261,6 +298,7 @@ }, { "id": "b1.3_01", + "checksum": "4203826f35e1036f089919032c3d19d1", "releaseTime": "2011-02-23T00:00:00+02:00", "type": "old_beta", "processArguments": "legacy", @@ -268,6 +306,7 @@ }, { "id": "b1.3b", + "checksum": "de2164df461d028229ed2e101181bbd4", "releaseTime": "2011-02-22T00:00:00+02:00", "type": "old_beta", "processArguments": "legacy", @@ -275,6 +314,7 @@ }, { "id": "b1.2_02", + "checksum": "1736c5ba4f63a981220c2a18a4120180", "releaseTime": "2011-01-21T00:00:00+02:00", "type": "old_beta", "processArguments": "legacy", @@ -282,6 +322,7 @@ }, { "id": "b1.2_01", + "checksum": "486d83ec00554b45ffa21af2faa0116a", "releaseTime": "2011-01-14T00:00:00+02:00", "type": "old_beta", "processArguments": "legacy", @@ -289,6 +330,7 @@ }, { "id": "b1.2", + "checksum": "6426223efe23c3931a4ef89685be3349", "releaseTime": "2011-01-13T00:00:00+02:00", "type": "old_beta", "processArguments": "legacy", @@ -296,6 +338,7 @@ }, { "id": "b1.1_02", + "checksum": "7d547e495a770c62054ef136add43034", "releaseTime": "2010-12-22T00:00:01+02:00", "type": "old_beta", "processArguments": "legacy", @@ -303,6 +346,7 @@ }, { "id": "b1.1_01", + "checksum": "1f9331f2bfca81b6ce2acdfc1f105837", "releaseTime": "2010-12-22T00:00:00+02:00", "type": "old_beta", "processArguments": "legacy", @@ -310,6 +354,7 @@ }, { "id": "b1.0.2", + "checksum": "d200c465b8c167cc8df6537531fc9a48", "releaseTime": "2010-12-21T00:00:00+02:00", "type": "old_beta", "processArguments": "legacy", @@ -317,6 +362,7 @@ }, { "id": "b1.0_01", + "checksum": "03bd20b870dbbd121de5dca98af4e1ce", "releaseTime": "2010-12-20T00:00:01+02:00", "type": "old_beta", "processArguments": "legacy", @@ -324,6 +370,7 @@ }, { "id": "b1.0", + "checksum": "5f8733dbbf09b4e7c874661a3c29c239", "releaseTime": "2010-12-20T00:00:00+02:00", "type": "old_beta", "processArguments": "legacy", @@ -331,6 +378,7 @@ }, { "id": "a1.2.6", + "checksum": "ddd5e39467f28d1ea1a03b4d9e790867", "releaseTime": "2010-12-03T00:00:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -338,6 +386,7 @@ }, { "id": "a1.2.5", + "checksum": "7d3a43037190970ff2e11153b5718b74", "releaseTime": "2010-12-01T00:00:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -345,6 +394,7 @@ }, { "id": "a1.2.4_01", + "checksum": "0a1cc8c668faa6dc93fc418e8b4b097a", "releaseTime": "2010-11-30T00:00:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -352,6 +402,7 @@ }, { "id": "a1.2.3_04", + "checksum": "b2c25a753c82a1cd228ce71469829dc1", "releaseTime": "2010-11-26T00:00:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -359,6 +410,7 @@ }, { "id": "a1.2.3_02", + "checksum": "3ad4808ef2ac3b65d10305315260da03", "releaseTime": "2010-11-25T00:00:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -366,6 +418,7 @@ }, { "id": "a1.2.3_01", + "checksum": "70cbab762b17c5b11fefea9b12564119", "releaseTime": "2010-11-24T00:00:01+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -373,6 +426,7 @@ }, { "id": "a1.2.3", + "checksum": "25f053114e34b915e675f82d58f08711", "releaseTime": "2010-11-24T00:00:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -380,6 +434,7 @@ }, { "id": "a1.2.2b", + "checksum": "6250fb17f8898c4d970d6bd03c229177", "releaseTime": "2010-11-10T00:00:01+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -387,6 +442,7 @@ }, { "id": "a1.2.2a", + "checksum": "0f9fe018b344fd9dd849005f9bdca803", "releaseTime": "2010-11-10T00:00:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -394,6 +450,7 @@ }, { "id": "a1.2.1_01", + "checksum": "0a496e44a7b4e2f493b5893d8e5845bd", "releaseTime": "2010-11-05T00:00:01+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -401,6 +458,7 @@ }, { "id": "a1.2.1", + "checksum": "0a496e44a7b4e2f493b5893d8e5845bd", "releaseTime": "2010-11-05T00:00:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -408,6 +466,7 @@ }, { "id": "a1.2.0_02", + "checksum": "f5bcb4d0c0e78bc220f164b89ae9bd60", "releaseTime": "2010-11-04T00:00:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -415,6 +474,7 @@ }, { "id": "a1.2.0_01", + "checksum": "b2e9333e967cb89488884c2e5c715d4f", "releaseTime": "2010-10-31T00:00:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -422,6 +482,7 @@ }, { "id": "a1.2.0", + "checksum": "44c384dae02390f700458b95d82c3e2a", "releaseTime": "2010-10-30T00:00:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -429,6 +490,7 @@ }, { "id": "a1.1.2_01", + "checksum": "94346e1b8f6ad0e4a284314f0e29207b", "releaseTime": "2010-09-23T00:00:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -436,6 +498,7 @@ }, { "id": "a1.1.2", + "checksum": "72ba1f834327805cb44164a42b331522", "releaseTime": "2010-09-20T00:00:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -443,6 +506,7 @@ }, { "id": "a1.1.0", + "checksum": "891fd93e04f5daaf35d73c58e45c01b1", "releaseTime": "2010-09-13T00:00:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -450,6 +514,7 @@ }, { "id": "a1.0.17_04", + "checksum": "16ed7dc58244772847991e504afcf02f", "releaseTime": "2010-08-23T00:00:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -457,6 +522,7 @@ }, { "id": "a1.0.17_02", + "checksum": "d89760b0871ef61a55c9f336c0439d58", "releaseTime": "2010-08-20T00:00:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -464,6 +530,7 @@ }, { "id": "a1.0.16", + "checksum": "6bbde02c13aed5766275f4398ede6aae", "releaseTime": "2010-08-12T00:00:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -471,6 +538,7 @@ }, { "id": "a1.0.15", + "checksum": "ade257d2080d56fa983763f9c701fa14", "releaseTime": "2010-08-04T00:00:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -478,6 +546,7 @@ }, { "id": "a1.0.14", + "checksum": "227d0c6fa896a231de6269a074c9a458", "releaseTime": "2010-07-30T00:00:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -485,6 +554,7 @@ }, { "id": "a1.0.11", + "checksum": "6f1b1dd157fa0df39760f5be3eab01b0", "releaseTime": "2010-07-23T00:00:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -492,6 +562,7 @@ }, { "id": "a1.0.5_01", + "checksum": "ae5f606caa18222e7568819c910ee423", "releaseTime": "2010-07-13T00:00:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -500,6 +571,7 @@ }, { "id": "a1.0.4", + "checksum": "13ce7935c3670e7494e26b2704bfa3e9", "releaseTime": "2010-07-09T00:00:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -508,6 +580,7 @@ }, { "id": "inf-20100618", + "checksum": "f5f5aa34760facc10486e906a7c60196", "releaseTime": "2010-06-16T00:00:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -517,6 +590,7 @@ }, { "id": "c0.30_01c", + "checksum": "fcfd7f83a6b27503cf48202381a5adf2", "releaseTime": "2009-12-22T00:00:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -526,6 +600,7 @@ }, { "id": "c0.0.13a_03", + "checksum": "a9527cb5aef198e0f53e235ebe13dc75", "releaseTime": "2009-05-22T00:00:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -535,6 +610,7 @@ }, { "id": "c0.0.13a", + "checksum": "3617fbf5fbfd2b837ebf5ceb63584908", "releaseTime": "2009-05-31T00:00:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -544,6 +620,7 @@ }, { "id": "c0.0.11a", + "checksum": "a6e03c2eaf74709facc0d2477648e999", "releaseTime": "2009-05-17T00:00:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -553,6 +630,7 @@ }, { "id": "rd-161348", + "checksum": "80882b8936a5c8d91500838a6660b504", "releaseTime": "2009-05-16T13:48:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -560,6 +638,7 @@ }, { "id": "rd-160052", + "checksum": "24c5cc99a2a612697ed2f7d5d04242fe", "releaseTime": "2009-05-16T00:52:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -567,6 +646,7 @@ }, { "id": "rd-132328", + "checksum": "70e33a81c541b13a477e68c1207124eb", "releaseTime": "2009-05-13T23:28:00+02:00", "type": "old_alpha", "processArguments": "legacy", @@ -574,6 +654,7 @@ }, { "id": "rd-132211", + "checksum": "99fdaea10c494b9c3c3254636b98b799", "releaseTime": "2009-05-13T22:11:00+02:00", "type": "old_alpha", "processArguments": "legacy", |