fix silly mistakes and merge upstream
This commit is contained in:
@ -515,8 +515,8 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv)
|
||||
FS::updateTimestamp(m_rootPath);
|
||||
#endif
|
||||
|
||||
#ifdef MULTIMC_JARS_LOCATION
|
||||
m_jarsPath = TOSTRING(MULTIMC_JARS_LOCATION);
|
||||
#ifdef LAUNCHER_JARS_LOCATION
|
||||
m_jarsPath = TOSTRING(LAUNCHER_JARS_LOCATION);
|
||||
#endif
|
||||
|
||||
qDebug() << BuildConfig.LAUNCHER_DISPLAYNAME << ", (c) 2013-2021 " << BuildConfig.LAUNCHER_COPYRIGHT;
|
||||
@ -575,9 +575,6 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv)
|
||||
m_settings->registerSetting("IconTheme", QString("pe_colored"));
|
||||
m_settings->registerSetting("ApplicationTheme", QString("system"));
|
||||
|
||||
// Notifications
|
||||
m_settings->registerSetting("ShownNotifications", QString());
|
||||
|
||||
// Remembered state
|
||||
m_settings->registerSetting("LastUsedGroupForNewInstance", QString());
|
||||
|
||||
@ -1494,10 +1491,10 @@ QString Application::getJarsPath()
|
||||
{
|
||||
return FS::PathCombine(QCoreApplication::applicationDirPath(), "jars");
|
||||
}
|
||||
return m_jarsPath;
|
||||
return FS::PathCombine(m_rootPath, m_jarsPath);
|
||||
}
|
||||
|
||||
QString Application::getMSAClientID()
|
||||
QString Application::getMSAClientID()
|
||||
{
|
||||
QString clientIDOverride = m_settings->get("MSAClientIDOverride").toString();
|
||||
if (!clientIDOverride.isEmpty()) {
|
||||
|
@ -174,13 +174,6 @@ add_unit_test(DownloadTask
|
||||
DATA updater/testdata
|
||||
)
|
||||
|
||||
# Rarely used notifications
|
||||
set(NOTIFICATIONS_SOURCES
|
||||
# Notifications - short warning messages
|
||||
notifications/NotificationChecker.h
|
||||
notifications/NotificationChecker.cpp
|
||||
)
|
||||
|
||||
# Backend for the news bar... there's usually no news.
|
||||
set(NEWS_SOURCES
|
||||
# News System
|
||||
@ -571,7 +564,6 @@ set(LOGIC_SOURCES
|
||||
${NET_SOURCES}
|
||||
${LAUNCH_SOURCES}
|
||||
${UPDATE_SOURCES}
|
||||
${NOTIFICATIONS_SOURCES}
|
||||
${NEWS_SOURCES}
|
||||
${MINECRAFT_SOURCES}
|
||||
${SCREENSHOTS_SOURCES}
|
||||
@ -807,12 +799,12 @@ SET(LAUNCHER_SOURCES
|
||||
ui/dialogs/NewComponentDialog.h
|
||||
ui/dialogs/NewInstanceDialog.cpp
|
||||
ui/dialogs/NewInstanceDialog.h
|
||||
ui/dialogs/NotificationDialog.cpp
|
||||
ui/dialogs/NotificationDialog.h
|
||||
ui/pagedialog/PageDialog.cpp
|
||||
ui/pagedialog/PageDialog.h
|
||||
ui/dialogs/ProgressDialog.cpp
|
||||
ui/dialogs/ProgressDialog.h
|
||||
ui/dialogs/ReviewMessageBox.cpp
|
||||
ui/dialogs/ReviewMessageBox.h
|
||||
ui/dialogs/UpdateDialog.cpp
|
||||
ui/dialogs/UpdateDialog.h
|
||||
ui/dialogs/VersionSelectDialog.cpp
|
||||
@ -908,7 +900,6 @@ qt5_wrap_ui(LAUNCHER_UI
|
||||
ui/dialogs/ProfileSetupDialog.ui
|
||||
ui/dialogs/ProgressDialog.ui
|
||||
ui/dialogs/NewInstanceDialog.ui
|
||||
ui/dialogs/NotificationDialog.ui
|
||||
ui/dialogs/UpdateDialog.ui
|
||||
ui/dialogs/NewComponentDialog.ui
|
||||
ui/dialogs/ProfileSelectDialog.ui
|
||||
@ -920,6 +911,7 @@ qt5_wrap_ui(LAUNCHER_UI
|
||||
ui/dialogs/AboutDialog.ui
|
||||
ui/dialogs/LoginDialog.ui
|
||||
ui/dialogs/EditAccountDialog.ui
|
||||
ui/dialogs/ReviewMessageBox.ui
|
||||
)
|
||||
|
||||
qt5_add_resources(LAUNCHER_RESOURCES
|
||||
|
@ -56,7 +56,7 @@ void LaunchController::decideAccount()
|
||||
m_parentWidget,
|
||||
tr("No Accounts"),
|
||||
tr("In order to play Minecraft, you must have at least one Mojang or Minecraft "
|
||||
"account logged in."
|
||||
"account logged in. "
|
||||
"Would you like to open the account manager to add an account now?"),
|
||||
QMessageBox::Information,
|
||||
QMessageBox::Yes | QMessageBox::No
|
||||
|
@ -1,129 +0,0 @@
|
||||
#include "NotificationChecker.h"
|
||||
|
||||
#include <QJsonDocument>
|
||||
#include <QJsonObject>
|
||||
#include <QJsonArray>
|
||||
#include <QDebug>
|
||||
|
||||
#include "net/Download.h"
|
||||
|
||||
#include "Application.h"
|
||||
|
||||
NotificationChecker::NotificationChecker(QObject *parent)
|
||||
: QObject(parent)
|
||||
{
|
||||
}
|
||||
|
||||
void NotificationChecker::setNotificationsUrl(const QUrl ¬ificationsUrl)
|
||||
{
|
||||
m_notificationsUrl = notificationsUrl;
|
||||
}
|
||||
|
||||
void NotificationChecker::setApplicationChannel(QString channel)
|
||||
{
|
||||
m_appVersionChannel = channel;
|
||||
}
|
||||
|
||||
void NotificationChecker::setApplicationFullVersion(QString version)
|
||||
{
|
||||
m_appFullVersion = version;
|
||||
}
|
||||
|
||||
void NotificationChecker::setApplicationPlatform(QString platform)
|
||||
{
|
||||
m_appPlatform = platform;
|
||||
}
|
||||
|
||||
QList<NotificationChecker::NotificationEntry> NotificationChecker::notificationEntries() const
|
||||
{
|
||||
return m_entries;
|
||||
}
|
||||
|
||||
void NotificationChecker::checkForNotifications()
|
||||
{
|
||||
if (!m_notificationsUrl.isValid())
|
||||
{
|
||||
qCritical() << "Failed to check for notifications. No notifications URL set."
|
||||
<< "If you'd like to use PolyMC's notification system, please pass the "
|
||||
"URL to CMake at compile time.";
|
||||
return;
|
||||
}
|
||||
if (m_checkJob)
|
||||
{
|
||||
return;
|
||||
}
|
||||
m_checkJob = new NetJob("Checking for notifications", APPLICATION->network());
|
||||
auto entry = APPLICATION->metacache()->resolveEntry("root", "notifications.json");
|
||||
entry->setStale(true);
|
||||
m_checkJob->addNetAction(m_download = Net::Download::makeCached(m_notificationsUrl, entry));
|
||||
connect(m_download.get(), &Net::Download::succeeded, this, &NotificationChecker::downloadSucceeded);
|
||||
m_checkJob->start();
|
||||
}
|
||||
|
||||
void NotificationChecker::downloadSucceeded(int)
|
||||
{
|
||||
m_entries.clear();
|
||||
|
||||
QFile file(m_download->getTargetFilepath());
|
||||
if (file.open(QFile::ReadOnly))
|
||||
{
|
||||
QJsonArray root = QJsonDocument::fromJson(file.readAll()).array();
|
||||
for (auto it = root.begin(); it != root.end(); ++it)
|
||||
{
|
||||
QJsonObject obj = (*it).toObject();
|
||||
NotificationEntry entry;
|
||||
entry.id = obj.value("id").toDouble();
|
||||
entry.message = obj.value("message").toString();
|
||||
entry.channel = obj.value("channel").toString();
|
||||
entry.platform = obj.value("platform").toString();
|
||||
entry.from = obj.value("from").toString();
|
||||
entry.to = obj.value("to").toString();
|
||||
const QString type = obj.value("type").toString("critical");
|
||||
if (type == "critical")
|
||||
{
|
||||
entry.type = NotificationEntry::Critical;
|
||||
}
|
||||
else if (type == "warning")
|
||||
{
|
||||
entry.type = NotificationEntry::Warning;
|
||||
}
|
||||
else if (type == "information")
|
||||
{
|
||||
entry.type = NotificationEntry::Information;
|
||||
}
|
||||
if(entryApplies(entry))
|
||||
m_entries.append(entry);
|
||||
}
|
||||
}
|
||||
|
||||
m_checkJob.reset();
|
||||
|
||||
emit notificationCheckFinished();
|
||||
}
|
||||
|
||||
bool versionLessThan(const QString &v1, const QString &v2)
|
||||
{
|
||||
QStringList l1 = v1.split('.');
|
||||
QStringList l2 = v2.split('.');
|
||||
while (!l1.isEmpty() && !l2.isEmpty())
|
||||
{
|
||||
int one = l1.isEmpty() ? 0 : l1.takeFirst().toInt();
|
||||
int two = l2.isEmpty() ? 0 : l2.takeFirst().toInt();
|
||||
if (one != two)
|
||||
{
|
||||
return one < two;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool NotificationChecker::entryApplies(const NotificationChecker::NotificationEntry& entry) const
|
||||
{
|
||||
bool channelApplies = entry.channel.isEmpty() || entry.channel == m_appVersionChannel;
|
||||
bool platformApplies = entry.platform.isEmpty() || entry.platform == m_appPlatform;
|
||||
bool fromApplies =
|
||||
entry.from.isEmpty() || entry.from == m_appFullVersion || !versionLessThan(m_appFullVersion, entry.from);
|
||||
bool toApplies =
|
||||
entry.to.isEmpty() || entry.to == m_appFullVersion || !versionLessThan(entry.to, m_appFullVersion);
|
||||
return channelApplies && platformApplies && fromApplies && toApplies;
|
||||
}
|
@ -1,61 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <QObject>
|
||||
|
||||
#include "net/NetJob.h"
|
||||
#include "net/Download.h"
|
||||
|
||||
class NotificationChecker : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit NotificationChecker(QObject *parent = 0);
|
||||
|
||||
void setNotificationsUrl(const QUrl ¬ificationsUrl);
|
||||
void setApplicationPlatform(QString platform);
|
||||
void setApplicationChannel(QString channel);
|
||||
void setApplicationFullVersion(QString version);
|
||||
|
||||
struct NotificationEntry
|
||||
{
|
||||
int id;
|
||||
QString message;
|
||||
enum
|
||||
{
|
||||
Critical,
|
||||
Warning,
|
||||
Information
|
||||
} type;
|
||||
QString channel;
|
||||
QString platform;
|
||||
QString from;
|
||||
QString to;
|
||||
};
|
||||
|
||||
QList<NotificationEntry> notificationEntries() const;
|
||||
|
||||
public
|
||||
slots:
|
||||
void checkForNotifications();
|
||||
|
||||
private
|
||||
slots:
|
||||
void downloadSucceeded(int);
|
||||
|
||||
signals:
|
||||
void notificationCheckFinished();
|
||||
|
||||
private:
|
||||
bool entryApplies(const NotificationEntry &entry) const;
|
||||
|
||||
private:
|
||||
QList<NotificationEntry> m_entries;
|
||||
QUrl m_notificationsUrl;
|
||||
NetJob::Ptr m_checkJob;
|
||||
Net::Download::Ptr m_download;
|
||||
|
||||
QString m_appVersionChannel;
|
||||
QString m_appPlatform;
|
||||
QString m_appFullVersion;
|
||||
};
|
@ -246,9 +246,13 @@
|
||||
<!-- placeholder when loading screenshot images -->
|
||||
<file>scalable/screenshot-placeholder.svg</file>
|
||||
|
||||
<!-- matrix logo -->
|
||||
<file>scalable/matrix.svg</file>
|
||||
|
||||
<!-- discord logo icon thing. from discord. traced from bitmap -->
|
||||
<file>scalable/discord.svg</file>
|
||||
|
||||
|
||||
<!-- instance icons -->
|
||||
<file>32x32/instances/chicken.png</file>
|
||||
<file>128x128/instances/chicken.png</file>
|
||||
|
7
launcher/resources/multimc/scalable/matrix.svg
Normal file
7
launcher/resources/multimc/scalable/matrix.svg
Normal file
@ -0,0 +1,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64">
|
||||
<g fill="#fff">
|
||||
<path d="M49.46 42.2h-5.32c-.178 0-.323-.145-.323-.323V30.91l-.074-1.808c-.047-.53-.173-.992-.376-1.376-.194-.367-.487-.664-.868-.883s-.93-.332-1.62-.332-1.238.13-1.647.382-.743.597-.976 1.01a4.21 4.21 0 0 0-.486 1.462c-.085.567-.128 1.15-.128 1.732v10.79c0 .178-.145.323-.323.323H32c-.178 0-.323-.145-.323-.323V31.02l-.037-1.69c-.024-.524-.124-1.013-.297-1.45-.164-.415-.43-.74-.814-.992s-.972-.378-1.752-.378c-.22 0-.527.053-.908.157-.368.1-.732.294-1.08.577s-.65.694-.904 1.235-.382 1.27-.382 2.167v11.24c0 .178-.144.323-.323.323h-5.32c-.178 0-.323-.145-.323-.323V22.515c0-.178.145-.322.323-.322h5.02c.178 0 .323.145.323.322V24.3c.618-.726 1.33-1.315 2.125-1.757 1.032-.574 2.225-.865 3.548-.865 1.265 0 2.44.25 3.5.743.934.44 1.68 1.17 2.224 2.18.556-.703 1.263-1.34 2.108-1.895 1.036-.682 2.274-1.028 3.68-1.028 1.048 0 2.036.13 2.937.387.917.263 1.715.69 2.373 1.267s1.18 1.348 1.548 2.278c.363.922.547 2.04.547 3.323v12.964c0 .178-.145.323-.323.323z" opacity=".5" />
|
||||
<path d="M24.88 22.515v2.623h.075c.7-.998 1.542-1.774 2.53-2.323s2.117-.824 3.39-.824c1.224 0 2.342.238 3.353.712s1.78 1.31 2.305 2.51c.574-.85 1.355-1.6 2.342-2.248s2.154-.974 3.504-.974c1.024 0 1.973.125 2.848.375s1.623.65 2.248 1.2 1.11 1.268 1.462 2.154.525 1.955.525 3.204v12.964h-5.32V30.91l-.075-1.836c-.05-.574-.187-1.073-.412-1.5s-.556-.762-.993-1.012-1.03-.374-1.78-.374-1.355.145-1.817.43-.824.663-1.087 1.124-.437.987-.524 1.574a12 12 0 0 0-.131 1.78v10.79H32V31.022l-.037-1.705c-.025-.562-.13-1.08-.32-1.556s-.5-.855-.937-1.143-1.08-.43-1.93-.43c-.25 0-.58.056-.993.17a3.3 3.3 0 0 0-1.199.637c-.388.313-.718.762-.993 1.35s-.412 1.355-.412 2.304v11.24h-5.32V22.515z" opacity=".5" />
|
||||
</g>
|
||||
<path d="M1.432 6.084v51.833h3.73v1.244H0V4.84h5.162v1.243zm20.788 16.43v2.623h.075c.7-.998 1.542-1.774 2.53-2.323s2.117-.824 3.4-.824c1.224 0 2.342.238 3.353.712s1.78 1.3 2.305 2.5c.574-.85 1.355-1.6 2.342-2.248s2.154-.974 3.504-.974c1.024 0 1.973.125 2.848.375s1.623.65 2.248 1.2 1.1 1.268 1.462 2.154.525 1.955.525 3.204v12.964h-5.32V30.9l-.075-1.836c-.05-.574-.187-1.073-.412-1.5s-.556-.762-.993-1.012-1.03-.374-1.78-.374-1.355.145-1.817.43a3.12 3.12 0 0 0-1.087 1.124c-.263.46-.437.987-.524 1.574a12 12 0 0 0-.131 1.78v10.8h-5.32V31.022l-.037-1.705c-.025-.562-.13-1.08-.32-1.556s-.5-.855-.937-1.143-1.08-.43-1.93-.43c-.25 0-.58.056-.993.17a3.3 3.3 0 0 0-1.199.637c-.388.313-.718.762-.993 1.35s-.412 1.355-.412 2.304v11.24H17.2V22.515zm40.348 35.402V6.084h-3.73V4.84H64v54.32h-5.162v-1.244z" />
|
||||
</svg>
|
After Width: | Height: | Size: 2.5 KiB |
@ -59,7 +59,6 @@
|
||||
#include <net/NetJob.h>
|
||||
#include <net/Download.h>
|
||||
#include <news/NewsChecker.h>
|
||||
#include <notifications/NotificationChecker.h>
|
||||
#include <tools/BaseProfiler.h>
|
||||
#include <updater/DownloadTask.h>
|
||||
#include <updater/UpdateChecker.h>
|
||||
@ -82,7 +81,6 @@
|
||||
#include "ui/dialogs/CopyInstanceDialog.h"
|
||||
#include "ui/dialogs/UpdateDialog.h"
|
||||
#include "ui/dialogs/EditAccountDialog.h"
|
||||
#include "ui/dialogs/NotificationDialog.h"
|
||||
#include "ui/dialogs/ExportInstanceDialog.h"
|
||||
|
||||
#include "UpdateController.h"
|
||||
@ -235,6 +233,7 @@ public:
|
||||
TranslatedToolButton helpMenuButton;
|
||||
TranslatedAction actionReportBug;
|
||||
TranslatedAction actionDISCORD;
|
||||
TranslatedAction actionMATRIX;
|
||||
TranslatedAction actionREDDIT;
|
||||
TranslatedAction actionAbout;
|
||||
|
||||
@ -343,13 +342,23 @@ public:
|
||||
all_actions.append(&actionReportBug);
|
||||
helpMenu->addAction(actionReportBug);
|
||||
}
|
||||
|
||||
if(!BuildConfig.MATRIX_URL.isEmpty()) {
|
||||
actionMATRIX = TranslatedAction(MainWindow);
|
||||
actionMATRIX->setObjectName(QStringLiteral("actionMATRIX"));
|
||||
actionMATRIX->setIcon(APPLICATION->getThemedIcon("matrix"));
|
||||
actionMATRIX.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Matrix"));
|
||||
actionMATRIX.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Open %1 Matrix space"));
|
||||
all_actions.append(&actionMATRIX);
|
||||
helpMenu->addAction(actionMATRIX);
|
||||
}
|
||||
|
||||
if (!BuildConfig.DISCORD_URL.isEmpty()) {
|
||||
actionDISCORD = TranslatedAction(MainWindow);
|
||||
actionDISCORD->setObjectName(QStringLiteral("actionDISCORD"));
|
||||
actionDISCORD->setIcon(APPLICATION->getThemedIcon("discord"));
|
||||
actionDISCORD.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Discord"));
|
||||
actionDISCORD.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Open %1 discord voice chat."));
|
||||
actionDISCORD.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Open %1 Discord guild."));
|
||||
all_actions.append(&actionDISCORD);
|
||||
helpMenu->addAction(actionDISCORD);
|
||||
}
|
||||
@ -835,17 +844,6 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new MainWindow
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
auto checker = new NotificationChecker();
|
||||
checker->setNotificationsUrl(QUrl(BuildConfig.NOTIFICATION_URL));
|
||||
checker->setApplicationChannel(BuildConfig.VERSION_CHANNEL);
|
||||
checker->setApplicationPlatform(BuildConfig.BUILD_PLATFORM);
|
||||
checker->setApplicationFullVersion(BuildConfig.FULL_VERSION_STR);
|
||||
m_notificationChecker.reset(checker);
|
||||
connect(m_notificationChecker.get(), &NotificationChecker::notificationCheckFinished, this, &MainWindow::notificationsChanged);
|
||||
checker->checkForNotifications();
|
||||
}
|
||||
|
||||
setSelectedInstanceById(APPLICATION->settings()->get("SelectedInstance").toString());
|
||||
|
||||
// removing this looks stupid
|
||||
@ -1257,24 +1255,6 @@ QString intListToString(const QList<int> &list)
|
||||
}
|
||||
return slist.join(',');
|
||||
}
|
||||
void MainWindow::notificationsChanged()
|
||||
{
|
||||
QList<NotificationChecker::NotificationEntry> entries = m_notificationChecker->notificationEntries();
|
||||
QList<int> shownNotifications = stringToIntList(APPLICATION->settings()->get("ShownNotifications").toString());
|
||||
for (auto it = entries.begin(); it != entries.end(); ++it)
|
||||
{
|
||||
NotificationChecker::NotificationEntry entry = *it;
|
||||
if (!shownNotifications.contains(entry.id))
|
||||
{
|
||||
NotificationDialog dialog(entry, this);
|
||||
if (dialog.exec() == NotificationDialog::DontShowAgain)
|
||||
{
|
||||
shownNotifications.append(entry.id);
|
||||
}
|
||||
}
|
||||
}
|
||||
APPLICATION->settings()->set("ShownNotifications", intListToString(shownNotifications));
|
||||
}
|
||||
|
||||
void MainWindow::downloadUpdates(GoUpdate::Status status)
|
||||
{
|
||||
@ -1500,6 +1480,11 @@ void MainWindow::on_actionDISCORD_triggered()
|
||||
DesktopServices::openUrl(QUrl(BuildConfig.DISCORD_URL));
|
||||
}
|
||||
|
||||
void MainWindow::on_actionMATRIX_triggered()
|
||||
{
|
||||
DesktopServices::openUrl(QUrl(BuildConfig.MATRIX_URL));
|
||||
}
|
||||
|
||||
void MainWindow::on_actionChangeInstIcon_triggered()
|
||||
{
|
||||
if (!m_selectedInstance)
|
||||
|
@ -28,7 +28,6 @@
|
||||
|
||||
class LaunchController;
|
||||
class NewsChecker;
|
||||
class NotificationChecker;
|
||||
class QToolButton;
|
||||
class InstanceProxyModel;
|
||||
class LabeledToolButton;
|
||||
@ -73,6 +72,8 @@ private slots:
|
||||
|
||||
void on_actionREDDIT_triggered();
|
||||
|
||||
void on_actionMATRIX_triggered();
|
||||
|
||||
void on_actionDISCORD_triggered();
|
||||
|
||||
void on_actionCopyInstance_triggered();
|
||||
@ -166,8 +167,6 @@ private slots:
|
||||
|
||||
void updateNotAvailable();
|
||||
|
||||
void notificationsChanged();
|
||||
|
||||
void defaultAccountChanged();
|
||||
|
||||
void changeActiveAccount();
|
||||
@ -213,7 +212,6 @@ private:
|
||||
KonamiCode * secretEventFilter = nullptr;
|
||||
|
||||
unique_qobject_ptr<NewsChecker> m_newsChecker;
|
||||
unique_qobject_ptr<NotificationChecker> m_notificationChecker;
|
||||
|
||||
InstancePtr m_selectedInstance;
|
||||
QString m_currentInstIcon;
|
||||
|
@ -5,7 +5,7 @@
|
||||
#include <InstanceList.h>
|
||||
|
||||
#include "ProgressDialog.h"
|
||||
#include "CustomMessageBox.h"
|
||||
#include "ReviewMessageBox.h"
|
||||
|
||||
#include <QLayout>
|
||||
#include <QPushButton>
|
||||
@ -75,27 +75,16 @@ void ModDownloadDialog::confirm()
|
||||
auto keys = modTask.keys();
|
||||
keys.sort(Qt::CaseInsensitive);
|
||||
|
||||
auto info = QString(tr("You're about to download the following mods:"));
|
||||
info.append("\n\n");
|
||||
for(auto task : keys){
|
||||
info.append(task);
|
||||
info.append("\n --> ");
|
||||
info.append(tr("File name: "));
|
||||
info.append(modTask.find(task).value()->getFilename());
|
||||
info.append('\n');
|
||||
}
|
||||
|
||||
auto confirm_dialog = CustomMessageBox::selectable(
|
||||
auto confirm_dialog = ReviewMessageBox::create(
|
||||
this,
|
||||
tr("Confirm mods to download"),
|
||||
info,
|
||||
QMessageBox::NoIcon,
|
||||
QMessageBox::Cancel | QMessageBox::Ok,
|
||||
QMessageBox::Ok
|
||||
tr("Confirm mods to download")
|
||||
);
|
||||
|
||||
auto AcceptButton = confirm_dialog->button(QMessageBox::Ok);
|
||||
connect(AcceptButton, &QPushButton::clicked, this, &ModDownloadDialog::accept);
|
||||
for(auto task : keys){
|
||||
confirm_dialog->appendMod(task, modTask.find(task).value()->getFilename());
|
||||
}
|
||||
|
||||
connect(confirm_dialog, &QDialog::accepted, this, &ModDownloadDialog::accept);
|
||||
|
||||
confirm_dialog->open();
|
||||
}
|
||||
|
@ -1,86 +0,0 @@
|
||||
#include "NotificationDialog.h"
|
||||
#include "ui_NotificationDialog.h"
|
||||
|
||||
#include <QTimerEvent>
|
||||
#include <QStyle>
|
||||
|
||||
NotificationDialog::NotificationDialog(const NotificationChecker::NotificationEntry &entry, QWidget *parent) :
|
||||
QDialog(parent, Qt::MSWindowsFixedSizeDialogHint | Qt::WindowTitleHint | Qt::CustomizeWindowHint),
|
||||
ui(new Ui::NotificationDialog)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
QStyle::StandardPixmap icon;
|
||||
switch (entry.type)
|
||||
{
|
||||
case NotificationChecker::NotificationEntry::Critical:
|
||||
icon = QStyle::SP_MessageBoxCritical;
|
||||
break;
|
||||
case NotificationChecker::NotificationEntry::Warning:
|
||||
icon = QStyle::SP_MessageBoxWarning;
|
||||
break;
|
||||
default:
|
||||
case NotificationChecker::NotificationEntry::Information:
|
||||
icon = QStyle::SP_MessageBoxInformation;
|
||||
break;
|
||||
}
|
||||
ui->iconLabel->setPixmap(style()->standardPixmap(icon, 0, this));
|
||||
ui->messageLabel->setText(entry.message);
|
||||
|
||||
m_dontShowAgainText = tr("Don't show again");
|
||||
m_closeText = tr("Close");
|
||||
|
||||
ui->dontShowAgainBtn->setText(m_dontShowAgainText + QString(" (%1)").arg(m_dontShowAgainTime));
|
||||
ui->closeBtn->setText(m_closeText + QString(" (%1)").arg(m_closeTime));
|
||||
|
||||
startTimer(1000);
|
||||
}
|
||||
|
||||
NotificationDialog::~NotificationDialog()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void NotificationDialog::timerEvent(QTimerEvent *event)
|
||||
{
|
||||
if (m_dontShowAgainTime > 0)
|
||||
{
|
||||
m_dontShowAgainTime--;
|
||||
if (m_dontShowAgainTime == 0)
|
||||
{
|
||||
ui->dontShowAgainBtn->setText(m_dontShowAgainText);
|
||||
ui->dontShowAgainBtn->setEnabled(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
ui->dontShowAgainBtn->setText(m_dontShowAgainText + QString(" (%1)").arg(m_dontShowAgainTime));
|
||||
}
|
||||
}
|
||||
if (m_closeTime > 0)
|
||||
{
|
||||
m_closeTime--;
|
||||
if (m_closeTime == 0)
|
||||
{
|
||||
ui->closeBtn->setText(m_closeText);
|
||||
ui->closeBtn->setEnabled(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
ui->closeBtn->setText(m_closeText + QString(" (%1)").arg(m_closeTime));
|
||||
}
|
||||
}
|
||||
|
||||
if (m_closeTime == 0 && m_dontShowAgainTime == 0)
|
||||
{
|
||||
killTimer(event->timerId());
|
||||
}
|
||||
}
|
||||
|
||||
void NotificationDialog::on_dontShowAgainBtn_clicked()
|
||||
{
|
||||
done(DontShowAgain);
|
||||
}
|
||||
void NotificationDialog::on_closeBtn_clicked()
|
||||
{
|
||||
done(Normal);
|
||||
}
|
@ -1,44 +0,0 @@
|
||||
#ifndef NOTIFICATIONDIALOG_H
|
||||
#define NOTIFICATIONDIALOG_H
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
#include "notifications/NotificationChecker.h"
|
||||
|
||||
namespace Ui {
|
||||
class NotificationDialog;
|
||||
}
|
||||
|
||||
class NotificationDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit NotificationDialog(const NotificationChecker::NotificationEntry &entry, QWidget *parent = 0);
|
||||
~NotificationDialog();
|
||||
|
||||
enum ExitCode
|
||||
{
|
||||
Normal,
|
||||
DontShowAgain
|
||||
};
|
||||
|
||||
protected:
|
||||
void timerEvent(QTimerEvent *event);
|
||||
|
||||
private:
|
||||
Ui::NotificationDialog *ui;
|
||||
|
||||
int m_dontShowAgainTime = 10;
|
||||
int m_closeTime = 5;
|
||||
|
||||
QString m_dontShowAgainText;
|
||||
QString m_closeText;
|
||||
|
||||
private
|
||||
slots:
|
||||
void on_dontShowAgainBtn_clicked();
|
||||
void on_closeBtn_clicked();
|
||||
};
|
||||
|
||||
#endif // NOTIFICATIONDIALOG_H
|
@ -1,85 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>NotificationDialog</class>
|
||||
<widget class="QDialog" name="NotificationDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>320</width>
|
||||
<height>240</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Notification</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout" stretch="1,0">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2" stretch="0,1">
|
||||
<item>
|
||||
<widget class="QLabel" name="iconLabel">
|
||||
<property name="text">
|
||||
<string notr="true">TextLabel</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="messageLabel">
|
||||
<property name="text">
|
||||
<string notr="true">TextLabel</string>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="openExternalLinks">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="textInteractionFlags">
|
||||
<set>Qt::TextBrowserInteraction</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="dontShowAgainBtn">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Don't show again</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="closeBtn">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Close</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
31
launcher/ui/dialogs/ReviewMessageBox.cpp
Normal file
31
launcher/ui/dialogs/ReviewMessageBox.cpp
Normal file
@ -0,0 +1,31 @@
|
||||
#include "ReviewMessageBox.h"
|
||||
#include "ui_ReviewMessageBox.h"
|
||||
|
||||
ReviewMessageBox::ReviewMessageBox(QWidget* parent, QString const& title, QString const& icon)
|
||||
: QDialog(parent), ui(new Ui::ReviewMessageBox)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
}
|
||||
|
||||
ReviewMessageBox::~ReviewMessageBox()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
auto ReviewMessageBox::create(QWidget* parent, QString&& title, QString&& icon) -> ReviewMessageBox*
|
||||
{
|
||||
return new ReviewMessageBox(parent, title, icon);
|
||||
}
|
||||
|
||||
void ReviewMessageBox::appendMod(const QString& name, const QString& filename)
|
||||
{
|
||||
auto itemTop = new QTreeWidgetItem(ui->modTreeWidget);
|
||||
itemTop->setText(0, name);
|
||||
|
||||
auto filenameItem = new QTreeWidgetItem(itemTop);
|
||||
filenameItem->setText(0, tr("Filename: %1").arg(filename));
|
||||
|
||||
itemTop->insertChildren(0, { filenameItem });
|
||||
|
||||
ui->modTreeWidget->addTopLevelItem(itemTop);
|
||||
}
|
23
launcher/ui/dialogs/ReviewMessageBox.h
Normal file
23
launcher/ui/dialogs/ReviewMessageBox.h
Normal file
@ -0,0 +1,23 @@
|
||||
#pragma once
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
namespace Ui {
|
||||
class ReviewMessageBox;
|
||||
}
|
||||
|
||||
class ReviewMessageBox final : public QDialog {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
static auto create(QWidget* parent, QString&& title, QString&& icon = "") -> ReviewMessageBox*;
|
||||
|
||||
void appendMod(const QString& name, const QString& filename);
|
||||
|
||||
~ReviewMessageBox();
|
||||
|
||||
private:
|
||||
ReviewMessageBox(QWidget* parent, const QString& title, const QString& icon);
|
||||
|
||||
Ui::ReviewMessageBox* ui;
|
||||
};
|
98
launcher/ui/dialogs/ReviewMessageBox.ui
Normal file
98
launcher/ui/dialogs/ReviewMessageBox.ui
Normal file
@ -0,0 +1,98 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>ReviewMessageBox</class>
|
||||
<widget class="QDialog" name="ReviewMessageBox">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Confirm mod selection</string>
|
||||
</property>
|
||||
<property name="sizeGripEnabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="modal">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>You're about to download the following mods:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QTreeWidget" name="modTreeWidget">
|
||||
<property name="alternatingRowColors">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="selectionMode">
|
||||
<enum>QAbstractItemView::NoSelection</enum>
|
||||
</property>
|
||||
<property name="selectionBehavior">
|
||||
<enum>QAbstractItemView::SelectItems</enum>
|
||||
</property>
|
||||
<attribute name="headerVisible">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>ReviewMessageBox</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>200</x>
|
||||
<y>265</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>199</x>
|
||||
<y>149</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>ReviewMessageBox</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>200</x>
|
||||
<y>265</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>199</x>
|
||||
<y>149</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
@ -234,11 +234,6 @@ void LauncherPage::applySettings()
|
||||
{
|
||||
auto s = APPLICATION->settings();
|
||||
|
||||
if (ui->resetNotificationsBtn->isChecked())
|
||||
{
|
||||
s->set("ShownNotifications", QString());
|
||||
}
|
||||
|
||||
// Updates
|
||||
s->set("AutoUpdate", ui->autoUpdateCheckBox->isChecked());
|
||||
s->set("UpdateChannel", m_currentUpdateChannel);
|
||||
@ -247,16 +242,16 @@ void LauncherPage::applySettings()
|
||||
switch (ui->themeComboBox->currentIndex())
|
||||
{
|
||||
case 0:
|
||||
s->set("IconTheme", "pe_dark");
|
||||
s->set("IconTheme", "pe_colored");
|
||||
break;
|
||||
case 1:
|
||||
s->set("IconTheme", "pe_light");
|
||||
break;
|
||||
case 2:
|
||||
s->set("IconTheme", "pe_blue");
|
||||
s->set("IconTheme", "pe_dark");
|
||||
break;
|
||||
case 3:
|
||||
s->set("IconTheme", "pe_colored");
|
||||
s->set("IconTheme", "pe_blue");
|
||||
break;
|
||||
case 4:
|
||||
s->set("IconTheme", "OSX");
|
||||
@ -268,10 +263,10 @@ void LauncherPage::applySettings()
|
||||
s->set("IconTheme", "flat");
|
||||
break;
|
||||
case 7:
|
||||
s->set("IconTheme", "custom");
|
||||
s->set("IconTheme", "multimc");
|
||||
break;
|
||||
case 8:
|
||||
s->set("IconTheme", "multimc");
|
||||
s->set("IconTheme", "custom");
|
||||
break;
|
||||
}
|
||||
|
||||
@ -324,7 +319,7 @@ void LauncherPage::loadSettings()
|
||||
m_currentUpdateChannel = s->get("UpdateChannel").toString();
|
||||
//FIXME: make generic
|
||||
auto theme = s->get("IconTheme").toString();
|
||||
if (theme == "pe_dark")
|
||||
if (theme == "pe_colored")
|
||||
{
|
||||
ui->themeComboBox->setCurrentIndex(0);
|
||||
}
|
||||
@ -332,11 +327,11 @@ void LauncherPage::loadSettings()
|
||||
{
|
||||
ui->themeComboBox->setCurrentIndex(1);
|
||||
}
|
||||
else if (theme == "pe_blue")
|
||||
else if (theme == "pe_dark")
|
||||
{
|
||||
ui->themeComboBox->setCurrentIndex(2);
|
||||
}
|
||||
else if (theme == "pe_colored")
|
||||
else if (theme == "pe_blue")
|
||||
{
|
||||
ui->themeComboBox->setCurrentIndex(3);
|
||||
}
|
||||
|
@ -184,25 +184,6 @@
|
||||
<string>User Interface</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_6">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_3">
|
||||
<property name="title">
|
||||
<string>Launcher notifications</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_5">
|
||||
<item>
|
||||
<widget class="QPushButton" name="resetNotificationsBtn">
|
||||
<property name="text">
|
||||
<string>Reset hidden notifications</string>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="sortingModeBox">
|
||||
<property name="enabled">
|
||||
@ -264,7 +245,7 @@
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Simple (Dark Icons)</string>
|
||||
<string>Simple (Colored Icons)</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
@ -274,12 +255,12 @@
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Simple (Blue Icons)</string>
|
||||
<string>Simple (Dark Icons)</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Simple (Colored Icons)</string>
|
||||
<string>Simple (Blue Icons)</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
@ -294,7 +275,12 @@
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string notr="true">Flat</string>
|
||||
<string>Flat</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Legacy</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
@ -302,11 +288,6 @@
|
||||
<string>Custom</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>MultiMC</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
@ -499,7 +480,6 @@
|
||||
<tabstop>modsDirBrowseBtn</tabstop>
|
||||
<tabstop>iconsDirTextBox</tabstop>
|
||||
<tabstop>iconsDirBrowseBtn</tabstop>
|
||||
<tabstop>resetNotificationsBtn</tabstop>
|
||||
<tabstop>sortLastLaunchedBtn</tabstop>
|
||||
<tabstop>sortByNameBtn</tabstop>
|
||||
<tabstop>themeComboBox</tabstop>
|
||||
|
@ -152,8 +152,8 @@ ModFolderPage::ModFolderPage(
|
||||
ui->actionsToolbar->insertActionBefore(ui->actionAdd, act);
|
||||
connect(act, &QAction::triggered, this, &ModFolderPage::on_actionInstall_mods_triggered);
|
||||
|
||||
ui->actionAdd->setText("Add .jar");
|
||||
ui->actionAdd->setToolTip("Add mods via local file");
|
||||
ui->actionAdd->setText(tr("Add .jar"));
|
||||
ui->actionAdd->setToolTip(tr("Add mods via local file"));
|
||||
}
|
||||
|
||||
ui->actionsToolbar->insertSpacer(ui->actionView_configs);
|
||||
|
@ -14,6 +14,7 @@
|
||||
*/
|
||||
|
||||
#include "PageContainer.h"
|
||||
#include "BuildConfig.h"
|
||||
#include "PageContainer_p.h"
|
||||
|
||||
#include <QStackedLayout>
|
||||
@ -207,7 +208,7 @@ void PageContainer::help()
|
||||
QString pageId = m_currentPage->helpPage();
|
||||
if (pageId.isEmpty())
|
||||
return;
|
||||
DesktopServices::openUrl(QUrl("https://github.com/PolyMC/PolyMC/wiki/" + pageId));
|
||||
DesktopServices::openUrl(QUrl(BuildConfig.HELP_URL.arg(pageId)));
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user