Compare commits

..

2 Commits

Author SHA1 Message Date
Petr Mrázek
836fefa2d9 WIP saving of config for offline mode name modes 2019-07-13 23:33:13 +02:00
Petr Mrázek
060992b448 WIP basic UI for offline mode name settings 2019-07-13 23:33:13 +02:00
6 changed files with 195 additions and 59 deletions

View File

@@ -4,7 +4,7 @@
#include <QSaveFile>
namespace {
bool load(const QString& path, RawGameOptions & contents)
bool load(const QString& path, std::vector<GameOptionItem> &contents, int & version)
{
contents.clear();
QFile file(path);
@@ -13,6 +13,7 @@ bool load(const QString& path, RawGameOptions & contents)
qWarning() << "Failed to read options file.";
return false;
}
version = 0;
while(!file.atEnd())
{
auto line = file.readLine();
@@ -30,32 +31,32 @@ bool load(const QString& path, RawGameOptions & contents)
qDebug() << "!!" << key << "!!";
if(key == "version")
{
contents.version = value.toInt();
version = value.toInt();
continue;
}
contents.mapping[key] = value;
contents.emplace_back(GameOptionItem{key, value});
}
qDebug() << "Loaded" << path << "with version:" << contents.version;
qDebug() << "Loaded" << path << "with version:" << version;
return true;
}
bool save(const QString& path, RawGameOptions& contents)
bool save(const QString& path, std::vector<GameOptionItem> &mapping, int version)
{
QSaveFile out(path);
if(!out.open(QIODevice::WriteOnly))
{
return false;
}
if(contents.version != 0)
if(version != 0)
{
QString versionLine = QString("version:%1\n").arg(contents.version);
QString versionLine = QString("version:%1\n").arg(version);
out.write(versionLine.toUtf8());
}
auto iter = contents.mapping.begin();
while (iter != contents.mapping.end())
auto iter = mapping.begin();
while (iter != mapping.end())
{
out.write(iter->first.toUtf8());
out.write(iter->key.toUtf8());
out.write(":");
out.write(iter->second.toUtf8());
out.write(iter->value.toUtf8());
out.write("\n");
iter++;
}
@@ -94,7 +95,7 @@ QVariant GameOptions::data(const QModelIndex& index, int role) const
int row = index.row();
int column = index.column();
if (row < 0 || row >= rowCount())
if (row < 0 || row >= int(contents.size()))
return QVariant();
switch (role)
@@ -102,11 +103,11 @@ QVariant GameOptions::data(const QModelIndex& index, int role) const
case Qt::DisplayRole:
if(column == 0)
{
return cookedOptions.items[row].id;
return contents[row].key;
}
else
{
return cookedOptions.items[row].default_value;
return contents[row].value;
}
default:
return QVariant();
@@ -116,7 +117,7 @@ QVariant GameOptions::data(const QModelIndex& index, int role) const
int GameOptions::rowCount(const QModelIndex&) const
{
return cookedOptions.items.size();
return contents.size();
}
int GameOptions::columnCount(const QModelIndex&) const
@@ -132,12 +133,12 @@ bool GameOptions::isLoaded() const
bool GameOptions::reload()
{
beginResetModel();
loaded = load(path, rawOptions);
loaded = load(path, contents, version);
endResetModel();
return loaded;
}
bool GameOptions::save()
{
return ::save(path, rawOptions);
return ::save(path, contents, version);
}

View File

@@ -4,46 +4,12 @@
#include <QString>
#include <QAbstractListModel>
struct RawGameOptions
{
void clear()
{
version = 0;
mapping.clear();
}
std::map<QString, QString> mapping;
int version = 0;
};
struct GameOptionItem
{
QString id;
enum ValueType
{
INT,
FLOAT,
BOOL,
FOV_MADNESS,
FPS_MADNESS
} value_type;
enum VisualType
{
} visual_type;
QVariant null_value;
QVariant default_value;
QVariant min_value;
QVariant max_value;
QString key;
QString value;
};
struct CookedGameOptions
{
std::vector<GameOptionItem> items;
};
class GameOptions : public QAbstractListModel
{
Q_OBJECT
@@ -61,8 +27,7 @@ public:
bool save();
private:
RawGameOptions rawOptions;
CookedGameOptions cookedOptions;
std::vector<GameOptionItem> contents;
bool loaded = false;
QString path;
int version = 0;

View File

@@ -488,6 +488,10 @@ MultiMC::MultiMC(int &argc, char **argv) : QApplication(argc, argv)
m_settings->registerSetting("InstSortMode", "Name");
m_settings->registerSetting("SelectedInstance", QString());
// Offline mode stuff
m_settings->registerSetting("OfflineModeNameMode", "UseAccountName");
m_settings->registerSetting("OfflineModeName", "Player");
// Window state and geometry
m_settings->registerSetting("MainWindowState", "");
m_settings->registerSetting("MainWindowGeometry", "");

View File

@@ -33,11 +33,18 @@
#include "MultiMC.h"
enum class OfflineModeNameMode
{
UseAccountName = 1,
RememberPerAccount = 2,
RememberPerInstance = 3,
UseFixedName = 4
};
AccountListPage::AccountListPage(QWidget *parent)
: QWidget(parent), ui(new Ui::AccountListPage)
{
ui->setupUi(this);
ui->tabWidget->tabBar()->hide();
m_accounts = MMC->accounts();
@@ -56,7 +63,15 @@ AccountListPage::AccountListPage(QWidget *parent)
connect(m_accounts.get(), SIGNAL(listChanged()), SLOT(listChanged()));
connect(m_accounts.get(), SIGNAL(activeAccountChanged()), SLOT(listChanged()));
ui->offlineButtonGroup->setId(ui->useSelectedNameBtn, int(OfflineModeNameMode::UseAccountName));
ui->offlineButtonGroup->setId(ui->rememberNamesForAccountsBtn, int(OfflineModeNameMode::RememberPerAccount));
ui->offlineButtonGroup->setId(ui->rememberNamesForInstancesBtn, int(OfflineModeNameMode::RememberPerInstance));
ui->offlineButtonGroup->setId(ui->useFixedNameBtn, int(OfflineModeNameMode::UseFixedName));
connect(ui->offlineButtonGroup, SIGNAL(buttonToggled(int,bool)), this, SLOT(groupSelectionChanged(int,bool)));
updateButtonStates();
loadSettings();
}
AccountListPage::~AccountListPage()
@@ -151,3 +166,68 @@ void AccountListPage::on_uploadSkinBtn_clicked()
dialog.exec();
}
}
bool AccountListPage::apply()
{
applySettings();
return true;
}
void AccountListPage::applySettings()
{
auto s = MMC->settings();
auto sortMode = (OfflineModeNameMode)ui->offlineButtonGroup->checkedId();
switch (sortMode)
{
default:
case OfflineModeNameMode::UseAccountName:
s->set("OfflineModeNameMode", "UseAccountName");
break;
case OfflineModeNameMode::RememberPerAccount:
s->set("OfflineModeNameMode", "RememberPerAccount");
break;
case OfflineModeNameMode::RememberPerInstance:
s->set("OfflineModeNameMode", "RememberPerInstance");
break;
case OfflineModeNameMode::UseFixedName:
s->set("OfflineModeNameMode", "UseFixedName");
break;
}
s->set("OfflineModeName", ui->mainOfflineNameEdit->text());
}
void AccountListPage::loadSettings()
{
auto s = MMC->settings();
auto value = s->get("OfflineModeNameMode").toString();
if(value == "UseAccountName")
{
ui->useSelectedNameBtn->setChecked(true);
}
else if(value == "RememberPerAccount")
{
ui->rememberNamesForAccountsBtn->setChecked(true);
}
else if(value == "RememberPerInstance")
{
ui->rememberNamesForInstancesBtn->setChecked(true);
}
else if(value == "UseFixedName")
{
ui->useFixedNameBtn->setChecked(true);
}
ui->mainOfflineNameEdit->setText(s->get("OfflineModeName").toString());
}
void AccountListPage::groupSelectionChanged(int, bool)
{
auto sortMode = (OfflineModeNameMode)ui->offlineButtonGroup->checkedId();
if(sortMode == OfflineModeNameMode::UseFixedName)
{
ui->mainOfflineNameEdit->setEnabled(true);
}
else
{
ui->mainOfflineNameEdit->setEnabled(false);
}
}

