Merge remote-tracking branch 'upstream/develop' into const-in-declarations
This commit is contained in:
commit
b42434bcb6
2
.github/workflows/backport.yml
vendored
2
.github/workflows/backport.yml
vendored
@ -24,7 +24,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
- name: Create backport PRs
|
- name: Create backport PRs
|
||||||
uses: korthout/backport-action@v2.0.0
|
uses: korthout/backport-action@v2.1.1
|
||||||
with:
|
with:
|
||||||
# Config README: https://github.com/korthout/backport-action#backport-action
|
# Config README: https://github.com/korthout/backport-action#backport-action
|
||||||
pull_description: |-
|
pull_description: |-
|
||||||
|
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
@ -594,7 +594,7 @@ jobs:
|
|||||||
flatpak:
|
flatpak:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container:
|
container:
|
||||||
image: bilelmoussaoui/flatpak-github-actions:kde-5.15-22.08
|
image: bilelmoussaoui/flatpak-github-actions:kde-5.15-23.08
|
||||||
options: --privileged
|
options: --privileged
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
|
11
README.md
11
README.md
@ -18,11 +18,18 @@
|
|||||||
</a>
|
</a>
|
||||||
|
|
||||||
- All downloads and instructions for Prism Launcher can be found on our [Website](https://prismlauncher.org/download).
|
- All downloads and instructions for Prism Launcher can be found on our [Website](https://prismlauncher.org/download).
|
||||||
- Last build status can be found in the [GitHub Actions](https://github.com/PrismLauncher/PrismLauncher/actions).
|
- Last build status can be found in the [GitHub Actions](https://github.com/PrismLauncher/PrismLauncher/actions) tab (this also includes the pull requests status).
|
||||||
|
|
||||||
### Development Builds
|
### Development Builds
|
||||||
|
|
||||||
There are development builds available [here](https://github.com/PrismLauncher/PrismLauncher/actions). These have debug information in the binaries, so their file sizes are relatively larger.
|
Please understand that these builds are not intended for most users. There may be bugs, and other instabilities. You have been warned.
|
||||||
|
|
||||||
|
There are development builds available through:
|
||||||
|
|
||||||
|
- [GitHub Actions](https://github.com/PrismLauncher/PrismLauncher/actions) (includes builds from pull requests opened by contribuitors)
|
||||||
|
- [nightly.link](https://nightly.link/PrismLauncher/PrismLauncher/workflows/trigger_builds/develop) (this will always point only to the latest version of develop)
|
||||||
|
|
||||||
|
These have debug information in the binaries, so their file sizes are relatively larger.
|
||||||
|
|
||||||
Prebuilt Development builds are provided for **Linux**, **Windows** and **macOS**.
|
Prebuilt Development builds are provided for **Linux**, **Windows** and **macOS**.
|
||||||
|
|
||||||
|
30
flake.lock
generated
30
flake.lock
generated
@ -21,11 +21,11 @@
|
|||||||
"nixpkgs-lib": "nixpkgs-lib"
|
"nixpkgs-lib": "nixpkgs-lib"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1696343447,
|
"lastModified": 1698882062,
|
||||||
"narHash": "sha256-B2xAZKLkkeRFG5XcHHSXXcP7To9Xzr59KXeZiRf4vdQ=",
|
"narHash": "sha256-HkhafUayIqxXyHH1X8d9RDl1M2CkFgZLjKD3MzabiEo=",
|
||||||
"owner": "hercules-ci",
|
"owner": "hercules-ci",
|
||||||
"repo": "flake-parts",
|
"repo": "flake-parts",
|
||||||
"rev": "c9afaba3dfa4085dbd2ccb38dfade5141e33d9d4",
|
"rev": "8c9fa2545007b49a5db5f650ae91f227672c3877",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -76,11 +76,11 @@
|
|||||||
"libnbtplusplus": {
|
"libnbtplusplus": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1690036783,
|
"lastModified": 1699286814,
|
||||||
"narHash": "sha256-A5kTgICnx+Qdq3Fir/bKTfdTt/T1NQP2SC+nhN1ENug=",
|
"narHash": "sha256-yy0q+bky80LtK1GWzz7qpM+aAGrOqLuewbid8WT1ilk=",
|
||||||
"owner": "PrismLauncher",
|
"owner": "PrismLauncher",
|
||||||
"repo": "libnbtplusplus",
|
"repo": "libnbtplusplus",
|
||||||
"rev": "a5e8fd52b8bf4ab5d5bcc042b2a247867589985f",
|
"rev": "23b955121b8217c1c348a9ed2483167a6f3ff4ad",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -106,11 +106,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1697886341,
|
"lastModified": 1700108881,
|
||||||
"narHash": "sha256-AdE67xPty9M9wn36nPVp6aDntIdigrs7UbyaGv1VAaM=",
|
"narHash": "sha256-+Lqybl8kj0+nD/IlAWPPG/RDTa47gff9nbei0u7BntE=",
|
||||||
"owner": "nixos",
|
"owner": "nixos",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "44881e03af1c730cbb1d72a4d41274a2c957813a",
|
"rev": "7414e9ee0b3e9903c24d3379f577a417f0aae5f1",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -123,11 +123,11 @@
|
|||||||
"nixpkgs-lib": {
|
"nixpkgs-lib": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"dir": "lib",
|
"dir": "lib",
|
||||||
"lastModified": 1696019113,
|
"lastModified": 1698611440,
|
||||||
"narHash": "sha256-X3+DKYWJm93DRSdC5M6K5hLqzSya9BjibtBsuARoPco=",
|
"narHash": "sha256-jPjHjrerhYDy3q9+s5EAsuhyhuknNfowY6yt6pjn9pc=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "f5892ddac112a1e9b3612c39af1b72987ee5783a",
|
"rev": "0cbe9f69c234a7700596e943bfae7ef27a31b735",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -153,11 +153,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1697746376,
|
"lastModified": 1700064067,
|
||||||
"narHash": "sha256-gu77VkgdfaHgNCVufeb6WP9oqFLjwK4jHcoPZmBVF3E=",
|
"narHash": "sha256-1ZWNDzhu8UlVCK7+DUN9dVQfiHX1bv6OQP9VxstY/gs=",
|
||||||
"owner": "cachix",
|
"owner": "cachix",
|
||||||
"repo": "pre-commit-hooks.nix",
|
"repo": "pre-commit-hooks.nix",
|
||||||
"rev": "8cc349bfd082da8782b989cad2158c9ad5bd70fd",
|
"rev": "e558068cba67b23b4fbc5537173dbb43748a17e8",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
id: org.prismlauncher.PrismLauncher
|
id: org.prismlauncher.PrismLauncher
|
||||||
runtime: org.kde.Platform
|
runtime: org.kde.Platform
|
||||||
runtime-version: "5.15-22.08"
|
runtime-version: "5.15-23.08"
|
||||||
sdk: org.kde.Sdk
|
sdk: org.kde.Sdk
|
||||||
sdk-extensions:
|
sdk-extensions:
|
||||||
- org.freedesktop.Sdk.Extension.openjdk17
|
- org.freedesktop.Sdk.Extension.openjdk17
|
||||||
@ -113,6 +113,9 @@ modules:
|
|||||||
version-query: .tag_name
|
version-query: .tag_name
|
||||||
url-query: .tarball_url
|
url-query: .tarball_url
|
||||||
timestamp-query: .published_at
|
timestamp-query: .published_at
|
||||||
|
# from https://github.com/flathub/net.gaijin.WarThunder/blob/7ea6f7a9f84b9c77150c003a7059dc03f8dcbc7f/gamemode.patch
|
||||||
|
- type: patch
|
||||||
|
path: patches/gamemode.patch
|
||||||
cleanup:
|
cleanup:
|
||||||
- /include
|
- /include
|
||||||
- /lib/pkgconfig
|
- /lib/pkgconfig
|
||||||
|
12
flatpak/patches/gamemode.patch
Normal file
12
flatpak/patches/gamemode.patch
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
diff -ruN a/common/common-pidfds.c b/common/common-pidfds.c
|
||||||
|
--- a/common/common-pidfds.c 2021-02-18 20:00:12.000000000 +0100
|
||||||
|
+++ b/common/common-pidfds.c 2023-09-07 08:57:42.954362763 +0200
|
||||||
|
@@ -58,6 +58,8 @@
|
||||||
|
{
|
||||||
|
return (int)syscall(__NR_pidfd_open, pid, flags);
|
||||||
|
}
|
||||||
|
+#else
|
||||||
|
+#include <sys/pidfd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* pidfd functions */
|
@ -1,5 +1,6 @@
|
|||||||
builds:
|
builds:
|
||||||
exclude: []
|
exclude:
|
||||||
|
- "*.x86_64-darwin.*"
|
||||||
include:
|
include:
|
||||||
- "checks.x86_64-linux.*"
|
- "checks.x86_64-linux.*"
|
||||||
- "devShells.*.*"
|
- "devShells.*.*"
|
||||||
|
@ -644,6 +644,7 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv)
|
|||||||
|
|
||||||
// Minecraft mods
|
// Minecraft mods
|
||||||
m_settings->registerSetting("ModMetadataDisabled", false);
|
m_settings->registerSetting("ModMetadataDisabled", false);
|
||||||
|
m_settings->registerSetting("ModDependenciesDisabled", false);
|
||||||
|
|
||||||
// Minecraft offline player name
|
// Minecraft offline player name
|
||||||
m_settings->registerSetting("LastOfflinePlayerName", "");
|
m_settings->registerSetting("LastOfflinePlayerName", "");
|
||||||
|
@ -108,12 +108,9 @@ bool openDirectory(const QString& path, [[maybe_unused]] bool ensureExists)
|
|||||||
#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
|
#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
|
||||||
if (!isSandbox()) {
|
if (!isSandbox()) {
|
||||||
return IndirectOpen(f);
|
return IndirectOpen(f);
|
||||||
} else {
|
|
||||||
return f();
|
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
return f();
|
|
||||||
#endif
|
#endif
|
||||||
|
return f();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool openFile(const QString& path)
|
bool openFile(const QString& path)
|
||||||
|
@ -943,6 +943,8 @@ bool createShortcut(QString destination, QString target, QStringList args, QStri
|
|||||||
<< "\n";
|
<< "\n";
|
||||||
stream << "Type=Application"
|
stream << "Type=Application"
|
||||||
<< "\n";
|
<< "\n";
|
||||||
|
stream << "Categories=Game;ActionGame;AdventureGame;Simulation"
|
||||||
|
<< "\n";
|
||||||
stream << "Exec=\"" << target.toLocal8Bit() << "\"" << argstring.toLocal8Bit() << "\n";
|
stream << "Exec=\"" << target.toLocal8Bit() << "\"" << argstring.toLocal8Bit() << "\n";
|
||||||
stream << "Name=" << name.toLocal8Bit() << "\n";
|
stream << "Name=" << name.toLocal8Bit() << "\n";
|
||||||
if (!icon.isEmpty()) {
|
if (!icon.isEmpty()) {
|
||||||
|
@ -290,7 +290,7 @@ void InstanceList::deleteGroup(const GroupId& name)
|
|||||||
qDebug() << "Remove" << instID << "from group" << name;
|
qDebug() << "Remove" << instID << "from group" << name;
|
||||||
removed = true;
|
removed = true;
|
||||||
auto idx = getInstIndex(instance.get());
|
auto idx = getInstIndex(instance.get());
|
||||||
if (idx > 0)
|
if (idx >= 0)
|
||||||
emit dataChanged(index(idx), index(idx), { GroupRole });
|
emit dataChanged(index(idx), index(idx), { GroupRole });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -315,7 +315,7 @@ void InstanceList::renameGroup(const QString& src, const QString& dst)
|
|||||||
qDebug() << "Set" << instID << "group to" << dst;
|
qDebug() << "Set" << instID << "group to" << dst;
|
||||||
modified = true;
|
modified = true;
|
||||||
auto idx = getInstIndex(instance.get());
|
auto idx = getInstIndex(instance.get());
|
||||||
if (idx > 0)
|
if (idx >= 0)
|
||||||
emit dataChanged(index(idx), index(idx), { GroupRole });
|
emit dataChanged(index(idx), index(idx), { GroupRole });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -947,9 +947,12 @@ QString InstanceList::getStagedInstancePath()
|
|||||||
|
|
||||||
bool InstanceList::commitStagedInstance(const QString& path,
|
bool InstanceList::commitStagedInstance(const QString& path,
|
||||||
InstanceName const& instanceName,
|
InstanceName const& instanceName,
|
||||||
const QString& groupName,
|
QString groupName,
|
||||||
InstanceTask const& commiting)
|
InstanceTask const& commiting)
|
||||||
{
|
{
|
||||||
|
if (groupName.isEmpty() && !groupName.isNull())
|
||||||
|
groupName = QString();
|
||||||
|
|
||||||
QDir dir;
|
QDir dir;
|
||||||
QString instID;
|
QString instID;
|
||||||
InstancePtr inst;
|
InstancePtr inst;
|
||||||
|
@ -130,7 +130,7 @@ class InstanceList : public QAbstractListModel {
|
|||||||
* should_override is used when another similar instance already exists, and we want to override it
|
* should_override is used when another similar instance already exists, and we want to override it
|
||||||
* - for instance, when updating it.
|
* - for instance, when updating it.
|
||||||
*/
|
*/
|
||||||
bool commitStagedInstance(const QString& keyPath, const InstanceName& instanceName, const QString& groupName, const InstanceTask&);
|
bool commitStagedInstance(const QString& keyPath, const InstanceName& instanceName, QString groupName, const InstanceTask&);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destroy a previously created staging area given by @keyPath - used when creation fails.
|
* Destroy a previously created staging area given by @keyPath - used when creation fails.
|
||||||
|
@ -89,7 +89,7 @@ void LaunchController::decideAccount()
|
|||||||
// Tell the user they need to log in at least one account in order to play.
|
// Tell the user they need to log in at least one account in order to play.
|
||||||
auto reply = CustomMessageBox::selectable(m_parentWidget, tr("No Accounts"),
|
auto reply = CustomMessageBox::selectable(m_parentWidget, tr("No Accounts"),
|
||||||
tr("In order to play Minecraft, you must have at least one Microsoft "
|
tr("In order to play Minecraft, you must have at least one Microsoft "
|
||||||
"account which owns Minecraft logged in."
|
"account which owns Minecraft logged in. "
|
||||||
"Would you like to open the account manager to add an account now?"),
|
"Would you like to open the account manager to add an account now?"),
|
||||||
QMessageBox::Information, QMessageBox::Yes | QMessageBox::No)
|
QMessageBox::Information, QMessageBox::Yes | QMessageBox::No)
|
||||||
->exec();
|
->exec();
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include <QPixmapCache>
|
#include <QPixmapCache>
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
#include <QTime>
|
#include <QTime>
|
||||||
|
#include <limits>
|
||||||
|
|
||||||
#define GET_TYPE() \
|
#define GET_TYPE() \
|
||||||
Qt::ConnectionType type; \
|
Qt::ConnectionType type; \
|
||||||
@ -100,10 +101,14 @@ class PixmapCache final : public QObject {
|
|||||||
*/
|
*/
|
||||||
bool _markCacheMissByEviciton()
|
bool _markCacheMissByEviciton()
|
||||||
{
|
{
|
||||||
|
static constexpr uint maxInt = static_cast<uint>(std::numeric_limits<int>::max());
|
||||||
|
static constexpr uint step = 10240;
|
||||||
|
static constexpr int oneSecond = 1000;
|
||||||
|
|
||||||
auto now = QTime::currentTime();
|
auto now = QTime::currentTime();
|
||||||
if (!m_last_cache_miss_by_eviciton.isNull()) {
|
if (!m_last_cache_miss_by_eviciton.isNull()) {
|
||||||
auto diff = m_last_cache_miss_by_eviciton.msecsTo(now);
|
auto diff = m_last_cache_miss_by_eviciton.msecsTo(now);
|
||||||
if (diff < 1000) { // less than a second ago
|
if (diff < oneSecond) { // less than a second ago
|
||||||
++m_consecutive_fast_evicitons;
|
++m_consecutive_fast_evicitons;
|
||||||
} else {
|
} else {
|
||||||
m_consecutive_fast_evicitons = 0;
|
m_consecutive_fast_evicitons = 0;
|
||||||
@ -111,11 +116,17 @@ class PixmapCache final : public QObject {
|
|||||||
}
|
}
|
||||||
m_last_cache_miss_by_eviciton = now;
|
m_last_cache_miss_by_eviciton = now;
|
||||||
if (m_consecutive_fast_evicitons >= m_consecutive_fast_evicitons_threshold) {
|
if (m_consecutive_fast_evicitons >= m_consecutive_fast_evicitons_threshold) {
|
||||||
// double the cache size
|
// increase the cache size
|
||||||
auto newSize = _cacheLimit() * 2;
|
uint newSize = _cacheLimit() + step;
|
||||||
qDebug() << m_consecutive_fast_evicitons << "pixmap cache misses by eviction happened too fast, doubling cache size to"
|
if (newSize >= maxInt) { // increase it until you overflow :D
|
||||||
<< newSize;
|
newSize = maxInt;
|
||||||
_setCacheLimit(newSize);
|
qDebug() << m_consecutive_fast_evicitons
|
||||||
|
<< tr("pixmap cache misses by eviction happened too fast, doing nothing as the cache size reached it's limit");
|
||||||
|
} else {
|
||||||
|
qDebug() << m_consecutive_fast_evicitons
|
||||||
|
<< tr("pixmap cache misses by eviction happened too fast, increasing cache size to") << static_cast<int>(newSize);
|
||||||
|
}
|
||||||
|
_setCacheLimit(static_cast<int>(newSize));
|
||||||
m_consecutive_fast_evicitons = 0;
|
m_consecutive_fast_evicitons = 0;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
|
#include <QFileInfo>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
|
|
||||||
@ -335,6 +336,7 @@ QList<QString> JavaUtils::FindJavaPaths()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
candidates.append(getMinecraftJavaBundle());
|
||||||
candidates = addJavasFromEnv(candidates);
|
candidates = addJavasFromEnv(candidates);
|
||||||
candidates.removeDuplicates();
|
candidates.removeDuplicates();
|
||||||
return candidates;
|
return candidates;
|
||||||
@ -360,6 +362,7 @@ QList<QString> JavaUtils::FindJavaPaths()
|
|||||||
javas.append(systemLibraryJVMDir.absolutePath() + "/" + java + "/Contents/Home/bin/java");
|
javas.append(systemLibraryJVMDir.absolutePath() + "/" + java + "/Contents/Home/bin/java");
|
||||||
javas.append(systemLibraryJVMDir.absolutePath() + "/" + java + "/Contents/Commands/java");
|
javas.append(systemLibraryJVMDir.absolutePath() + "/" + java + "/Contents/Commands/java");
|
||||||
}
|
}
|
||||||
|
javas.append(getMinecraftJavaBundle());
|
||||||
javas = addJavasFromEnv(javas);
|
javas = addJavasFromEnv(javas);
|
||||||
javas.removeDuplicates();
|
javas.removeDuplicates();
|
||||||
return javas;
|
return javas;
|
||||||
@ -411,6 +414,7 @@ QList<QString> JavaUtils::FindJavaPaths()
|
|||||||
// javas downloaded by sdkman
|
// javas downloaded by sdkman
|
||||||
scanJavaDirs(FS::PathCombine(home, ".sdkman/candidates/java"));
|
scanJavaDirs(FS::PathCombine(home, ".sdkman/candidates/java"));
|
||||||
|
|
||||||
|
javas.append(getMinecraftJavaBundle());
|
||||||
javas = addJavasFromEnv(javas);
|
javas = addJavasFromEnv(javas);
|
||||||
javas.removeDuplicates();
|
javas.removeDuplicates();
|
||||||
return javas;
|
return javas;
|
||||||
@ -423,6 +427,7 @@ QList<QString> JavaUtils::FindJavaPaths()
|
|||||||
QList<QString> javas;
|
QList<QString> javas;
|
||||||
javas.append(this->GetDefaultJava()->path);
|
javas.append(this->GetDefaultJava()->path);
|
||||||
|
|
||||||
|
javas.append(getMinecraftJavaBundle());
|
||||||
return addJavasFromEnv(javas);
|
return addJavasFromEnv(javas);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -431,3 +436,50 @@ QString JavaUtils::getJavaCheckPath()
|
|||||||
{
|
{
|
||||||
return APPLICATION->getJarPath("JavaCheck.jar");
|
return APPLICATION->getJarPath("JavaCheck.jar");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QStringList getMinecraftJavaBundle()
|
||||||
|
{
|
||||||
|
QString partialPath;
|
||||||
|
QString executable = "java";
|
||||||
|
QStringList processpaths;
|
||||||
|
#if defined(Q_OS_OSX)
|
||||||
|
partialPath = FS::PathCombine(QDir::homePath(), "Library/Application Support");
|
||||||
|
#elif defined(Q_OS_WIN32)
|
||||||
|
partialPath = QProcessEnvironment::systemEnvironment().value("LOCALAPPDATA", "");
|
||||||
|
executable += "w.exe";
|
||||||
|
|
||||||
|
// add the microsoft store version of the launcher to the search. the current path is:
|
||||||
|
// C:\Users\USERNAME\AppData\Local\Packages\Microsoft.4297127D64EC6_8wekyb3d8bbwe\LocalCache\Local\runtime
|
||||||
|
auto minecraftMSStorePath =
|
||||||
|
FS::PathCombine(QFileInfo(partialPath).absolutePath(), "Local", "Packages", "Microsoft.4297127D64EC6_8wekyb3d8bbwe");
|
||||||
|
minecraftMSStorePath = FS::PathCombine(minecraftMSStorePath, "LocalCache", "Local", "runtime");
|
||||||
|
processpaths << minecraftMSStorePath;
|
||||||
|
#else
|
||||||
|
partialPath = QDir::homePath();
|
||||||
|
#endif
|
||||||
|
auto minecraftDataPath = FS::PathCombine(partialPath, ".minecraft", "runtime");
|
||||||
|
processpaths << minecraftDataPath;
|
||||||
|
|
||||||
|
QStringList javas;
|
||||||
|
while (!processpaths.isEmpty()) {
|
||||||
|
auto dirPath = processpaths.takeFirst();
|
||||||
|
QDir dir(dirPath);
|
||||||
|
if (!dir.exists())
|
||||||
|
continue;
|
||||||
|
auto entries = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
|
||||||
|
auto binFound = false;
|
||||||
|
for (auto& entry : entries) {
|
||||||
|
if (entry.baseName() == "bin") {
|
||||||
|
javas.append(FS::PathCombine(entry.canonicalFilePath(), executable));
|
||||||
|
binFound = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!binFound) {
|
||||||
|
for (auto& entry : entries) {
|
||||||
|
processpaths << entry.canonicalFilePath();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return javas;
|
||||||
|
}
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
|
|
||||||
QString stripVariableEntries(QString name, QString target, QString remove);
|
QString stripVariableEntries(QString name, QString target, QString remove);
|
||||||
QProcessEnvironment CleanEnviroment();
|
QProcessEnvironment CleanEnviroment();
|
||||||
|
QStringList getMinecraftJavaBundle();
|
||||||
|
|
||||||
class JavaUtils : public QObject {
|
class JavaUtils : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
@ -565,6 +565,22 @@ QProcessEnvironment MinecraftInstance::createEnvironment()
|
|||||||
for (auto it = variables.begin(); it != variables.end(); ++it) {
|
for (auto it = variables.begin(); it != variables.end(); ++it) {
|
||||||
env.insert(it.key(), it.value());
|
env.insert(it.key(), it.value());
|
||||||
}
|
}
|
||||||
|
// custom env
|
||||||
|
|
||||||
|
auto insertEnv = [&env](QMap<QString, QVariant> envMap) {
|
||||||
|
if (envMap.isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (auto iter = envMap.begin(); iter != envMap.end(); iter++)
|
||||||
|
env.insert(iter.key(), iter.value().toString());
|
||||||
|
};
|
||||||
|
|
||||||
|
bool overrideEnv = settings()->get("OverrideEnv").toBool();
|
||||||
|
|
||||||
|
if (!overrideEnv)
|
||||||
|
insertEnv(APPLICATION->settings()->get("Env").toMap());
|
||||||
|
else
|
||||||
|
insertEnv(settings()->get("Env").toMap());
|
||||||
return env;
|
return env;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -575,15 +591,20 @@ QProcessEnvironment MinecraftInstance::createLaunchEnvironment()
|
|||||||
|
|
||||||
#ifdef Q_OS_LINUX
|
#ifdef Q_OS_LINUX
|
||||||
if (settings()->get("EnableMangoHud").toBool() && APPLICATION->capabilities() & Application::SupportsMangoHud) {
|
if (settings()->get("EnableMangoHud").toBool() && APPLICATION->capabilities() & Application::SupportsMangoHud) {
|
||||||
auto preloadList = env.value("LD_PRELOAD").split(QLatin1String(":"));
|
QStringList preloadList;
|
||||||
auto libPaths = env.value("LD_LIBRARY_PATH").split(QLatin1String(":"));
|
if (auto value = env.value("LD_PRELOAD"); !value.isEmpty())
|
||||||
|
preloadList = value.split(QLatin1String(":"));
|
||||||
|
QStringList libPaths;
|
||||||
|
if (auto value = env.value("LD_LIBRARY_PATH"); !value.isEmpty())
|
||||||
|
libPaths = value.split(QLatin1String(":"));
|
||||||
|
|
||||||
auto mangoHudLibString = MangoHud::getLibraryString();
|
auto mangoHudLibString = MangoHud::getLibraryString();
|
||||||
if (!mangoHudLibString.isEmpty()) {
|
if (!mangoHudLibString.isEmpty()) {
|
||||||
QFileInfo mangoHudLib(mangoHudLibString);
|
QFileInfo mangoHudLib(mangoHudLibString);
|
||||||
|
|
||||||
// dlsym variant is only needed for OpenGL and not included in the vulkan layer
|
// dlsym variant is only needed for OpenGL and not included in the vulkan layer
|
||||||
preloadList << "libMangoHud_dlsym.so" << mangoHudLib.fileName();
|
preloadList << "libMangoHud_dlsym.so"
|
||||||
|
<< "libMangoHud_opengl.so" << mangoHudLib.fileName();
|
||||||
libPaths << mangoHudLib.absolutePath();
|
libPaths << mangoHudLib.absolutePath();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -601,24 +622,6 @@ QProcessEnvironment MinecraftInstance::createLaunchEnvironment()
|
|||||||
env.insert("__GLX_VENDOR_LIBRARY_NAME", "nvidia");
|
env.insert("__GLX_VENDOR_LIBRARY_NAME", "nvidia");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// custom env
|
|
||||||
|
|
||||||
auto insertEnv = [&env](QMap<QString, QVariant> envMap) {
|
|
||||||
if (envMap.isEmpty())
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (auto iter = envMap.begin(); iter != envMap.end(); iter++)
|
|
||||||
env.insert(iter.key(), iter.value().toString());
|
|
||||||
};
|
|
||||||
|
|
||||||
bool overrideEnv = settings()->get("OverrideEnv").toBool();
|
|
||||||
|
|
||||||
if (!overrideEnv)
|
|
||||||
insertEnv(APPLICATION->settings()->get("Env").toMap());
|
|
||||||
else
|
|
||||||
insertEnv(settings()->get("Env").toMap());
|
|
||||||
|
|
||||||
return env;
|
return env;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,9 +37,9 @@
|
|||||||
#include "ModFolderModel.h"
|
#include "ModFolderModel.h"
|
||||||
|
|
||||||
#include <FileSystem.h>
|
#include <FileSystem.h>
|
||||||
#include <qheaderview.h>
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QFileSystemWatcher>
|
#include <QFileSystemWatcher>
|
||||||
|
#include <QHeaderView>
|
||||||
#include <QIcon>
|
#include <QIcon>
|
||||||
#include <QMimeData>
|
#include <QMimeData>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
@ -65,8 +65,8 @@ ModFolderModel::ModFolderModel(const QString& dir, BaseInstance* instance, bool
|
|||||||
m_column_names = QStringList({ "Enable", "Image", "Name", "Version", "Last Modified", "Provider" });
|
m_column_names = QStringList({ "Enable", "Image", "Name", "Version", "Last Modified", "Provider" });
|
||||||
m_column_names_translated = QStringList({ tr("Enable"), tr("Image"), tr("Name"), tr("Version"), tr("Last Modified"), tr("Provider") });
|
m_column_names_translated = QStringList({ tr("Enable"), tr("Image"), tr("Name"), tr("Version"), tr("Last Modified"), tr("Provider") });
|
||||||
m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::NAME, SortType::VERSION, SortType::DATE, SortType::PROVIDER };
|
m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::NAME, SortType::VERSION, SortType::DATE, SortType::PROVIDER };
|
||||||
m_column_resize_modes = { QHeaderView::ResizeToContents, QHeaderView::Interactive, QHeaderView::Stretch,
|
m_column_resize_modes = { QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Stretch,
|
||||||
QHeaderView::ResizeToContents, QHeaderView::ResizeToContents, QHeaderView::ResizeToContents };
|
QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Interactive };
|
||||||
m_columnsHideable = { false, true, false, true, true, true };
|
m_columnsHideable = { false, true, false, true, true, true };
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -131,6 +131,11 @@ QVariant ModFolderModel::data(const QModelIndex& index, int role) const
|
|||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
case Qt::SizeHintRole:
|
||||||
|
if (column == ImageColumn) {
|
||||||
|
return QSize(32, 32);
|
||||||
|
}
|
||||||
|
return {};
|
||||||
case Qt::CheckStateRole:
|
case Qt::CheckStateRole:
|
||||||
switch (column) {
|
switch (column) {
|
||||||
case ActiveColumn:
|
case ActiveColumn:
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
|
#include <QHeaderView>
|
||||||
#include <QIcon>
|
#include <QIcon>
|
||||||
#include <QMenu>
|
#include <QMenu>
|
||||||
#include <QMimeData>
|
#include <QMimeData>
|
||||||
@ -516,36 +517,22 @@ void ResourceFolderModel::setupHeaderAction(QAction* act, int column)
|
|||||||
act->setText(columnNames().at(column));
|
act->setText(columnNames().at(column));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResourceFolderModel::saveHiddenColumn(int column, bool hidden)
|
void ResourceFolderModel::saveColumns(QTreeView* tree)
|
||||||
{
|
{
|
||||||
auto const setting_name = QString("UI/%1_Page/HiddenColumns").arg(id());
|
auto const setting_name = QString("UI/%1_Page/Columns").arg(id());
|
||||||
auto setting = (m_instance->settings()->contains(setting_name)) ? m_instance->settings()->getSetting(setting_name)
|
auto setting = (m_instance->settings()->contains(setting_name)) ? m_instance->settings()->getSetting(setting_name)
|
||||||
: m_instance->settings()->registerSetting(setting_name);
|
: m_instance->settings()->registerSetting(setting_name);
|
||||||
|
|
||||||
auto hiddenColumns = setting->get().toStringList();
|
setting->set(tree->header()->saveState());
|
||||||
auto name = columnNames(false).at(column);
|
|
||||||
auto index = hiddenColumns.indexOf(name);
|
|
||||||
if (index >= 0 && !hidden) {
|
|
||||||
hiddenColumns.removeAt(index);
|
|
||||||
} else if (index < 0 && hidden) {
|
|
||||||
hiddenColumns.append(name);
|
|
||||||
}
|
|
||||||
setting->set(hiddenColumns);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResourceFolderModel::loadHiddenColumns(QTreeView* tree)
|
void ResourceFolderModel::loadColumns(QTreeView* tree)
|
||||||
{
|
{
|
||||||
auto const setting_name = QString("UI/%1_Page/HiddenColumns").arg(id());
|
auto const setting_name = QString("UI/%1_Page/Columns").arg(id());
|
||||||
auto setting = (m_instance->settings()->contains(setting_name)) ? m_instance->settings()->getSetting(setting_name)
|
auto setting = (m_instance->settings()->contains(setting_name)) ? m_instance->settings()->getSetting(setting_name)
|
||||||
: m_instance->settings()->registerSetting(setting_name);
|
: m_instance->settings()->registerSetting(setting_name);
|
||||||
|
|
||||||
auto hiddenColumns = setting->get().toStringList();
|
tree->header()->restoreState(setting->get().toByteArray());
|
||||||
auto col_names = columnNames(false);
|
|
||||||
for (auto col_name : hiddenColumns) {
|
|
||||||
auto index = col_names.indexOf(col_name);
|
|
||||||
if (index >= 0)
|
|
||||||
tree->setColumnHidden(index, true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QMenu* ResourceFolderModel::createHeaderContextMenu(QTreeView* tree)
|
QMenu* ResourceFolderModel::createHeaderContextMenu(QTreeView* tree)
|
||||||
@ -570,7 +557,7 @@ QMenu* ResourceFolderModel::createHeaderContextMenu(QTreeView* tree)
|
|||||||
if (m_column_resize_modes.at(c) == QHeaderView::ResizeToContents)
|
if (m_column_resize_modes.at(c) == QHeaderView::ResizeToContents)
|
||||||
tree->resizeColumnToContents(c);
|
tree->resizeColumnToContents(c);
|
||||||
}
|
}
|
||||||
saveHiddenColumn(col, !toggled);
|
saveColumns(tree);
|
||||||
});
|
});
|
||||||
|
|
||||||
menu->addAction(act);
|
menu->addAction(act);
|
||||||
|
@ -117,8 +117,8 @@ class ResourceFolderModel : public QAbstractListModel {
|
|||||||
[[nodiscard]] QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
|
[[nodiscard]] QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
|
||||||
|
|
||||||
void setupHeaderAction(QAction* act, int column);
|
void setupHeaderAction(QAction* act, int column);
|
||||||
void saveHiddenColumn(int column, bool hidden);
|
void saveColumns(QTreeView* tree);
|
||||||
void loadHiddenColumns(QTreeView* tree);
|
void loadColumns(QTreeView* tree);
|
||||||
QMenu* createHeaderContextMenu(QTreeView* tree);
|
QMenu* createHeaderContextMenu(QTreeView* tree);
|
||||||
|
|
||||||
/** This creates a proxy model to filter / sort the model for a UI.
|
/** This creates a proxy model to filter / sort the model for a UI.
|
||||||
@ -201,8 +201,7 @@ class ResourceFolderModel : public QAbstractListModel {
|
|||||||
QList<SortType> m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::DATE };
|
QList<SortType> m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::DATE };
|
||||||
QStringList m_column_names = { "Enable", "Name", "Last Modified" };
|
QStringList m_column_names = { "Enable", "Name", "Last Modified" };
|
||||||
QStringList m_column_names_translated = { tr("Enable"), tr("Name"), tr("Last Modified") };
|
QStringList m_column_names_translated = { tr("Enable"), tr("Name"), tr("Last Modified") };
|
||||||
QList<QHeaderView::ResizeMode> m_column_resize_modes = { QHeaderView::ResizeToContents, QHeaderView::Stretch,
|
QList<QHeaderView::ResizeMode> m_column_resize_modes = { QHeaderView::Interactive, QHeaderView::Stretch, QHeaderView::Interactive };
|
||||||
QHeaderView::ResizeToContents };
|
|
||||||
QList<bool> m_columnsHideable = { false, false, true };
|
QList<bool> m_columnsHideable = { false, false, true };
|
||||||
|
|
||||||
QDir m_dir;
|
QDir m_dir;
|
||||||
|
@ -52,8 +52,8 @@ ResourcePackFolderModel::ResourcePackFolderModel(const QString& dir, BaseInstanc
|
|||||||
m_column_names = QStringList({ "Enable", "Image", "Name", "Pack Format", "Last Modified" });
|
m_column_names = QStringList({ "Enable", "Image", "Name", "Pack Format", "Last Modified" });
|
||||||
m_column_names_translated = QStringList({ tr("Enable"), tr("Image"), tr("Name"), tr("Pack Format"), tr("Last Modified") });
|
m_column_names_translated = QStringList({ tr("Enable"), tr("Image"), tr("Name"), tr("Pack Format"), tr("Last Modified") });
|
||||||
m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::NAME, SortType::PACK_FORMAT, SortType::DATE };
|
m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::NAME, SortType::PACK_FORMAT, SortType::DATE };
|
||||||
m_column_resize_modes = { QHeaderView::ResizeToContents, QHeaderView::Interactive, QHeaderView::Stretch, QHeaderView::ResizeToContents,
|
m_column_resize_modes = { QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Stretch, QHeaderView::Interactive,
|
||||||
QHeaderView::ResizeToContents };
|
QHeaderView::Interactive };
|
||||||
m_columnsHideable = { false, true, false, true, true };
|
m_columnsHideable = { false, true, false, true, true };
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,6 +117,11 @@ QVariant ResourcePackFolderModel::data(const QModelIndex& index, int role) const
|
|||||||
}
|
}
|
||||||
return m_resources[row]->internal_id();
|
return m_resources[row]->internal_id();
|
||||||
}
|
}
|
||||||
|
case Qt::SizeHintRole:
|
||||||
|
if (column == ImageColumn) {
|
||||||
|
return QSize(32, 32);
|
||||||
|
}
|
||||||
|
return {};
|
||||||
case Qt::CheckStateRole:
|
case Qt::CheckStateRole:
|
||||||
switch (column) {
|
switch (column) {
|
||||||
case ActiveColumn:
|
case ActiveColumn:
|
||||||
|
@ -47,8 +47,7 @@ TexturePackFolderModel::TexturePackFolderModel(const QString& dir, BaseInstance*
|
|||||||
m_column_names = QStringList({ "Enable", "Image", "Name", "Last Modified" });
|
m_column_names = QStringList({ "Enable", "Image", "Name", "Last Modified" });
|
||||||
m_column_names_translated = QStringList({ tr("Enable"), tr("Image"), tr("Name"), tr("Last Modified") });
|
m_column_names_translated = QStringList({ tr("Enable"), tr("Image"), tr("Name"), tr("Last Modified") });
|
||||||
m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::NAME, SortType::DATE };
|
m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::NAME, SortType::DATE };
|
||||||
m_column_resize_modes = { QHeaderView::ResizeToContents, QHeaderView::Interactive, QHeaderView::Stretch,
|
m_column_resize_modes = { QHeaderView::Interactive, QHeaderView::Interactive, QHeaderView::Stretch, QHeaderView::Interactive };
|
||||||
QHeaderView::ResizeToContents };
|
|
||||||
m_columnsHideable = { false, true, false, true };
|
m_columnsHideable = { false, true, false, true };
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -104,6 +103,11 @@ QVariant TexturePackFolderModel::data(const QModelIndex& index, int role) const
|
|||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
case Qt::SizeHintRole:
|
||||||
|
if (column == ImageColumn) {
|
||||||
|
return QSize(32, 32);
|
||||||
|
}
|
||||||
|
return {};
|
||||||
case Qt::CheckStateRole:
|
case Qt::CheckStateRole:
|
||||||
if (column == ActiveColumn) {
|
if (column == ActiveColumn) {
|
||||||
return m_resources[row]->enabled() ? Qt::Checked : Qt::Unchecked;
|
return m_resources[row]->enabled() ? Qt::Checked : Qt::Unchecked;
|
||||||
|
@ -208,17 +208,15 @@ Task::Ptr FlameAPI::getFile(const QString& addonId, const QString& fileId, std::
|
|||||||
return netJob;
|
return netJob;
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://docs.curseforge.com/?python#tocS_ModsSearchSortField
|
|
||||||
static QList<ResourceAPI::SortingMethod> s_sorts = { { 1, "Featured", QObject::tr("Sort by Featured") },
|
|
||||||
{ 2, "Popularity", QObject::tr("Sort by Popularity") },
|
|
||||||
{ 3, "LastUpdated", QObject::tr("Sort by Last Updated") },
|
|
||||||
{ 4, "Name", QObject::tr("Sort by Name") },
|
|
||||||
{ 5, "Author", QObject::tr("Sort by Author") },
|
|
||||||
{ 6, "TotalDownloads", QObject::tr("Sort by Downloads") },
|
|
||||||
{ 7, "Category", QObject::tr("Sort by Category") },
|
|
||||||
{ 8, "GameVersion", QObject::tr("Sort by Game Version") } };
|
|
||||||
|
|
||||||
QList<ResourceAPI::SortingMethod> FlameAPI::getSortingMethods() const
|
QList<ResourceAPI::SortingMethod> FlameAPI::getSortingMethods() const
|
||||||
{
|
{
|
||||||
return s_sorts;
|
// https://docs.curseforge.com/?python#tocS_ModsSearchSortField
|
||||||
|
return { { 1, "Featured", QObject::tr("Sort by Featured") },
|
||||||
|
{ 2, "Popularity", QObject::tr("Sort by Popularity") },
|
||||||
|
{ 3, "LastUpdated", QObject::tr("Sort by Last Updated") },
|
||||||
|
{ 4, "Name", QObject::tr("Sort by Name") },
|
||||||
|
{ 5, "Author", QObject::tr("Sort by Author") },
|
||||||
|
{ 6, "TotalDownloads", QObject::tr("Sort by Downloads") },
|
||||||
|
{ 7, "Category", QObject::tr("Sort by Category") },
|
||||||
|
{ 8, "GameVersion", QObject::tr("Sort by Game Version") } };
|
||||||
}
|
}
|
||||||
|
@ -111,14 +111,12 @@ Task::Ptr ModrinthAPI::getProjects(QStringList addonIds, std::shared_ptr<QByteAr
|
|||||||
return netJob;
|
return netJob;
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://docs.modrinth.com/api-spec/#tag/projects/operation/searchProjects
|
|
||||||
static QList<ResourceAPI::SortingMethod> s_sorts = { { 1, "relevance", QObject::tr("Sort by Relevance") },
|
|
||||||
{ 2, "downloads", QObject::tr("Sort by Downloads") },
|
|
||||||
{ 3, "follows", QObject::tr("Sort by Follows") },
|
|
||||||
{ 4, "newest", QObject::tr("Sort by Last Updated") },
|
|
||||||
{ 5, "updated", QObject::tr("Sort by Newest") } };
|
|
||||||
|
|
||||||
QList<ResourceAPI::SortingMethod> ModrinthAPI::getSortingMethods() const
|
QList<ResourceAPI::SortingMethod> ModrinthAPI::getSortingMethods() const
|
||||||
{
|
{
|
||||||
return s_sorts;
|
// https://docs.modrinth.com/api-spec/#tag/projects/operation/searchProjects
|
||||||
|
return { { 1, "relevance", QObject::tr("Sort by Relevance") },
|
||||||
|
{ 2, "downloads", QObject::tr("Sort by Downloads") },
|
||||||
|
{ 3, "follows", QObject::tr("Sort by Follows") },
|
||||||
|
{ 4, "newest", QObject::tr("Sort by Newest") },
|
||||||
|
{ 5, "updated", QObject::tr("Sort by Last Updated") } };
|
||||||
}
|
}
|
||||||
|
@ -1198,17 +1198,27 @@ void MainWindow::on_actionViewCentralModsFolder_triggered()
|
|||||||
|
|
||||||
void MainWindow::on_actionViewIconThemeFolder_triggered()
|
void MainWindow::on_actionViewIconThemeFolder_triggered()
|
||||||
{
|
{
|
||||||
DesktopServices::openDirectory(APPLICATION->themeManager()->getIconThemesFolder().path());
|
DesktopServices::openDirectory(APPLICATION->themeManager()->getIconThemesFolder().path(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_actionViewWidgetThemeFolder_triggered()
|
void MainWindow::on_actionViewWidgetThemeFolder_triggered()
|
||||||
{
|
{
|
||||||
DesktopServices::openDirectory(APPLICATION->themeManager()->getApplicationThemesFolder().path());
|
DesktopServices::openDirectory(APPLICATION->themeManager()->getApplicationThemesFolder().path(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_actionViewCatPackFolder_triggered()
|
void MainWindow::on_actionViewCatPackFolder_triggered()
|
||||||
{
|
{
|
||||||
DesktopServices::openDirectory(APPLICATION->themeManager()->getCatPacksFolder().path());
|
DesktopServices::openDirectory(APPLICATION->themeManager()->getCatPacksFolder().path(), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_actionViewIconsFolder_triggered()
|
||||||
|
{
|
||||||
|
DesktopServices::openDirectory(APPLICATION->icons()->getDirectory(), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_actionViewLogsFolder_triggered()
|
||||||
|
{
|
||||||
|
DesktopServices::openDirectory("logs", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::refreshInstances()
|
void MainWindow::refreshInstances()
|
||||||
|
@ -117,6 +117,8 @@ class MainWindow : public QMainWindow {
|
|||||||
void on_actionViewIconThemeFolder_triggered();
|
void on_actionViewIconThemeFolder_triggered();
|
||||||
void on_actionViewWidgetThemeFolder_triggered();
|
void on_actionViewWidgetThemeFolder_triggered();
|
||||||
void on_actionViewCatPackFolder_triggered();
|
void on_actionViewCatPackFolder_triggered();
|
||||||
|
void on_actionViewIconsFolder_triggered();
|
||||||
|
void on_actionViewLogsFolder_triggered();
|
||||||
|
|
||||||
void on_actionViewSelectedInstFolder_triggered();
|
void on_actionViewSelectedInstFolder_triggered();
|
||||||
|
|
||||||
|
@ -194,6 +194,9 @@
|
|||||||
<addaction name="actionViewIconThemeFolder"/>
|
<addaction name="actionViewIconThemeFolder"/>
|
||||||
<addaction name="actionViewWidgetThemeFolder"/>
|
<addaction name="actionViewWidgetThemeFolder"/>
|
||||||
<addaction name="actionViewCatPackFolder"/>
|
<addaction name="actionViewCatPackFolder"/>
|
||||||
|
<addaction name="actionViewIconsFolder"/>
|
||||||
|
<addaction name="separator"/>
|
||||||
|
<addaction name="actionViewLogsFolder"/>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenu" name="accountsMenu">
|
<widget class="QMenu" name="accountsMenu">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
@ -545,10 +548,10 @@
|
|||||||
<normaloff>.</normaloff>.</iconset>
|
<normaloff>.</normaloff>.</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>View &Instance Folder</string>
|
<string>&Instances</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Open the instance folder in a file browser.</string>
|
<string>Open the instances folder in a file browser.</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionViewLauncherRootFolder">
|
<action name="actionViewLauncherRootFolder">
|
||||||
@ -557,7 +560,7 @@
|
|||||||
<normaloff>.</normaloff>.</iconset>
|
<normaloff>.</normaloff>.</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>View Launcher &Root Folder</string>
|
<string>Launcher &Root</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Open the launcher's root folder in a file browser.</string>
|
<string>Open the launcher's root folder in a file browser.</string>
|
||||||
@ -569,12 +572,36 @@
|
|||||||
<normaloff>.</normaloff>.</iconset>
|
<normaloff>.</normaloff>.</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>View &Central Mods Folder</string>
|
<string>&Central Mods</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Open the central mods folder in a file browser.</string>
|
<string>Open the central mods folder in a file browser.</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="actionViewIconsFolder">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset theme="viewfolder">
|
||||||
|
<normaloff>.</normaloff>.</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Instance Icons</string>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Open the instance icons folder in a file browser.</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionViewLogsFolder">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset theme="viewfolder">
|
||||||
|
<normaloff>.</normaloff>.</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Logs</string>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Open the logs folder in a file browser.</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
<action name="actionChangeTheme">
|
<action name="actionChangeTheme">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Themes</string>
|
<string>Themes</string>
|
||||||
@ -718,10 +745,10 @@
|
|||||||
<normaloff>.</normaloff>.</iconset>
|
<normaloff>.</normaloff>.</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>View &Widget Themes Folder</string>
|
<string>&Widget Themes</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>View Widget Theme Folder</string>
|
<string>Open the widget themes folder in a file browser.</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionViewIconThemeFolder">
|
<action name="actionViewIconThemeFolder">
|
||||||
@ -730,18 +757,22 @@
|
|||||||
<normaloff>.</normaloff>.</iconset>
|
<normaloff>.</normaloff>.</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>View I&con Theme Folder</string>
|
<string>I&con Theme</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>View Icon Theme Folder</string>
|
<string>Open the icon theme folder in a file browser.</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionViewCatPackFolder">
|
<action name="actionViewCatPackFolder">
|
||||||
<property name="icon">
|
<property name="icon">
|
||||||
<iconset theme="viewfolder"/>
|
<iconset theme="viewfolder">
|
||||||
|
<normaloff>.</normaloff>.</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>View Cat Packs Folder</string>
|
<string>Cat Packs</string>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Open the cat packs folder in a file browser.</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
|
@ -101,7 +101,7 @@ QString getCreditsHtml()
|
|||||||
stream << "<h3>" << QObject::tr("With thanks to", "About Credits") << "</h3>\n";
|
stream << "<h3>" << QObject::tr("With thanks to", "About Credits") << "</h3>\n";
|
||||||
stream << QString("<p>Boba %1</p>\n").arg(getWebsite("https://bobaonline.neocities.org/"));
|
stream << QString("<p>Boba %1</p>\n").arg(getWebsite("https://bobaonline.neocities.org/"));
|
||||||
stream << QString("<p>Davi Rafael %1</p>\n").arg(getWebsite("https://auti.one/"));
|
stream << QString("<p>Davi Rafael %1</p>\n").arg(getWebsite("https://auti.one/"));
|
||||||
stream << QString("<p>Fulmine %1</p>\n").arg(getWebsite("https://www.fulmine.xyz/"));
|
stream << QString("<p>Fulmine %1</p>\n").arg(getWebsite("https://fulmine.xyz/"));
|
||||||
stream << QString("<p>ely %1</p>\n").arg(getGitHub("elyrodso"));
|
stream << QString("<p>ely %1</p>\n").arg(getGitHub("elyrodso"));
|
||||||
stream << QString("<p>gon sawa %1</p>\n").arg(getGitHub("gonsawa"));
|
stream << QString("<p>gon sawa %1</p>\n").arg(getGitHub("gonsawa"));
|
||||||
stream << QString("<p>Pankakes</p>\n");
|
stream << QString("<p>Pankakes</p>\n");
|
||||||
|
@ -13,7 +13,6 @@ enum class ResourceProvider;
|
|||||||
|
|
||||||
class Mod;
|
class Mod;
|
||||||
class NetJob;
|
class NetJob;
|
||||||
class ModUpdateDialog;
|
|
||||||
|
|
||||||
class ChooseProviderDialog : public QDialog {
|
class ChooseProviderDialog : public QDialog {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
@ -214,10 +214,11 @@ void ExportToModListDialog::addExtra(ExportToModList::OptionalData option)
|
|||||||
void ExportToModListDialog::enableCustom(bool enabled)
|
void ExportToModListDialog::enableCustom(bool enabled)
|
||||||
{
|
{
|
||||||
ui->authorsCheckBox->setHidden(enabled);
|
ui->authorsCheckBox->setHidden(enabled);
|
||||||
ui->versionCheckBox->setHidden(enabled);
|
|
||||||
ui->urlCheckBox->setHidden(enabled);
|
|
||||||
|
|
||||||
ui->authorsButton->setHidden(!enabled);
|
ui->authorsButton->setHidden(!enabled);
|
||||||
|
|
||||||
|
ui->versionCheckBox->setHidden(enabled);
|
||||||
ui->versionButton->setHidden(!enabled);
|
ui->versionButton->setHidden(!enabled);
|
||||||
|
|
||||||
|
ui->urlCheckBox->setHidden(enabled);
|
||||||
ui->urlButton->setHidden(!enabled);
|
ui->urlButton->setHidden(!enabled);
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>650</width>
|
<width>650</width>
|
||||||
<height>446</height>
|
<height>522</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
@ -61,18 +61,37 @@
|
|||||||
</item>
|
</item>
|
||||||
<item row="1" column="0">
|
<item row="1" column="0">
|
||||||
<widget class="QGroupBox" name="templateGroup">
|
<widget class="QGroupBox" name="templateGroup">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Template</string>
|
<string>Template</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QTextEdit" name="templateText"/>
|
<widget class="QTextEdit" name="templateText">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Maximum">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="1">
|
<item row="1" column="1">
|
||||||
<widget class="QGroupBox" name="optionsGroup">
|
<widget class="QGroupBox" name="optionsGroup">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Optional Info</string>
|
<string>Optional Info</string>
|
||||||
</property>
|
</property>
|
||||||
|
@ -105,8 +105,16 @@ void MSALoginDialog::showVerificationUriAndCode(const QUrl& uri, const QString&
|
|||||||
|
|
||||||
QString urlString = uri.toString();
|
QString urlString = uri.toString();
|
||||||
QString linkString = QString("<a href=\"%1\">%2</a>").arg(urlString, urlString);
|
QString linkString = QString("<a href=\"%1\">%2</a>").arg(urlString, urlString);
|
||||||
ui->label->setText(
|
if (urlString == "https://www.microsoft.com/link" && !code.isEmpty()) {
|
||||||
tr("<p>Please open up %1 in a browser and put in the code <b>%2</b> to proceed with login.</p>").arg(linkString, code));
|
urlString += QString("?otc=%1").arg(code);
|
||||||
|
DesktopServices::openUrl(urlString);
|
||||||
|
ui->label->setText(tr("<p>Please login in the opened browser. If no browser was opened, please open up %1 in "
|
||||||
|
"a browser and put in the code <b>%2</b> to proceed with login.</p>")
|
||||||
|
.arg(linkString, code));
|
||||||
|
} else {
|
||||||
|
ui->label->setText(
|
||||||
|
tr("<p>Please open up %1 in a browser and put in the code <b>%2</b> to proceed with login.</p>").arg(linkString, code));
|
||||||
|
}
|
||||||
ui->actionButton->setVisible(true);
|
ui->actionButton->setVisible(true);
|
||||||
connect(ui->actionButton, &QPushButton::clicked, [=]() {
|
connect(ui->actionButton, &QPushButton::clicked, [=]() {
|
||||||
DesktopServices::openUrl(uri);
|
DesktopServices::openUrl(uri);
|
||||||
|
@ -39,7 +39,8 @@ static std::optional<ModPlatform::ModLoaderTypes> mcLoaders(BaseInstance* inst)
|
|||||||
ModUpdateDialog::ModUpdateDialog(QWidget* parent,
|
ModUpdateDialog::ModUpdateDialog(QWidget* parent,
|
||||||
BaseInstance* instance,
|
BaseInstance* instance,
|
||||||
const std::shared_ptr<ModFolderModel> mods,
|
const std::shared_ptr<ModFolderModel> mods,
|
||||||
QList<Mod*>& search_for)
|
QList<Mod*>& search_for,
|
||||||
|
bool includeDeps)
|
||||||
: ReviewMessageBox(parent, tr("Confirm mods to update"), "")
|
: ReviewMessageBox(parent, tr("Confirm mods to update"), "")
|
||||||
, m_parent(parent)
|
, m_parent(parent)
|
||||||
, m_mod_model(mods)
|
, m_mod_model(mods)
|
||||||
@ -47,6 +48,7 @@ ModUpdateDialog::ModUpdateDialog(QWidget* parent,
|
|||||||
, m_second_try_metadata(
|
, m_second_try_metadata(
|
||||||
new ConcurrentTask(nullptr, "Second Metadata Search", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt()))
|
new ConcurrentTask(nullptr, "Second Metadata Search", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt()))
|
||||||
, m_instance(instance)
|
, m_instance(instance)
|
||||||
|
, m_include_deps(includeDeps)
|
||||||
{
|
{
|
||||||
ReviewMessageBox::setGeometry(0, 0, 800, 600);
|
ReviewMessageBox::setGeometry(0, 0, 800, 600);
|
||||||
|
|
||||||
@ -186,7 +188,7 @@ void ModUpdateDialog::checkCandidates()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{ // dependencies
|
if (m_include_deps && !APPLICATION->settings()->get("ModDependenciesDisabled").toBool()) { // dependencies
|
||||||
auto depTask = makeShared<GetModDependenciesTask>(this, m_instance, m_mod_model.get(), selectedVers);
|
auto depTask = makeShared<GetModDependenciesTask>(this, m_instance, m_mod_model.get(), selectedVers);
|
||||||
|
|
||||||
connect(depTask.get(), &Task::failed, this,
|
connect(depTask.get(), &Task::failed, this,
|
||||||
|
@ -17,6 +17,11 @@ class ModUpdateDialog final : public ReviewMessageBox {
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit ModUpdateDialog(QWidget* parent, BaseInstance* instance, std::shared_ptr<ModFolderModel> mod_model, QList<Mod*>& search_for);
|
explicit ModUpdateDialog(QWidget* parent, BaseInstance* instance, std::shared_ptr<ModFolderModel> mod_model, QList<Mod*>& search_for);
|
||||||
|
explicit ModUpdateDialog(QWidget* parent,
|
||||||
|
BaseInstance* instance,
|
||||||
|
std::shared_ptr<ModFolderModel> mod_model,
|
||||||
|
QList<Mod*>& search_for,
|
||||||
|
bool includeDeps);
|
||||||
|
|
||||||
void checkCandidates();
|
void checkCandidates();
|
||||||
|
|
||||||
@ -58,4 +63,5 @@ class ModUpdateDialog final : public ReviewMessageBox {
|
|||||||
|
|
||||||
bool m_no_updates = false;
|
bool m_no_updates = false;
|
||||||
bool m_aborted = false;
|
bool m_aborted = false;
|
||||||
|
bool m_include_deps = false;
|
||||||
};
|
};
|
||||||
|
@ -270,13 +270,15 @@ QList<BasePage*> ModDownloadDialog::getPages()
|
|||||||
|
|
||||||
GetModDependenciesTask::Ptr ModDownloadDialog::getModDependenciesTask()
|
GetModDependenciesTask::Ptr ModDownloadDialog::getModDependenciesTask()
|
||||||
{
|
{
|
||||||
if (auto model = dynamic_cast<ModFolderModel*>(getBaseModel().get()); model) {
|
if (!APPLICATION->settings()->get("ModDependenciesDisabled").toBool()) { // dependencies
|
||||||
QList<std::shared_ptr<GetModDependenciesTask::PackDependency>> selectedVers;
|
if (auto model = dynamic_cast<ModFolderModel*>(getBaseModel().get()); model) {
|
||||||
for (auto& selected : getTasks()) {
|
QList<std::shared_ptr<GetModDependenciesTask::PackDependency>> selectedVers;
|
||||||
selectedVers.append(std::make_shared<GetModDependenciesTask::PackDependency>(selected->getPack(), selected->getVersion()));
|
for (auto& selected : getTasks()) {
|
||||||
}
|
selectedVers.append(std::make_shared<GetModDependenciesTask::PackDependency>(selected->getPack(), selected->getVersion()));
|
||||||
|
}
|
||||||
|
|
||||||
return makeShared<GetModDependenciesTask>(this, m_instance, model, selectedVers);
|
return makeShared<GetModDependenciesTask>(this, m_instance, model, selectedVers);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
@ -278,12 +278,14 @@ void InstanceView::mousePressEvent(QMouseEvent* event)
|
|||||||
m_pressedAlreadySelected = selectionModel()->isSelected(m_pressedIndex);
|
m_pressedAlreadySelected = selectionModel()->isSelected(m_pressedIndex);
|
||||||
m_pressedPosition = geometryPos;
|
m_pressedPosition = geometryPos;
|
||||||
|
|
||||||
VisualGroup::HitResults hitResult;
|
if (event->button() == Qt::LeftButton) {
|
||||||
m_pressedCategory = categoryAt(geometryPos, hitResult);
|
VisualGroup::HitResults hitResult;
|
||||||
if (m_pressedCategory && hitResult & VisualGroup::CheckboxHit) {
|
m_pressedCategory = categoryAt(geometryPos, hitResult);
|
||||||
setState(m_pressedCategory->collapsed ? ExpandingState : CollapsingState);
|
if (m_pressedCategory && hitResult & VisualGroup::CheckboxHit) {
|
||||||
event->accept();
|
setState(m_pressedCategory->collapsed ? ExpandingState : CollapsingState);
|
||||||
return;
|
event->accept();
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (index.isValid() && (index.flags() & Qt::ItemIsEnabled)) {
|
if (index.isValid() && (index.flags() & Qt::ItemIsEnabled)) {
|
||||||
@ -366,10 +368,7 @@ void InstanceView::mouseReleaseEvent(QMouseEvent* event)
|
|||||||
|
|
||||||
VisualGroup::HitResults hitResult;
|
VisualGroup::HitResults hitResult;
|
||||||
|
|
||||||
bool click =
|
if (event->button() == Qt::LeftButton && m_pressedCategory != nullptr && m_pressedCategory == categoryAt(geometryPos, hitResult)) {
|
||||||
(index == m_pressedIndex && index.isValid()) || (m_pressedCategory && m_pressedCategory == categoryAt(geometryPos, hitResult));
|
|
||||||
|
|
||||||
if (click && m_pressedCategory) {
|
|
||||||
if (state() == ExpandingState) {
|
if (state() == ExpandingState) {
|
||||||
m_pressedCategory->collapsed = false;
|
m_pressedCategory->collapsed = false;
|
||||||
emit groupStateChanged(m_pressedCategory->text, false);
|
emit groupStateChanged(m_pressedCategory->text, false);
|
||||||
@ -397,7 +396,7 @@ void InstanceView::mouseReleaseEvent(QMouseEvent* event)
|
|||||||
|
|
||||||
setState(NoState);
|
setState(NoState);
|
||||||
|
|
||||||
if (click) {
|
if (index == m_pressedIndex && index.isValid()) {
|
||||||
if (event->button() == Qt::LeftButton) {
|
if (event->button() == Qt::LeftButton) {
|
||||||
emit clicked(index);
|
emit clicked(index);
|
||||||
}
|
}
|
||||||
|
@ -42,22 +42,17 @@
|
|||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
|
||||||
#include "net/NetJob.h"
|
|
||||||
|
|
||||||
#include "ui/dialogs/CustomMessageBox.h"
|
#include "ui/dialogs/CustomMessageBox.h"
|
||||||
#include "ui/dialogs/MSALoginDialog.h"
|
#include "ui/dialogs/MSALoginDialog.h"
|
||||||
#include "ui/dialogs/OfflineLoginDialog.h"
|
#include "ui/dialogs/OfflineLoginDialog.h"
|
||||||
#include "ui/dialogs/ProgressDialog.h"
|
#include "ui/dialogs/ProgressDialog.h"
|
||||||
#include "ui/dialogs/SkinUploadDialog.h"
|
#include "ui/dialogs/SkinUploadDialog.h"
|
||||||
|
|
||||||
#include "minecraft/auth/AccountTask.h"
|
|
||||||
#include "minecraft/services/SkinDelete.h"
|
#include "minecraft/services/SkinDelete.h"
|
||||||
#include "tasks/Task.h"
|
#include "tasks/Task.h"
|
||||||
|
|
||||||
#include "Application.h"
|
#include "Application.h"
|
||||||
|
|
||||||
#include "BuildConfig.h"
|
|
||||||
|
|
||||||
AccountListPage::AccountListPage(QWidget* parent) : QMainWindow(parent), ui(new Ui::AccountListPage)
|
AccountListPage::AccountListPage(QWidget* parent) : QMainWindow(parent), ui(new Ui::AccountListPage)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
@ -172,6 +167,12 @@ void AccountListPage::on_actionAddOffline_triggered()
|
|||||||
|
|
||||||
void AccountListPage::on_actionRemove_triggered()
|
void AccountListPage::on_actionRemove_triggered()
|
||||||
{
|
{
|
||||||
|
auto response = CustomMessageBox::selectable(this, tr("Remove account?"), tr("Do you really want to delete this account?"),
|
||||||
|
QMessageBox::Question, QMessageBox::Yes | QMessageBox::No, QMessageBox::No)
|
||||||
|
->exec();
|
||||||
|
if (response != QMessageBox::Yes) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
QModelIndexList selection = ui->listView->selectionModel()->selectedIndexes();
|
QModelIndexList selection = ui->listView->selectionModel()->selectedIndexes();
|
||||||
if (selection.size() > 0) {
|
if (selection.size() > 0) {
|
||||||
QModelIndex selected = selection.first();
|
QModelIndex selected = selection.first();
|
||||||
@ -230,6 +231,7 @@ void AccountListPage::updateButtonStates()
|
|||||||
ui->actionNoDefault->setEnabled(true);
|
ui->actionNoDefault->setEnabled(true);
|
||||||
ui->actionNoDefault->setChecked(false);
|
ui->actionNoDefault->setChecked(false);
|
||||||
}
|
}
|
||||||
|
ui->listView->resizeColumnToContents(3);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AccountListPage::on_actionUploadSkin_triggered()
|
void AccountListPage::on_actionUploadSkin_triggered()
|
||||||
|
@ -84,7 +84,7 @@
|
|||||||
<string notr="true"> MiB</string>
|
<string notr="true"> MiB</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>128</number>
|
<number>8</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>1048576</number>
|
<number>1048576</number>
|
||||||
@ -106,7 +106,7 @@
|
|||||||
<string notr="true"> MiB</string>
|
<string notr="true"> MiB</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>128</number>
|
<number>8</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>1048576</number>
|
<number>1048576</number>
|
||||||
@ -128,7 +128,7 @@
|
|||||||
<string notr="true"> MiB</string>
|
<string notr="true"> MiB</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>64</number>
|
<number>4</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>999999999</number>
|
<number>999999999</number>
|
||||||
|
@ -223,6 +223,7 @@ void LauncherPage::applySettings()
|
|||||||
|
|
||||||
// Mods
|
// Mods
|
||||||
s->set("ModMetadataDisabled", ui->metadataDisableBtn->isChecked());
|
s->set("ModMetadataDisabled", ui->metadataDisableBtn->isChecked());
|
||||||
|
s->set("ModDependenciesDisabled", ui->dependenciesDisableBtn->isChecked());
|
||||||
}
|
}
|
||||||
void LauncherPage::loadSettings()
|
void LauncherPage::loadSettings()
|
||||||
{
|
{
|
||||||
@ -278,6 +279,7 @@ void LauncherPage::loadSettings()
|
|||||||
// Mods
|
// Mods
|
||||||
ui->metadataDisableBtn->setChecked(s->get("ModMetadataDisabled").toBool());
|
ui->metadataDisableBtn->setChecked(s->get("ModMetadataDisabled").toBool());
|
||||||
ui->metadataWarningLabel->setHidden(!ui->metadataDisableBtn->isChecked());
|
ui->metadataWarningLabel->setHidden(!ui->metadataDisableBtn->isChecked());
|
||||||
|
ui->dependenciesDisableBtn->setChecked(s->get("ModDependenciesDisabled").toBool());
|
||||||
}
|
}
|
||||||
|
|
||||||
void LauncherPage::refreshFontPreview()
|
void LauncherPage::refreshFontPreview()
|
||||||
|
@ -186,6 +186,16 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="dependenciesDisableBtn">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Disable the automatic detection, installation, and updating of mod dependencies.</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Disable automatic mod dependency management</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
@ -42,6 +42,7 @@
|
|||||||
#include "minecraft/mod/ResourceFolderModel.h"
|
#include "minecraft/mod/ResourceFolderModel.h"
|
||||||
#include "ui/GuiUtil.h"
|
#include "ui/GuiUtil.h"
|
||||||
|
|
||||||
|
#include <QHeaderView>
|
||||||
#include <QKeyEvent>
|
#include <QKeyEvent>
|
||||||
#include <QMenu>
|
#include <QMenu>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
@ -95,7 +96,8 @@ ExternalResourcesPage::ExternalResourcesPage(BaseInstance* instance, std::shared
|
|||||||
|
|
||||||
connect(viewHeader, &QHeaderView::customContextMenuRequested, this, &ExternalResourcesPage::ShowHeaderContextMenu);
|
connect(viewHeader, &QHeaderView::customContextMenuRequested, this, &ExternalResourcesPage::ShowHeaderContextMenu);
|
||||||
|
|
||||||
m_model->loadHiddenColumns(ui->treeView);
|
m_model->loadColumns(ui->treeView);
|
||||||
|
connect(ui->treeView->header(), &QHeaderView::sectionResized, this, [this] { m_model->saveColumns(ui->treeView); });
|
||||||
}
|
}
|
||||||
|
|
||||||
ExternalResourcesPage::~ExternalResourcesPage()
|
ExternalResourcesPage::~ExternalResourcesPage()
|
||||||
|
@ -70,6 +70,9 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="WideBar" name="actionsToolbar">
|
<widget class="WideBar" name="actionsToolbar">
|
||||||
|
<property name="useDefaultAction" stdset="0">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
<string>Actions</string>
|
<string>Actions</string>
|
||||||
</property>
|
</property>
|
||||||
@ -146,17 +149,6 @@
|
|||||||
<string>Download a new resource</string>
|
<string>Download a new resource</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionUpdateItem">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Check for &Updates</string>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Try to check or update all selected resources (all resources if none are selected)</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="actionVisitItemPage">
|
<action name="actionVisitItemPage">
|
||||||
<property name="enabled">
|
<property name="enabled">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
@ -168,15 +160,15 @@
|
|||||||
<string>Go to mods home page</string>
|
<string>Go to mods home page</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionRemoveItemMetadata">
|
<action name="actionUpdateItem">
|
||||||
<property name="enabled">
|
<property name="enabled">
|
||||||
<bool>false</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Remove metadata</string>
|
<string>Check for &Updates</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Remove mod's metadata</string>
|
<string>Try to check or update all selected resources (all resources if none are selected)</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
|
@ -155,7 +155,7 @@
|
|||||||
<string notr="true"> MiB</string>
|
<string notr="true"> MiB</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>128</number>
|
<number>8</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>1048576</number>
|
<number>1048576</number>
|
||||||
@ -177,7 +177,7 @@
|
|||||||
<string notr="true"> MiB</string>
|
<string notr="true"> MiB</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>128</number>
|
<number>8</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>1048576</number>
|
<number>1048576</number>
|
||||||
@ -199,7 +199,7 @@
|
|||||||
<string notr="true"> MiB</string>
|
<string notr="true"> MiB</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>64</number>
|
<number>4</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>999999999</number>
|
<number>999999999</number>
|
||||||
|
@ -84,50 +84,71 @@ ModFolderPage::ModFolderPage(BaseInstance* inst, std::shared_ptr<ModFolderModel>
|
|||||||
|
|
||||||
connect(ui->actionDownloadItem, &QAction::triggered, this, &ModFolderPage::installMods);
|
connect(ui->actionDownloadItem, &QAction::triggered, this, &ModFolderPage::installMods);
|
||||||
|
|
||||||
|
// update menu
|
||||||
|
auto updateMenu = ui->actionUpdateItem->menu();
|
||||||
|
if (updateMenu) {
|
||||||
|
updateMenu->clear();
|
||||||
|
} else {
|
||||||
|
updateMenu = new QMenu(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto update = updateMenu->addAction(tr("Check for Updates"));
|
||||||
|
update->setToolTip(tr("Try to check or update all selected mods (all mods if none are selected)"));
|
||||||
|
connect(update, &QAction::triggered, this, &ModFolderPage::updateMods);
|
||||||
|
|
||||||
|
auto updateWithDeps = updateMenu->addAction(tr("Verify Dependencies"));
|
||||||
|
updateWithDeps->setToolTip(
|
||||||
|
tr("Try to update and check for missing dependencies all selected mods (all mods if none are selected)"));
|
||||||
|
connect(updateWithDeps, &QAction::triggered, this, [this] { updateMods(true); });
|
||||||
|
|
||||||
|
auto depsDisabled = APPLICATION->settings()->getSetting("ModDependenciesDisabled");
|
||||||
|
updateWithDeps->setVisible(!depsDisabled->get().toBool());
|
||||||
|
connect(depsDisabled.get(), &Setting::SettingChanged, this,
|
||||||
|
[updateWithDeps](const Setting& setting, QVariant value) { updateWithDeps->setVisible(!value.toBool()); });
|
||||||
|
|
||||||
|
auto actionRemoveItemMetadata = updateMenu->addAction(tr("Reset update metadata"));
|
||||||
|
actionRemoveItemMetadata->setToolTip(tr("Remove mod's metadata"));
|
||||||
|
connect(actionRemoveItemMetadata, &QAction::triggered, this, &ModFolderPage::deleteModMetadata);
|
||||||
|
actionRemoveItemMetadata->setEnabled(false);
|
||||||
|
|
||||||
|
ui->actionUpdateItem->setMenu(updateMenu);
|
||||||
|
|
||||||
ui->actionUpdateItem->setToolTip(tr("Try to check or update all selected mods (all mods if none are selected)"));
|
ui->actionUpdateItem->setToolTip(tr("Try to check or update all selected mods (all mods if none are selected)"));
|
||||||
ui->actionsToolbar->insertActionAfter(ui->actionAddItem, ui->actionUpdateItem);
|
|
||||||
connect(ui->actionUpdateItem, &QAction::triggered, this, &ModFolderPage::updateMods);
|
connect(ui->actionUpdateItem, &QAction::triggered, this, &ModFolderPage::updateMods);
|
||||||
|
ui->actionsToolbar->insertActionBefore(ui->actionAddItem, ui->actionUpdateItem);
|
||||||
|
|
||||||
ui->actionVisitItemPage->setToolTip(tr("Go to mod's home page"));
|
ui->actionVisitItemPage->setToolTip(tr("Go to mod's home page"));
|
||||||
ui->actionsToolbar->addAction(ui->actionVisitItemPage);
|
ui->actionsToolbar->addAction(ui->actionVisitItemPage);
|
||||||
connect(ui->actionVisitItemPage, &QAction::triggered, this, &ModFolderPage::visitModPages);
|
connect(ui->actionVisitItemPage, &QAction::triggered, this, &ModFolderPage::visitModPages);
|
||||||
|
|
||||||
ui->actionRemoveItemMetadata->setToolTip(tr("Remove mod's metadata"));
|
|
||||||
ui->actionsToolbar->insertActionAfter(ui->actionRemoveItem, ui->actionRemoveItemMetadata);
|
|
||||||
connect(ui->actionRemoveItemMetadata, &QAction::triggered, this, &ModFolderPage::deleteModMetadata);
|
|
||||||
|
|
||||||
auto check_allow_update = [this] { return ui->treeView->selectionModel()->hasSelection() || !m_model->empty(); };
|
auto check_allow_update = [this] { return ui->treeView->selectionModel()->hasSelection() || !m_model->empty(); };
|
||||||
|
|
||||||
connect(ui->treeView->selectionModel(), &QItemSelectionModel::selectionChanged, this, [this, check_allow_update] {
|
connect(ui->treeView->selectionModel(), &QItemSelectionModel::selectionChanged, this,
|
||||||
ui->actionUpdateItem->setEnabled(check_allow_update());
|
[this, check_allow_update, actionRemoveItemMetadata] {
|
||||||
|
ui->actionUpdateItem->setEnabled(check_allow_update());
|
||||||
|
|
||||||
auto selection = m_filterModel->mapSelectionToSource(ui->treeView->selectionModel()->selection()).indexes();
|
auto selection = m_filterModel->mapSelectionToSource(ui->treeView->selectionModel()->selection()).indexes();
|
||||||
auto mods_list = m_model->selectedMods(selection);
|
auto mods_list = m_model->selectedMods(selection);
|
||||||
auto selected = std::count_if(mods_list.cbegin(), mods_list.cend(),
|
auto selected = std::count_if(mods_list.cbegin(), mods_list.cend(),
|
||||||
[](Mod* v) { return v->metadata() != nullptr || v->homeurl().size() != 0; });
|
[](Mod* v) { return v->metadata() != nullptr || v->homeurl().size() != 0; });
|
||||||
if (selected <= 1) {
|
if (selected <= 1) {
|
||||||
ui->actionVisitItemPage->setText(tr("Visit mod's page"));
|
ui->actionVisitItemPage->setText(tr("Visit mod's page"));
|
||||||
ui->actionVisitItemPage->setToolTip(tr("Go to mod's home page"));
|
ui->actionVisitItemPage->setToolTip(tr("Go to mod's home page"));
|
||||||
|
|
||||||
ui->actionRemoveItemMetadata->setToolTip(tr("Remove mod's metadata"));
|
} else {
|
||||||
} else {
|
ui->actionVisitItemPage->setText(tr("Visit mods' pages"));
|
||||||
ui->actionVisitItemPage->setText(tr("Visit mods' pages"));
|
ui->actionVisitItemPage->setToolTip(tr("Go to the pages of the selected mods"));
|
||||||
ui->actionVisitItemPage->setToolTip(tr("Go to the pages of the selected mods"));
|
}
|
||||||
|
ui->actionVisitItemPage->setEnabled(selected != 0);
|
||||||
|
actionRemoveItemMetadata->setEnabled(selected != 0);
|
||||||
|
});
|
||||||
|
|
||||||
ui->actionRemoveItemMetadata->setToolTip(tr("Remove mods' metadata"));
|
auto updateButtons = [this, check_allow_update] { ui->actionUpdateItem->setEnabled(check_allow_update()); };
|
||||||
}
|
connect(mods.get(), &ModFolderModel::rowsInserted, this, updateButtons);
|
||||||
ui->actionVisitItemPage->setEnabled(selected != 0);
|
|
||||||
ui->actionRemoveItemMetadata->setEnabled(selected != 0);
|
|
||||||
});
|
|
||||||
|
|
||||||
connect(mods.get(), &ModFolderModel::rowsInserted, this,
|
connect(mods.get(), &ModFolderModel::rowsRemoved, this, updateButtons);
|
||||||
[this, check_allow_update] { ui->actionUpdateItem->setEnabled(check_allow_update()); });
|
|
||||||
|
|
||||||
connect(mods.get(), &ModFolderModel::rowsRemoved, this,
|
connect(mods.get(), &ModFolderModel::updateFinished, this, updateButtons);
|
||||||
[this, check_allow_update] { ui->actionUpdateItem->setEnabled(check_allow_update()); });
|
|
||||||
|
|
||||||
connect(mods.get(), &ModFolderModel::updateFinished, this,
|
|
||||||
[this, check_allow_update] { ui->actionUpdateItem->setEnabled(check_allow_update()); });
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -204,7 +225,7 @@ void ModFolderPage::installMods()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModFolderPage::updateMods()
|
void ModFolderPage::updateMods(bool includeDeps)
|
||||||
{
|
{
|
||||||
if (m_instance->typeName() != "Minecraft")
|
if (m_instance->typeName() != "Minecraft")
|
||||||
return; // this is a null instance or a legacy instance
|
return; // this is a null instance or a legacy instance
|
||||||
@ -214,6 +235,10 @@ void ModFolderPage::updateMods()
|
|||||||
QMessageBox::critical(this, tr("Error"), tr("Please install a mod loader first!"));
|
QMessageBox::critical(this, tr("Error"), tr("Please install a mod loader first!"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (APPLICATION->settings()->get("ModMetadataDisabled").toBool()) {
|
||||||
|
QMessageBox::critical(this, tr("Error"), tr("Mod updates are unavailable when metadata is disabled!"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
auto selection = m_filterModel->mapSelectionToSource(ui->treeView->selectionModel()->selection()).indexes();
|
auto selection = m_filterModel->mapSelectionToSource(ui->treeView->selectionModel()->selection()).indexes();
|
||||||
|
|
||||||
auto mods_list = m_model->selectedMods(selection);
|
auto mods_list = m_model->selectedMods(selection);
|
||||||
@ -221,7 +246,7 @@ void ModFolderPage::updateMods()
|
|||||||
if (use_all)
|
if (use_all)
|
||||||
mods_list = m_model->allMods();
|
mods_list = m_model->allMods();
|
||||||
|
|
||||||
ModUpdateDialog update_dialog(this, m_instance, m_model, mods_list);
|
ModUpdateDialog update_dialog(this, m_instance, m_model, mods_list, includeDeps);
|
||||||
update_dialog.checkCandidates();
|
update_dialog.checkCandidates();
|
||||||
|
|
||||||
if (update_dialog.aborted()) {
|
if (update_dialog.aborted()) {
|
||||||
|
@ -64,7 +64,7 @@ class ModFolderPage : public ExternalResourcesPage {
|
|||||||
void deleteModMetadata();
|
void deleteModMetadata();
|
||||||
|
|
||||||
void installMods();
|
void installMods();
|
||||||
void updateMods();
|
void updateMods(bool includeDeps = false);
|
||||||
void visitModPages();
|
void visitModPages();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -80,7 +80,7 @@ void JavaSettingsWidget::setupUi()
|
|||||||
m_minMemSpinBox = new QSpinBox(m_memoryGroupBox);
|
m_minMemSpinBox = new QSpinBox(m_memoryGroupBox);
|
||||||
m_minMemSpinBox->setObjectName(QStringLiteral("minMemSpinBox"));
|
m_minMemSpinBox->setObjectName(QStringLiteral("minMemSpinBox"));
|
||||||
m_minMemSpinBox->setSuffix(QStringLiteral(" MiB"));
|
m_minMemSpinBox->setSuffix(QStringLiteral(" MiB"));
|
||||||
m_minMemSpinBox->setMinimum(128);
|
m_minMemSpinBox->setMinimum(8);
|
||||||
m_minMemSpinBox->setMaximum(1048576);
|
m_minMemSpinBox->setMaximum(1048576);
|
||||||
m_minMemSpinBox->setSingleStep(128);
|
m_minMemSpinBox->setSingleStep(128);
|
||||||
m_labelMinMem->setBuddy(m_minMemSpinBox);
|
m_labelMinMem->setBuddy(m_minMemSpinBox);
|
||||||
@ -93,7 +93,7 @@ void JavaSettingsWidget::setupUi()
|
|||||||
m_maxMemSpinBox = new QSpinBox(m_memoryGroupBox);
|
m_maxMemSpinBox = new QSpinBox(m_memoryGroupBox);
|
||||||
m_maxMemSpinBox->setObjectName(QStringLiteral("maxMemSpinBox"));
|
m_maxMemSpinBox->setObjectName(QStringLiteral("maxMemSpinBox"));
|
||||||
m_maxMemSpinBox->setSuffix(QStringLiteral(" MiB"));
|
m_maxMemSpinBox->setSuffix(QStringLiteral(" MiB"));
|
||||||
m_maxMemSpinBox->setMinimum(128);
|
m_maxMemSpinBox->setMinimum(8);
|
||||||
m_maxMemSpinBox->setMaximum(1048576);
|
m_maxMemSpinBox->setMaximum(1048576);
|
||||||
m_maxMemSpinBox->setSingleStep(128);
|
m_maxMemSpinBox->setSingleStep(128);
|
||||||
m_labelMaxMem->setBuddy(m_maxMemSpinBox);
|
m_labelMaxMem->setBuddy(m_maxMemSpinBox);
|
||||||
@ -112,7 +112,7 @@ void JavaSettingsWidget::setupUi()
|
|||||||
m_permGenSpinBox = new QSpinBox(m_memoryGroupBox);
|
m_permGenSpinBox = new QSpinBox(m_memoryGroupBox);
|
||||||
m_permGenSpinBox->setObjectName(QStringLiteral("permGenSpinBox"));
|
m_permGenSpinBox->setObjectName(QStringLiteral("permGenSpinBox"));
|
||||||
m_permGenSpinBox->setSuffix(QStringLiteral(" MiB"));
|
m_permGenSpinBox->setSuffix(QStringLiteral(" MiB"));
|
||||||
m_permGenSpinBox->setMinimum(64);
|
m_permGenSpinBox->setMinimum(4);
|
||||||
m_permGenSpinBox->setMaximum(1048576);
|
m_permGenSpinBox->setMaximum(1048576);
|
||||||
m_permGenSpinBox->setSingleStep(8);
|
m_permGenSpinBox->setSingleStep(8);
|
||||||
m_gridLayout_2->addWidget(m_permGenSpinBox, 2, 1, 1, 1);
|
m_gridLayout_2->addWidget(m_permGenSpinBox, 2, 1, 1, 1);
|
||||||
|
@ -48,14 +48,14 @@ void ModListView::setModel(QAbstractItemModel* model)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!string.size()) {
|
if (!string.size()) {
|
||||||
head->setSectionResizeMode(0, QHeaderView::ResizeToContents);
|
head->setSectionResizeMode(0, QHeaderView::Interactive);
|
||||||
head->setSectionResizeMode(1, QHeaderView::Stretch);
|
head->setSectionResizeMode(1, QHeaderView::Stretch);
|
||||||
for (int i = 2; i < head->count(); i++)
|
for (int i = 2; i < head->count(); i++)
|
||||||
head->setSectionResizeMode(i, QHeaderView::ResizeToContents);
|
head->setSectionResizeMode(i, QHeaderView::Interactive);
|
||||||
} else {
|
} else {
|
||||||
head->setSectionResizeMode(0, QHeaderView::Stretch);
|
head->setSectionResizeMode(0, QHeaderView::Stretch);
|
||||||
for (int i = 1; i < head->count(); i++)
|
for (int i = 1; i < head->count(); i++)
|
||||||
head->setSectionResizeMode(i, QHeaderView::ResizeToContents);
|
head->setSectionResizeMode(i, QHeaderView::Interactive);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,12 +16,6 @@
|
|||||||
<description>Custom Minecraft launcher for managing multiple installs.</description>
|
<description>Custom Minecraft launcher for managing multiple installs.</description>
|
||||||
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||||
<application>
|
<application>
|
||||||
<!--The ID below indicates app support for Windows 7 -->
|
|
||||||
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
|
|
||||||
<!--The ID below indicates app support for Windows 8 -->
|
|
||||||
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
|
|
||||||
<!--The ID below indicates app support for Windows 8.1 -->
|
|
||||||
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
|
|
||||||
<!--The ID below indicates app support for Windows 10/11 -->
|
<!--The ID below indicates app support for Windows 10/11 -->
|
||||||
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
|
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
|
||||||
</application>
|
</application>
|
||||||
|
Loading…
Reference in New Issue
Block a user