Merge branch 'PrismLauncher:develop' into better-component-installation

This commit is contained in:
TheKodeToad 2023-06-22 13:22:44 +01:00 committed by GitHub
commit e7ad373d89
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 133 additions and 72 deletions

View File

@ -191,7 +191,7 @@ jobs:
if: runner.os == 'Linux' if: runner.os == 'Linux'
run: | run: |
sudo apt-get -y update sudo apt-get -y update
sudo apt-get -y install ninja-build extra-cmake-modules scdoc sudo apt-get -y install ninja-build extra-cmake-modules scdoc appstream
- name: Install Dependencies (macOS) - name: Install Dependencies (macOS)
if: runner.os == 'macOS' if: runner.os == 'macOS'
@ -250,6 +250,7 @@ jobs:
wget "https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage" wget "https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage"
${{ github.workspace }}/.github/scripts/prepare_JREs.sh ${{ github.workspace }}/.github/scripts/prepare_JREs.sh
sudo apt install libopengl0
- name: Add QT_HOST_PATH var (Windows MSVC arm64) - name: Add QT_HOST_PATH var (Windows MSVC arm64)
if: runner.os == 'Windows' && matrix.architecture == 'arm64' if: runner.os == 'Windows' && matrix.architecture == 'arm64'
@ -467,7 +468,8 @@ jobs:
shell: bash shell: bash
run: | run: |
cmake --install ${{ env.BUILD_DIR }} --prefix ${{ env.INSTALL_APPIMAGE_DIR }}/usr cmake --install ${{ env.BUILD_DIR }} --prefix ${{ env.INSTALL_APPIMAGE_DIR }}/usr
mv ${{ env.INSTALL_APPIMAGE_DIR }}/usr/share/metainfo/org.prismlauncher.PrismLauncher.metainfo.xml ${{ env.INSTALL_APPIMAGE_DIR }}/usr/share/metainfo/org.prismlauncher.PrismLauncher.appdata.xml
export "NO_APPSTREAM=1" # we have to skip appstream checking because appstream on ubuntu 20.04 is outdated
export OUTPUT="PrismLauncher-${{ runner.os }}-${{ env.VERSION }}-${{ inputs.build_type }}-x86_64.AppImage" export OUTPUT="PrismLauncher-${{ runner.os }}-${{ env.VERSION }}-${{ inputs.build_type }}-x86_64.AppImage"
chmod +x linuxdeploy-*.AppImage chmod +x linuxdeploy-*.AppImage
@ -482,7 +484,8 @@ jobs:
cp -r /home/runner/work/PrismLauncher/Qt/${{ matrix.qt_version }}/gcc_64/plugins/iconengines/* ${{ env.INSTALL_APPIMAGE_DIR }}/usr/plugins/iconengines cp -r /home/runner/work/PrismLauncher/Qt/${{ matrix.qt_version }}/gcc_64/plugins/iconengines/* ${{ env.INSTALL_APPIMAGE_DIR }}/usr/plugins/iconengines
cp /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 ${{ env.INSTALL_APPIMAGE_DIR }}/usr/lib/ cp /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 ${{ env.INSTALL_APPIMAGE_DIR }}/usr/lib/
cp /usr/lib/x86_64-linux-gnu/libssl.so.1.1 ${{ env.INSTALL_APPIMAGE_DIR }}//usr/lib/ cp /usr/lib/x86_64-linux-gnu/libssl.so.1.1 ${{ env.INSTALL_APPIMAGE_DIR }}/usr/lib/
cp /usr/lib/x86_64-linux-gnu/libOpenGL.so.0* ${{ env.INSTALL_APPIMAGE_DIR }}/usr/lib/
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${{ env.INSTALL_APPIMAGE_DIR }}/usr/lib" LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${{ env.INSTALL_APPIMAGE_DIR }}/usr/lib"
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${{ env.INSTALL_APPIMAGE_DIR }}/usr/lib/jvm/java-8-openjdk/lib/amd64/server" LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${{ env.INSTALL_APPIMAGE_DIR }}/usr/lib/jvm/java-8-openjdk/lib/amd64/server"
@ -599,7 +602,7 @@ jobs:
submodules: 'true' submodules: 'true'
- name: Install nix - name: Install nix
if: inputs.build_type == 'Debug' if: inputs.build_type == 'Debug'
uses: cachix/install-nix-action@v21 uses: cachix/install-nix-action@v22
with: with:
install_url: https://nixos.org/nix/install install_url: https://nixos.org/nix/install
extra_nix_config: | extra_nix_config: |

View File

@ -82,6 +82,7 @@ Config::Config()
{ {
GIT_REFSPEC = "refs/heads/stable"; GIT_REFSPEC = "refs/heads/stable";
GIT_TAG = versionString(); GIT_TAG = versionString();
GIT_COMMIT = "";
} }
if (GIT_REFSPEC.startsWith("refs/heads/")) if (GIT_REFSPEC.startsWith("refs/heads/"))

View File

@ -102,7 +102,7 @@ namespace fs = ghc::filesystem;
#include <linux/fs.h> #include <linux/fs.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <unistd.h> #include <unistd.h>
#elif defined(Q_OS_MACOS) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD) #elif defined(Q_OS_MACOS) || defined(Q_OS_OPENBSD)
#include <sys/attr.h> #include <sys/attr.h>
#include <sys/clonefile.h> #include <sys/clonefile.h>
#elif defined(Q_OS_WIN) #elif defined(Q_OS_WIN)
@ -1151,7 +1151,7 @@ bool clone_file(const QString& src, const QString& dst, std::error_code& ec)
return false; return false;
} }
#elif defined(Q_OS_MACOS) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD) #elif defined(Q_OS_MACOS) || defined(Q_OS_OPENBSD)
if (!macos_bsd_clonefile(src_path, dst_path, ec)) { if (!macos_bsd_clonefile(src_path, dst_path, ec)) {
qDebug() << "failed macos_bsd_clonefile:"; qDebug() << "failed macos_bsd_clonefile:";
@ -1380,7 +1380,7 @@ bool linux_ficlone(const std::string& src_path, const std::string& dst_path, std
return true; return true;
} }
#elif defined(Q_OS_MACOS) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD) #elif defined(Q_OS_MACOS) || defined(Q_OS_OPENBSD)
bool macos_bsd_clonefile(const std::string& src_path, const std::string& dst_path, std::error_code& ec) bool macos_bsd_clonefile(const std::string& src_path, const std::string& dst_path, std::error_code& ec)
{ {

View File

@ -333,13 +333,13 @@ QVariant AccountList::data(const QModelIndex &index, int role) const
case MigrationColumn: { case MigrationColumn: {
if(account->isMSA() || account->isOffline()) { if(account->isMSA() || account->isOffline()) {
return tr("N/A", "Can Migrate?"); return tr("N/A", "Can Migrate");
} }
if (account->canMigrate()) { if (account->canMigrate()) {
return tr("Yes", "Can Migrate?"); return tr("Yes", "Can Migrate");
} }
else { else {
return tr("No", "Can Migrate?"); return tr("No", "Can Migrate");
} }
} }

View File

@ -153,6 +153,9 @@ bool FlameCreationTask::updateInstance()
old_files.remove(file.key()); old_files.remove(file.key());
files_iterator = files.erase(files_iterator); files_iterator = files.erase(files_iterator);
if (files_iterator != files.begin())
files_iterator--;
} }
} }

View File

@ -214,7 +214,7 @@ bool ModrinthCreationTask::createInstance()
if (m_instIcon != "default") { if (m_instIcon != "default") {
instance.setIconKey(m_instIcon); instance.setIconKey(m_instIcon);
} else { } else if (!m_managed_id.isEmpty()) {
instance.setIconKey("modrinth"); instance.setIconKey("modrinth");
} }

View File

@ -53,6 +53,7 @@ ExportMrPackDialog::ExportMrPackDialog(InstancePtr instance, QWidget* parent)
const QDir root(instance->gameRoot()); const QDir root(instance->gameRoot());
proxy = new FileIgnoreProxy(instance->gameRoot(), this); proxy = new FileIgnoreProxy(instance->gameRoot(), this);
proxy->setSourceModel(model); proxy->setSourceModel(model);
proxy->setFilterRegularExpression("^(?!\\.DS_Store).+$");
const QDir::Filters filter(QDir::AllEntries | QDir::NoDotAndDotDot | QDir::AllDirs | QDir::Hidden); const QDir::Filters filter(QDir::AllEntries | QDir::NoDotAndDotDot | QDir::AllDirs | QDir::Hidden);

View File

@ -35,15 +35,16 @@
#pragma once #pragma once
#include <QString>
#include <QIcon> #include <QIcon>
#include <QString>
#include <functional>
#include <memory> #include <memory>
#include "BasePageContainer.h" #include "BasePageContainer.h"
class BasePage class BasePage {
{ public:
public: using updateExtraInfoFunc = std::function<void(QString)>;
virtual ~BasePage() {} virtual ~BasePage() {}
virtual QString id() const = 0; virtual QString id() const = 0;
virtual QString displayName() const = 0; virtual QString displayName() const = 0;
@ -63,17 +64,16 @@ public:
} }
virtual void openedImpl() {} virtual void openedImpl() {}
virtual void closedImpl() {} virtual void closedImpl() {}
virtual void setParentContainer(BasePageContainer * container) virtual void setParentContainer(BasePageContainer* container) { m_container = container; };
{ virtual void retranslate() {}
m_container = container;
};
virtual void retranslate() { }
public: public:
int stackIndex = -1; int stackIndex = -1;
int listIndex = -1; int listIndex = -1;
protected: updateExtraInfoFunc updateExtraInfo;
BasePageContainer * m_container = nullptr;
protected:
BasePageContainer* m_container = nullptr;
bool isOpened = false; bool isOpened = false;
}; };

View File

@ -172,7 +172,7 @@
<string>Disable using metadata provided by mod providers (like Modrinth or Curseforge) for mods.</string> <string>Disable using metadata provided by mod providers (like Modrinth or Curseforge) for mods.</string>
</property> </property>
<property name="text"> <property name="text">
<string>Disable using metadata for mods?</string> <string>Disable using metadata for mods</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -307,21 +307,21 @@
<item> <item>
<widget class="QCheckBox" name="showConsoleCheck"> <widget class="QCheckBox" name="showConsoleCheck">
<property name="text"> <property name="text">
<string>Show console while the game is &amp;running?</string> <string>Show console while the game is &amp;running</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QCheckBox" name="autoCloseConsoleCheck"> <widget class="QCheckBox" name="autoCloseConsoleCheck">
<property name="text"> <property name="text">
<string>&amp;Automatically close console when the game quits?</string> <string>&amp;Automatically close console when the game quits</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QCheckBox" name="showConsoleErrorCheck"> <widget class="QCheckBox" name="showConsoleErrorCheck">
<property name="text"> <property name="text">
<string>Show console when the game &amp;crashes?</string> <string>Show console when the game &amp;crashes</string>
</property> </property>
</widget> </widget>
</item> </item>

View File

@ -51,7 +51,7 @@
<item> <item>
<widget class="QCheckBox" name="maximizedCheckBox"> <widget class="QCheckBox" name="maximizedCheckBox">
<property name="text"> <property name="text">
<string>Start Minecraft &amp;maximized?</string> <string>Start Minecraft &amp;maximized</string>
</property> </property>
</widget> </widget>
</item> </item>

View File

@ -1,3 +1,38 @@
// SPDX-License-Identifier: GPL-3.0-only
/*
* Prism Launcher - Minecraft Launcher
* Copyright (c) 2023 Trial97 <alexandru.tripon97@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* This file incorporates work covered by the following copyright and
* permission notice:
*
* Copyright 2013-2021 MultiMC Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ExternalResourcesPage.h" #include "ExternalResourcesPage.h"
#include "ui/dialogs/CustomMessageBox.h" #include "ui/dialogs/CustomMessageBox.h"
#include "ui_ExternalResourcesPage.h" #include "ui_ExternalResourcesPage.h"
@ -9,6 +44,7 @@
#include <QKeyEvent> #include <QKeyEvent>
#include <QMenu> #include <QMenu>
#include <algorithm>
ExternalResourcesPage::ExternalResourcesPage(BaseInstance* instance, std::shared_ptr<ResourceFolderModel> model, QWidget* parent) ExternalResourcesPage::ExternalResourcesPage(BaseInstance* instance, std::shared_ptr<ResourceFolderModel> model, QWidget* parent)
: QMainWindow(parent), m_instance(instance), ui(new Ui::ExternalResourcesPage), m_model(model) : QMainWindow(parent), m_instance(instance), ui(new Ui::ExternalResourcesPage), m_model(model)
@ -43,6 +79,13 @@ ExternalResourcesPage::ExternalResourcesPage(BaseInstance* instance, std::shared
auto selection_model = ui->treeView->selectionModel(); auto selection_model = ui->treeView->selectionModel();
connect(selection_model, &QItemSelectionModel::currentChanged, this, &ExternalResourcesPage::current); connect(selection_model, &QItemSelectionModel::currentChanged, this, &ExternalResourcesPage::current);
auto updateExtra = [this]() {
if (updateExtraInfo)
updateExtraInfo(extraHeaderInfoString());
};
connect(selection_model, &QItemSelectionModel::selectionChanged, this, updateExtra);
connect(model.get(), &ResourceFolderModel::updateFinished, this, updateExtra);
connect(ui->filterEdit, &QLineEdit::textChanged, this, &ExternalResourcesPage::filterTextChanged); connect(ui->filterEdit, &QLineEdit::textChanged, this, &ExternalResourcesPage::filterTextChanged);
} }
@ -248,6 +291,15 @@ bool ExternalResourcesPage::onSelectionChanged(const QModelIndex& current, const
int row = sourceCurrent.row(); int row = sourceCurrent.row();
Resource const& resource = m_model->at(row); Resource const& resource = m_model->at(row);
ui->frame->updateWithResource(resource); ui->frame->updateWithResource(resource);
return true; return true;
} }
QString ExternalResourcesPage::extraHeaderInfoString()
{
if (ui && ui->treeView && ui->treeView->selectionModel()) {
auto selection = m_filterModel->mapSelectionToSource(ui->treeView->selectionModel()->selection()).indexes();
if (auto count = std::count_if(selection.cbegin(), selection.cend(), [](auto v) { return v.column() == 0; }); count != 0)
return tr(" (%1 installed, %2 selected)").arg(m_model->size()).arg(count);
}
return tr(" (%1 installed)").arg(m_model->size());
}

View File

@ -29,6 +29,7 @@ class ExternalResourcesPage : public QMainWindow, public BasePage {
virtual QString helpPage() const override = 0; virtual QString helpPage() const override = 0;
virtual bool shouldDisplay() const override = 0; virtual bool shouldDisplay() const override = 0;
QString extraHeaderInfoString();
void openedImpl() override; void openedImpl() override;
void closedImpl() override; void closedImpl() override;

View File

@ -269,7 +269,7 @@
<item> <item>
<widget class="QCheckBox" name="maximizedCheckBox"> <widget class="QCheckBox" name="maximizedCheckBox">
<property name="text"> <property name="text">
<string>Start Minecraft maximized?</string> <string>Start Minecraft maximized</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -341,21 +341,21 @@
<item> <item>
<widget class="QCheckBox" name="showConsoleCheck"> <widget class="QCheckBox" name="showConsoleCheck">
<property name="text"> <property name="text">
<string>Show console while the game is running?</string> <string>Show console while the game is running</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QCheckBox" name="autoCloseConsoleCheck"> <widget class="QCheckBox" name="autoCloseConsoleCheck">
<property name="text"> <property name="text">
<string>Automatically close console when the game quits?</string> <string>Automatically close console when the game quits</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QCheckBox" name="showConsoleErrorCheck"> <widget class="QCheckBox" name="showConsoleErrorCheck">
<property name="text"> <property name="text">
<string>Show console when the game crashes?</string> <string>Show console when the game crashes</string>
</property> </property>
</widget> </widget>
</item> </item>

View File

@ -4,6 +4,7 @@
* Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org> * Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org>
* Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net> * Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net>
* Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me> * Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me>
* Copyright (c) 2023 Trial97 <alexandru.tripon97@gmail.com>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -86,28 +87,20 @@ ModFolderPage::ModFolderPage(BaseInstance* inst, std::shared_ptr<ModFolderModel>
connect(ui->actionUpdateItem, &QAction::triggered, this, &ModFolderPage::updateMods); connect(ui->actionUpdateItem, &QAction::triggered, this, &ModFolderPage::updateMods);
auto check_allow_update = [this] { auto check_allow_update = [this] {
return (!m_instance || !m_instance->isRunning()) && return (!m_instance || !m_instance->isRunning()) && (ui->treeView->selectionModel()->hasSelection() || !m_model->empty());
(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] { ui->actionUpdateItem->setEnabled(check_allow_update()); });
});
connect(mods.get(), &ModFolderModel::rowsInserted, this, [this, check_allow_update] { connect(mods.get(), &ModFolderModel::rowsInserted, this,
ui->actionUpdateItem->setEnabled(check_allow_update()); [this, check_allow_update] { ui->actionUpdateItem->setEnabled(check_allow_update()); });
});
connect(mods.get(), &ModFolderModel::rowsRemoved, this, [this, check_allow_update] { connect(mods.get(), &ModFolderModel::rowsRemoved, this,
ui->actionUpdateItem->setEnabled(check_allow_update()); [this, check_allow_update] { ui->actionUpdateItem->setEnabled(check_allow_update()); });
});
connect(mods.get(), &ModFolderModel::updateFinished, this, [this, check_allow_update, mods] { connect(mods.get(), &ModFolderModel::updateFinished, this,
ui->actionUpdateItem->setEnabled(check_allow_update()); [this, check_allow_update] { ui->actionUpdateItem->setEnabled(check_allow_update()); });
// Prevent a weird crash when trying to open the mods page twice in a session o.O
disconnect(mods.get(), &ModFolderModel::updateFinished, this, 0);
});
connect(m_instance, &BaseInstance::runningStatusChanged, this, &ModFolderPage::runningStateChanged); connect(m_instance, &BaseInstance::runningStatusChanged, this, &ModFolderPage::runningStateChanged);
ModFolderPage::runningStateChanged(m_instance && m_instance->isRunning()); ModFolderPage::runningStateChanged(m_instance && m_instance->isRunning());

View File

@ -89,17 +89,13 @@ void ModPage::filterMods()
void ModPage::triggerSearch() void ModPage::triggerSearch()
{ {
auto changed = m_filter_widget->changed();
m_filter = m_filter_widget->getFilter(); m_filter = m_filter_widget->getFilter();
if (changed) {
m_ui->packView->clearSelection(); m_ui->packView->clearSelection();
m_ui->packDescription->clear(); m_ui->packDescription->clear();
m_ui->versionSelectionBox->clear(); m_ui->versionSelectionBox->clear();
updateSelectionButton(); updateSelectionButton();
}
static_cast<ModModel*>(m_model)->searchWithTerm(getSearchTerm(), m_ui->sortByBox->currentData().toUInt(), changed); static_cast<ModModel*>(m_model)->searchWithTerm(getSearchTerm(), m_ui->sortByBox->currentData().toUInt(), m_filter_widget->changed());
m_fetch_progress.watch(m_model->activeSearchJob().get()); m_fetch_progress.watch(m_model->activeSearchJob().get());
} }
@ -122,6 +118,8 @@ void ModPage::updateVersionList()
QString mcVersion = packProfile->getComponentVersion("net.minecraft"); QString mcVersion = packProfile->getComponentVersion("net.minecraft");
auto current_pack = getCurrentPack(); auto current_pack = getCurrentPack();
if (!current_pack)
return;
for (int i = 0; i < current_pack->versions.size(); i++) { for (int i = 0; i < current_pack->versions.size(); i++) {
auto version = current_pack->versions[i]; auto version = current_pack->versions[i];
bool valid = false; bool valid = false;

View File

@ -174,7 +174,11 @@ ModPlatform::IndexedPack::Ptr ResourcePage::getCurrentPack() const
void ResourcePage::updateUi() void ResourcePage::updateUi()
{ {
auto current_pack = getCurrentPack(); auto current_pack = getCurrentPack();
if (!current_pack) {
m_ui->packDescription->setHtml({});
m_ui->packDescription->flush();
return;
}
QString text = ""; QString text = "";
QString name = current_pack->name; QString name = current_pack->name;
@ -240,8 +244,8 @@ void ResourcePage::updateSelectionButton()
} }
m_ui->resourceSelectionButton->setEnabled(true); m_ui->resourceSelectionButton->setEnabled(true);
if (getCurrentPack()) { if (auto current_pack = getCurrentPack(); current_pack) {
if (!getCurrentPack()->isVersionSelected(m_selected_version_index)) if (!current_pack->isVersionSelected(m_selected_version_index))
m_ui->resourceSelectionButton->setText(tr("Select %1 for download").arg(resourceString())); m_ui->resourceSelectionButton->setText(tr("Select %1 for download").arg(resourceString()));
else else
m_ui->resourceSelectionButton->setText(tr("Deselect %1 for download").arg(resourceString())); m_ui->resourceSelectionButton->setText(tr("Deselect %1 for download").arg(resourceString()));
@ -258,6 +262,7 @@ void ResourcePage::updateVersionList()
m_ui->versionSelectionBox->clear(); m_ui->versionSelectionBox->clear();
m_ui->versionSelectionBox->blockSignals(false); m_ui->versionSelectionBox->blockSignals(false);
if (current_pack)
for (int i = 0; i < current_pack->versions.size(); i++) { for (int i = 0; i < current_pack->versions.size(); i++) {
auto& version = current_pack->versions[i]; auto& version = current_pack->versions[i];
if (optedOut(version)) if (optedOut(version))
@ -283,7 +288,7 @@ void ResourcePage::onSelectionChanged(QModelIndex curr, QModelIndex prev)
auto current_pack = getCurrentPack(); auto current_pack = getCurrentPack();
bool request_load = false; bool request_load = false;
if (!current_pack->versionsLoaded) { if (!current_pack || !current_pack->versionsLoaded) {
m_ui->resourceSelectionButton->setText(tr("Loading versions...")); m_ui->resourceSelectionButton->setText(tr("Loading versions..."));
m_ui->resourceSelectionButton->setEnabled(false); m_ui->resourceSelectionButton->setEnabled(false);
@ -292,7 +297,7 @@ void ResourcePage::onSelectionChanged(QModelIndex curr, QModelIndex prev)
updateVersionList(); updateVersionList();
} }
if (!current_pack->extraDataLoaded) if (current_pack && !current_pack->extraDataLoaded)
request_load = true; request_load = true;
if (request_load) if (request_load)
@ -340,7 +345,7 @@ void ResourcePage::onResourceSelected()
return; return;
auto current_pack = getCurrentPack(); auto current_pack = getCurrentPack();
if (!current_pack->versionsLoaded) if (!current_pack || !current_pack->versionsLoaded)
return; return;
auto& version = current_pack->versions[m_selected_version_index]; auto& version = current_pack->versions[m_selected_version_index];
@ -386,7 +391,7 @@ void ResourcePage::openUrl(const QUrl& url)
const QString slug = match.captured(1); const QString slug = match.captured(1);
// ensure the user isn't opening the same mod // ensure the user isn't opening the same mod
if (slug != getCurrentPack()->slug) { if (auto current_pack = getCurrentPack(); current_pack && slug != current_pack->slug) {
m_parent_dialog->selectPage(page); m_parent_dialog->selectPage(page);
auto newPage = m_parent_dialog->selectedPage(); auto newPage = m_parent_dialog->selectedPage();

View File

@ -94,6 +94,10 @@ PageContainer::PageContainer(BasePageProvider *pageProvider, QString defaultId,
page->listIndex = counter; page->listIndex = counter;
page->setParentContainer(this); page->setParentContainer(this);
counter++; counter++;
page->updateExtraInfo = [this](QString info) {
if (m_currentPage)
m_header->setText(m_currentPage->displayName() + info);
};
} }
m_model->setPages(pages); m_model->setPages(pages);