View File

@@ -58,6 +58,7 @@ public:
{
return "Getting-Started#adding-an-account";
}
bool apply() override;
public
slots:
@@ -73,6 +74,8 @@ slots:
void listChanged();
void groupSelectionChanged(int, bool);
//! Updates the states of the dialog's buttons.
void updateButtonStates();
@@ -83,6 +86,10 @@ protected
slots:
void addAccount(const QString& errMsg="");
private:
void applySettings();
void loadSettings();
private:
Ui::AccountListPage *ui;
};

View File

@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>694</width>
<height>609</height>
<width>333</width>
<height>302</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
@@ -28,9 +28,9 @@
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab">
<widget class="QWidget" name="onlineTab">
<attribute name="title">
<string notr="true">Tab 1</string>
<string>Online</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
@@ -113,10 +113,89 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="offlineTab">
<attribute name="title">
<string>Offline</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout22">
<item>
<widget class="QGroupBox" name="offlineBox">
<property name="title">
<string>Offline mode name</string>
</property>
<layout class="QGridLayout" name="foldersBoxLayout_2">
<item row="0" column="0">
<widget class="QRadioButton" name="useSelectedNameBtn">
<property name="text">
<string>&amp;Use selected account name</string>
</property>
<attribute name="buttonGroup">
<string notr="true">offlineButtonGroup</string>
</attribute>
</widget>
</item>
<item row="3" column="0">
<widget class="QRadioButton" name="useFixedNameBtn">
<property name="text">
<string>Always use &amp;this offline name:</string>
</property>
<attribute name="buttonGroup">
<string notr="true">offlineButtonGroup</string>
</attribute>
</widget>
</item>
<item row="4" column="0">
<widget class="QLineEdit" name="mainOfflineNameEdit">
<property name="enabled">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="rememberNamesForAccountsBtn">
<property name="text">
<string>Remember offline &amp;names per account</string>
</property>
<attribute name="buttonGroup">
<string notr="true">offlineButtonGroup</string>
</attribute>
</widget>
</item>
<item row="2" column="0">
<widget class="QRadioButton" name="rememberNamesForInstancesBtn">
<property name="text">
<string>Remember offline &amp;names per instance</string>
</property>
<attribute name="buttonGroup">
<string notr="true">offlineButtonGroup</string>
</attribute>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
<buttongroups>
<buttongroup name="offlineButtonGroup"/>
</buttongroups>
</ui>