Merge pull request #1 from MultiMC/develop

Pull from main develop into robotbrain.
This commit is contained in:
robotbrain 2013-10-12 10:37:14 -07:00
commit 2f7791405c
26 changed files with 1169 additions and 675 deletions

View File

@ -22,6 +22,7 @@ Build Instructions
```bash
git clone git@github.com:MultiMC/MultiMC5.git # get the code
cd MultiMC5
git checkout develop
```
once that is done, do these commands:
@ -35,7 +36,8 @@ ccmake ..
A GUI will pop up. press the c key. now set the build prefix. if you are in /home/username/code/MultiMC5/build then put /home/username/code/MultiMC5/build/run as build prefix. if you want you can choose whatever dir you want, but then you need to adjust the path when running it. to edit the value use the up/down keys to select it and hit return to edit it. after you are done hit return again.
Also adjust the paths to your qt install.
Then hit c and g
Then hit c and g. If the window stays open (and g has no effect) retry c followed by g. sometimes you need to use c twice.
If you get an error make sure you have all dependencies installed and configured the paths properly
continue with the following commands:
@ -110,4 +112,4 @@ Getting the project to build and run on Windows is easy if you use Qt's IDE, Qt
# OS X
*There are no build instructions for OS X yet. If you can help with this section please contact us on IRC (Esper/#MultiMC)!*
*There are no build instructions for OS X yet. If you can help with this section please contact us on IRC (Esper/#MultiMC)!*

View File

@ -215,6 +215,8 @@ gui/LabeledToolButton.h
gui/LabeledToolButton.cpp
gui/EditNotesDialog.h
gui/EditNotesDialog.cpp
gui/MCModInfoFrame.h
gui/MCModInfoFrame.cpp
# Base classes and infrastructure
logic/BaseVersion.h
@ -334,6 +336,8 @@ gui/IconPickerDialog.ui
gui/LegacyModEditDialog.ui
gui/OneSixModEditDialog.ui
gui/EditNotesDialog.ui
gui/MCModInfoFrame.ui
)
set (FILES_TO_TRANSLATE ${FILES_TO_TRANSLATE} ${MULTIMC_SOURCES} ${MULTIMC_UIS})

View File

@ -47,6 +47,9 @@ LegacyModEditDialog::LegacyModEditDialog(LegacyInstance *inst, QWidget *parent)
#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
{
@ -55,6 +58,9 @@ LegacyModEditDialog::LegacyModEditDialog(LegacyInstance *inst, QWidget *parent)
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
{
@ -63,6 +69,9 @@ LegacyModEditDialog::LegacyModEditDialog(LegacyInstance *inst, QWidget *parent)
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
{
@ -201,7 +210,7 @@ void LegacyModEditDialog::on_addForgeBtn_clicked()
if (vselect.exec() && vselect.selectedVersion())
{
ForgeVersionPtr forge =
std::dynamic_pointer_cast<ForgeVersion> (vselect.selectedVersion());
std::dynamic_pointer_cast<ForgeVersion>(vselect.selectedVersion());
if (!forge)
return;
auto entry = MMC->metacache()->resolveEntry("minecraftforge", forge->filename);
@ -345,34 +354,38 @@ void LegacyModEditDialog::on_buttonBox_rejected()
close();
}
//FIXME: too much copypasta makes peterix a sad hacker. BUT IT'S SO DELICIOUS!
void LegacyModEditDialog::on_coreWebsite_clicked()
void LegacyModEditDialog::jarCurrent(QModelIndex current, QModelIndex previous)
{
int first, last;
auto list = ui->coreModsTreeView->selectionModel()->selectedRows();
if (!lastfirst(list, first, last))
if(!current.isValid())
{
ui->jarMIFrame->clear();
return;
showWebsiteForMod(this, m_coremods->operator[](first));
}
int row = current.row();
Mod &m = m_jarmods->operator[](row);
ui->jarMIFrame->updateWithMod(m);
}
void LegacyModEditDialog::on_jarWebsite_clicked()
void LegacyModEditDialog::coreCurrent(QModelIndex current, QModelIndex previous)
{
int first, last;
auto list = ui->jarModsTreeView->selectionModel()->selectedRows();
if (!lastfirst(list, first, last))
if(!current.isValid())
{
ui->coreMIFrame->clear();
return;
showWebsiteForMod(this, m_jarmods->operator[](first));
}
int row = current.row();
Mod &m = m_coremods->operator[](row);
ui->coreMIFrame->updateWithMod(m);
}
void LegacyModEditDialog::on_loaderWebsite_clicked()
void LegacyModEditDialog::loaderCurrent(QModelIndex current, QModelIndex previous)
{
int first, last;
auto list = ui->loaderModTreeView->selectionModel()->selectedRows();
if (!lastfirst(list, first, last))
if(!current.isValid())
{
ui->loaderMIFrame->clear();
return;
showWebsiteForMod(this, m_mods->operator[](first));
}
int row = current.row();
Mod &m = m_mods->operator[](row);
ui->loaderMIFrame->updateWithMod(m);
}

View File

@ -53,13 +53,13 @@ slots:
void on_rmTexPackBtn_clicked();
void on_viewTexPackBtn_clicked();
void on_jarWebsite_clicked();
void on_loaderWebsite_clicked();
void on_coreWebsite_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);

View File

@ -23,197 +23,215 @@
<attribute name="title">
<string>Jar Mods</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout">
<layout class="QVBoxLayout" name="verticalLayout_2">
<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">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="addJarBtn">
<property name="text">
<string>&amp;Add</string>
<widget class="ModListView" name="jarModsTreeView">
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOn</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="rmJarBtn">
<property name="text">
<string>&amp;Remove</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="addForgeBtn">
<property name="text">
<string>MCForge</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="jarWebsite">
<property name="text">
<string>Website</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 &amp;Up</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="moveJarDownBtn">
<property name="text">
<string>Move &amp;Down</string>
</property>
</widget>
<layout class="QVBoxLayout" name="jarModsButtonBox">
<item>
<widget class="QPushButton" name="addJarBtn">
<property name="text">
<string>&amp;Add</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="rmJarBtn">
<property name="text">
<string>&amp;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 &amp;Up</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="moveJarDownBtn">
<property name="text">
<string>Move &amp;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="QHBoxLayout" name="horizontalLayout_3">
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="ModListView" name="coreModsTreeView">
<property name="dragDropMode">
<enum>QAbstractItemView::DropOnly</enum>
</property>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="coreModsButtonBox">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QPushButton" name="addCoreBtn">
<property name="text">
<string>&amp;Add</string>
<widget class="ModListView" name="coreModsTreeView">
<property name="dragDropMode">
<enum>QAbstractItemView::DropOnly</enum>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="rmCoreBtn">
<property name="text">
<string>&amp;Remove</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="coreWebsite">
<property name="text">
<string>Website</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>&amp;View Folder</string>
</property>
</widget>
<layout class="QVBoxLayout" name="coreModsButtonBox">
<item>
<widget class="QPushButton" name="addCoreBtn">
<property name="text">
<string>&amp;Add</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="rmCoreBtn">
<property name="text">
<string>&amp;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>&amp;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="QHBoxLayout" name="horizontalLayout_2">
<layout class="QVBoxLayout" name="verticalLayout_4">
<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">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QPushButton" name="addModBtn">
<property name="text">
<string>&amp;Add</string>
<widget class="ModListView" name="loaderModTreeView">
<property name="acceptDrops">
<bool>true</bool>
</property>
<property name="dragDropMode">
<enum>QAbstractItemView::DropOnly</enum>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="rmModBtn">
<property name="text">
<string>&amp;Remove</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="loaderWebsite">
<property name="text">
<string>Website</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>&amp;View Folder</string>
</property>
</widget>
<layout class="QVBoxLayout" name="mlModsButtonBox">
<item>
<widget class="QPushButton" name="addModBtn">
<property name="text">
<string>&amp;Add</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="rmModBtn">
<property name="text">
<string>&amp;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>&amp;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">
@ -291,6 +309,12 @@
<extends>QTreeView</extends>
<header>gui/ModListView.h</header>
</customwidget>
<customwidget>
<class>MCModInfoFrame</class>
<extends>QFrame</extends>
<header>gui/MCModInfoFrame.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections/>

73
gui/MCModInfoFrame.cpp Normal file
View File

@ -0,0 +1,73 @@
/* 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 "MCModInfoFrame.h"
#include "ui_MCModInfoFrame.h"
void MCModInfoFrame::updateWithMod(Mod &m)
{
if(m.type() == m.MOD_FOLDER)
{
clear();
return;
}
QString text = "";
QString name = "";
if(m.name().isEmpty()) name = m.id();
else name = m.name();
if(m.homeurl().isEmpty()) text = name;
else text = "<a href=\"" + m.homeurl() + "\">" + name + "</a>";
if(!m.authors().isEmpty()) text += " by " + m.authors();
setModText(text);
if(m.description().isEmpty())
{
setModDescription(tr("No description provided in mcmod.info"));
}
else
{
setModDescription(m.description());
}
}
void MCModInfoFrame::clear()
{
setModText(tr("Select a mod to view title and authors..."));
setModDescription(tr("Select a mod to view description..."));
}
MCModInfoFrame::MCModInfoFrame(QWidget *parent) :
QFrame(parent),
ui(new Ui::MCModInfoFrame)
{
ui->setupUi(this);
}
MCModInfoFrame::~MCModInfoFrame()
{
delete ui;
}
void MCModInfoFrame::setModText(QString text)
{
ui->label_ModText->setText(text);
}
void MCModInfoFrame::setModDescription(QString text)
{
ui->label_ModDescription->setText(text);
}

42
gui/MCModInfoFrame.h Normal file
View File

@ -0,0 +1,42 @@
/* 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 <QFrame>
#include "logic/Mod.h"
namespace Ui
{
class MCModInfoFrame;
}
class MCModInfoFrame : public QFrame
{
Q_OBJECT
public:
explicit MCModInfoFrame(QWidget *parent = 0);
~MCModInfoFrame();
void setModText(QString text);
void setModDescription(QString text);
void updateWithMod(Mod &m);
void clear();
private:
Ui::MCModInfoFrame *ui;
};

68
gui/MCModInfoFrame.ui Normal file
View File

@ -0,0 +1,68 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MCModInfoFrame</class>
<widget class="QFrame" name="MCModInfoFrame">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>527</width>
<height>113</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>120</height>
</size>
</property>
<property name="windowTitle">
<string>Frame</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLabel" name="label_ModText">
<property name="text">
<string>Select a mod to view title and authors...</string>
</property>
<property name="textFormat">
<enum>Qt::RichText</enum>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_ModDescription">
<property name="text">
<string>Select a mod to view description...</string>
</property>
<property name="textFormat">
<enum>Qt::PlainText</enum>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -9,4 +9,5 @@ class ModListView: public QTreeView
public:
explicit ModListView ( QWidget* parent = 0 );
virtual void setModel ( QAbstractItemModel* model );
};
};

View File

@ -60,6 +60,9 @@ OneSixModEditDialog::OneSixModEditDialog(OneSixInstance *inst, QWidget *parent)
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)));
}
// resource packs
{
@ -298,12 +301,14 @@ void OneSixModEditDialog::on_viewResPackBtn_clicked()
openDirInDefaultProgram(m_inst->resourcePacksDir(), true);
}
void OneSixModEditDialog::on_loaderWebsite_clicked()
void OneSixModEditDialog::loaderCurrent(QModelIndex current, QModelIndex previous)
{
int first, last;
auto list = ui->loaderModTreeView->selectionModel()->selectedRows();
if (!lastfirst(list, first, last))
if(!current.isValid())
{
ui->frame->clear();
return;
showWebsiteForMod(this, m_mods->operator[](first));
}
int row = current.row();
Mod &m = m_mods->operator[](row);
ui->frame->updateWithMod(m);
}

View File

@ -1,9 +1,9 @@
/* 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
@ -19,23 +19,25 @@
#include <logic/OneSixInstance.h>
class EnabledItemFilter;
namespace Ui {
class OneSixModEditDialog;
namespace Ui
{
class OneSixModEditDialog;
}
class OneSixModEditDialog : public QDialog
{
Q_OBJECT
public:
explicit OneSixModEditDialog(OneSixInstance* inst, QWidget *parent = 0);
explicit OneSixModEditDialog(OneSixInstance *inst, QWidget *parent = 0);
virtual ~OneSixModEditDialog();
private slots:
private
slots:
void on_addModBtn_clicked();
void on_rmModBtn_clicked();
void on_viewModBtn_clicked();
void on_addResPackBtn_clicked();
void on_rmResPackBtn_clicked();
void on_viewResPackBtn_clicked();
@ -44,18 +46,22 @@ private slots:
void on_forgeBtn_clicked();
void on_customizeBtn_clicked();
void on_revertBtn_clicked();
void on_loaderWebsite_clicked();
void updateVersionControls();
void updateVersionControls();
void disableVersionControls();
protected:
bool eventFilter(QObject *obj, QEvent *ev);
bool loaderListFilter( QKeyEvent* ev );
bool resourcePackListFilter( QKeyEvent* ev );
bool loaderListFilter(QKeyEvent *ev);
bool resourcePackListFilter(QKeyEvent *ev);
private:
Ui::OneSixModEditDialog *ui;
std::shared_ptr<OneSixVersion> m_version;
std::shared_ptr<ModList> m_mods;
std::shared_ptr<ModList> m_resourcepacks;
EnabledItemFilter * main_model;
OneSixInstance * m_inst;
EnabledItemFilter *main_model;
OneSixInstance *m_inst;
public
slots:
void loaderCurrent(QModelIndex current, QModelIndex previous);
};

View File

@ -26,7 +26,7 @@
</size>
</property>
<property name="currentIndex">
<number>0</number>
<number>1</number>
</property>
<widget class="QWidget" name="libTab">
<attribute name="title">
@ -157,62 +157,79 @@
<attribute name="title">
<string>Loader Mods</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<layout class="QVBoxLayout" name="verticalLayout_6">
<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="verticalLayout_2">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QPushButton" name="addModBtn">
<property name="text">
<string>&amp;Add</string>
</property>
</widget>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="ModListView" name="loaderModTreeView">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="acceptDrops">
<bool>true</bool>
</property>
<property name="dragDropMode">
<enum>QAbstractItemView::DropOnly</enum>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QPushButton" name="rmModBtn">
<property name="text">
<string>&amp;Remove</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="loaderWebsite">
<property name="text">
<string>Website</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<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>&amp;View Folder</string>
</property>
</widget>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QPushButton" name="addModBtn">
<property name="text">
<string>&amp;Add</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="rmModBtn">
<property name="text">
<string>&amp;Remove</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<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>&amp;View Folder</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<widget class="MCModInfoFrame" name="frame">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="resPackTab">
@ -290,6 +307,12 @@
<extends>QTreeView</extends>
<header>gui/ModListView.h</header>
</customwidget>
<customwidget>
<class>MCModInfoFrame</class>
<extends>QFrame</extends>
<header>gui/MCModInfoFrame.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections/>

View File

@ -96,7 +96,7 @@
<item>
<widget class="QToolBox" name="toolBox">
<property name="currentIndex">
<number>0</number>
<number>1</number>
</property>
<widget class="QWidget" name="aboutPage">
<property name="geometry">
@ -104,7 +104,7 @@
<x>0</x>
<y>0</y>
<width>432</width>
<height>197</height>
<height>203</height>
</rect>
</property>
<attribute name="label">
@ -163,7 +163,7 @@
<x>0</x>
<y>0</y>
<width>432</width>
<height>197</height>
<height>203</height>
</rect>
</property>
<attribute name="label">
@ -179,11 +179,22 @@
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:11pt;&quot;&gt;Andrew Okin &amp;lt;&lt;/span&gt;&lt;a href=&quot;mailto:forkk@forkk.net&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:11pt; text-decoration: underline; color:#0000ff;&quot;&gt;forkk@forkk.net&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:11pt;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:11pt;&quot;&gt;Petr Mrázek &amp;lt;&lt;/span&gt;&lt;a href=&quot;mailto:peterix@gmail.com&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:11pt; text-decoration: underline; color:#0000ff;&quot;&gt;peterix@gmail.com&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:11pt;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:11pt;&quot;&gt;Orochimarufan &amp;lt;&lt;/span&gt;&lt;a href=&quot;mailto:orochimarufan.x3@gmail.com&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:11pt; text-decoration: underline; color:#0000ff;&quot;&gt;orochimarufan.x3@gmail.com&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:11pt;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:11pt;&quot;&gt;Sky Welch &amp;lt;&lt;/span&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:11pt; text-decoration: underline; color:#0000ff;&quot;&gt;multimc@bunnies.cc&lt;/span&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:11pt;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Ubuntu'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:11pt;&quot;&gt;Andrew Okin &amp;lt;&lt;/span&gt;&lt;a href=&quot;mailto:forkk@forkk.net&quot;&gt;&lt;span style=&quot; font-size:11pt; text-decoration: underline; color:#0000ff;&quot;&gt;forkk@forkk.net&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:11pt;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:11pt;&quot;&gt;Petr Mrázek &amp;lt;&lt;/span&gt;&lt;a href=&quot;mailto:peterix@gmail.com&quot;&gt;&lt;span style=&quot; font-size:11pt; text-decoration: underline; color:#0000ff;&quot;&gt;peterix@gmail.com&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:11pt;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:11pt;&quot;&gt;Orochimarufan &amp;lt;&lt;/span&gt;&lt;a href=&quot;mailto:orochimarufan.x3@gmail.com&quot;&gt;&lt;span style=&quot; font-size:11pt; text-decoration: underline; color:#0000ff;&quot;&gt;orochimarufan.x3@gmail.com&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:11pt;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:11pt;&quot;&gt;Sky Welch &amp;lt;&lt;/span&gt;&lt;span style=&quot; font-size:11pt; text-decoration: underline; color:#0000ff;&quot;&gt;multimc@bunnies.cc&lt;/span&gt;&lt;span style=&quot; font-size:11pt;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:11pt;&quot;&gt;Kilobyte &amp;lt;&lt;/span&gt;&lt;a href=&quot;mailto:stiepen22@gmx.de&quot;&gt;&lt;span style=&quot; font-size:11pt; text-decoration: underline; color:#0000ff;&quot;&gt;stiepen22@gmx.de&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:11pt;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="translationInfo">
<property name="text">
<string extracomment="Hey, Translator, feel free to put credit to you here">No Language file loaded.</string>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
@ -195,7 +206,7 @@ p, li { white-space: pre-wrap; }
<x>0</x>
<y>0</y>
<width>432</width>
<height>197</height>
<height>203</height>
</rect>
</property>
<attribute name="label">
@ -217,45 +228,45 @@ p, li { white-space: pre-wrap; }
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;Copyright 2012 MultiMC Contributors&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;you may not use this file except in compliance with the License.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;You may obtain a copy of the License at&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt; http://www.apache.org/licenses/LICENSE-2.0&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;Unless required by applicable law or agreed to in writing, software&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;See the License for the specific language governing permissions and&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;limitations under the License.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;MultiMC uses QSLog, &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;Copyright (c) 2010, Razvan Petru&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;All rights reserved.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;Redistribution and use in source and binary forms, with or without modification,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;are permitted provided that the following conditions are met:&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;* Redistributions of source code must retain the above copyright notice, this&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt; list of conditions and the following disclaimer.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;* Redistributions in binary form must reproduce the above copyright notice, this&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt; list of conditions and the following disclaimer in the documentation and/or other&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt; materials provided with the distribution.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;* The name of the contributors may not be used to endorse or promote products&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt; derived from this software without specific prior written permission.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &amp;quot;AS IS&amp;quot; AND&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt;&quot;&gt;OF THE POSSIBILITY OF SUCH DAMAGE.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Ubuntu'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Copyright 2012 MultiMC Contributors&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;you may not use this file except in compliance with the License.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;You may obtain a copy of the License at&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt; http://www.apache.org/licenses/LICENSE-2.0&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Unless required by applicable law or agreed to in writing, software&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;See the License for the specific language governing permissions and&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;limitations under the License.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;MultiMC uses QSLog, &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Copyright (c) 2010, Razvan Petru&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;All rights reserved.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Redistribution and use in source and binary forms, with or without modification,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;are permitted provided that the following conditions are met:&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;* Redistributions of source code must retain the above copyright notice, this&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt; list of conditions and the following disclaimer.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;* Redistributions in binary form must reproduce the above copyright notice, this&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt; list of conditions and the following disclaimer in the documentation and/or other&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt; materials provided with the distribution.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;* The name of the contributors may not be used to endorse or promote products&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt; derived from this software without specific prior written permission.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &amp;quot;AS IS&amp;quot; AND&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;OF THE POSSIBILITY OF SUCH DAMAGE.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>

View File

@ -507,10 +507,11 @@ void MainWindow::onLoginComplete()
}
else
{
ProgressDialog *tDialog = new ProgressDialog(this);
ProgressDialog tDialog(this);
connect(updateTask, SIGNAL(succeeded()), SLOT(onGameUpdateComplete()));
connect(updateTask, SIGNAL(failed(QString)), SLOT(onGameUpdateError(QString)));
tDialog->exec(updateTask);
tDialog.exec(updateTask);
delete updateTask;
}
}
@ -605,6 +606,15 @@ void MainWindow::on_actionChangeInstMCVersion_triggered()
vselect.setFilter(1, "OneSix");
if (vselect.exec() && vselect.selectedVersion())
{
if (m_selectedInstance->versionIsCustom())
{
auto result = QMessageBox::warning(
this, tr("Are you sure?"),
tr("This will remove any library/version customization you did previously. "
"This includes things like Forge install and similar."), QMessageBox::Ok, QMessageBox::Abort);
if(result != QMessageBox::Ok)
return;
}
m_selectedInstance->setIntendedVersionId(vselect.selectedVersion()->descriptor());
}
}

View File

@ -3,7 +3,7 @@
* 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
@ -33,9 +33,9 @@ class BaseInstancePrivate;
/*!
* \brief Base class for instances.
* This class implements many functions that are common between instances and
* This class implements many functions that are common between instances and
* provides a standard interface for all instances.
*
*
* To create a new instance type, create a new class inheriting from this class
* and implement the pure virtual functions.
*/
@ -44,66 +44,72 @@ class BaseInstance : public QObject
Q_OBJECT
protected:
/// no-touchy!
BaseInstance(BaseInstancePrivate * d, const QString &rootDir, SettingsObject * settings, QObject *parent = 0);
BaseInstance(BaseInstancePrivate *d, const QString &rootDir, SettingsObject *settings,
QObject *parent = 0);
public:
/// virtual destructor to make sure the destruction is COMPLETE
virtual ~BaseInstance() {};
/// nuke thoroughly - deletes the instance contents, notifies the list/model which is responsible of cleaning up the husk
/// nuke thoroughly - deletes the instance contents, notifies the list/model which is
/// responsible of cleaning up the husk
void nuke();
/// The instance's ID. The ID SHALL be determined by MMC internally. The ID IS guaranteed to be unique.
/// The instance's ID. The ID SHALL be determined by MMC internally. The ID IS guaranteed to
/// be unique.
QString id() const;
/// get the type of this instance
QString instanceType() const;
/// Path to the instance's root directory.
QString instanceRoot() const;
/// Path to the instance's minecraft directory.
QString minecraftRoot() const;
QString name() const;
void setName(QString val);
QString iconKey() const;
void setIconKey(QString val);
QString notes() const;
void setNotes(QString val);
QString group() const;
void setGroupInitial(QString val);
void setGroupPost(QString val);
virtual QString intendedVersionId() const = 0;
virtual bool setIntendedVersionId(QString version) = 0;
virtual bool versionIsCustom() = 0;
/*!
* The instance's current version.
* This value represents the instance's current version. If this value is
* This value represents the instance's current version. If this value is
* different from the intendedVersion, the instance should be updated.
* \warning Don't change this value unless you know what you're doing.
*/
virtual QString currentVersionId() const = 0;
//virtual void setCurrentVersionId(QString val) = 0;
// virtual void setCurrentVersionId(QString val) = 0;
/*!
* Whether or not Minecraft should be downloaded when the instance is launched.
*/
virtual bool shouldUpdate() const = 0;
virtual void setShouldUpdate(bool val) = 0;
/// Get the curent base jar of this instance. By default, it's the versions/$version/$version.jar
/// Get the curent base jar of this instance. By default, it's the
/// versions/$version/$version.jar
QString baseJar() const;
/// the default base jar of this instance
virtual QString defaultBaseJar() const = 0;
/// the default custom base jar of this instance
virtual QString defaultCustomBaseJar() const = 0;
/*!
* Whether or not custom base jar is used
*/
@ -114,7 +120,7 @@ public:
*/
QString customBaseJar() const;
void setCustomBaseJar(QString val);
/**
* Gets the time that the instance was last launched.
* Stored in milliseconds since epoch.
@ -122,53 +128,54 @@ public:
qint64 lastLaunch() const;
/// Sets the last launched time to 'val' milliseconds since epoch
void setLastLaunch(qint64 val = QDateTime::currentMSecsSinceEpoch());
/*!
* \brief Gets the instance list that this instance is a part of.
* Returns NULL if this instance is not in a list
* \brief Gets the instance list that this instance is a part of.
* Returns NULL if this instance is not in a list
* (the parent is not an InstanceList).
* \return A pointer to the InstanceList containing this instance.
* \return A pointer to the InstanceList containing this instance.
*/
InstanceList *instList() const;
/*!
* \brief Gets a pointer to this instance's version list.
* \return A pointer to the available version list for this instance.
*/
virtual std::shared_ptr<BaseVersionList> versionList() const;
/*!
* \brief Gets this instance's settings object.
* This settings object stores instance-specific settings.
* \return A pointer to this instance's settings object.
*/
virtual SettingsObject &settings() const;
/// returns a valid update task if update is needed, NULL otherwise
virtual BaseUpdate* doUpdate() = 0;
virtual BaseUpdate *doUpdate() = 0;
/// returns a valid minecraft process, ready for launch
virtual MinecraftProcess* prepareForLaunch(LoginResponse response) = 0;
/// do any necessary cleanups after the instance finishes. also runs before 'prepareForLaunch'
virtual MinecraftProcess *prepareForLaunch(LoginResponse response) = 0;
/// do any necessary cleanups after the instance finishes. also runs before
/// 'prepareForLaunch'
virtual void cleanupAfterRun() = 0;
/// create a mod edit dialog for the instance
virtual QDialog * createModEditDialog ( QWidget* parent ) = 0;
virtual QDialog *createModEditDialog(QWidget *parent) = 0;
/// is a particular action enabled with this instance selected?
virtual bool menuActionEnabled(QString action_name) const = 0;
virtual QString getStatusbarDescription() = 0;
/// FIXME: this really should be elsewhere...
virtual QString instanceConfigFolder() const = 0;
signals:
/*!
* \brief Signal emitted when properties relevant to the instance view change
*/
void propertiesChanged(BaseInstance * inst);
void propertiesChanged(BaseInstance *inst);
/*!
* \brief Signal emitted when groups are affected in any way
*/
@ -176,12 +183,11 @@ signals:
/*!
* \brief The instance just got nuked. Hurray!
*/
void nuked(BaseInstance * inst);
void nuked(BaseInstance *inst);
protected:
std::shared_ptr<BaseInstancePrivate> inst_d;
};
// pointer for lazy people
typedef std::shared_ptr<BaseInstance> InstancePtr;

View File

@ -14,8 +14,9 @@
#define LAUNCHER_FILE "MultiMCLauncher.jar"
LegacyInstance::LegacyInstance(const QString& rootDir, SettingsObject* settings, QObject* parent)
:BaseInstance( new LegacyInstancePrivate(),rootDir, settings, parent)
LegacyInstance::LegacyInstance(const QString &rootDir, SettingsObject *settings,
QObject *parent)
: BaseInstance(new LegacyInstancePrivate(), rootDir, settings, parent)
{
settings->registerSetting(new Setting("NeedsRebuild", true));
settings->registerSetting(new Setting("ShouldUpdate", false));
@ -24,50 +25,51 @@ LegacyInstance::LegacyInstance(const QString& rootDir, SettingsObject* settings,
settings->registerSetting(new Setting("IntendedJarVersion", ""));
}
BaseUpdate* LegacyInstance::doUpdate()
BaseUpdate *LegacyInstance::doUpdate()
{
auto list = jarModList();
return new LegacyUpdate(this, this);
}
MinecraftProcess* LegacyInstance::prepareForLaunch(LoginResponse response)
MinecraftProcess *LegacyInstance::prepareForLaunch(LoginResponse response)
{
MinecraftProcess * proc = new MinecraftProcess(this);
MinecraftProcess *proc = new MinecraftProcess(this);
QIcon icon = MMC->icons()->getIcon(iconKey());
auto pixmap = icon.pixmap(128,128);
pixmap.save(PathCombine(minecraftRoot(), "icon.png"),"PNG");
auto pixmap = icon.pixmap(128, 128);
pixmap.save(PathCombine(minecraftRoot(), "icon.png"), "PNG");
// extract the legacy launcher
QFile(":/launcher/launcher.jar").copy(PathCombine(minecraftRoot(), LAUNCHER_FILE));
// set the process arguments
{
QStringList args;
// window size
QString windowSize;
if (settings().get("LaunchMaximized").toBool())
windowSize = "max";
else
windowSize = QString("%1x%2").
arg(settings().get("MinecraftWinWidth").toInt()).
arg(settings().get("MinecraftWinHeight").toInt());
windowSize = QString("%1x%2").arg(settings().get("MinecraftWinWidth").toInt()).arg(
settings().get("MinecraftWinHeight").toInt());
// window title
QString windowTitle;
windowTitle.append("MultiMC: ").append(name());
// Java arguments
args.append(Util::Commandline::splitArgs(settings().get("JvmArgs").toString()));
#ifdef OSX
// OSX dock icon and name
args << "-Xdock:icon=icon.png";
args << QString("-Xdock:name=\"%1\"").arg(windowTitle);
#endif
QString lwjgl = QDir(MMC->settings()->get("LWJGLDir").toString() + "/" + lwjglVersion()).absolutePath();
QString lwjgl = QDir(MMC->settings()->get("LWJGLDir").toString() + "/" + lwjglVersion())
.absolutePath();
// launcher arguments
args << QString("-Xms%1m").arg(settings().get("MinMemAlloc").toInt());
args << QString("-Xmx%1m").arg(settings().get("MaxMemAlloc").toInt());
@ -80,41 +82,39 @@ MinecraftProcess* LegacyInstance::prepareForLaunch(LoginResponse response)
args << lwjgl;
proc->setMinecraftArguments(args);
}
// set the process work path
proc->setMinecraftWorkdir(minecraftRoot());
return proc;
}
void LegacyInstance::cleanupAfterRun()
{
//FIXME: delete the launcher and icons and whatnot.
// FIXME: delete the launcher and icons and whatnot.
}
std::shared_ptr< ModList > LegacyInstance::coreModList()
std::shared_ptr<ModList> LegacyInstance::coreModList()
{
I_D(LegacyInstance);
if(!d->core_mod_list)
if (!d->core_mod_list)
{
d->core_mod_list.reset(new ModList(coreModsDir()));
}
else
d->core_mod_list->update();
d->core_mod_list->update();
return d->core_mod_list;
}
std::shared_ptr< ModList > LegacyInstance::jarModList()
std::shared_ptr<ModList> LegacyInstance::jarModList()
{
I_D(LegacyInstance);
if(!d->jar_mod_list)
if (!d->jar_mod_list)
{
auto list = new ModList(jarModsDir(), modListFile());
connect(list, SIGNAL(changed()), SLOT(jarModsChanged()));
d->jar_mod_list.reset(list);
}
else
d->jar_mod_list->update();
d->jar_mod_list->update();
return d->jar_mod_list;
}
@ -123,38 +123,33 @@ void LegacyInstance::jarModsChanged()
setShouldRebuild(true);
}
std::shared_ptr< ModList > LegacyInstance::loaderModList()
std::shared_ptr<ModList> LegacyInstance::loaderModList()
{
I_D(LegacyInstance);
if(!d->loader_mod_list)
if (!d->loader_mod_list)
{
d->loader_mod_list.reset(new ModList(loaderModsDir()));
}
else
d->loader_mod_list->update();
d->loader_mod_list->update();
return d->loader_mod_list;
}
std::shared_ptr< ModList > LegacyInstance::texturePackList()
std::shared_ptr<ModList> LegacyInstance::texturePackList()
{
I_D(LegacyInstance);
if(!d->texture_pack_list)
if (!d->texture_pack_list)
{
d->texture_pack_list.reset(new ModList(texturePacksDir()));
}
else
d->texture_pack_list->update();
d->texture_pack_list->update();
return d->texture_pack_list;
}
QDialog * LegacyInstance::createModEditDialog ( QWidget* parent )
QDialog *LegacyInstance::createModEditDialog(QWidget *parent)
{
return new LegacyModEditDialog(this, parent);
}
QString LegacyInstance::jarModsDir() const
{
return PathCombine(instanceRoot(), "instMods");
@ -204,7 +199,6 @@ QString LegacyInstance::instanceConfigFolder() const
return PathCombine(minecraftRoot(), "config");
}
/*
bool LegacyInstance::shouldUpdateCurrentVersion() const
{
@ -215,21 +209,22 @@ bool LegacyInstance::shouldUpdateCurrentVersion() const
void LegacyInstance::updateCurrentVersion(bool keepCurrent)
{
QFileInfo jar(runnableJar());
if(!jar.exists())
{
setLastCurrentVersionUpdate(0);
setCurrentVersionId("Unknown");
return;
}
qint64 time = jar.lastModified().toUTC().toMSecsSinceEpoch();
setLastCurrentVersionUpdate(time);
if (!keepCurrent)
{
// TODO: Implement GetMinecraftJarVersion function.
QString newVersion = "Unknown";//javautils::GetMinecraftJarVersion(jar.absoluteFilePath());
QString newVersion =
"Unknown";//javautils::GetMinecraftJarVersion(jar.absoluteFilePath());
setCurrentVersionId(newVersion);
}
}
@ -247,41 +242,41 @@ void LegacyInstance::setLastCurrentVersionUpdate ( qint64 val )
bool LegacyInstance::shouldRebuild() const
{
I_D(LegacyInstance);
return d->m_settings->get ( "NeedsRebuild" ).toBool();
return d->m_settings->get("NeedsRebuild").toBool();
}
void LegacyInstance::setShouldRebuild ( bool val )
void LegacyInstance::setShouldRebuild(bool val)
{
I_D(LegacyInstance);
d->m_settings->set ( "NeedsRebuild", val );
d->m_settings->set("NeedsRebuild", val);
}
QString LegacyInstance::currentVersionId() const
{
I_D(LegacyInstance);
return d->m_settings->get ( "JarVersion" ).toString();
return d->m_settings->get("JarVersion").toString();
}
void LegacyInstance::setCurrentVersionId ( QString val )
void LegacyInstance::setCurrentVersionId(QString val)
{
I_D(LegacyInstance);
d->m_settings->set ( "JarVersion", val );
d->m_settings->set("JarVersion", val);
}
QString LegacyInstance::lwjglVersion() const
{
I_D(LegacyInstance);
return d->m_settings->get ( "LwjglVersion" ).toString();
return d->m_settings->get("LwjglVersion").toString();
}
void LegacyInstance::setLWJGLVersion ( QString val )
void LegacyInstance::setLWJGLVersion(QString val)
{
I_D(LegacyInstance);
d->m_settings->set ( "LwjglVersion", val );
d->m_settings->set("LwjglVersion", val);
}
QString LegacyInstance::intendedVersionId() const
{
I_D(LegacyInstance);
return d->m_settings->get ( "IntendedJarVersion" ).toString();
return d->m_settings->get("IntendedJarVersion").toString();
}
bool LegacyInstance::setIntendedVersionId ( QString version )
bool LegacyInstance::setIntendedVersionId(QString version)
{
settings().set("IntendedJarVersion", version);
setShouldUpdate(true);
@ -290,16 +285,16 @@ bool LegacyInstance::setIntendedVersionId ( QString version )
bool LegacyInstance::shouldUpdate() const
{
I_D(LegacyInstance);
QVariant var = settings().get ( "ShouldUpdate" );
if ( !var.isValid() || var.toBool() == false )
QVariant var = settings().get("ShouldUpdate");
if (!var.isValid() || var.toBool() == false)
{
return intendedVersionId() != currentVersionId();
}
return true;
}
void LegacyInstance::setShouldUpdate ( bool val )
void LegacyInstance::setShouldUpdate(bool val)
{
settings().set ( "ShouldUpdate", val );
settings().set("ShouldUpdate", val);
}
QString LegacyInstance::defaultBaseJar() const
@ -312,7 +307,7 @@ QString LegacyInstance::defaultCustomBaseJar() const
return PathCombine(binDir(), "mcbackup.jar");
}
bool LegacyInstance::menuActionEnabled ( QString action_name ) const
bool LegacyInstance::menuActionEnabled(QString action_name) const
{
if (action_name == "actionChangeInstMCVersion")
return false;
@ -321,7 +316,7 @@ bool LegacyInstance::menuActionEnabled ( QString action_name ) const
QString LegacyInstance::getStatusbarDescription()
{
if(shouldUpdate())
if (shouldUpdate())
return "Legacy : " + currentVersionId() + " -> " + intendedVersionId();
else
return "Legacy : " + currentVersionId();

View File

@ -9,21 +9,22 @@ class LegacyInstance : public BaseInstance
{
Q_OBJECT
public:
explicit LegacyInstance(const QString &rootDir, SettingsObject * settings, QObject *parent = 0);
explicit LegacyInstance(const QString &rootDir, SettingsObject *settings,
QObject *parent = 0);
/// Path to the instance's minecraft.jar
QString runnableJar() const;
//! Path to the instance's modlist file.
QString modListFile() const;
////// Mod Lists //////
std::shared_ptr<ModList> jarModList();
std::shared_ptr<ModList> coreModList();
std::shared_ptr<ModList> loaderModList();
std::shared_ptr<ModList> texturePackList();
////// Directories //////
QString savesDir() const;
QString texturePacksDir() const;
@ -33,40 +34,47 @@ public:
QString coreModsDir() const;
QString resourceDir() const;
virtual QString instanceConfigFolder() const;
/*!
* Whether or not the instance's minecraft.jar needs to be rebuilt.
* If this is true, when the instance launches, its jar mods will be
* If this is true, when the instance launches, its jar mods will be
* re-added to a fresh minecraft.jar file.
*/
bool shouldRebuild() const;
void setShouldRebuild(bool val);
virtual QString currentVersionId() const;
virtual void setCurrentVersionId(QString val);
//! The version of LWJGL that this instance uses.
QString lwjglVersion() const;
/// st the version of LWJGL libs this instance will use
void setLWJGLVersion(QString val);
virtual QString intendedVersionId() const;
virtual bool setIntendedVersionId ( QString version );
virtual bool setIntendedVersionId(QString version);
// the `version' of Legacy instances is defined by the launcher code.
// in contrast with OneSix, where `version' is described in a json file
virtual bool versionIsCustom() override
{
return false;
};
virtual bool shouldUpdate() const;
virtual void setShouldUpdate(bool val);
virtual BaseUpdate* doUpdate();
virtual MinecraftProcess* prepareForLaunch(LoginResponse response);
virtual BaseUpdate *doUpdate();
virtual MinecraftProcess *prepareForLaunch(LoginResponse response);
virtual void cleanupAfterRun();
virtual QDialog * createModEditDialog ( QWidget* parent );
virtual QDialog *createModEditDialog(QWidget *parent);
virtual QString defaultBaseJar() const;
virtual QString defaultCustomBaseJar() const;
bool menuActionEnabled ( QString action_name ) const;
bool menuActionEnabled(QString action_name) const;
virtual QString getStatusbarDescription();
protected slots:
protected
slots:
virtual void jarModsChanged();
};

View File

@ -57,7 +57,7 @@ void LegacyUpdate::lwjglStart()
auto worker = MMC->qnam();
QNetworkRequest req(realUrl);
req.setRawHeader("Host", hostname.toLatin1());
req.setHeader(QNetworkRequest::UserAgentHeader, "Wget/1.14 (linux-gnu)");
req.setHeader(QNetworkRequest::UserAgentHeader, "MultiMC/5.0 (Cached)");
QNetworkReply *rep = worker->get(req);
m_reply = std::shared_ptr<QNetworkReply>(rep);
@ -100,7 +100,7 @@ void LegacyUpdate::lwjglFinished(QNetworkReply *reply)
QString hostname = realUrl.host();
QNetworkRequest req(redirectedTo);
req.setRawHeader("Host", hostname.toLatin1());
req.setHeader(QNetworkRequest::UserAgentHeader, "Wget/1.14 (linux-gnu)");
req.setHeader(QNetworkRequest::UserAgentHeader, "MultiMC/5.0 (Cached)");
QNetworkReply *rep = worker->get(req);
connect(rep, SIGNAL(downloadProgress(qint64, qint64)),
SIGNAL(progress(qint64, qint64)));

View File

@ -119,6 +119,18 @@ void Mod::ReadMCModInfo(QByteArray contents)
m_name = firstObj.value("name").toString();
m_version = firstObj.value("version").toString();
m_homeurl = firstObj.value("url").toString();
m_description = firstObj.value("description").toString();
QJsonArray authors = firstObj.value("authors").toArray();
if(authors.size() == 0) m_authors = "";
else if(authors.size() >= 1)
{
m_authors = authors.at(0).toString();
for(int i = 1; i < authors.size(); i++)
{
m_authors += ", " + authors.at(i).toString();
}
}
m_credits = firstObj.value("credits").toString();
return;
}
;

