mirror of
https://github.com/redstrate/Astra.git
synced 2025-04-22 12:47:44 +00:00
155 lines
No EOL
3.9 KiB
C++
155 lines
No EOL
3.9 KiB
C++
// SPDX-FileCopyrightText: 2023 Joshua Goins <josh@redstrate.com>
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
#include "profilemanager.h"
|
|
#include "astra_log.h"
|
|
|
|
#include <KSharedConfig>
|
|
#include <QDir>
|
|
#include <QUuid>
|
|
|
|
using namespace Qt::StringLiterals;
|
|
|
|
ProfileManager::ProfileManager(LauncherCore &launcher, QObject *parent)
|
|
: QAbstractListModel(parent)
|
|
, m_launcher(launcher)
|
|
{
|
|
}
|
|
|
|
Profile *ProfileManager::getProfile(const int index)
|
|
{
|
|
return m_profiles[index];
|
|
}
|
|
|
|
int ProfileManager::getProfileIndex(const QString &name)
|
|
{
|
|
for (int i = 0; i < m_profiles.size(); i++) {
|
|
if (m_profiles[i]->uuid() == name)
|
|
return i;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
Profile *ProfileManager::getProfileByUUID(const QString &uuid)
|
|
{
|
|
for (auto &m_profile : m_profiles) {
|
|
if (m_profile->uuid() == uuid)
|
|
return m_profile;
|
|
}
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
Profile *ProfileManager::addProfile()
|
|
{
|
|
auto newProfile = new Profile(m_launcher, QUuid::createUuid().toString(), this);
|
|
newProfile->setName(QStringLiteral("New Profile"));
|
|
|
|
insertProfile(newProfile);
|
|
|
|
return newProfile;
|
|
}
|
|
|
|
void ProfileManager::deleteProfile(Profile *profile)
|
|
{
|
|
auto config = KSharedConfig::openStateConfig();
|
|
config->deleteGroup(QStringLiteral("profile-%1").arg(profile->uuid()));
|
|
config->sync();
|
|
|
|
const int row = static_cast<int>(m_profiles.indexOf(profile));
|
|
beginRemoveRows(QModelIndex(), row, row);
|
|
m_profiles.removeAll(profile);
|
|
endRemoveRows();
|
|
Q_EMIT profilesChanged();
|
|
}
|
|
|
|
QString ProfileManager::getDefaultGamePath(const QString &uuid)
|
|
{
|
|
const QDir appData = QStandardPaths::standardLocations(QStandardPaths::StandardLocation::AppDataLocation)[0];
|
|
const QDir gameDir = appData.absoluteFilePath(QStringLiteral("game"));
|
|
return gameDir.absoluteFilePath(uuid);
|
|
}
|
|
|
|
QString ProfileManager::getDefaultWinePrefixPath(const QString &uuid)
|
|
{
|
|
const QDir appData = QStandardPaths::standardLocations(QStandardPaths::StandardLocation::AppDataLocation)[0];
|
|
const QDir prefixDir = appData.absoluteFilePath(QStringLiteral("prefix"));
|
|
return prefixDir.absoluteFilePath(uuid);
|
|
}
|
|
|
|
void ProfileManager::load()
|
|
{
|
|
auto config = KSharedConfig::openStateConfig();
|
|
for (const auto &id : config->groupList()) {
|
|
if (id.contains("profile-"_L1)) {
|
|
const QString uuid = QString(id).remove("profile-"_L1);
|
|
qInfo(ASTRA_LOG) << "Loading profile" << uuid;
|
|
auto profile = new Profile(m_launcher, uuid, this);
|
|
insertProfile(profile);
|
|
}
|
|
}
|
|
|
|
// Add a dummy profile if none exist
|
|
if (m_profiles.empty()) {
|
|
addProfile();
|
|
}
|
|
}
|
|
|
|
int ProfileManager::rowCount(const QModelIndex &index) const
|
|
{
|
|
Q_UNUSED(index)
|
|
return static_cast<int>(m_profiles.size());
|
|
}
|
|
|
|
QVariant ProfileManager::data(const QModelIndex &index, int role) const
|
|
{
|
|
if (!checkIndex(index)) {
|
|
return {};
|
|
}
|
|
|
|
const int row = index.row();
|
|
if (role == ProfileRole) {
|
|
return QVariant::fromValue(m_profiles[row]);
|
|
}
|
|
|
|
return {};
|
|
}
|
|
|
|
QHash<int, QByteArray> ProfileManager::roleNames() const
|
|
{
|
|
return {{ProfileRole, QByteArrayLiteral("profile")}};
|
|
}
|
|
|
|
void ProfileManager::insertProfile(Profile *profile)
|
|
{
|
|
beginInsertRows(QModelIndex(), static_cast<int>(m_profiles.size()), static_cast<int>(m_profiles.size()));
|
|
m_profiles.append(profile);
|
|
endInsertRows();
|
|
Q_EMIT profilesChanged();
|
|
}
|
|
|
|
QList<Profile *> ProfileManager::profiles() const
|
|
{
|
|
return m_profiles;
|
|
}
|
|
|
|
bool ProfileManager::canDelete(Profile *account) const
|
|
{
|
|
Q_UNUSED(account)
|
|
return m_profiles.size() != 1;
|
|
}
|
|
|
|
bool ProfileManager::hasAnyExistingInstallations() const
|
|
{
|
|
return std::ranges::any_of(m_profiles, [](const auto &profile) {
|
|
return profile->isGameInstalled();
|
|
});
|
|
}
|
|
|
|
int ProfileManager::numProfiles() const
|
|
{
|
|
return static_cast<int>(m_profiles.count());
|
|
}
|
|
|
|
#include "moc_profilemanager.cpp" |