summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt23
-rw-r--r--MultiMC.cpp15
-rw-r--r--MultiMC.h6
-rw-r--r--changelog.yaml4
-rw-r--r--gui/ConsoleWindow.cpp40
-rw-r--r--gui/ConsoleWindow.h7
-rw-r--r--gui/MainWindow.cpp93
-rw-r--r--gui/MainWindow.h15
-rw-r--r--gui/dialogs/SettingsDialog.cpp4
-rw-r--r--gui/widgets/IconLabel.cpp30
-rw-r--r--gui/widgets/IconLabel.h26
-rw-r--r--gui/widgets/LineSeparator.cpp37
-rw-r--r--gui/widgets/LineSeparator.h18
-rw-r--r--gui/widgets/ServerStatus.cpp115
-rw-r--r--gui/widgets/ServerStatus.h34
-rw-r--r--logic/BaseInstance.h2
-rw-r--r--logic/LegacyInstance.cpp12
-rw-r--r--logic/LegacyInstance.h2
-rw-r--r--logic/MinecraftProcess.cpp2
-rw-r--r--logic/MinecraftProcess.h19
-rw-r--r--logic/OneSixInstance.cpp13
-rw-r--r--logic/OneSixInstance.h2
-rw-r--r--logic/status/StatusChecker.cpp23
-rw-r--r--logic/status/StatusChecker.h11
-rw-r--r--resources/multimc/16x16/status-bad.pngbin0 -> 643 bytes
-rw-r--r--resources/multimc/16x16/status-good.pngbin0 -> 714 bytes
-rw-r--r--resources/multimc/22x22/status-bad.pngbin0 -> 968 bytes
-rw-r--r--resources/multimc/22x22/status-good.pngbin0 -> 994 bytes
-rw-r--r--resources/multimc/24x24/status-bad.pngbin0 -> 1102 bytes
-rw-r--r--resources/multimc/24x24/status-good.pngbin0 -> 1066 bytes
-rw-r--r--resources/multimc/32x32/status-bad.pngbin0 -> 1422 bytes
-rw-r--r--resources/multimc/32x32/status-good.pngbin0 -> 1400 bytes
-rw-r--r--resources/multimc/48x48/status-bad.pngbin0 -> 2389 bytes
-rw-r--r--resources/multimc/48x48/status-good.pngbin0 -> 2248 bytes
-rw-r--r--resources/multimc/64x64/status-bad.pngbin0 -> 2827 bytes
-rw-r--r--resources/multimc/64x64/status-good.pngbin0 -> 2954 bytes
-rw-r--r--resources/multimc/multimc.qrc16
-rw-r--r--resources/multimc/scalable/status-bad.svg142
-rw-r--r--resources/multimc/scalable/status-good.svg201
-rw-r--r--resources/sources/status-bad.svg262
-rw-r--r--resources/sources/status-good.svg293
-rw-r--r--resources/sources/status-terrible.svg262
-rw-r--r--translations/CMakeLists.txt2
43 files changed, 757 insertions, 974 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2d25fc6b..531f7342 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -104,7 +104,7 @@ set(MultiMC_NEWS_RSS_URL "http://multimc.org/rss.xml" CACHE STRING "URL to fetch
######## Set version numbers ########
set(MultiMC_VERSION_MAJOR 0)
set(MultiMC_VERSION_MINOR 3)
-set(MultiMC_VERSION_HOTFIX 4)
+set(MultiMC_VERSION_HOTFIX 5)
# Build number
set(MultiMC_VERSION_BUILD -1 CACHE STRING "Build number. -1 for no build number.")
@@ -335,16 +335,23 @@ SET(MULTIMC_SOURCES
gui/dialogs/NotificationDialog.cpp
# GUI - widgets
- gui/widgets/Common.h
gui/widgets/Common.cpp
- gui/widgets/ModListView.h
- gui/widgets/ModListView.cpp
- gui/widgets/VersionListView.h
- gui/widgets/VersionListView.cpp
- gui/widgets/LabeledToolButton.h
+ gui/widgets/Common.h
+ gui/widgets/IconLabel.cpp
+ gui/widgets/IconLabel.h
gui/widgets/LabeledToolButton.cpp
- gui/widgets/MCModInfoFrame.h
+ gui/widgets/LabeledToolButton.h
+ gui/widgets/LineSeparator.cpp
+ gui/widgets/LineSeparator.h
gui/widgets/MCModInfoFrame.cpp
+ gui/widgets/MCModInfoFrame.h
+ gui/widgets/ModListView.cpp
+ gui/widgets/ModListView.h
+ gui/widgets/ServerStatus.cpp
+ gui/widgets/ServerStatus.h
+ gui/widgets/VersionListView.cpp
+ gui/widgets/VersionListView.h
+
# GUI - instance group view
gui/groupview/Group.cpp
diff --git a/MultiMC.cpp b/MultiMC.cpp
index dc878a32..bdebe181 100644
--- a/MultiMC.cpp
+++ b/MultiMC.cpp
@@ -161,6 +161,17 @@ MultiMC::MultiMC(int &argc, char **argv, bool root_override)
#endif
}
+ // static data paths... mostly just for translations
+ #ifdef Q_OS_LINUX
+ QDir foo(PathCombine(binPath, ".."));
+ staticDataPath = foo.absolutePath();
+ #elif defined(Q_OS_WIN32)
+ staticDataPath = binPath;
+ #elif defined(Q_OS_MAC)
+ QDir foo(PathCombine(rootPath, "Contents/Resources"));
+ staticDataPath = foo.absolutePath();
+ #endif
+
// init the logger
initLogger();
@@ -179,6 +190,7 @@ MultiMC::MultiMC(int &argc, char **argv, bool root_override)
}
QLOG_INFO() << "Binary path : " << binPath;
QLOG_INFO() << "Application root path : " << rootPath;
+ QLOG_INFO() << "Static data path : " << staticDataPath;
// load settings
initGlobalSettings();
@@ -287,7 +299,8 @@ void MultiMC::initTranslations()
}
m_mmc_translator.reset(new QTranslator());
- if (m_mmc_translator->load("mmc_" + locale.bcp47Name(), MMC->root() + "/translations"))
+ if (m_mmc_translator->load("mmc_" + locale.bcp47Name(),
+ MMC->staticData() + "/translations"))
{
QLOG_DEBUG() << "Loading MMC Language File for"
<< locale.bcp47Name().toLocal8Bit().constData() << "...";
diff --git a/MultiMC.h b/MultiMC.h
index 2455cbb4..0fd60b7d 100644
--- a/MultiMC.h
+++ b/MultiMC.h
@@ -150,6 +150,11 @@ public:
*/
bool openJsonEditor(const QString &filename);
+ /// this is the static data. it stores things that don't move.
+ const QString &staticData()
+ {
+ return staticDataPath;
+ }
/// this is the root of the 'installation'. Used for automatic updates
const QString &root()
{
@@ -218,6 +223,7 @@ private:
UpdateFlags m_updateOnExitFlags = None;
QString rootPath;
+ QString staticDataPath;
QString binPath;
QString dataPath;
QString origcwdPath;
diff --git a/changelog.yaml b/changelog.yaml
index f850d6d2..7fb75534 100644
--- a/changelog.yaml
+++ b/changelog.yaml
@@ -72,3 +72,7 @@
- Add french translation
- Download and cache FML libs for legacy versions
- Update the OS X icon
+ - Fix FTB libraries not being used properly
+0.3.5
+ - More versions are now selectable when changing instance versions
+ - Fix for Forge/FML changing its mcmod.info metadata format
diff --git a/gui/ConsoleWindow.cpp b/gui/ConsoleWindow.cpp
index 18a617e0..ac3752c5 100644
--- a/gui/ConsoleWindow.cpp
+++ b/gui/ConsoleWindow.cpp
@@ -24,9 +24,11 @@
#include <gui/Platform.h>
#include <gui/dialogs/CustomMessageBox.h>
#include <gui/dialogs/ProgressDialog.h>
+#include "dialogs/ScreenshotDialog.h"
#include "logic/net/PasteUpload.h"
#include "logic/icons/IconList.h"
+#include <logic/screenshots/ScreenshotList.h>
ConsoleWindow::ConsoleWindow(MinecraftProcess *mcproc, QWidget *parent)
: QMainWindow(parent), ui(new Ui::ConsoleWindow), proc(mcproc)
@@ -35,14 +37,12 @@ ConsoleWindow::ConsoleWindow(MinecraftProcess *mcproc, QWidget *parent)
ui->setupUi(this);
connect(mcproc, SIGNAL(log(QString, MessageLevel::Enum)), this,
SLOT(write(QString, MessageLevel::Enum)));
- connect(mcproc, SIGNAL(ended(BaseInstance *, int, QProcess::ExitStatus)), this,
- SLOT(onEnded(BaseInstance *, int, QProcess::ExitStatus)));
- connect(mcproc, SIGNAL(prelaunch_failed(BaseInstance *, int, QProcess::ExitStatus)), this,
- SLOT(onEnded(BaseInstance *, int, QProcess::ExitStatus)));
- connect(mcproc, SIGNAL(launch_failed(BaseInstance *)), this,
- SLOT(onLaunchFailed(BaseInstance *)));
-
- connect(ui->btnScreenshots, &QPushButton::clicked, this, &ConsoleWindow::uploadScreenshots);
+ connect(mcproc, SIGNAL(ended(InstancePtr, int, QProcess::ExitStatus)), this,
+ SLOT(onEnded(InstancePtr, int, QProcess::ExitStatus)));
+ connect(mcproc, SIGNAL(prelaunch_failed(InstancePtr, int, QProcess::ExitStatus)), this,
+ SLOT(onEnded(InstancePtr, int, QProcess::ExitStatus)));
+ connect(mcproc, SIGNAL(launch_failed(InstancePtr)), this,
+ SLOT(onLaunchFailed(InstancePtr)));
restoreState(
QByteArray::fromBase64(MMC->settings()->get("ConsoleWindowState").toByteArray()));
@@ -172,6 +172,26 @@ void ConsoleWindow::on_closeButton_clicked()
close();
}
+void ConsoleWindow::on_btnScreenshots_clicked()
+{
+ ScreenshotList *list = new ScreenshotList(proc->instance());
+ Task *task = list->load();
+ ProgressDialog prog(this);
+ prog.exec(task);
+ if (!task->successful())
+ {
+ CustomMessageBox::selectable(this, tr("Failed to load screenshots!"),
+ task->failReason(), QMessageBox::Warning)->exec();
+ return;
+ }
+ ScreenshotDialog dialog(list, this);
+ if (dialog.exec() == ScreenshotDialog::Accepted)
+ {
+ CustomMessageBox::selectable(this, tr("Done uploading!"), dialog.message(),
+ QMessageBox::Information)->exec();
+ }
+}
+
void ConsoleWindow::setMayClose(bool mayclose)
{
if(mayclose)
@@ -242,7 +262,7 @@ void ConsoleWindow::on_btnKillMinecraft_clicked()
ui->btnKillMinecraft->setEnabled(true);
}
-void ConsoleWindow::onEnded(BaseInstance *instance, int code, QProcess::ExitStatus status)
+void ConsoleWindow::onEnded(InstancePtr instance, int code, QProcess::ExitStatus status)
{
bool peacefulExit = code == 0 && status != QProcess::CrashExit;
ui->btnKillMinecraft->setEnabled(false);
@@ -274,7 +294,7 @@ void ConsoleWindow::onEnded(BaseInstance *instance, int code, QProcess::ExitStat
}
}
-void ConsoleWindow::onLaunchFailed(BaseInstance *instance)
+void ConsoleWindow::onLaunchFailed(InstancePtr instance)
{
ui->btnKillMinecraft->setEnabled(false);
diff --git a/gui/ConsoleWindow.h b/gui/ConsoleWindow.h
index e21da33c..17c64392 100644
--- a/gui/ConsoleWindow.h
+++ b/gui/ConsoleWindow.h
@@ -51,7 +51,6 @@ private:
signals:
void isClosing();
- void uploadScreenshots();
public
slots:
@@ -71,9 +70,11 @@ slots:
private
slots:
void on_closeButton_clicked();
+ void on_btnScreenshots_clicked();
void on_btnKillMinecraft_clicked();
- void onEnded(BaseInstance *instance, int code, QProcess::ExitStatus status);
- void onLaunchFailed(BaseInstance *instance);
+
+ void onEnded(InstancePtr instance, int code, QProcess::ExitStatus status);
+ void onLaunchFailed(InstancePtr instance);
// FIXME: add handlers for the other MinecraftProcess signals (pre/post launch command
// failures)
diff --git a/gui/MainWindow.cpp b/gui/MainWindow.cpp
index f437f8a3..5ba05b2a 100644
--- a/gui/MainWindow.cpp
+++ b/gui/MainWindow.cpp
@@ -47,6 +47,7 @@
#include "gui/Platform.h"
#include "gui/widgets/LabeledToolButton.h"
+#include "widgets/ServerStatus.h"
#include "gui/dialogs/SettingsDialog.h"
#include "gui/dialogs/NewInstanceDialog.h"
@@ -63,8 +64,8 @@
#include "gui/dialogs/AccountSelectDialog.h"
#include "gui/dialogs/UpdateDialog.h"
#include "gui/dialogs/EditAccountDialog.h"
-#include "gui/dialogs/ScreenshotDialog.h"
#include "gui/dialogs/NotificationDialog.h"
+#include "dialogs/ScreenshotDialog.h"
#include "gui/ConsoleWindow.h"
@@ -216,29 +217,9 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
connect(MMC->instances().get(), SIGNAL(dataIsInvalid()), SLOT(selectionBad()));
m_statusLeft = new QLabel(tr("No instance selected"), this);
- m_statusRight = new QLabel(tr("No status available"), this);
- m_statusRefresh = new QToolButton(this);
- m_statusRefresh->setCheckable(true);
- m_statusRefresh->setToolButtonStyle(Qt::ToolButtonIconOnly);
- m_statusRefresh->setIcon(QIcon::fromTheme("refresh"));
-
+ m_statusRight = new ServerStatus(this);
statusBar()->addPermanentWidget(m_statusLeft, 1);
statusBar()->addPermanentWidget(m_statusRight, 0);
- statusBar()->addPermanentWidget(m_statusRefresh, 0);
-
- // Start status checker
- {
- connect(MMC->statusChecker().get(), &StatusChecker::statusLoaded, this,
- &MainWindow::updateStatusUI);
- connect(MMC->statusChecker().get(), &StatusChecker::statusLoadingFailed, this,
- &MainWindow::updateStatusFailedUI);
-
- connect(m_statusRefresh, &QAbstractButton::clicked, this, &MainWindow::reloadStatus);
- connect(&statusTimer, &QTimer::timeout, this, &MainWindow::reloadStatus);
- statusTimer.setSingleShot(true);
-
- reloadStatus();
- }
// Add "manage accounts" button, right align
QWidget *spacer = new QWidget();
@@ -620,60 +601,6 @@ void MainWindow::updateNewsLabel()
}
}
-static QString convertStatus(const QString &status)
-{
- QString ret = "?";
-
- if (status == "green")
- ret = "↑";
- else if (status == "yellow")
- ret = "-";
- else if (status == "red")
- ret = "↓";
-
- return "<span style=\"font-size:11pt; font-weight:600;\">" + ret + "</span>";
-}
-
-void MainWindow::reloadStatus()
-{
- m_statusRefresh->setChecked(true);
- MMC->statusChecker()->reloadStatus();
- // updateStatusUI();
-}
-
-static QString makeStatusString(const QMap<QString, QString> statuses)
-{
- QString status = "";
- status += "Web: " + convertStatus(statuses["minecraft.net"]);
- status += " Account: " + convertStatus(statuses["account.mojang.com"]);
- status += " Skins: " + convertStatus(statuses["skins.minecraft.net"]);
- status += " Auth: " + convertStatus(statuses["authserver.mojang.com"]);
- status += " Session: " + convertStatus(statuses["sessionserver.mojang.com"]);
-
- return status;
-}
-
-void MainWindow::updateStatusUI()
-{
- auto statusChecker = MMC->statusChecker();
- auto statuses = statusChecker->getStatusEntries();
-
- QString status = makeStatusString(statuses);
- m_statusRefresh->setChecked(false);
-
- m_statusRight->setText(status);
-
- statusTimer.start(60 * 1000);
-}
-
-void MainWindow::updateStatusFailedUI()
-{
- m_statusRight->setText(makeStatusString(QMap<QString, QString>()));
- m_statusRefresh->setChecked(false);
-
- statusTimer.start(60 * 1000);
-}
-
void MainWindow::updateAvailable(QString repo, QString versionName, int versionId)
{
UpdateDialog dlg;
@@ -1317,15 +1244,19 @@ void MainWindow::launchInstance(InstancePtr instance, AuthSessionPtr session, Ba
Q_ASSERT_X(instance != NULL, "launchInstance", "instance is NULL");
Q_ASSERT_X(session.get() != nullptr, "launchInstance", "session is NULL");
- proc = instance->prepareForLaunch(session);
- if (!proc)
+ QString launchScript;
+
+ if(!instance->prepareForLaunch(session, launchScript))
return;
+ MinecraftProcess *proc = new MinecraftProcess(instance);
+ proc->setLaunchScript(launchScript);
+ proc->setWorkdir(instance->minecraftRoot());
+
this->hide();
console = new ConsoleWindow(proc);
connect(console, SIGNAL(isClosing()), this, SLOT(instanceEnded()));
- connect(console, &ConsoleWindow::uploadScreenshots, this, &MainWindow::on_actionScreenshots_triggered);
proc->setLogin(session);
proc->arm();
@@ -1347,7 +1278,7 @@ void MainWindow::launchInstance(InstancePtr instance, AuthSessionPtr session, Ba
dialog.setLabelText(tr("Waiting for profiler..."));
connect(&dialog, &QProgressDialog::canceled, profilerInstance, &BaseProfiler::abortProfiling);
dialog.show();
- connect(profilerInstance, &BaseProfiler::readyToLaunch, [&dialog, this](const QString &message)
+ connect(profilerInstance, &BaseProfiler::readyToLaunch, [&dialog, this, proc](const QString &message)
{
dialog.accept();
QMessageBox msg;
@@ -1360,7 +1291,7 @@ void MainWindow::launchInstance(InstancePtr instance, AuthSessionPtr session, Ba
msg.exec();
proc->launch();
});
- connect(profilerInstance, &BaseProfiler::abortLaunch, [&dialog, this](const QString &message)
+ connect(profilerInstance, &BaseProfiler::abortLaunch, [&dialog, this, proc](const QString &message)
{
dialog.accept();
QMessageBox msg;
diff --git a/gui/MainWindow.h b/gui/MainWindow.h
index d610a87d..69cf11b0 100644
--- a/gui/MainWindow.h
+++ b/gui/MainWindow.h
@@ -111,6 +111,8 @@ slots:
void on_actionEditInstNotes_triggered();
+ void on_actionScreenshots_triggered();
+
/*!
* Launches the currently selected instance with the default account.
* If no default account is selected, prompts the user to pick an account.
@@ -144,8 +146,6 @@ slots:
void showInstanceContextMenu(const QPoint &);
- void on_actionScreenshots_triggered();
-
void updateToolsMenu();
void skinJobFinished();
@@ -171,12 +171,6 @@ slots:
void updateNewsLabel();
- void updateStatusUI();
-
- void updateStatusFailedUI();
-
- void reloadStatus();
-
/*!
* Runs the DownloadUpdateTask and installs updates.
*/
@@ -206,12 +200,9 @@ private:
Task *m_versionLoadTask;
QLabel *m_statusLeft;
- QLabel *m_statusRight;
- QToolButton *m_statusRefresh;
+ class ServerStatus *m_statusRight;
QMenu *accountMenu;
QToolButton *accountMenuButton;
QAction *manageAccountsAction;
-
- QTimer statusTimer;
};
diff --git a/gui/dialogs/SettingsDialog.cpp b/gui/dialogs/SettingsDialog.cpp
index 7ec48336..2dd19077 100644
--- a/gui/dialogs/SettingsDialog.cpp
+++ b/gui/dialogs/SettingsDialog.cpp
@@ -407,8 +407,8 @@ void SettingsDialog::loadSettings(SettingsObject *s)
// Language
ui->languageBox->clear();
ui->languageBox->addItem(tr("English"), QLocale(QLocale::English));
- foreach(const QString & lang,
- QDir(MMC->root() + "/translations").entryList(QStringList() << "*.qm", QDir::Files))
+ foreach(const QString & lang, QDir(MMC->staticData() + "/translations")
+ .entryList(QStringList() << "*.qm", QDir::Files))
{
QLocale locale(lang.section(QRegExp("[_\.]"), 1));
ui->languageBox->addItem(QLocale::languageToString(locale.language()), locale);
diff --git a/gui/widgets/IconLabel.cpp b/gui/widgets/IconLabel.cpp
new file mode 100644
index 00000000..1bfe8dc9
--- /dev/null
+++ b/gui/widgets/IconLabel.cpp
@@ -0,0 +1,30 @@
+#include "IconLabel.h"
+
+#include <QStyle>
+#include <QStyleOption>
+#include <QLayout>
+#include <QPainter>
+#include <QRect>
+
+IconLabel::IconLabel(QWidget *parent, QIcon icon, QSize size)
+ : QWidget(parent), m_icon(icon), m_size(size)
+{
+ setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
+}
+
+QSize IconLabel::sizeHint() const
+{
+ return m_size;
+}
+
+void IconLabel::setIcon(QIcon icon)
+{
+ m_icon = icon;
+ update();
+}
+
+void IconLabel::paintEvent(QPaintEvent *)
+{
+ QPainter p(this);
+ m_icon.paint(&p, contentsRect());
+}
diff --git a/gui/widgets/IconLabel.h b/gui/widgets/IconLabel.h
new file mode 100644
index 00000000..a2f1eef3
--- /dev/null
+++ b/gui/widgets/IconLabel.h
@@ -0,0 +1,26 @@
+#pragma once
+#include <QWidget>
+#include <QIcon>
+
+class QStyleOption;
+
+/**
+ * This is a trivial widget that paints a QIcon of the specified size.
+ */
+class IconLabel : public QWidget
+{
+ Q_OBJECT
+
+public:
+ /// Create a line separator. orientation is the orientation of the line.
+ explicit IconLabel(QWidget *parent, QIcon icon, QSize size);
+
+ virtual QSize sizeHint() const;
+ virtual void paintEvent(QPaintEvent *);
+
+ void setIcon(QIcon icon);
+
+private:
+ QSize m_size;
+ QIcon m_icon;
+};
diff --git a/gui/widgets/LineSeparator.cpp b/gui/widgets/LineSeparator.cpp
new file mode 100644
index 00000000..f4ee173d
--- /dev/null
+++ b/gui/widgets/LineSeparator.cpp
@@ -0,0 +1,37 @@
+#include "LineSeparator.h"
+
+#include <QStyle>
+#include <QStyleOption>
+#include <QLayout>
+#include <QPainter>
+
+void LineSeparator::initStyleOption(QStyleOption *option) const
+{
+ option->initFrom(this);
+ // in a horizontal layout, the line is vertical (and vice versa)
+ if (m_orientation == Qt::Vertical)
+ option->state |= QStyle::State_Horizontal;
+}
+
+LineSeparator::LineSeparator(QWidget *parent, Qt::Orientation orientation)
+ : QWidget(parent), m_orientation(orientation)
+{
+ setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
+}
+
+QSize LineSeparator::sizeHint() const
+{
+ QStyleOption opt;
+ initStyleOption(&opt);
+ const int extent =
+ style()->pixelMetric(QStyle::PM_ToolBarSeparatorExtent, &opt, parentWidget());
+ return QSize(extent, extent);
+}
+
+void LineSeparator::paintEvent(QPaintEvent *)
+{
+ QPainter p(this);
+ QStyleOption opt;
+ initStyleOption(&opt);
+ style()->drawPrimitive(QStyle::PE_IndicatorToolBarSeparator, &opt, &p, parentWidget());
+}
diff --git a/gui/widgets/LineSeparator.h b/gui/widgets/LineSeparator.h
new file mode 100644
index 00000000..376f2056
--- /dev/null
+++ b/gui/widgets/LineSeparator.h
@@ -0,0 +1,18 @@
+#pragma once
+#include <QWidget>
+
+class QStyleOption;
+
+class LineSeparator : public QWidget
+{
+ Q_OBJECT
+
+public:
+ /// Create a line separator. orientation is the orientation of the line.
+ explicit LineSeparator(QWidget *parent, Qt::Orientation orientation = Qt::Vertical);
+ QSize sizeHint() const;
+ void paintEvent(QPaintEvent *);
+ void initStyleOption(QStyleOption *option) const;
+private:
+ Qt::Orientation m_orientation = Qt::Vertical;
+};
diff --git a/gui/widgets/ServerStatus.cpp b/gui/widgets/ServerStatus.cpp
new file mode 100644
index 00000000..e540a301
--- /dev/null
+++ b/gui/widgets/ServerStatus.cpp
@@ -0,0 +1,115 @@
+#include "ServerStatus.h"
+#include "LineSeparator.h"
+#include "IconLabel.h"
+#include "logic/status/StatusChecker.h"
+
+#include "MultiMC.h"
+
+#include <QHBoxLayout>
+#include <QFrame>
+#include <QLabel>
+#include <QMap>
+#include <QToolButton>
+#include <QAction>
+
+ServerStatus::ServerStatus(QWidget *parent, Qt::WindowFlags f) : QWidget(parent, f)
+{
+ layout = new QHBoxLayout(this);
+ layout->setContentsMargins(0, 0, 0, 0);
+ goodIcon = QIcon::fromTheme("status-good");
+ badIcon = QIcon::fromTheme("status-bad");
+
+ addStatus("minecraft.net", tr("Web"));
+ addLine();
+ addStatus("account.mojang.com", tr("Account"));
+ addLine();
+ addStatus("skins.minecraft.net", tr("Skins"));
+ addLine();
+ addStatus("authserver.mojang.com", tr("Auth"));
+ addLine();
+ addStatus("sessionserver.mojang.com", tr("Session"));
+
+ m_statusRefresh = new QToolButton(this);
+ m_statusRefresh->setCheckable(true);
+ m_statusRefresh->setToolButtonStyle(Qt::ToolButtonIconOnly);
+ m_statusRefresh->setIcon(QIcon::fromTheme("refresh"));
+ layout->addWidget(m_statusRefresh);
+
+ setLayout(layout);
+
+ // Start status checker
+ {
+ auto reloader = MMC->statusChecker().get();
+ connect(reloader, &StatusChecker::statusChanged, this, &ServerStatus::StatusChanged);
+ connect(reloader, &StatusChecker::statusLoading, this, &ServerStatus::StatusReloading);
+ connect(m_statusRefresh, &QAbstractButton::clicked, this, &ServerStatus::reloadStatus);
+ MMC->statusChecker()->startTimer(60000);
+ reloadStatus();
+ }
+}
+
+ServerStatus::~ServerStatus()
+{
+}
+
+void ServerStatus::reloadStatus()
+{
+ MMC->statusChecker()->reloadStatus();
+}
+
+void ServerStatus::addLine()
+{
+ layout->addWidget(new LineSeparator(this));
+}
+
+void ServerStatus::addStatus(QString key, QString name)
+{
+ {
+ auto label = new IconLabel(this, badIcon, QSize(16, 16));
+ label->setToolTip(key);
+ serverLabels[key] = label;
+ layout->addWidget(label);
+ }
+ {
+ auto label = new QLabel(this);
+ label->setText(name);
+ label->setToolTip(key);
+ layout->addWidget(label);
+ }
+}
+
+void ServerStatus::setStatus(QString key, bool value)
+{
+ if (!serverLabels.contains(key))
+ return;
+ IconLabel *label = serverLabels[key];
+ label->setIcon(value ? goodIcon : badIcon);
+}
+
+void ServerStatus::StatusChanged(const QMap<QString, QString> statusEntries)
+{
+ auto convertStatus = [&](QString status)->bool
+ {
+ if (status == "green")
+ return true;
+ else if (status == "yellow")
+ return false;
+ else if (status == "red")
+ return false;
+ return false;
+ }
+ ;
+ auto iter = statusEntries.begin();
+ while (iter != statusEntries.end())
+ {
+ QString key = iter.key();
+ bool value = convertStatus(iter.value());
+ setStatus(key, value);
+ iter++;
+ }
+}
+
+void ServerStatus::StatusReloading(bool is_reloading)
+{
+ m_statusRefresh->setChecked(is_reloading);
+}
diff --git a/gui/widgets/ServerStatus.h b/gui/widgets/ServerStatus.h
new file mode 100644
index 00000000..2244031b
--- /dev/null
+++ b/gui/widgets/ServerStatus.h
@@ -0,0 +1,34 @@
+#pragma once
+#include <QString>
+#include <QWidget>
+#include <QMap>
+#include <QIcon>
+#include <memory>
+
+class IconLabel;
+class QToolButton;
+class QHBoxLayout;
+
+class ServerStatus: public QWidget
+{
+ Q_OBJECT
+public:
+ explicit ServerStatus(QWidget *parent = nullptr, Qt::WindowFlags f = 0);
+ virtual ~ServerStatus();
+ ;
+public slots:
+ void reloadStatus();
+ void StatusChanged(const QMap<QString, QString> statuses);
+ void StatusReloading(bool is_reloading);
+
+private: /* methods */
+ void addLine();
+ void addStatus(QString key, QString name);
+ void setStatus(QString key, bool value);
+private: /* data */
+ QHBoxLayout * layout = nullptr;
+ QToolButton *m_statusRefresh = nullptr;
+ QMap<QString, IconLabel *> serverLabels;
+ QIcon goodIcon;
+ QIcon badIcon;
+};
diff --git a/logic/BaseInstance.h b/logic/BaseInstance.h
index d38ae409..16791592 100644
--- a/logic/BaseInstance.h
+++ b/logic/BaseInstance.h
@@ -163,7 +163,7 @@ public:
virtual std::shared_ptr<Task> doUpdate() = 0;
/// returns a valid minecraft process, ready for launch with the given account.
- virtual MinecraftProcess *prepareForLaunch(AuthSessionPtr account) = 0;
+ virtual bool prepareForLaunch(AuthSessionPtr account, QString & launchScript) = 0;
/// do any necessary cleanups after the instance finishes. also runs before
/// 'prepareForLaunch'
diff --git a/logic/LegacyInstance.cpp b/logic/LegacyInstance.cpp
index d06b8827..6648e059 100644
--- a/logic/LegacyInstance.cpp
+++ b/logic/LegacyInstance.cpp
@@ -50,16 +50,13 @@ std::shared_ptr<Task> LegacyInstance::doUpdate()
return std::shared_ptr<Task>(new LegacyUpdate(this, this));
}
-MinecraftProcess *LegacyInstance::prepareForLaunch(AuthSessionPtr account)
+bool LegacyInstance::prepareForLaunch(AuthSessionPtr account, QString & launchScript)
{
- MinecraftProcess *proc = new MinecraftProcess(this);
-
QIcon icon = MMC->icons()->getIcon(iconKey());
auto pixmap = icon.pixmap(128, 128);
pixmap.save(PathCombine(minecraftRoot(), "icon.png"), "PNG");
// create the launch script
- QString launchScript;
{
// window size
QString windowParams;
@@ -79,12 +76,7 @@ MinecraftProcess *LegacyInstance::prepareForLaunch(AuthSessionPtr account)
launchScript += "lwjgl " + lwjgl + "\n";
launchScript += "launcher legacy\n";
}
- proc->setLaunchScript(launchScript);
-
- // set the process work path
- proc->setWorkdir(minecraftRoot());
-
- return proc;
+ return true;
}
void LegacyInstance::cleanupAfterRun()
diff --git a/logic/LegacyInstance.h b/logic/LegacyInstance.h
index badaf7e3..aa80968e 100644
--- a/logic/LegacyInstance.h
+++ b/logic/LegacyInstance.h
@@ -79,7 +79,7 @@ public:
virtual void setShouldUpdate(bool val) override;
virtual std::shared_ptr<Task> doUpdate() override;
- virtual MinecraftProcess *prepareForLaunch(AuthSessionPtr account) override;
+ virtual bool prepareForLaunch(AuthSessionPtr account, QString & launchScript) override;
virtual void cleanupAfterRun() override;
virtual QDialog *createModEditDialog(QWidget *parent) override;
diff --git a/logic/MinecraftProcess.cpp b/logic/MinecraftProcess.cpp
index e43e5830..b268a4cc 100644
--- a/logic/MinecraftProcess.cpp
+++ b/logic/MinecraftProcess.cpp
@@ -34,7 +34,7 @@
#define IBUS "@im=ibus"
// constructor
-MinecraftProcess::MinecraftProcess(BaseInstance *inst) : m_instance(inst)
+MinecraftProcess::MinecraftProcess(InstancePtr inst) : m_instance(inst)
{
connect(this, SIGNAL(finished(int, QProcess::ExitStatus)),
SLOT(finish(int, QProcess::ExitStatus)));
diff --git a/logic/MinecraftProcess.h b/logic/MinecraftProcess.h
index d47a6cd2..b61ef380 100644
--- a/logic/MinecraftProcess.h
+++ b/logic/MinecraftProcess.h
@@ -52,8 +52,13 @@ public:
* @brief MinecraftProcess constructor
* @param inst the Instance pointer to launch
*/
- MinecraftProcess(BaseInstance *inst);
+ MinecraftProcess(InstancePtr inst);
+ virtual ~MinecraftProcess()
+ {
+
+ };
+
/**
* @brief start the launcher part with the provided launch script
*/
@@ -69,7 +74,7 @@ public:
*/
void abort();
- BaseInstance *instance()
+ InstancePtr instance()
{
return m_instance;
}
@@ -97,22 +102,22 @@ signals:
/**
* @brief emitted when Minecraft immediately fails to run
*/
- void launch_failed(BaseInstance *);
+ void launch_failed(InstancePtr);
/**
* @brief emitted when the PreLaunchCommand fails
*/
- void prelaunch_failed(BaseInstance *, int code, QProcess::ExitStatus status);
+ void prelaunch_failed(InstancePtr, int code, QProcess::ExitStatus status);
/**
* @brief emitted when the PostLaunchCommand fails
*/
- void postlaunch_failed(BaseInstance *, int code, QProcess::ExitStatus status);
+ void postlaunch_failed(InstancePtr, int code, QProcess::ExitStatus status);
/**
* @brief emitted when mc has finished and the PostLaunchCommand was run
*/
- void ended(BaseInstance *, int code, QProcess::ExitStatus status);
+ void ended(InstancePtr, int code, QProcess::ExitStatus status);
/**
* @brief emitted when we want to log something
@@ -122,7 +127,7 @@ signals:
void log(QString text, MessageLevel::Enum level = MessageLevel::MultiMC);
protected:
- BaseInstance *m_instance = nullptr;
+ InstancePtr m_instance;
QString m_err_leftover;
QString m_out_leftover;
QProcess m_prepostlaunchprocess;
diff --git a/logic/OneSixInstance.cpp b/logic/OneSixInstance.cpp
index 24d54446..6f3018cb 100644
--- a/logic/OneSixInstance.cpp
+++ b/logic/OneSixInstance.cpp
@@ -189,7 +189,7 @@ QStringList OneSixInstance::processMinecraftArgs(AuthSessionPtr session)
return parts;
}
-MinecraftProcess *OneSixInstance::prepareForLaunch(AuthSessionPtr session)
+bool OneSixInstance::prepareForLaunch(AuthSessionPtr account, QString &launchScript)
{
I_D(OneSixInstance);
@@ -200,7 +200,6 @@ MinecraftProcess *OneSixInstance::prepareForLaunch(AuthSessionPtr session)
auto version = d->version;
if (!version)
return nullptr;
- QString launchScript;
{
auto libs = version->getActiveNormalLibs();
for (auto lib : libs)
@@ -212,7 +211,7 @@ MinecraftProcess *OneSixInstance::prepareForLaunch(AuthSessionPtr session)
}
launchScript += "mainClass " + version->mainClass + "\n";
- for (auto param : processMinecraftArgs(session))
+ for (auto param : processMinecraftArgs(account))
{
launchScript += "param " + param + "\n";
}
@@ -240,13 +239,7 @@ MinecraftProcess *OneSixInstance::prepareForLaunch(AuthSessionPtr session)
}
launchScript += "natives " + natives_dir.absolutePath() + "\n";
launchScript += "launcher onesix\n";
-
- // create the process and set its parameters
- MinecraftProcess *proc = new MinecraftProcess(this);
- proc->setWorkdir(minecraftRoot());
- proc->setLaunchScript(launchScript);
- // proc->setNativeFolder(natives_dir.absolutePath());
- return proc;
+ return true;
}
void OneSixInstance::cleanupAfterRun()
diff --git a/logic/OneSixInstance.h b/logic/OneSixInstance.h
index 4e9d62a1..13a392c2 100644
--- a/logic/OneSixInstance.h
+++ b/logic/OneSixInstance.h
@@ -40,7 +40,7 @@ public:
virtual QString instanceConfigFolder() const override;
virtual std::shared_ptr<Task> doUpdate() override;
- virtual MinecraftProcess *prepareForLaunch(AuthSessionPtr session) override;
+ virtual bool prepareForLaunch(AuthSessionPtr account, QString & launchScript) override;
virtual void cleanupAfterRun() override;
diff --git a/logic/status/StatusChecker.cpp b/logic/status/StatusChecker.cpp
index 66f800ae..17053837 100644
--- a/logic/status/StatusChecker.cpp
+++ b/logic/status/StatusChecker.cpp
@@ -27,6 +27,12 @@ StatusChecker::StatusChecker()
}
+void StatusChecker::timerEvent(QTimerEvent *e)
+{
+ QObject::timerEvent(e);
+ reloadStatus();
+}
+
void StatusChecker::reloadStatus()
{
if (isLoadingStatus())
@@ -42,13 +48,14 @@ void StatusChecker::reloadStatus()
QObject::connect(job, &NetJob::succeeded, this, &StatusChecker::statusDownloadFinished);
QObject::connect(job, &NetJob::failed, this, &StatusChecker::statusDownloadFailed);
m_statusNetJob.reset(job);
+ emit statusLoading(true);
job->start();
}
void StatusChecker::statusDownloadFinished()
{
QLOG_DEBUG() << "Finished loading status JSON.";
-
+ m_statusEntries.clear();
QByteArray data;
{
ByteArrayDownloadPtr dl = std::dynamic_pointer_cast<ByteArrayDownload>(m_statusNetJob->first());
@@ -121,17 +128,27 @@ QString StatusChecker::getLastLoadErrorMsg() const
void StatusChecker::succeed()
{
+ if(m_prevEntries != m_statusEntries)
+ {
+ emit statusChanged(m_statusEntries);
+ m_prevEntries = m_statusEntries;
+ }
m_lastLoadError = "";
QLOG_DEBUG() << "Status loading succeeded.";
m_statusNetJob.reset();
- emit statusLoaded();
+ emit statusLoading(false);
}
void StatusChecker::fail(const QString& errorMsg)
{
+ if(m_prevEntries != m_statusEntries)
+ {
+ emit statusChanged(m_statusEntries);
+ m_prevEntries = m_statusEntries;
+ }
m_lastLoadError = errorMsg;
QLOG_DEBUG() << "Failed to load status:" << errorMsg;
m_statusNetJob.reset();
- emit statusLoadingFailed(errorMsg);
+ emit statusLoading(false);
}
diff --git a/logic/status/StatusChecker.h b/logic/status/StatusChecker.h
index 1cb01836..df0dd06d 100644
--- a/logic/status/StatusChecker.h
+++ b/logic/status/StatusChecker.h
@@ -29,26 +29,27 @@ public:
QString getLastLoadErrorMsg() const;
- bool isStatusLoaded() const;
-
bool isLoadingStatus() const;
QMap<QString, QString> getStatusEntries() const;
void Q_SLOT reloadStatus();
+protected:
+ virtual void timerEvent(QTimerEvent *);
+
signals:
- void statusLoaded();
- void statusLoadingFailed(QString errorMsg);
+ void statusLoading(bool loading);
+ void statusChanged(QMap<QString, QString> newStatus);
protected slots:
void statusDownloadFinished();
void statusDownloadFailed();
protected:
+ QMap<QString, QString> m_prevEntries;
QMap<QString, QString> m_statusEntries;
NetJobPtr m_statusNetJob;
- bool m_loadedStatus;
QString m_lastLoadError;
void Q_SLOT succeed();
diff --git a/resources/multimc/16x16/status-bad.png b/resources/multimc/16x16/status-bad.png
new file mode 100644
index 00000000..5b3f2051
--- /dev/null
+++ b/resources/multimc/16x16/status-bad.png
Binary files differ
diff --git a/resources/multimc/16x16/status-good.png b/resources/multimc/16x16/status-good.png
new file mode 100644
index 00000000..5cbdee81
--- /dev/null
+++ b/resources/multimc/16x16/status-good.png
Binary files differ
diff --git a/resources/multimc/22x22/status-bad.png b/resources/multimc/22x22/status-bad.png
new file mode 100644
index 00000000..2707539e
--- /dev/null
+++ b/resources/multimc/22x22/status-bad.png
Binary files differ
diff --git a/resources/multimc/22x22/status-good.png b/resources/multimc/22x22/status-good.png
new file mode 100644
index 00000000..f55debc3
--- /dev/null
+++ b/resources/multimc/22x22/status-good.png
Binary files differ
diff --git a/resources/multimc/24x24/status-bad.png b/resources/multimc/24x24/status-bad.png
new file mode 100644
index 00000000..d1547a47
--- /dev/null
+++ b/resources/multimc/24x24/status-bad.png
Binary files differ
diff --git a/resources/multimc/24x24/status-good.png b/resources/multimc/24x24/status-good.png
new file mode 100644
index 00000000..3545bc4c
--- /dev/null
+++ b/resources/multimc/24x24/status-good.png
Binary files differ
diff --git a/resources/multimc/32x32/status-bad.png b/resources/multimc/32x32/status-bad.png
new file mode 100644
index 00000000..8c2c9d4f
--- /dev/null
+++ b/resources/multimc/32x32/status-bad.png
Binary files differ
diff --git a/resources/multimc/32x32/status-good.png b/resources/multimc/32x32/status-good.png
new file mode 100644
index 00000000..1a805e68
--- /dev/null
+++ b/resources/multimc/32x32/status-good.png
Binary files differ
diff --git a/resources/multimc/48x48/status-bad.png b/resources/multimc/48x48/status-bad.png
new file mode 100644
index 00000000..41c9cf22
--- /dev/null
+++ b/resources/multimc/48x48/status-bad.png
Binary files differ
diff --git a/resources/multimc/48x48/status-good.png b/resources/multimc/48x48/status-good.png
new file mode 100644
index 00000000..df7cb59b
--- /dev/null
+++ b/resources/multimc/48x48/status-good.png
Binary files differ
diff --git a/resources/multimc/64x64/status-bad.png b/resources/multimc/64x64/status-bad.png
new file mode 100644
index 00000000..64060ba0
--- /dev/null
+++ b/resources/multimc/64x64/status-bad.png
Binary files differ
diff --git a/resources/multimc/64x64/status-good.png b/resources/multimc/64x64/status-good.png
new file mode 100644
index 00000000..e862ddcd
--- /dev/null
+++ b/resources/multimc/64x64/status-good.png
Binary files differ
diff --git a/resources/multimc/multimc.qrc b/resources/multimc/multimc.qrc
index d3068ff4..1df22c29 100644
--- a/resources/multimc/multimc.qrc
+++ b/resources/multimc/multimc.qrc
@@ -87,6 +87,22 @@
<file>48x48/news.png</file>
<file>64x64/news.png</file>
+ <!-- Bad status. Our own. -->
+ <file>16x16/status-bad.png</file>
+ <file>24x24/status-bad.png</file>
+ <file>22x22/status-bad.png</file>
+ <file>32x32/status-bad.png</file>
+ <file>48x48/status-bad.png</file>
+ <file>64x64/status-bad.png</file>
+
+ <!-- Good status. Our own. -->
+ <file>16x16/status-good.png</file>
+ <file>24x24/status-good.png</file>
+ <file>22x22/status-good.png</file>
+ <file>32x32/status-good.png</file>
+ <file>48x48/status-good.png</file>
+ <file>64x64/status-good.png</file>
+
<!-- Refresh, CC-BY-SA 3.0, Oxygen icons. -->
<file>16x16/refresh.png</file>
<file>22x22/refresh.png</file>
diff --git a/resources/multimc/scalable/status-bad.svg b/resources/multimc/scalable/status-bad.svg
new file mode 100644
index 00000000..9f47307e
--- /dev/null
+++ b/resources/multimc/scalable/status-bad.svg
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="32"
+ height="32"
+ id="svg3891"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="status-bad.svg"
+ inkscape:export-filename="/home/peterix/minecraft/src/MultiMC5/resources/multimc/64x64/status-bad.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180">
+ <defs
+ id="defs3893">
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter3850">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.5"
+ id="feGaussianBlur3852" />
+ </filter>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3827"
+ id="radialGradient3823"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4496779,1.5407764,-0.90127514,0.84794135,4.9906134,-4.9255796)"
+ cx="3.9371533"
+ cy="7.5016646"
+ fx="3.9371533"
+ fy="7.5016646"
+ r="2.5" />
+ <linearGradient
+ id="linearGradient3827">
+ <stop
+ id="stop3829"
+ offset="0"
+ style="stop-color:#b80000;stop-opacity:1;" />
+ <stop
+ id="stop3831"
+ offset="1"
+ style="stop-color:#600000;stop-opacity:1;" />
+ </linearGradient>
+ <radialGradient
+ r="2.5"
+ fy="7.5016646"
+ fx="3.9371533"
+ cy="7.5016646"
+ cx="3.9371533"
+ gradientTransform="matrix(1.4496779,1.5407764,-0.90127514,0.84794135,4.9906134,-4.9255796)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3889"
+ xlink:href="#linearGradient3827"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="3.959798"
+ inkscape:cx="5.985117"
+ inkscape:cy="16.047085"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="532"
+ inkscape:window-height="454"
+ inkscape:window-x="2159"
+ inkscape:window-y="166"
+ inkscape:window-maximized="0" />
+ <metadata
+ id="metadata3896">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-381.14286,-467.79075)">
+ <path
+ transform="matrix(6.4,0,0,6.4,361.94286,422.99075)"
+ d="M 8,9.5 C 8,10.880712 6.8807119,12 5.5,12 4.1192881,12 3,10.880712 3,9.5 3,8.1192881 4.1192881,7 5.5,7 6.8807119,7 8,8.1192881 8,9.5 z"
+ sodipodi:ry="2.5"
+ sodipodi:rx="2.5"
+ sodipodi:cy="9.5"
+ sodipodi:cx="5.5"
+ id="path3811"
+ style="color:#000000;fill:url(#radialGradient3889);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.93333333,0,0,0.93333444,382.20952,468.85732)"
+ d="M 31,16 C 31,24.284271 24.284271,31 16,31 7.7157288,31 1,24.284271 1,16 1,7.7157288 7.7157288,1 16,1 24.284271,1 31,7.7157288 31,16 z"
+ sodipodi:ry="15"
+ sodipodi:rx="15"
+ sodipodi:cy="16"
+ sodipodi:cx="16"
+ id="path3813"
+ style="color:#000000;fill:#df0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3840"
+ d="m 392.64286,476.29082 -3,3 4.5,4.5 -4.5,4.5 3,3 4.5,-4.5 4.5,4.5 3,-3 -4.5,-4.5 4.5,-4.5 -3,-3 -4.5,4.5 -4.5,-4.5 z"
+ style="fill:none;stroke:#000000;filter:url(#filter3850)" />
+ <path
+ style="fill:#ffffff;stroke:#000000"
+ d="m 392.64286,476.29082 -3,3 4.5,4.5 -4.5,4.5 3,3 4.5,-4.5 4.5,4.5 3,-3 -4.5,-4.5 4.5,-4.5 -3,-3 -4.5,4.5 -4.5,-4.5 z"
+ id="path3819"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3854"
+ d="m 392.64286,476.29082 -3,3 4.5,4.5 -4.5,4.5 3,3 4.5,-4.5 4.5,4.5 3,-3 -4.5,-4.5 4.5,-4.5 -3,-3 -4.5,4.5 -4.5,-4.5 z"
+ style="opacity:0.51879697;fill:#ffffff;stroke:none" />
+ </g>
+</svg>
diff --git a/resources/multimc/scalable/status-good.svg b/resources/multimc/scalable/status-good.svg
new file mode 100644
index 00000000..0a35c80f
--- /dev/null
+++ b/resources/multimc/scalable/status-good.svg
@@ -0,0 +1,201 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="32"
+ height="32"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="status-good.svg"
+ inkscape:export-filename="/home/peterix/minecraft/src/MultiMC5/resources/multimc/64x64/status-good.png"
+ inkscape:export-xdpi="180"
+ inkscape:export-ydpi="180">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient3827">
+ <stop
+ id="stop3829"
+ offset="0"
+ style="stop-color:#b80000;stop-opacity:1;" />
+ <stop
+ id="stop3831"
+ offset="1"
+ style="stop-color:#600000;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3801">
+ <stop
+ style="stop-color:#00b81a;stop-opacity:1;"
+ offset="0"
+ id="stop3803" />
+ <stop
+ style="stop-color:#00600d;stop-opacity:1;"
+ offset="1"
+ id="stop3805" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3005">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3007" />
+ <stop
+ id="stop3781"
+ offset="0.8142857"
+ style="stop-color:#ffffff;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop3009" />
+ </linearGradient>
+ <filter
+ inkscape:collect="always"
+ id="filter3797">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.52592593"
+ id="feGaussianBlur3799" />
+ </filter>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3801"
+ id="radialGradient3807"
+ cx="3.9371533"
+ cy="7.5016646"
+ fx="3.9371533"
+ fy="7.5016646"
+ r="2.5"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4496779,1.5407764,-0.90127514,0.84794135,4.9906134,-4.9255796)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3827"
+ id="radialGradient3823"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.4496779,1.5407764,-0.90127514,0.84794135,4.9906134,-4.9255796)"
+ cx="3.9371533"
+ cy="7.5016646"
+ fx="3.9371533"
+ fy="7.5016646"
+ r="2.5" />
+ <filter
+ inkscape:collect="always"
+ id="filter3850">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.5"
+ id="feGaussianBlur3852" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.8"
+ inkscape:cx="8.6376236"
+ inkscape:cy="10.641334"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ showguides="false"
+ inkscape:snap-bbox="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-width="532"
+ inkscape:window-height="454"
+ inkscape:window-x="2290"
+ inkscape:window-y="202"
+ inkscape:window-maximized="0">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2993"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ <sodipodi:guide
+ orientation="0,1"
+ position="15,16"
+ id="guide3783" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="16,14"
+ id="guide3785" />
+ <sodipodi:guide
+ orientation="0,1"
+ position="94,38"
+ id="guide3833" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="84,34"
+ id="guide3835" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1020.3622)">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;color:#000000;fill:url(#radialGradient3807);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.50000000000000000;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;stroke-miterlimit:4;stroke-dasharray:none"
+ id="path2997"
+ sodipodi:cx="5.5"
+ sodipodi:cy="9.5"
+ sodipodi:rx="2.5"
+ sodipodi:ry="2.5"
+ d="m 8,9.5 a 2.5,2.5 0 1 1 -5,0 2.5,2.5 0 1 1 5,0 z"
+ transform="matrix(6.4,0,0,6.4,-19.2,975.5622)" />
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:#00c900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.50000000000000000;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path2999"
+ sodipodi:cx="16"
+ sodipodi:cy="16"
+ sodipodi:rx="15"
+ sodipodi:ry="15"
+ d="M 31,16 A 15,15 0 1 1 1,16 15,15 0 1 1 31,16 z"
+ transform="matrix(0.93333333,0,0,0.93333444,1.0666666,1021.4288)" />
+ <path
+ sodipodi:nodetypes="ccccccc"
+ inkscape:connector-curvature="0"
+ id="path3787"
+ d="m 6.5,1037.3622 3,-3 4.5,4.5 9.5,-9.5 3,3 -12.5,12.5 z"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3797)" />
+ <path
+ style="fill:#ffffff;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 6.5,1037.3622 3,-3 4.5,4.5 9.5,-9.5 3,3 -12.5,12.5 z"
+ id="path3001"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <path
+ sodipodi:nodetypes="ccccccc"
+ inkscape:connector-curvature="0"
+ id="path3809"
+ d="m 6.5,1037.3622 3,-3 4.5,4.5 9.5,-9.5 3,3 -12.5,12.5 z"
+ style="fill:#ffffff;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;opacity:0.54887218" />
+ </g>
+</svg>
diff --git a/resources/sources/status-bad.svg b/resources/sources/status-bad.svg
deleted file mode 100644
index 54334e06..00000000
--- a/resources/sources/status-bad.svg
+++ /dev/null
@@ -1,262 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="64"
- height="64"
- id="svg2"
- version="1.1"
- inkscape:version="0.48.4 r9939"
- sodipodi:docname="status-bad.svg"
- inkscape:export-filename="/home/peterix/projects/MultiMC4/src/resources/insticons/enderpearl.png"
- inkscape:export-xdpi="45"
- inkscape:export-ydpi="45">
- <defs
- id="defs4">
- <linearGradient
- id="linearGradient4245">
- <stop
- id="stop4247"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- style="stop-color:#106810;stop-opacity:1"
- offset="0.89412045"
- id="stop4251" />
- <stop
- id="stop4249"
- offset="1"
- style="stop-color:#199c19;stop-opacity:0" />
- </linearGradient>
- <linearGradient
- id="linearGradient4239">
- <stop
- id="stop4241"
- offset="0"
- style="stop-color:#513000;stop-opacity:1;" />
- <stop
- id="stop4243"
- offset="1"
- style="stop-color:#eea700;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient4030">
- <stop
- id="stop4032"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop4034"
- offset="1"
- style="stop-color:#0c493f;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient3954">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop3956" />
- <stop
- style="stop-color:#199c19;stop-opacity:1;"
- offset="1"
- id="stop3958" />
- </linearGradient>
- <filter
- inkscape:collect="always"
- id="filter3884">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.505"
- id="feGaussianBlur3886" />
- </filter>
- <filter
- inkscape:collect="always"
- id="filter3898"
- x="-0.20110182"
- width="1.4022036"
- y="-0.20210065"
- height="1.4042013">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.0604979"
- id="feGaussianBlur3900" />
- </filter>
- <filter
- inkscape:collect="always"
- id="filter3916"
- x="-0.11491533"
- width="1.2298307"
- y="-0.11548609"
- height="1.2309722">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.6059988"
- id="feGaussianBlur3918" />
- </filter>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient4239"
- id="radialGradient4024"
- gradientUnits="userSpaceOnUse"
- cx="37.15184"
- cy="33.513309"
- fx="37.15184"
- fy="33.513309"
- r="20"
- gradientTransform="matrix(-1.2888095,0.63917683,-0.44430494,-0.89587535,99.563439,45.881313)" />
- <filter
- inkscape:collect="always"
- id="filter4110"
- x="-0.17716113"
- width="1.3543223"
- y="-0.17804105"
- height="1.3560821">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.93424815"
- id="feGaussianBlur4112" />
- </filter>
- <linearGradient
- id="linearGradient3954-9">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop3956-4" />
- <stop
- style="stop-color:#0f5f52;stop-opacity:1;"
- offset="1"
- id="stop3958-2" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3954"
- id="radialGradient4230"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1486906,1.2798015,-0.74419869,0.66795831,19.056258,-30.328315)"
- cx="32"
- cy="32"
- fx="32"
- fy="32"
- r="20" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3954"
- id="radialGradient4250"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1486906,1.2798015,-0.74419869,0.66795831,19.056258,-30.328315)"
- cx="32"
- cy="32"
- fx="32"
- fy="32"
- r="20" />
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="0.35355339"
- inkscape:cx="-1038.0652"
- inkscape:cy="556.75939"
- inkscape:document-units="px"
- inkscape:current-layer="g4116"
- showgrid="false"
- showguides="true"
- inkscape:guide-bbox="true"
- inkscape:window-width="1612"
- inkscape:window-height="1026"
- inkscape:window-x="1677"
- inkscape:window-y="-4"
- inkscape:window-maximized="1"
- inkscape:snap-global="true"
- inkscape:snap-bbox="true">
- <inkscape:grid
- type="xygrid"
- id="grid2985"
- empspacing="2"
- visible="true"
- enabled="true"
- snapvisiblegridlinesonly="true" />
- <sodipodi:guide
- orientation="0,1"
- position="11.25,96.5"
- id="guide4252" />
- </sodipodi:namedview>
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title></dc:title>
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1"
- transform="translate(0,-988.36218)">
- <g
- id="g4116"
- transform="matrix(1.3594572,0,0,1.3553409,-10.875658,-362.67325)">
- <path
- transform="matrix(1.1769403,0,0,1.1769403,-6.1232836,982.70009)"
- d="M 52,32 C 52,43.045695 43.045695,52 32,52 20.954305,52 12,43.045695 12,32 12,20.954305 20.954305,12 32,12 c 11.045695,0 20,8.954305 20,20 z"
- sodipodi:ry="20"
- sodipodi:rx="20"
- sodipodi:cy="32"
- sodipodi:cx="32"
- id="path3014"
- style="fill:url(#radialGradient4024);fill-opacity:1;stroke:none"
- sodipodi:type="arc" />
- <path
- sodipodi:nodetypes="ssccs"
- inkscape:connector-curvature="0"
- id="path3866"
- transform="matrix(1.1769403,0,0,1.1769403,-5.6620909,982.68843)"
- d="m 28,16 c -6.627417,0 -12,5.372583 -12,12 0,0.20181 0.0214,0.394383 0.03125,0.59375 C 20,20 22,22 28.65625,16.03125 28.436252,16.019242 28.222996,16 28,16 z"
- style="fill:#ffbf00;fill-opacity:1;stroke:none;filter:url(#filter3884)" />
- <path
- transform="matrix(1.487885,0,0,1.487885,-10.597031,-493.22036)"
- style="fill:#ffef00;fill-opacity:1;stroke:none;filter:url(#filter3898)"
- d="m 28,1004.3622 c -6.627417,0 -12,5.3726 -12,12 0,0.2018 0.0214,0.3944 0.03125,0.5937 3.96875,-8.5937 5.96875,-6.5937 12.625,-12.5625 -0.219998,-0.012 -0.433254,-0.031 -0.65625,-0.031 z"
- id="path3888"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ssccs" />
- <path
- sodipodi:nodetypes="ssccs"
- inkscape:connector-curvature="0"
- id="path3902"
- d="m 28,1004.3622 c -6.627417,0 -12,5.3726 -12,12 0,0.2018 0.0214,0.3944 0.03125,0.5937 3.96875,-8.5937 5.96875,-6.5937 12.625,-12.5625 -0.219998,-0.012 -0.433254,-0.031 -0.65625,-0.031 z"
- style="fill:#ffdd00;fill-opacity:1;stroke:none;filter:url(#filter3916)"
- transform="matrix(-1.8359746,0,0,-1.8359746,81.432966,2885.3572)" />
- <path
- transform="matrix(-1.1914115,0,0,-1.1914115,69.087304,2235.4229)"
- style="fill:#f4ecd7;fill-opacity:1;stroke:none;filter:url(#filter3916);opacity:0.7518797"
- d="m 28,1004.3622 c -6.627417,0 -12,5.3726 -12,12 0,0.2018 0.0214,0.3944 0.03125,0.5937 3.96875,-8.5937 5.96875,-6.5937 12.625,-12.5625 -0.219998,-0.012 -0.433254,-0.031 -0.65625,-0.031 z"
- id="path3920"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ssccs" />
- <path
- sodipodi:nodetypes="csccsc"
- inkscape:connector-curvature="0"
- id="path3964"
- d="m 28,1004.3622 c -6.627417,0 -12,5.3726 -12,12 0,0.2018 0.0214,0.3944 0.03125,0.5937 5.570868,-4.4816 8.905966,-4.4575 12.625,-12.5625 -0.219998,-0.012 -0.433254,-0.031 -0.65625,-0.031 z"
- style="fill:#ffffff;fill-opacity:1;stroke:none;filter:url(#filter4110);opacity:0.69924812"
- transform="matrix(0.58516297,0,0,0.58516297,6.7391969,416.10681)" />
- </g>
- </g>
-</svg>
diff --git a/resources/sources/status-good.svg b/resources/sources/status-good.svg
deleted file mode 100644
index 3b311806..00000000
--- a/resources/sources/status-good.svg
+++ /dev/null
@@ -1,293 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="64"
- height="64"
- id="svg2"
- version="1.1"
- inkscape:version="0.48.4 r9939"
- sodipodi:docname="enderpearl.svg"
- inkscape:export-filename="/home/peterix/projects/MultiMC4/src/resources/insticons/enderpearl.png"
- inkscape:export-xdpi="45"
- inkscape:export-ydpi="45">
- <defs
- id="defs4">
- <linearGradient
- id="linearGradient4245">
- <stop
- id="stop4247"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- style="stop-color:#106810;stop-opacity:1"
- offset="0.89412045"
- id="stop4251" />
- <stop
- id="stop4249"
- offset="1"
- style="stop-color:#199c19;stop-opacity:0" />
- </linearGradient>
- <linearGradient
- id="linearGradient4239">
- <stop
- id="stop4241"
- offset="0"
- style="stop-color:#043400;stop-opacity:1" />
- <stop
- id="stop4243"
- offset="1"
- style="stop-color:#199c19;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient4030">
- <stop
- id="stop4032"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop4034"
- offset="1"
- style="stop-color:#0c493f;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient3954">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop3956" />
- <stop
- style="stop-color:#199c19;stop-opacity:1;"
- offset="1"
- id="stop3958" />
- </linearGradient>
- <filter
- inkscape:collect="always"
- id="filter3884">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.505"
- id="feGaussianBlur3886" />
- </filter>
- <filter
- inkscape:collect="always"
- id="filter3898"
- x="-0.20110182"
- width="1.4022036"
- y="-0.20210065"
- height="1.4042013">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.0604979"
- id="feGaussianBlur3900" />
- </filter>
- <filter
- inkscape:collect="always"
- id="filter3916"
- x="-0.11491533"
- width="1.2298307"
- y="-0.11548609"
- height="1.2309722">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.6059988"
- id="feGaussianBlur3918" />
- </filter>
- <filter
- inkscape:collect="always"
- id="filter3992">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.44"
- id="feGaussianBlur3994" />
- </filter>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient4239"
- id="radialGradient4024"
- gradientUnits="userSpaceOnUse"
- cx="37.15184"
- cy="33.513309"
- fx="37.15184"
- fy="33.513309"
- r="20"
- gradientTransform="matrix(-1.2888095,0.63917683,-0.44430494,-0.89587535,99.563439,45.881313)" />
- <filter
- inkscape:collect="always"
- id="filter4082"
- x="-0.13465964"
- width="1.2693193"
- y="-0.12490681"
- height="1.2498136">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.763901"
- id="feGaussianBlur4084" />
- </filter>
- <filter
- inkscape:collect="always"
- id="filter4110"
- x="-0.17716113"
- width="1.3543223"
- y="-0.17804105"
- height="1.3560821">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.93424815"
- id="feGaussianBlur4112" />
- </filter>
- <linearGradient
- id="linearGradient3954-9">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop3956-4" />
- <stop
- style="stop-color:#0f5f52;stop-opacity:1;"
- offset="1"
- id="stop3958-2" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3954"
- id="radialGradient4230"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1486906,1.2798015,-0.74419869,0.66795831,19.056258,-30.328315)"
- cx="32"
- cy="32"
- fx="32"
- fy="32"
- r="20" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3954"
- id="radialGradient4250"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1486906,1.2798015,-0.74419869,0.66795831,19.056258,-30.328315)"
- cx="32"
- cy="32"
- fx="32"
- fy="32"
- r="20" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient4245"
- id="radialGradient4231"
- cx="11.428607"
- cy="52.782928"
- fx="11.428607"
- fy="52.782928"
- r="22.333248"
- gradientTransform="matrix(0,-0.99787164,0.98982309,1.711883e-6,-20.245763,43.404188)"
- gradientUnits="userSpaceOnUse" />
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="8"
- inkscape:cx="30.78415"
- inkscape:cy="28.132388"
- inkscape:document-units="px"
- inkscape:current-layer="g4116"
- showgrid="false"
- showguides="true"
- inkscape:guide-bbox="true"
- inkscape:window-width="1612"
- inkscape:window-height="1026"
- inkscape:window-x="1677"
- inkscape:window-y="-4"
- inkscape:window-maximized="1"
- inkscape:snap-global="true"
- inkscape:snap-bbox="true">
- <inkscape:grid
- type="xygrid"
- id="grid2985"
- empspacing="2"
- visible="true"
- enabled="true"
- snapvisiblegridlinesonly="true" />
- <sodipodi:guide
- orientation="0,1"
- position="11.25,96.5"
- id="guide4252" />
- </sodipodi:namedview>
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title></dc:title>
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1"
- transform="translate(0,-988.36218)">
- <g
- id="g4116"
- transform="matrix(1.3594572,0,0,1.3553409,-10.875658,-362.67325)">
- <path
- transform="matrix(1.1769403,0,0,1.1769403,-6.1232836,982.70009)"
- d="M 52,32 C 52,43.045695 43.045695,52 32,52 20.954305,52 12,43.045695 12,32 12,20.954305 20.954305,12 32,12 c 11.045695,0 20,8.954305 20,20 z"
- sodipodi:ry="20"
- sodipodi:rx="20"
- sodipodi:cy="32"
- sodipodi:cx="32"
- id="path3014"
- style="fill:url(#radialGradient4024);fill-opacity:1;stroke:none"
- sodipodi:type="arc" />
- <path
- sodipodi:nodetypes="ssccs"
- inkscape:connector-curvature="0"
- id="path3866"
- transform="matrix(1.1769403,0,0,1.1769403,-5.6620909,982.68843)"
- d="m 28,16 c -6.627417,0 -12,5.372583 -12,12 0,0.20181 0.0214,0.394383 0.03125,0.59375 C 20,20 22,22 28.65625,16.03125 28.436252,16.019242 28.222996,16 28,16 z"
- style="fill:#08ff00;fill-opacity:1;stroke:none;filter:url(#filter3884)" />
- <path
- transform="matrix(1.487885,0,0,1.487885,-10.597031,-493.22036)"
- style="fill:#14ff00;fill-opacity:1;stroke:none;filter:url(#filter3898)"
- d="m 28,1004.3622 c -6.627417,0 -12,5.3726 -12,12 0,0.2018 0.0214,0.3944 0.03125,0.5937 3.96875,-8.5937 5.96875,-6.5937 12.625,-12.5625 -0.219998,-0.012 -0.433254,-0.031 -0.65625,-0.031 z"
- id="path3888"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ssccs" />
- <path
- sodipodi:nodetypes="ssccs"
- inkscape:connector-curvature="0"
- id="path3902"
- d="m 28,1004.3622 c -6.627417,0 -12,5.3726 -12,12 0,0.2018 0.0214,0.3944 0.03125,0.5937 3.96875,-8.5937 5.96875,-6.5937 12.625,-12.5625 -0.219998,-0.012 -0.433254,-0.031 -0.65625,-0.031 z"
- style="fill:#56ff00;fill-opacity:1;stroke:none;filter:url(#filter3916)"
- transform="matrix(-1.8359746,0,0,-1.8359746,81.432966,2885.3572)" />
- <path
- transform="matrix(-1.1914115,0,0,-1.1914115,69.087304,2235.4229)"
- style="fill:#d7f4d7;fill-opacity:1;stroke:none;filter:url(#filter3916)"
- d="m 28,1004.3622 c -6.627417,0 -12,5.3726 -12,12 0,0.2018 0.0214,0.3944 0.03125,0.5937 3.96875,-8.5937 5.96875,-6.5937 12.625,-12.5625 -0.219998,-0.012 -0.433254,-0.031 -0.65625,-0.031 z"
- id="path3920"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ssccs" />
- <path
- sodipodi:nodetypes="csccsc"
- inkscape:connector-curvature="0"
- id="path3964"
- d="m 28,1004.3622 c -6.627417,0 -12,5.3726 -12,12 0,0.2018 0.0214,0.3944 0.03125,0.5937 5.570868,-4.4816 8.905966,-4.4575 12.625,-12.5625 -0.219998,-0.012 -0.433254,-0.031 -0.65625,-0.031 z"
- style="fill:#ffffff;fill-opacity:1;stroke:none;filter:url(#filter4110)"
- transform="matrix(0.58516297,0,0,0.58516297,6.7391969,416.10681)" />
- </g>
- </g>
-</svg>
diff --git a/resources/sources/status-terrible.svg b/resources/sources/status-terrible.svg
deleted file mode 100644
index b0de7bfd..00000000
--- a/resources/sources/status-terrible.svg
+++ /dev/null
@@ -1,262 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="64"
- height="64"
- id="svg2"
- version="1.1"
- inkscape:version="0.48.4 r9939"
- sodipodi:docname="status-terrible.svg"
- inkscape:export-filename="/home/peterix/projects/MultiMC4/src/resources/insticons/enderpearl.png"
- inkscape:export-xdpi="45"
- inkscape:export-ydpi="45">
- <defs
- id="defs4">
- <linearGradient
- id="linearGradient4245">
- <stop
- id="stop4247"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- style="stop-color:#106810;stop-opacity:1"
- offset="0.89412045"
- id="stop4251" />
- <stop
- id="stop4249"
- offset="1"
- style="stop-color:#199c19;stop-opacity:0" />
- </linearGradient>
- <linearGradient
- id="linearGradient4239">
- <stop
- id="stop4241"
- offset="0"
- style="stop-color:#510000;stop-opacity:1;" />
- <stop
- id="stop4243"
- offset="1"
- style="stop-color:#ee0000;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient4030">
- <stop
- id="stop4032"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop4034"
- offset="1"
- style="stop-color:#0c493f;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient3954">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop3956" />
- <stop
- style="stop-color:#199c19;stop-opacity:1;"
- offset="1"
- id="stop3958" />
- </linearGradient>
- <filter
- inkscape:collect="always"
- id="filter3884">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.505"
- id="feGaussianBlur3886" />
- </filter>
- <filter
- inkscape:collect="always"
- id="filter3898"
- x="-0.20110182"
- width="1.4022036"
- y="-0.20210065"
- height="1.4042013">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.0604979"
- id="feGaussianBlur3900" />
- </filter>
- <filter
- inkscape:collect="always"
- id="filter3916"
- x="-0.11491533"
- width="1.2298307"
- y="-0.11548609"
- height="1.2309722">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.6059988"
- id="feGaussianBlur3918" />
- </filter>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient4239"
- id="radialGradient4024"
- gradientUnits="userSpaceOnUse"
- cx="37.15184"
- cy="33.513309"
- fx="37.15184"
- fy="33.513309"
- r="20"
- gradientTransform="matrix(-1.2888095,0.63917683,-0.44430494,-0.89587535,99.563439,45.881313)" />
- <filter
- inkscape:collect="always"
- id="filter4110"
- x="-0.17716113"
- width="1.3543223"
- y="-0.17804105"
- height="1.3560821">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.93424815"
- id="feGaussianBlur4112" />
- </filter>
- <linearGradient
- id="linearGradient3954-9">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop3956-4" />
- <stop
- style="stop-color:#0f5f52;stop-opacity:1;"
- offset="1"
- id="stop3958-2" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3954"
- id="radialGradient4230"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1486906,1.2798015,-0.74419869,0.66795831,19.056258,-30.328315)"
- cx="32"
- cy="32"
- fx="32"
- fy="32"
- r="20" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3954"
- id="radialGradient4250"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1486906,1.2798015,-0.74419869,0.66795831,19.056258,-30.328315)"
- cx="32"
- cy="32"
- fx="32"
- fy="32"
- r="20" />
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="0.5"
- inkscape:cx="-732.84524"
- inkscape:cy="332.3527"
- inkscape:document-units="px"
- inkscape:current-layer="g4116"
- showgrid="false"
- showguides="true"
- inkscape:guide-bbox="true"
- inkscape:window-width="1612"
- inkscape:window-height="1026"
- inkscape:window-x="1677"
- inkscape:window-y="-4"
- inkscape:window-maximized="1"
- inkscape:snap-global="true"
- inkscape:snap-bbox="true">
- <inkscape:grid
- type="xygrid"
- id="grid2985"
- empspacing="2"
- visible="true"
- enabled="true"
- snapvisiblegridlinesonly="true" />
- <sodipodi:guide
- orientation="0,1"
- position="11.25,96.5"
- id="guide4252" />
- </sodipodi:namedview>
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title></dc:title>
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1"
- transform="translate(0,-988.36218)">
- <g
- id="g4116"
- transform="matrix(1.3594572,0,0,1.3553409,-10.875658,-362.67325)">
- <path
- transform="matrix(1.1769403,0,0,1.1769403,-6.1232836,982.70009)"
- d="M 52,32 C 52,43.045695 43.045695,52 32,52 20.954305,52 12,43.045695 12,32 12,20.954305 20.954305,12 32,12 c 11.045695,0 20,8.954305 20,20 z"
- sodipodi:ry="20"
- sodipodi:rx="20"
- sodipodi:cy="32"
- sodipodi:cx="32"
- id="path3014"
- style="fill:url(#radialGradient4024);fill-opacity:1;stroke:none"
- sodipodi:type="arc" />
- <path
- sodipodi:nodetypes="ssccs"
- inkscape:connector-curvature="0"
- id="path3866"
- transform="matrix(1.1769403,0,0,1.1769403,-5.6620909,982.68843)"
- d="m 28,16 c -6.627417,0 -12,5.372583 -12,12 0,0.20181 0.0214,0.394383 0.03125,0.59375 C 20,20 22,22 28.65625,16.03125 28.436252,16.019242 28.222996,16 28,16 z"
- style="fill:#ff8f8f;fill-opacity:1;stroke:none;filter:url(#filter3884)" />
- <path
- transform="matrix(1.487885,0,0,1.487885,-10.597031,-493.22036)"
- style="fill:#ff7878;fill-opacity:1;stroke:none;filter:url(#filter3898)"
- d="m 28,1004.3622 c -6.627417,0 -12,5.3726 -12,12 0,0.2018 0.0214,0.3944 0.03125,0.5937 3.96875,-8.5937 5.96875,-6.5937 12.625,-12.5625 -0.219998,-0.012 -0.433254,-0.031 -0.65625,-0.031 z"
- id="path3888"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ssccs" />
- <path
- sodipodi:nodetypes="ssccs"
- inkscape:connector-curvature="0"
- id="path3902"
- d="m 28,1004.3622 c -6.627417,0 -12,5.3726 -12,12 0,0.2018 0.0214,0.3944 0.03125,0.5937 3.96875,-8.5937 5.96875,-6.5937 12.625,-12.5625 -0.219998,-0.012 -0.433254,-0.031 -0.65625,-0.031 z"
- style="fill:#ff5252;fill-opacity:1;stroke:none;filter:url(#filter3916)"
- transform="matrix(-1.8359746,0,0,-1.8359746,81.432966,2885.3572)" />
- <path
- transform="matrix(-1.1914115,0,0,-1.1914115,69.087304,2235.4229)"
- style="fill:#ffffff;fill-opacity:1;stroke:none;filter:url(#filter3916);opacity:0.75187970000000004"
- d="m 28,1004.3622 c -6.627417,0 -12,5.3726 -12,12 0,0.2018 0.0214,0.3944 0.03125,0.5937 3.96875,-8.5937 5.96875,-6.5937 12.625,-12.5625 -0.219998,-0.012 -0.433254,-0.031 -0.65625,-0.031 z"
- id="path3920"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ssccs" />
- <path
- sodipodi:nodetypes="csccsc"
- inkscape:connector-curvature="0"
- id="path3964"
- d="m 28,1004.3622 c -6.627417,0 -12,5.3726 -12,12 0,0.2018 0.0214,0.3944 0.03125,0.5937 5.570868,-4.4816 8.905966,-4.4575 12.625,-12.5625 -0.219998,-0.012 -0.433254,-0.031 -0.65625,-0.031 z"
- style="fill:#ffffff;fill-opacity:1;stroke:none;filter:url(#filter4110);opacity:0.69924812"
- transform="matrix(0.58516297,0,0,0.58516297,6.7391969,416.10681)" />
- </g>
- </g>
-</svg>
diff --git a/translations/CMakeLists.txt b/translations/CMakeLists.txt
index d28a997d..c5ae65a6 100644
--- a/translations/CMakeLists.txt
+++ b/translations/CMakeLists.txt
@@ -10,7 +10,7 @@ add_custom_target(translations_update DEPENDS ${TRANSLATION_MESSAGES})
add_custom_target(translations DEPENDS ${TRANSLATION_QM})
if(APPLE AND UNIX) ## OSX
- install(FILES ${TRANSLATION_QM} DESTINATION MultiMC.app/Contents/MacOS/translations)
+ install(FILES ${TRANSLATION_QM} DESTINATION MultiMC.app/Contents/Resources/translations)
else()
install(FILES ${TRANSLATION_QM} DESTINATION translations)
endif()