View File

@ -63,6 +63,21 @@ public:
return m_homeurl;
}
QString description() const
{
return m_description;
}
QString authors() const
{
return m_authors;
}
QString credits() const
{
return m_credits;
}
// delete all the files of this mod
bool destroy();
// replace this mod with a copy of the other
@ -99,6 +114,9 @@ protected:
QString m_version;
QString m_mcversion;
QString m_homeurl;
QString m_description;
QString m_authors;
QString m_credits;
ModType m_type;
};

View File

@ -1,12 +1,12 @@
//
//
// 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.
@ -23,22 +23,23 @@
#include <QFileSystemWatcher>
#include <logger/QsLog.h>
ModList::ModList ( const QString& dir, const QString& list_file )
: QAbstractListModel(), m_dir(dir), m_list_file(list_file)
ModList::ModList(const QString &dir, const QString &list_file)
: QAbstractListModel(), m_dir(dir), m_list_file(list_file)
{
m_dir.setFilter(QDir::Readable | QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs | QDir::NoSymLinks);
m_dir.setFilter(QDir::Readable | QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs |
QDir::NoSymLinks);
m_dir.setSorting(QDir::Name);
m_list_id = QUuid::createUuid().toString();
m_watcher = new QFileSystemWatcher(this);
is_watching = false;
connect(m_watcher,SIGNAL(directoryChanged(QString)), this, SLOT(directoryChanged(QString)));
update();
connect(m_watcher, SIGNAL(directoryChanged(QString)), this,
SLOT(directoryChanged(QString)));
}
void ModList::startWatching()
{
is_watching = m_watcher->addPath(m_dir.absolutePath());
if(is_watching)
if (is_watching)
QLOG_INFO() << "Started watching " << m_dir.absolutePath();
else
QLOG_INFO() << "Failed to start watching " << m_dir.absolutePath();
@ -47,32 +48,31 @@ void ModList::startWatching()
void ModList::stopWatching()
{
is_watching = !m_watcher->removePath(m_dir.absolutePath());
if(!is_watching)
if (!is_watching)
QLOG_INFO() << "Stopped watching " << m_dir.absolutePath();
else
QLOG_INFO() << "Failed to stop watching " << m_dir.absolutePath();
}
bool ModList::update()
{
if (!isValid())
return false;
QList<Mod> newMods;
m_dir.refresh();
auto folderContents = m_dir.entryInfoList();
bool orderWasInvalid = false;
// first, process the ordered items (if any)
int currentOrderIndex = 0;
QStringList listOrder = readListFile();
for(auto item: listOrder)
for (auto item : listOrder)
{
QFileInfo info (m_dir.filePath(item));
QFileInfo info(m_dir.filePath(item));
int idx = folderContents.indexOf(info);
// if the file from the index file exists
if(idx != -1)
if (idx != -1)
{
// remove from the actual folder contents list
folderContents.takeAt(idx);
@ -84,26 +84,27 @@ bool ModList::update()
orderWasInvalid = true;
}
}
for(auto entry: folderContents)
for (auto entry : folderContents)
{
newMods.append(Mod(entry));
}
if(mods.size() != newMods.size())
if (mods.size() != newMods.size())
{
orderWasInvalid = true;
}
else for(int i = 0; i < mods.size(); i++)
{
if(!mods[i].strongCompare(newMods[i]))
else
for (int i = 0; i < mods.size(); i++)
{
orderWasInvalid = true;
break;
if (!mods[i].strongCompare(newMods[i]))
{
orderWasInvalid = true;
break;
}
}
}
beginResetModel();
mods.swap(newMods);
endResetModel();
if(orderWasInvalid)
if (orderWasInvalid)
{
saveListFile();
emit changed();
@ -111,22 +112,21 @@ bool ModList::update()
return true;
}
void ModList::directoryChanged ( QString path )
void ModList::directoryChanged(QString path)
{
update();
}
QStringList ModList::readListFile()
{
QStringList stringList;
if(m_list_file.isNull() || m_list_file.isEmpty())
if (m_list_file.isNull() || m_list_file.isEmpty())
return stringList;
QFile textFile(m_list_file);
if(!textFile.open(QIODevice::ReadOnly | QIODevice::Text))
if (!textFile.open(QIODevice::ReadOnly | QIODevice::Text))
return QStringList();
QTextStream textStream(&textFile);
while (true)
{
@ -144,13 +144,13 @@ QStringList ModList::readListFile()
bool ModList::saveListFile()
{
if(m_list_file.isNull() || m_list_file.isEmpty())
if (m_list_file.isNull() || m_list_file.isEmpty())
return false;
QFile textFile(m_list_file);
if(!textFile.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate))
if (!textFile.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate))
return false;
QTextStream textStream(&textFile);
for(auto mod:mods)
for (auto mod : mods)
{
auto pathname = mod.filename();
QString filename = pathname.fileName();
@ -160,29 +160,28 @@ bool ModList::saveListFile()
return false;
}
bool ModList::isValid()
{
return m_dir.exists() && m_dir.isReadable();
}
bool ModList::installMod ( const QFileInfo& filename, int index )
bool ModList::installMod(const QFileInfo &filename, int index)
{
if(!filename.exists() || !filename.isReadable() || index < 0)
if (!filename.exists() || !filename.isReadable() || index < 0)
{
return false;
}
Mod m(filename);
if(!m.valid())
if (!m.valid())
return false;
// if it's already there, replace the original mod (in place)
int idx = mods.indexOf(m);
if(idx != -1)
if (idx != -1)
{
if(mods[idx].replace(m))
if (mods[idx].replace(m))
{
auto left = this->index(index);
auto right = this->index(index, columnCount(QModelIndex()) - 1);
emit dataChanged(left, right);
@ -192,33 +191,33 @@ bool ModList::installMod ( const QFileInfo& filename, int index )
}
return false;
}
auto type = m.type();
if(type == Mod::MOD_UNKNOWN)
if (type == Mod::MOD_UNKNOWN)
return false;
if(type == Mod::MOD_SINGLEFILE || type == Mod::MOD_ZIPFILE)
if (type == Mod::MOD_SINGLEFILE || type == Mod::MOD_ZIPFILE)
{
QString newpath = PathCombine(m_dir.path(), filename.fileName());
if(!QFile::copy(filename.filePath(), newpath))
if (!QFile::copy(filename.filePath(), newpath))
return false;
m.repath(newpath);
beginInsertRows(QModelIndex(), index, index);
mods.insert(index,m);
mods.insert(index, m);
endInsertRows();
saveListFile();
emit changed();
return true;
}
else if(type == Mod::MOD_FOLDER)
else if (type == Mod::MOD_FOLDER)
{
QString from = filename.filePath();
QString to = PathCombine(m_dir.path(), filename.fileName());
if(!copyPath(from, to))
if (!copyPath(from, to))
return false;
m.repath(to);
beginInsertRows(QModelIndex(), index, index);
mods.insert(index,m);
mods.insert(index, m);
endInsertRows();
saveListFile();
emit changed();
@ -227,12 +226,12 @@ bool ModList::installMod ( const QFileInfo& filename, int index )
return false;
}
bool ModList::deleteMod ( int index )
bool ModList::deleteMod(int index)
{
if(index >= mods.size() || index < 0)
if (index >= mods.size() || index < 0)
return false;
Mod & m = mods[index];
if(m.destroy())
Mod &m = mods[index];
if (m.destroy())
{
beginRemoveRows(QModelIndex(), index, index);
mods.removeAt(index);
@ -244,11 +243,11 @@ bool ModList::deleteMod ( int index )
return false;
}
bool ModList::deleteMods ( int first, int last )
bool ModList::deleteMods(int first, int last)
{
for(int i = first; i <= last; i++)
for (int i = first; i <= last; i++)
{
Mod & m = mods[i];
Mod &m = mods[i];
m.destroy();
}
beginRemoveRows(QModelIndex(), first, last);
@ -259,18 +258,17 @@ bool ModList::deleteMods ( int first, int last )
return true;
}
bool ModList::moveModTo ( int from, int to )
bool ModList::moveModTo(int from, int to)
{
if(from < 0 || from >= mods.size())
if (from < 0 || from >= mods.size())
return false;
if (to >= rowCount())
to = rowCount() - 1;
if (to == -1)
to = rowCount() - 1;
if(from == to)
if (from == to)
return false;
int togap = to > from ? to + 1: to;
int togap = to > from ? to + 1 : to;
beginMoveRows(QModelIndex(), from, from, QModelIndex(), togap);
mods.move(from, to);
endMoveRows();
@ -279,83 +277,81 @@ bool ModList::moveModTo ( int from, int to )
return true;
}
bool ModList::moveModUp ( int from )
bool ModList::moveModUp(int from)
{
if(from > 0)
if (from > 0)
return moveModTo(from, from - 1);
return false;
}
bool ModList::moveModsUp ( int first, int last )
bool ModList::moveModsUp(int first, int last)
{
if(first == 0)
if (first == 0)
return false;
beginMoveRows(QModelIndex(), first, last, QModelIndex(), first - 1);
mods.move(first-1, last);
mods.move(first - 1, last);
endMoveRows();
saveListFile();
emit changed();
return true;
}
bool ModList::moveModDown ( int from )
bool ModList::moveModDown(int from)
{
if(from < 0)
if (from < 0)
return false;
if(from < mods.size() - 1)
if (from < mods.size() - 1)
return moveModTo(from, from + 1);
return false;
}
bool ModList::moveModsDown ( int first, int last )
bool ModList::moveModsDown(int first, int last)
{
if(last == mods.size() - 1)
if (last == mods.size() - 1)
return false;
beginMoveRows(QModelIndex(), first, last, QModelIndex(), last + 2);
mods.move(last+1, first);
mods.move(last + 1, first);
endMoveRows();
saveListFile();
emit changed();
return true;
}
int ModList::columnCount ( const QModelIndex& parent ) const
int ModList::columnCount(const QModelIndex &parent) const
{
return 2;
}
QVariant ModList::data ( const QModelIndex& index, int role ) const
QVariant ModList::data(const QModelIndex &index, int role) const
{
if(!index.isValid())
if (!index.isValid())
return QVariant();
int row = index.row();
int column = index.column();
if(row < 0 || row >= mods.size())
if (row < 0 || row >= mods.size())
return QVariant();
if(role != Qt::DisplayRole)
if (role != Qt::DisplayRole)
return QVariant();
switch(column)
switch (column)
{
case 0:
return mods[row].name();
case 1:
return mods[row].version();
case 2:
return mods[row].mcversion();
default:
return QVariant();
case 0:
return mods[row].name();
case 1:
return mods[row].version();
case 2:
return mods[row].mcversion();
default:
return QVariant();
}
}
QVariant ModList::headerData ( int section, Qt::Orientation orientation, int role ) const
QVariant ModList::headerData(int section, Qt::Orientation orientation, int role) const
{
if (role != Qt::DisplayRole || orientation != Qt::Horizontal)
return QVariant();
@ -370,10 +366,9 @@ QVariant ModList::headerData ( int section, Qt::Orientation orientation, int rol
}
}
Qt::ItemFlags ModList::flags ( const QModelIndex& index ) const
Qt::ItemFlags ModList::flags(const QModelIndex &index) const
{
Qt::ItemFlags defaultFlags = QAbstractListModel::flags ( index );
Qt::ItemFlags defaultFlags = QAbstractListModel::flags(index);
if (index.isValid())
return Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | defaultFlags;
else
@ -400,36 +395,37 @@ Qt::DropActions ModList::supportedDragActions() const
return Qt::MoveAction;
}
QMimeData* ModList::mimeData ( const QModelIndexList& indexes ) const
QMimeData *ModList::mimeData(const QModelIndexList &indexes) const
{
QMimeData * data = new QMimeData();
if(indexes.size() == 0)
QMimeData *data = new QMimeData();
if (indexes.size() == 0)
return data;
auto idx = indexes[0];
int row = idx.row();
if(row <0 || row >= mods.size())
if (row < 0 || row >= mods.size())
return data;
QStringList params;
params << m_list_id << QString::number(row);
data->setText(params.join('|'));
return data;
}
bool ModList::dropMimeData ( const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent )
bool ModList::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column,
const QModelIndex &parent)
{
if (action == Qt::IgnoreAction)
return true;
return true;
// check if the action is supported
if (!data || !(action & supportedDropActions()))
return false;
if(parent.isValid())
if (parent.isValid())
{
row = parent.row();
column = parent.column();
}
if (row > rowCount())
row = rowCount();
if (row == -1)
@ -437,41 +433,41 @@ bool ModList::dropMimeData ( const QMimeData* data, Qt::DropAction action, int r
if (column == -1)
column = 0;
QLOG_INFO() << "Drop row: " << row << " column: " << column;
// files dropped from outside?
if(data->hasUrls())
if (data->hasUrls())
{
bool was_watching = is_watching;
if(was_watching)
if (was_watching)
stopWatching();
auto urls = data->urls();
for(auto url: urls)
for (auto url : urls)
{
// only local files may be dropped...
if(!url.isLocalFile())
if (!url.isLocalFile())
continue;
QString filename = url.toLocalFile();
installMod(filename, row);
QLOG_INFO() << "installing: " << filename;
}
if(was_watching)
if (was_watching)
startWatching();
return true;
}
else if(data->hasText())
else if (data->hasText())
{
QString sourcestr = data->text();
auto list = sourcestr.split('|');
if(list.size() != 2)
if (list.size() != 2)
return false;
QString remoteId = list[0];
int remoteIndex = list[1].toInt();
QLOG_INFO() << "move: " << sourcestr;
// no moving of things between two lists
if(remoteId != m_list_id)
if (remoteId != m_list_id)
return false;
// no point moving to the same place...
if(row == remoteIndex)
if (row == remoteIndex)
return false;
// otherwise, move the mod :D
moveModTo(remoteIndex, row);
@ -479,4 +475,3 @@ bool ModList::dropMimeData ( const QMimeData* data, Qt::DropAction action, int r
}
return false;
}

View File

@ -57,8 +57,10 @@ QStringList OneSixInstance::processMinecraftArgs(LoginResponse response)
QString args_pattern = version->minecraftArguments;
QMap<QString, QString> token_mapping;
// yggdrasil!
token_mapping["auth_username"] = response.username;
token_mapping["auth_session"] = response.session_id;
token_mapping["auth_access_token"] = response.access_token;
token_mapping["auth_player_name"] = response.player_name;
token_mapping["auth_uuid"] = response.player_id;
@ -68,6 +70,7 @@ QStringList OneSixInstance::processMinecraftArgs(LoginResponse response)
map["auth_player_name"] = "00000000-0000-0000-0000-000000000000";
*/
// these do nothing and are stupid.
token_mapping["profile_name"] = name();
token_mapping["version_name"] = version->id;
@ -144,8 +147,17 @@ MinecraftProcess *OneSixInstance::prepareForLaunch(LoginResponse response)
args.append(processMinecraftArgs(response));
// Set the width and height for 1.6 instances
args << QString("--width") << settings().get("MinecraftWinWidth").toString();
args << QString("--height") << settings().get("MinecraftWinHeight").toString();
bool maximize = settings().get("LaunchMaximized").toBool();
if(maximize)
{
// this is probably a BAD idea
// args << QString("--fullscreen");
}
else
{
args << QString("--width") << settings().get("MinecraftWinWidth").toString();
args << QString("--height") << settings().get("MinecraftWinHeight").toString();
}
// create the process and set its parameters
MinecraftProcess *proc = new MinecraftProcess(this);
@ -168,8 +180,7 @@ std::shared_ptr<ModList> OneSixInstance::loaderModList()
{
d->loader_mod_list.reset(new ModList(loaderModsDir()));
}
else
d->loader_mod_list->update();
d->loader_mod_list->update();
return d->loader_mod_list;
}
@ -180,8 +191,7 @@ std::shared_ptr<ModList> OneSixInstance::resourcePackList()
{
d->resource_pack_list.reset(new ModList(resourcePacksDir()));
}
else
d->resource_pack_list->update();
d->resource_pack_list->update();
return d->resource_pack_list;
}
@ -194,6 +204,11 @@ bool OneSixInstance::setIntendedVersionId(QString version)
{
settings().set("IntendedVersion", version);
setShouldUpdate(true);
auto pathCustom = PathCombine(instanceRoot(), "custom.json");
auto pathOrig = PathCombine(instanceRoot(), "version.json");
QFile::remove(pathCustom);
QFile::remove(pathOrig);
reloadFullVersion();
return true;
}
@ -273,7 +288,11 @@ bool OneSixInstance::reloadFullVersion()
d->version = version;
return true;
}
return false;
else
{
d->version.reset();
return false;
}
}
std::shared_ptr<OneSixVersion> OneSixInstance::getFullVersion()

View File

@ -10,33 +10,33 @@ class OneSixInstance : public BaseInstance
{
Q_OBJECT
public:
explicit OneSixInstance(const QString &rootDir, SettingsObject * settings, QObject *parent = 0);
explicit OneSixInstance(const QString &rootDir, SettingsObject *settings,
QObject *parent = 0);
////// Mod Lists //////
std::shared_ptr<ModList> loaderModList();
std::shared_ptr<ModList> resourcePackList();
////// Directories //////
QString resourcePacksDir() const;
QString loaderModsDir() const;
virtual QString instanceConfigFolder() const;
virtual BaseUpdate* doUpdate();
virtual MinecraftProcess* prepareForLaunch ( LoginResponse response );
virtual BaseUpdate *doUpdate();
virtual MinecraftProcess *prepareForLaunch(LoginResponse response);
virtual void cleanupAfterRun();
virtual QString intendedVersionId() const;
virtual bool setIntendedVersionId ( QString version );
virtual bool setIntendedVersionId(QString version);
virtual QString currentVersionId() const;
// virtual void setCurrentVersionId ( QString val ) {};
virtual bool shouldUpdate() const;
virtual void setShouldUpdate(bool val);
virtual QDialog * createModEditDialog ( QWidget* parent );
virtual QDialog *createModEditDialog(QWidget *parent);
/// reload the full version json file. return true on success!
bool reloadFullVersion();
/// get the current full version info
@ -46,13 +46,14 @@ public:
/// customize the current base version
bool customizeVersion();
/// is the current version original, or custom?
bool versionIsCustom();
virtual bool versionIsCustom() override;
virtual QString defaultBaseJar() const;
virtual QString defaultCustomBaseJar() const;
virtual bool menuActionEnabled ( QString action_name ) const;
virtual bool menuActionEnabled(QString action_name) const;
virtual QString getStatusbarDescription();
private:
QStringList processMinecraftArgs( LoginResponse response );
QStringList processMinecraftArgs(LoginResponse response);
};

View File

@ -264,6 +264,6 @@ void LoginTask::parseYggdrasilReply(QByteArray data)
};
*/
result = {uInfo.username, sessionID, playerName, playerID};
result = {uInfo.username, sessionID, playerName, playerID, accessToken};
emitSucceeded();
}

