diff options
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() << "..."; @@ -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 Binary files differnew file mode 100644 index 00000000..5b3f2051 --- /dev/null +++ b/resources/multimc/16x16/status-bad.png diff --git a/resources/multimc/16x16/status-good.png b/resources/multimc/16x16/status-good.png Binary files differnew file mode 100644 index 00000000..5cbdee81 --- /dev/null +++ b/resources/multimc/16x16/status-good.png diff --git a/resources/multimc/22x22/status-bad.png b/resources/multimc/22x22/status-bad.png Binary files differnew file mode 100644 index 00000000..2707539e --- /dev/null +++ b/resources/multimc/22x22/status-bad.png diff --git a/resources/multimc/22x22/status-good.png b/resources/multimc/22x22/status-good.png Binary files differnew file mode 100644 index 00000000..f55debc3 --- /dev/null +++ b/resources/multimc/22x22/status-good.png diff --git a/resources/multimc/24x24/status-bad.png b/resources/multimc/24x24/status-bad.png Binary files differnew file mode 100644 index 00000000..d1547a47 --- /dev/null +++ b/resources/multimc/24x24/status-bad.png diff --git a/resources/multimc/24x24/status-good.png b/resources/multimc/24x24/status-good.png Binary files differnew file mode 100644 index 00000000..3545bc4c --- /dev/null +++ b/resources/multimc/24x24/status-good.png diff --git a/resources/multimc/32x32/status-bad.png b/resources/multimc/32x32/status-bad.png Binary files differnew file mode 100644 index 00000000..8c2c9d4f --- /dev/null +++ b/resources/multimc/32x32/status-bad.png diff --git a/resources/multimc/32x32/status-good.png b/resources/multimc/32x32/status-good.png Binary files differnew file mode 100644 index 00000000..1a805e68 --- /dev/null +++ b/resources/multimc/32x32/status-good.png diff --git a/resources/multimc/48x48/status-bad.png b/resources/multimc/48x48/status-bad.png Binary files differnew file mode 100644 index 00000000..41c9cf22 --- /dev/null +++ b/resources/multimc/48x48/status-bad.png diff --git a/resources/multimc/48x48/status-good.png b/resources/multimc/48x48/status-good.png Binary files differnew file mode 100644 index 00000000..df7cb59b --- /dev/null +++ b/resources/multimc/48x48/status-good.png diff --git a/resources/multimc/64x64/status-bad.png b/resources/multimc/64x64/status-bad.png Binary files differnew file mode 100644 index 00000000..64060ba0 --- /dev/null +++ b/resources/multimc/64x64/status-bad.png diff --git a/resources/multimc/64x64/status-good.png b/resources/multimc/64x64/status-good.png Binary files differnew file mode 100644 index 00000000..e862ddcd --- /dev/null +++ b/resources/multimc/64x64/status-good.png 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() |