aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt12
-rw-r--r--buildconfig/BuildConfig.cpp.in8
-rw-r--r--buildconfig/BuildConfig.h7
-rw-r--r--launcher/Application.cpp11
-rw-r--r--launcher/CMakeLists.txt14
-rw-r--r--launcher/notifications/NotificationChecker.cpp129
-rw-r--r--launcher/notifications/NotificationChecker.h61
-rw-r--r--launcher/ui/MainWindow.cpp31
-rw-r--r--launcher/ui/MainWindow.h4
-rw-r--r--launcher/ui/dialogs/ModDownloadDialog.cpp27
-rw-r--r--launcher/ui/dialogs/NotificationDialog.cpp86
-rw-r--r--launcher/ui/dialogs/NotificationDialog.h44
-rw-r--r--launcher/ui/dialogs/NotificationDialog.ui85
-rw-r--r--launcher/ui/dialogs/ReviewMessageBox.cpp31
-rw-r--r--launcher/ui/dialogs/ReviewMessageBox.h23
-rw-r--r--launcher/ui/dialogs/ReviewMessageBox.ui98
-rw-r--r--launcher/ui/pages/global/LauncherPage.cpp5
-rw-r--r--launcher/ui/pages/global/LauncherPage.ui20
18 files changed, 177 insertions, 519 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5250d0ff..7cd0cf86 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -59,14 +59,11 @@ set(Launcher_VERSION_HOTFIX 0)
set(Launcher_VERSION_BUILD -1 CACHE STRING "Build number. -1 for no build number.")
# Build platform.
-set(Launcher_BUILD_PLATFORM "" CACHE STRING "A short string identifying the platform that this build was built for. Only used by the notification system and to display in the about dialog.")
+set(Launcher_BUILD_PLATFORM "" CACHE STRING "A short string identifying the platform that this build was built for. Only used to display in the about dialog.")
# Channel list URL
set(Launcher_UPDATER_BASE "" CACHE STRING "Base URL for the updater.")
-# Notification URL
-set(Launcher_NOTIFICATION_URL "" CACHE STRING "URL for checking for notifications.")
-
# The metadata server
set(Launcher_META_URL "https://meta.polymc.org/v1/" CACHE STRING "URL to fetch Launcher's meta files from.")
@@ -170,13 +167,13 @@ if(UNIX AND APPLE)
# Mac bundle settings
set(MACOSX_BUNDLE_BUNDLE_NAME "${Launcher_Name}")
- set(MACOSX_BUNDLE_INFO_STRING "${Launcher_Name}: Minecraft launcher and management utility.")
+ set(MACOSX_BUNDLE_INFO_STRING "${Launcher_Name}: A custom launcher for Minecraft that allows you to easily manage multiple installations of Minecraft at once.")
set(MACOSX_BUNDLE_GUI_IDENTIFIER "org.polymc.${Launcher_Name}")
set(MACOSX_BUNDLE_BUNDLE_VERSION "${Launcher_VERSION_MAJOR}.${Launcher_VERSION_MINOR}.${Launcher_VERSION_HOTFIX}.${Launcher_VERSION_BUILD}")
set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${Launcher_VERSION_MAJOR}.${Launcher_VERSION_MINOR}.${Launcher_VERSION_HOTFIX}.${Launcher_VERSION_BUILD}")
set(MACOSX_BUNDLE_LONG_VERSION_STRING "${Launcher_VERSION_MAJOR}.${Launcher_VERSION_MINOR}.${Launcher_VERSION_HOTFIX}.${Launcher_VERSION_BUILD}")
set(MACOSX_BUNDLE_ICON_FILE ${Launcher_Name}.icns)
- set(MACOSX_BUNDLE_COPYRIGHT "Copyright 2015-2021 ${Launcher_Copyright}")
+ set(MACOSX_BUNDLE_COPYRIGHT "Copyright 2021-2022 ${Launcher_Copyright}")
# directories to look for dependencies
set(DIRS ${QT_LIBS_DIR} ${QT_LIBEXECS_DIR} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
@@ -207,7 +204,8 @@ elseif(UNIX)
set(LAUNCHER_METAINFO_DEST_DIR "share/metainfo" CACHE STRING "Path to the metainfo directory")
set(LAUNCHER_ICON_DEST_DIR "share/icons/hicolor/scalable/apps" CACHE STRING "Path to the scalable icon directory")
- set(Launcher_APP_BINARY_DEFS "-DMULTIMC_JARS_LOCATION=${CMAKE_INSTALL_PREFIX}/${JARS_DEST_DIR}")
+ # jars path is determined on runtime, relative to "Application root path", generally /usr for Launcher_PORTABLE=0
+ set(Launcher_APP_BINARY_DEFS "-DLAUNCHER_JARS_LOCATION=${JARS_DEST_DIR}")
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${Launcher_Desktop} DESTINATION ${LAUNCHER_DESKTOP_DEST_DIR})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${Launcher_MetaInfo} DESTINATION ${LAUNCHER_METAINFO_DEST_DIR})
diff --git a/buildconfig/BuildConfig.cpp.in b/buildconfig/BuildConfig.cpp.in
index d1bd4d05..4625b1bf 100644
--- a/buildconfig/BuildConfig.cpp.in
+++ b/buildconfig/BuildConfig.cpp.in
@@ -25,12 +25,14 @@ Config::Config()
BUILD_PLATFORM = "@Launcher_BUILD_PLATFORM@";
UPDATER_BASE = "@Launcher_UPDATER_BASE@";
- NOTIFICATION_URL = "@Launcher_NOTIFICATION_URL@";
- FULL_VERSION_STR = "@Launcher_VERSION_MAJOR@.@Launcher_VERSION_MINOR@.@Launcher_VERSION_BUILD@";
GIT_COMMIT = "@Launcher_GIT_COMMIT@";
GIT_REFSPEC = "@Launcher_GIT_REFSPEC@";
- if(GIT_REFSPEC.startsWith("refs/heads/"))
+ if (GIT_REFSPEC == QStringLiteral("GITDIR-NOTFOUND"))
+ {
+ VERSION_CHANNEL = QStringLiteral("stable");
+ }
+ else if(GIT_REFSPEC.startsWith("refs/heads/"))
{
VERSION_CHANNEL = GIT_REFSPEC;
VERSION_CHANNEL.remove("refs/heads/");
diff --git a/buildconfig/BuildConfig.h b/buildconfig/BuildConfig.h
index cf74b39e..79210505 100644
--- a/buildconfig/BuildConfig.h
+++ b/buildconfig/BuildConfig.h
@@ -46,13 +46,6 @@ public:
/// User-Agent to use for uncached requests.
QString USER_AGENT_UNCACHED;
-
- /// URL for notifications
- QString NOTIFICATION_URL;
-
- /// Used for matching notifications
- QString FULL_VERSION_STR;
-
/// The git commit hash of this build
QString GIT_COMMIT;
diff --git a/launcher/Application.cpp b/launcher/Application.cpp
index 0ce80d4b..e0d7ba0a 100644
--- a/launcher/Application.cpp
+++ b/launcher/Application.cpp
@@ -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()) {
diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt
index 86c05651..751b354b 100644
--- a/launcher/CMakeLists.txt
+++ b/launcher/CMakeLists.txt
@@ -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
@@ -561,7 +554,6 @@ set(LOGIC_SOURCES
${NET_SOURCES}
${LAUNCH_SOURCES}
${UPDATE_SOURCES}
- ${NOTIFICATIONS_SOURCES}
${NEWS_SOURCES}
${MINECRAFT_SOURCES}
${SCREENSHOTS_SOURCES}
@@ -791,12 +783,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
@@ -893,7 +885,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
@@ -905,6 +896,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
diff --git a/launcher/notifications/NotificationChecker.cpp b/launcher/notifications/NotificationChecker.cpp
deleted file mode 100644
index 10b91691..00000000
--- a/launcher/notifications/NotificationChecker.cpp
+++ /dev/null
@@ -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 &notificationsUrl)
-{
- 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;
-}
diff --git a/launcher/notifications/NotificationChecker.h b/launcher/notifications/NotificationChecker.h
deleted file mode 100644
index 0f305f33..00000000
--- a/launcher/notifications/NotificationChecker.h
+++ /dev/null
@@ -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 &notificationsUrl);
- 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;
-};
diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp
index 2cb3c7fd..7b758e05 100644
--- a/launcher/ui/MainWindow.cpp
+++ b/launcher/ui/MainWindow.cpp
@@ -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"
@@ -846,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
@@ -1268,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)
{
diff --git a/launcher/ui/MainWindow.h b/launcher/ui/MainWindow.h
index bdbe81aa..f2852d78 100644
--- a/launcher/ui/MainWindow.h
+++ b/launcher/ui/MainWindow.h
@@ -28,7 +28,6 @@
class LaunchController;
class NewsChecker;
-class NotificationChecker;
class QToolButton;
class InstanceProxyModel;
class LabeledToolButton;
@@ -168,8 +167,6 @@ private slots:
void updateNotAvailable();
- void notificationsChanged();
-
void defaultAccountChanged();
void changeActiveAccount();
@@ -215,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;
diff --git a/launcher/ui/dialogs/ModDownloadDialog.cpp b/launcher/ui/dialogs/ModDownloadDialog.cpp
index 23ca8731..a53f93e8 100644
--- a/launcher/ui/dialogs/ModDownloadDialog.cpp
+++ b/launcher/ui/dialogs/ModDownloadDialog.cpp
@@ -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();
}
diff --git a/launcher/ui/dialogs/NotificationDialog.cpp b/launcher/ui/dialogs/NotificationDialog.cpp
deleted file mode 100644
index f2a35ae2..00000000
--- a/launcher/ui/dialogs/NotificationDialog.cpp
+++ /dev/null
@@ -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);
-}
diff --git a/launcher/ui/dialogs/NotificationDialog.h b/launcher/ui/dialogs/NotificationDialog.h
deleted file mode 100644
index e1cbb9fa..00000000
--- a/launcher/ui/dialogs/NotificationDialog.h
+++ /dev/null
@@ -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
diff --git a/launcher/ui/dialogs/NotificationDialog.ui b/launcher/ui/dialogs/NotificationDialog.ui
deleted file mode 100644
index 3e6c22bc..00000000
--- a/launcher/ui/dialogs/NotificationDialog.ui
+++ /dev/null
@@ -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>
diff --git a/launcher/ui/dialogs/ReviewMessageBox.cpp b/launcher/ui/dialogs/ReviewMessageBox.cpp
new file mode 100644
index 00000000..2bfd02e0
--- /dev/null
+++ b/launcher/ui/dialogs/ReviewMessageBox.cpp
@@ -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);
+}
diff --git a/launcher/ui/dialogs/ReviewMessageBox.h b/launcher/ui/dialogs/ReviewMessageBox.h
new file mode 100644
index 00000000..48742cd9
--- /dev/null
+++ b/launcher/ui/dialogs/ReviewMessageBox.h
@@ -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;
+};
diff --git a/launcher/ui/dialogs/ReviewMessageBox.ui b/launcher/ui/dialogs/ReviewMessageBox.ui
new file mode 100644
index 00000000..d04f3b3f
--- /dev/null
+++ b/launcher/ui/dialogs/ReviewMessageBox.ui
@@ -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>
diff --git a/launcher/ui/pages/global/LauncherPage.cpp b/launcher/ui/pages/global/LauncherPage.cpp
index cec496dc..ee68cd08 100644
--- a/launcher/ui/pages/global/LauncherPage.cpp
+++ b/launcher/ui/pages/global/LauncherPage.cpp
@@ -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);
diff --git a/launcher/ui/pages/global/LauncherPage.ui b/launcher/ui/pages/global/LauncherPage.ui
index 59096a28..c110dd09 100644
--- a/launcher/ui/pages/global/LauncherPage.ui
+++ b/launcher/ui/pages/global/LauncherPage.ui
@@ -185,25 +185,6 @@
</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">
<bool>true</bool>
@@ -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>