View File

@ -27,9 +27,10 @@ struct UserInfo
struct LoginResponse
{
QString username;
QString session_id;
QString session_id; // session id is a combination of player id and the access token
QString player_name;
QString player_id;
QString access_token;
};
class QNetworkReply;

View File

@ -30,16 +30,71 @@
</message>
<message>
<location filename="../gui/aboutdialog.ui" line="148"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;http://github.com/Forkk/MultiMC5&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;http://github.com/MultiMC/MultiMC5&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation></translation>
</message>
<message>
<location filename="../gui/aboutdialog.ui" line="190"/>
<source>No Language file loaded.</source>
<extracomment>Hey, Translator, You are free to put a reference to you here :)</extracomment>
<translation>Deutsche Sprachdatei von Kilobyte (siehe oben).</translation>
</message>
<message>
<location filename="../gui/aboutdialog.ui" line="224"/>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Copyright 2012 MultiMC Contributors&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;you may not use this file except in compliance with the License.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;You may obtain a copy of the License at&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt; http://www.apache.org/licenses/LICENSE-2.0&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Unless required by applicable law or agreed to in writing, software&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;See the License for the specific language governing permissions and&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;limitations under the License.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;MultiMC uses QSLog, &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Copyright (c) 2010, Razvan Petru&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;All rights reserved.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Redistribution and use in source and binary forms, with or without modification,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;are permitted provided that the following conditions are met:&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;* Redistributions of source code must retain the above copyright notice, this&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt; list of conditions and the following disclaimer.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;* Redistributions in binary form must reproduce the above copyright notice, this&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt; list of conditions and the following disclaimer in the documentation and/or other&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt; materials provided with the distribution.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;* The name of the contributors may not be used to endorse or promote products&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt; derived from this software without specific prior written permission.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &amp;quot;AS IS&amp;quot; AND&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;OF THE POSSIBILITY OF SUCH DAMAGE.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation></translation>
</message>
<message>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;http://github.com/Forkk/MultiMC5&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;http://github.com/Forkk/MultiMC5&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;http://github.com/Forkk/MultiMC5&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;http://github.com/Forkk/MultiMC5&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
<translation type="obsolete">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;http://github.com/Forkk/MultiMC5&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;http://github.com/Forkk/MultiMC5&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../gui/aboutdialog.ui" line="167"/>
<source>Credits</source>
<translation>Danke an</translation>
<translation>Dank an</translation>
</message>
<message>
<location filename="../gui/aboutdialog.ui" line="176"/>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
@ -47,7 +102,7 @@ p, li { white-space: pre-wrap; }
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Andrew Okin &amp;lt;&lt;a href=&quot;mailto:forkk@forkk.net&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;forkk@forkk.net&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Petr Mrázek &amp;lt;&lt;a href=&quot;mailto:peterix@gmail.com&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;peterix@gmail.com&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Orochimarufan &amp;lt;&lt;a href=&quot;mailto:orochimarufan.x3@gmail.com&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;orochimarufan.x3@gmail.com&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
<translation type="obsolete">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
@ -57,12 +112,11 @@ p, li { white-space: pre-wrap; }
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Deutsche Übersetzung: Kilobyte &amp;lt;&lt;a href=&quot;mailto:stiepen22@gmx.de&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;stiepen22@gmx.de&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../gui/aboutdialog.ui" line="190"/>
<location filename="../gui/aboutdialog.ui" line="209"/>
<source>License</source>
<translation>Lizenz</translation>
</message>
<message>
<location filename="../gui/aboutdialog.ui" line="205"/>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
@ -104,7 +158,7 @@ p, li { white-space: pre-wrap; }
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;POSSIBILITY OF SUCH DAMAGE.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
<translation type="obsolete">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
@ -147,12 +201,12 @@ p, li { white-space: pre-wrap; }
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;POSSIBILITY OF SUCH DAMAGE.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../gui/aboutdialog.ui" line="258"/>
<location filename="../gui/aboutdialog.ui" line="278"/>
<source>About Qt</source>
<translation>Über Qt</translation>
</message>
<message>
<location filename="../gui/aboutdialog.ui" line="278"/>
<location filename="../gui/aboutdialog.ui" line="298"/>
<source>Close</source>
<translation>Schließen</translation>
</message>
@ -365,7 +419,7 @@ p, li { white-space: pre-wrap; }
<translation>Anktualisie&amp;ren</translation>
</message>
<message>
<location filename="../gui/lwjglselectdialog.cpp" line="57"/>
<location filename="../gui/lwjglselectdialog.cpp" line="59"/>
<source>Loading LWJGL version list...</source>
<translation>Lade LWJGL-Versionsliste...</translation>
</message>
@ -384,83 +438,83 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../gui/LegacyModEditDialog.ui" line="42"/>
<location filename="../gui/LegacyModEditDialog.ui" line="111"/>
<location filename="../gui/LegacyModEditDialog.ui" line="166"/>
<location filename="../gui/LegacyModEditDialog.ui" line="224"/>
<location filename="../gui/LegacyModEditDialog.ui" line="108"/>
<location filename="../gui/LegacyModEditDialog.ui" line="163"/>
<location filename="../gui/LegacyModEditDialog.ui" line="221"/>
<source>&amp;Add</source>
<translation>&amp;Hinzufügen</translation>
</message>
<message>
<location filename="../gui/LegacyModEditDialog.ui" line="49"/>
<location filename="../gui/LegacyModEditDialog.ui" line="118"/>
<location filename="../gui/LegacyModEditDialog.ui" line="173"/>
<location filename="../gui/LegacyModEditDialog.ui" line="231"/>
<location filename="../gui/LegacyModEditDialog.ui" line="115"/>
<location filename="../gui/LegacyModEditDialog.ui" line="170"/>
<location filename="../gui/LegacyModEditDialog.ui" line="228"/>
<source>&amp;Remove</source>
<translation>&amp;Entfernen</translation>
</message>
<message>
<location filename="../gui/LegacyModEditDialog.ui" line="59"/>
<location filename="../gui/LegacyModEditDialog.ui" line="56"/>
<source>MCForge</source>
<translation></translation>
</message>
<message>
<location filename="../gui/LegacyModEditDialog.ui" line="79"/>
<location filename="../gui/LegacyModEditDialog.ui" line="76"/>
<source>Move &amp;Up</source>
<translation>&amp;Nach Oben</translation>
</message>
<message>
<location filename="../gui/LegacyModEditDialog.ui" line="86"/>
<location filename="../gui/LegacyModEditDialog.ui" line="83"/>
<source>Move &amp;Down</source>
<translation>Nach &amp;Unten</translation>
</message>
<message>
<location filename="../gui/LegacyModEditDialog.ui" line="96"/>
<location filename="../gui/LegacyModEditDialog.ui" line="93"/>
<source>Core Mods</source>
<translation>Coremods</translation>
</message>
<message>
<location filename="../gui/LegacyModEditDialog.ui" line="138"/>
<location filename="../gui/LegacyModEditDialog.ui" line="193"/>
<location filename="../gui/LegacyModEditDialog.ui" line="251"/>
<location filename="../gui/LegacyModEditDialog.ui" line="135"/>
<location filename="../gui/LegacyModEditDialog.ui" line="190"/>
<location filename="../gui/LegacyModEditDialog.ui" line="248"/>
<source>&amp;View Folder</source>
<translation>&amp;Ordner öffnen</translation>
</message>
<message>
<location filename="../gui/LegacyModEditDialog.ui" line="148"/>
<location filename="../gui/LegacyModEditDialog.ui" line="145"/>
<source>Loader Mods</source>
<translation>Normale Mods</translation>
</message>
<message>
<location filename="../gui/LegacyModEditDialog.ui" line="206"/>
<location filename="../gui/LegacyModEditDialog.ui" line="203"/>
<source>Texture Packs</source>
<translation>Texturenpacks</translation>
</message>
<message>
<location filename="../gui/OneSixModEditDialog.cpp" line="115"/>
<location filename="../gui/LegacyModEditDialog.cpp" line="213"/>
<location filename="../gui/OneSixModEditDialog.cpp" line="249"/>
<location filename="../gui/LegacyModEditDialog.cpp" line="246"/>
<source>Select Loader Mods</source>
<extracomment>Title of regular mod selection dialog</extracomment>
<translation>Mods auswählen</translation>
</message>
<message>
<location filename="../gui/OneSixModEditDialog.cpp" line="142"/>
<location filename="../gui/OneSixModEditDialog.cpp" line="276"/>
<source>Select Resource Packs</source>
<translation>Resourcenpacks auswählen</translation>
</message>
<message>
<location filename="../gui/LegacyModEditDialog.cpp" line="187"/>
<location filename="../gui/LegacyModEditDialog.cpp" line="188"/>
<source>Select Core Mods</source>
<extracomment>Title of core mod selection dialog</extracomment>
<translation>Coremodsauswählen</translation>
</message>
<message>
<location filename="../gui/LegacyModEditDialog.cpp" line="202"/>
<location filename="../gui/LegacyModEditDialog.cpp" line="235"/>
<source>Select Jar Mods</source>
<extracomment>Title of jar mod selection dialog</extracomment>
<translation>Jarmods auswählen</translation>
</message>
<message>
<location filename="../gui/LegacyModEditDialog.cpp" line="224"/>
<location filename="../gui/LegacyModEditDialog.cpp" line="257"/>
<source>Select Texture Packs</source>
<extracomment>Title of texture pack selection dialog</extracomment>
<translation>Texturenpacks auswählen</translation>
@ -524,46 +578,57 @@ p, li { white-space: pre-wrap; }
<context>
<name>LoginTask</name>
<message>
<location filename="../logic/tasks/LoginTask.cpp" line="31"/>
<location filename="../logic/net/LoginTask.cpp" line="41"/>
<location filename="../logic/net/LoginTask.cpp" line="135"/>
<source>Logging in...</source>
<translation>Einloggen...</translation>
</message>
<message>
<location filename="../logic/tasks/LoginTask.cpp" line="79"/>
<source>Failed to parse Minecraft version string.</source>
<translation>Konnte Minecraft-Versionsstring nicht parsen.</translation>
<translation type="obsolete">Konnte Minecraft-Versionsstring nicht parsen.</translation>
</message>
<message>
<location filename="../logic/tasks/LoginTask.cpp" line="85"/>
<location filename="../logic/net/LoginTask.cpp" line="124"/>
<source>Invalid username or password.</source>
<translation>Falsche Kombination von Nutzernamen und Passwort.</translation>
</message>
<message>
<location filename="../logic/tasks/LoginTask.cpp" line="87"/>
<location filename="../logic/net/LoginTask.cpp" line="126"/>
<source>Launcher outdated, please update.</source>
<translation>Veralteter Launcher, Bitte lade ein Update herunter.</translation>
</message>
<message>
<location filename="../logic/tasks/LoginTask.cpp" line="89"/>
<location filename="../logic/tasks/LoginTask.cpp" line="108"/>
<location filename="../logic/net/LoginTask.cpp" line="93"/>
<location filename="../logic/net/LoginTask.cpp" line="128"/>
<location filename="../logic/net/LoginTask.cpp" line="205"/>
<location filename="../logic/net/LoginTask.cpp" line="232"/>
<source>Login failed: %1</source>
<translation>Login fehlgeschlagen: %1</translation>
</message>
<message>
<location filename="../logic/tasks/LoginTask.cpp" line="94"/>
<location filename="../logic/net/LoginTask.cpp" line="77"/>
<location filename="../logic/net/LoginTask.cpp" line="189"/>
<source>The login servers are currently unavailable. Check http://help.mojang.com/ for more info.</source>
<translation>Derzeit kann auf die Login-Server nicht zugegriffe werden. Für weitere Informationen siehe http://help.mojang.com/.</translation>
</message>
<message>
<location filename="../logic/tasks/LoginTask.cpp" line="98"/>
<location filename="../logic/net/LoginTask.cpp" line="82"/>
<location filename="../logic/net/LoginTask.cpp" line="194"/>
<source>Login failed: Unknown HTTP error %1 occurred.</source>
<translation>Login fehlgeschlagen. Unbekannter HTTP-Fehler: %1.</translation>
</message>
<message>
<location filename="../logic/tasks/LoginTask.cpp" line="104"/>
<location filename="../logic/net/LoginTask.cpp" line="89"/>
<location filename="../logic/net/LoginTask.cpp" line="201"/>
<source>Login canceled.</source>
<translation>Login abgebrochen.</translation>
</message>
<message>
<location filename="../logic/net/LoginTask.cpp" line="238"/>
<source>Login failed: BAD FORMAT #1</source>
<translatorcomment>Login fehlgeschlagen: UNGÜLTIGES FORMAT #1</translatorcomment>
<translation></translation>
</message>
</context>
<context>
<name>MainWindow</name>
@ -837,51 +902,55 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../gui/mainwindow.ui" line="443"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;center&quot;&gt;&lt;span style=&quot; font-weight:600; color:#ff0004;&quot;&gt;Catnatok!&lt;/span&gt;&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;Or just a cat with a ball of yarn?&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;span style=&quot; font-style:italic;&quot;&gt;WHO KNOWS?!&lt;/span&gt;&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;:/icons/instances/tnt&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;center&quot;&gt;&lt;span style=&quot; font-weight:600; color:#ff0004;&quot;&gt;Catnatok!&lt;/span&gt;&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;Or just a cat with a ball of yarn?&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;span style=&quot; font-style:italic;&quot;&gt;WHO KNOWS?!&lt;/span&gt;&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;:/icons/instances/tnt&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;center&quot;&gt;&lt;span style=&quot; font-weight:600; color:#ff0004;&quot;&gt;Catnarok!&lt;/span&gt;&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;Or just a cat with a ball of yarn?&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;span style=&quot; font-style:italic;&quot;&gt;WHO KNOWS?!&lt;/span&gt;&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;:/icons/instances/tnt&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation></translation>
</message>
<message>
<location filename="../gui/mainwindow.cpp" line="318"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;center&quot;&gt;&lt;span style=&quot; font-weight:600; color:#ff0004;&quot;&gt;Catnatok!&lt;/span&gt;&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;Or just a cat with a ball of yarn?&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;span style=&quot; font-style:italic;&quot;&gt;WHO KNOWS?!&lt;/span&gt;&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;:/icons/instances/tnt&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="obsolete">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;center&quot;&gt;&lt;span style=&quot; font-weight:600; color:#ff0004;&quot;&gt;Catnatok!&lt;/span&gt;&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;Or just a cat with a ball of yarn?&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;span style=&quot; font-style:italic;&quot;&gt;WHO KNOWS?!&lt;/span&gt;&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;:/icons/instances/tnt&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../gui/mainwindow.cpp" line="313"/>
<source>Group name</source>
<translation>Gruppenname</translation>
</message>
<message>
<location filename="../gui/mainwindow.cpp" line="318"/>
<location filename="../gui/mainwindow.cpp" line="313"/>
<source>Enter a new group name.</source>
<translation>Neuen Gruppennamen eingeben.</translation>
</message>
<message>
<location filename="../gui/mainwindow.cpp" line="404"/>
<location filename="../gui/mainwindow.cpp" line="398"/>
<source>Instance name</source>
<translation>Instanzname</translation>
</message>
<message>
<location filename="../gui/mainwindow.cpp" line="404"/>
<location filename="../gui/mainwindow.cpp" line="398"/>
<source>Enter a new instance name.</source>
<translation>Neuen Instanznamen eingeben.</translation>
</message>
<message>
<location filename="../gui/mainwindow.cpp" line="586"/>
<location filename="../gui/mainwindow.cpp" line="580"/>
<source>MultiMC Shortcut</source>
<translation>MultiMC-Verknüpfung</translation>
</message>
<message>
<location filename="../gui/mainwindow.cpp" line="586"/>
<location filename="../gui/mainwindow.cpp" line="580"/>
<source>Enter a Shortcut Name.</source>
<translation>Verknüpfungsnamen eingeben.</translation>
</message>
<message>
<location filename="../gui/mainwindow.cpp" line="590"/>
<location filename="../gui/mainwindow.cpp" line="588"/>
<source>Not useful</source>
<translation>Sinnlos</translation>
</message>
<message>
<location filename="../gui/mainwindow.cpp" line="590"/>
<location filename="../gui/mainwindow.cpp" line="589"/>
<source>A Dummy Shortcut was created. it will not do anything productive</source>
<translation>Eine Dummy-Verknüpfung wurde erstellt. Sie wird jedoch absolut nichts bewirken</translation>
</message>
<message>
<location filename="../gui/mainwindow.cpp" line="661"/>
<location filename="../gui/mainwindow.cpp" line="665"/>
<source>Rename Instance</source>
<translation>Instanz umbenennen</translation>
</message>
@ -889,19 +958,19 @@ p, li { white-space: pre-wrap; }
<context>
<name>MinecraftProcess</name>
<message>
<location filename="../logic/MinecraftProcess.cpp" line="124"/>
<location filename="../logic/MinecraftProcess.cpp" line="123"/>
<source>Minecraft exited with exitcode %1.</source>
<extracomment>Message displayed on instance exit</extracomment>
<translation>Minecraft wurde mit exitcode %1 beendet.</translation>
</message>
<message>
<location filename="../logic/MinecraftProcess.cpp" line="127"/>
<location filename="../logic/MinecraftProcess.cpp" line="126"/>
<source>Minecraft was killed by user.</source>
<extracomment>Message displayed after the instance exits due to kill request</extracomment>
<translation>Minecraft wurde durch den nutzer gekillt.</translation>
</message>
<message>
<location filename="../logic/MinecraftProcess.cpp" line="174"/>
<location filename="../logic/MinecraftProcess.cpp" line="175"/>
<source>Could not launch minecraft!</source>
<extracomment>Error message displayed if instace can&apos;t start</extracomment>
<translation>Konnte Minecraft nicht starten!</translation>
@ -986,41 +1055,122 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../gui/OneSixModEditDialog.ui" line="14"/>
<source>Dialog</source>
<translation>Dialog</translation>
<translatorcomment>Am i really responsible for this?</translatorcomment>
<translation>Edit Mods</translation>
</message>
<message>
<location filename="../gui/OneSixModEditDialog.ui" line="39"/>
<source>Library</source>
<translation>Bibliothek</translation>
<translation type="obsolete">Bibliothek</translation>
</message>
<message>
<location filename="../gui/OneSixModEditDialog.ui" line="56"/>
<location filename="../gui/OneSixModEditDialog.ui" line="158"/>
<source>Loader Mods</source>
<translation>Mods</translation>
</message>
<message>
<location filename="../gui/OneSixModEditDialog.ui" line="74"/>
<location filename="../gui/OneSixModEditDialog.ui" line="129"/>
<location filename="../gui/OneSixModEditDialog.ui" line="122"/>
<location filename="../gui/OneSixModEditDialog.ui" line="176"/>
<location filename="../gui/OneSixModEditDialog.ui" line="231"/>
<source>&amp;Add</source>
<translation>&amp;Hinzufügen</translation>
</message>
<message>
<location filename="../gui/OneSixModEditDialog.ui" line="81"/>
<location filename="../gui/OneSixModEditDialog.ui" line="136"/>
<location filename="../gui/OneSixModEditDialog.ui" line="33"/>
<source>Version</source>
<translation>Version</translation>
</message>
<message>
<location filename="../gui/OneSixModEditDialog.ui" line="53"/>
<source>Main Class:</source>
<translation>Hauptklasse:</translation>
</message>
<message>
<location filename="../gui/OneSixModEditDialog.ui" line="73"/>
<source>Replace any current custom version with Minecraft Forge</source>
<translation>Die aktuelle benutzerdefinierte Version mit Minecraft Forge ersetzen</translation>
</message>
<message>
<location filename="../gui/OneSixModEditDialog.ui" line="76"/>
<source>Install Forge</source>
<translation>Forge Installieren</translation>
</message>
<message>
<location filename="../gui/OneSixModEditDialog.ui" line="83"/>
<source>Create an customized copy of the base version</source>
<translation>Eine modifizierbare Kopie der Version erstellen</translation>
</message>
<message>
<location filename="../gui/OneSixModEditDialog.ui" line="86"/>
<source>Customize</source>
<translation>Benutzerdefiniert</translation>
</message>
<message>
<location filename="../gui/OneSixModEditDialog.ui" line="96"/>
<source>Revert to original base version</source>
<translation>Benutzerdefinierte Einstellungen zurücksetzen</translation>
</message>
<message>
<location filename="../gui/OneSixModEditDialog.ui" line="99"/>
<source>Revert</source>
<translation>Zurücksetzen</translation>
</message>
<message>
<location filename="../gui/OneSixModEditDialog.ui" line="119"/>
<source>Add new libraries</source>
<translation></translation>
</message>
<message>
<location filename="../gui/OneSixModEditDialog.ui" line="132"/>
<source>Remove selected libraries</source>
<translation></translation>
</message>
<message>
<location filename="../gui/OneSixModEditDialog.ui" line="135"/>
<location filename="../gui/OneSixModEditDialog.ui" line="183"/>
<location filename="../gui/OneSixModEditDialog.ui" line="238"/>
<source>&amp;Remove</source>
<translation>&amp;Entfernen</translation>
</message>
<message>
<location filename="../gui/OneSixModEditDialog.ui" line="101"/>
<location filename="../gui/OneSixModEditDialog.ui" line="156"/>
<location filename="../gui/OneSixModEditDialog.ui" line="203"/>
<location filename="../gui/OneSixModEditDialog.ui" line="258"/>
<source>&amp;View Folder</source>
<translation>&amp;Ordner öffnen</translation>
</message>
<message>
<location filename="../gui/OneSixModEditDialog.ui" line="111"/>
<location filename="../gui/OneSixModEditDialog.ui" line="213"/>
<source>Resource Packs</source>
<translation>Resourcenpacks</translation>
</message>
<message>
<location filename="../gui/OneSixModEditDialog.cpp" line="108"/>
<location filename="../gui/OneSixModEditDialog.cpp" line="131"/>
<source>Revert?</source>
<translation>Zurücksetzen?</translation>
</message>
<message>
<location filename="../gui/OneSixModEditDialog.cpp" line="108"/>
<source>Do you want to revert the version of this instance to its original configuration?</source>
<translation>Möchtest du wirklich die Version dieser Instanz zurücksetzen?</translation>
</message>
<message>
<location filename="../gui/OneSixModEditDialog.cpp" line="132"/>
<source>This will revert any changes you did to the version up to this point. Is that OK?</source>
<translation>Dies wird alle Änderungen, die du vorgenommen hast zurücksetzen. Bist du damit einverstanden?</translation>
</message>
</context>
<context>
<name>ProgressDialog</name>
<message>
<location filename="../gui/ProgressDialog.ui" line="26"/>
<source>Please wait...</source>
<translation>Bitte warten...</translation>
</message>
<message>
<location filename="../gui/ProgressDialog.ui" line="32"/>
<source>Task Status...</source>
<translation>Aufgabenstatus...</translation>
</message>
</context>
<context>
<name>SettingsDialog</name>
@ -1172,72 +1322,81 @@ p, li { white-space: pre-wrap; }
<translation>Java-Pfad:</translation>
</message>
<message>
<location filename="../gui/settingsdialog.ui" line="388"/>
<location filename="../gui/settingsdialog.ui" line="385"/>
<source>JVM arguments:</source>
<translation>JVM-Argumente:</translation>
</message>
<message>
<location filename="../gui/settingsdialog.ui" line="395"/>
<location filename="../gui/settingsdialog.ui" line="398"/>
<source>Browse...</source>
<translation>Durchsuchen...</translation>
</message>
<message>
<location filename="../gui/settingsdialog.ui" line="417"/>
<source>Auto-detect</source>
<translation>Automatisch erkennen</translation>
</message>
<message>
<location filename="../gui/settingsdialog.ui" line="408"/>
<location filename="../gui/settingsdialog.ui" line="427"/>
<source>Custom Commands</source>
<translation>Eigene Befehle</translation>
</message>
<message>
<location filename="../gui/settingsdialog.ui" line="414"/>
<location filename="../gui/settingsdialog.ui" line="433"/>
<source>Post-exit command:</source>
<translation>Nach-abschluss-Befehl:</translation>
</message>
<message>
<location filename="../gui/settingsdialog.ui" line="421"/>
<location filename="../gui/settingsdialog.ui" line="440"/>
<source>Pre-launch command:</source>
<translation>Vor-Start-Befehl:</translation>
</message>
<message>
<location filename="../gui/settingsdialog.ui" line="443"/>
<location filename="../gui/settingsdialog.ui" line="462"/>
<source>Pre-launch command runs before the instance launches and post-exit command runs after it exits. Both will be run in MultiMC&apos;s working directory with INST_ID, INST_DIR, and INST_NAME as environment variables.</source>
<translation>Vor-Start wird ausgeführt, bevor die Instanz startet, Nach-Ende nachdem die Instanz beendet wurde. Beide werden Im ausführungsverzeichnis von MultiMC gestartet. Verfügbare Umgebungsvariablen: INST_ID, INST_DIR, INST_NAME.</translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="52"/>
<location filename="../gui/settingsdialog.cpp" line="53"/>
<source>Instance Directory</source>
<translation>Instanz-Ordner</translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="60"/>
<location filename="../gui/settingsdialog.cpp" line="61"/>
<source>Mods Directory</source>
<translation>Modordner</translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="68"/>
<location filename="../gui/settingsdialog.cpp" line="69"/>
<source>LWJGL Directory</source>
<translation>LWJGL-Ordner</translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="102"/>
<location filename="../gui/settingsdialog.cpp" line="103"/>
<source>Development builds</source>
<translation>Entwicklerversionen</translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="103"/>
<location filename="../gui/settingsdialog.cpp" line="104"/>
<source>Development builds contain experimental features and may be unstable. Are you sure you want to enable them?</source>
<translation type="unfinished">Entwicklerversionen enthalten experimentelle Features und können instabil sein. Möchtest du sie dennoch aktivieren?</translation>
<translation>Entwicklerversionen enthalten experimentelle Features und können instabil sein. Möchtest du sie dennoch aktivieren?</translation>
</message>
<message>
<location filename="../gui/settingsdialog.cpp" line="195"/>
<source>Find Java executable</source>
<translatorcomment>Umm... this translation is a bit meh</translatorcomment>
<translation type="unfinished">Java-Anwendung finden</translation>
</message>
</context>
<context>
<name>TaskDialog</name>
<message>
<location filename="../gui/taskdialog.ui" line="26"/>
<source>Please wait...</source>
<translation>Bitte warten...</translation>
<translation type="obsolete">Bitte warten...</translation>
</message>
<message>
<location filename="../gui/taskdialog.ui" line="32"/>
<source>Task Status...</source>
<translation>Aufgabenstatus...</translation>
<translation type="obsolete">Aufgabenstatus...</translation>
</message>
</context>
<context>
@ -1248,22 +1407,20 @@ p, li { white-space: pre-wrap; }
<translation>Dialog</translation>
</message>
<message>
<location filename="../gui/versionselectdialog.ui" line="66"/>
<source>Show &amp;snapshots?</source>
<translation>&apos;&amp;Snapshots&apos; anzeigen?</translation>
<translation type="obsolete">&apos;&amp;Snapshots&apos; anzeigen?</translation>
</message>
<message>
<location filename="../gui/versionselectdialog.ui" line="92"/>
<source>Show &amp;Nostalgia?</source>
<translation>&apos;&amp;Nostalgia&apos;-Versionen anzeigen?</translation>
<translation type="obsolete">&apos;&amp;Nostalgia&apos;-Versionen anzeigen?</translation>
</message>
<message>
<location filename="../gui/versionselectdialog.ui" line="116"/>
<location filename="../gui/versionselectdialog.ui" line="47"/>
<source>Reloads the version list.</source>
<translation>Instanzliste aktualisieren.</translation>
</message>
<message>
<location filename="../gui/versionselectdialog.ui" line="119"/>
<location filename="../gui/versionselectdialog.ui" line="50"/>
<source>&amp;Refresh</source>
<translation>&amp;Aktualisieren</translation>
</message>