mirror of
https://github.com/monero-project/monero-gui.git
synced 2024-11-17 00:07:51 +00:00
Merge pull request #3023
1aa98c3
MoneroSettings: portable mode, CWD relative 'monero-storage' dir (xiphon)
This commit is contained in:
commit
adb04cef71
2 changed files with 104 additions and 3 deletions
|
@ -134,12 +134,13 @@ QVariant MoneroSettings::readProperty(const QMetaProperty &property) const
|
||||||
void MoneroSettings::init()
|
void MoneroSettings::init()
|
||||||
{
|
{
|
||||||
if (!this->m_initialized) {
|
if (!this->m_initialized) {
|
||||||
this->m_settings = this->m_fileName.isEmpty() ? new QSettings() : new QSettings(this->m_fileName, QSettings::IniFormat);
|
this->m_settings = portableConfigExists() ? portableSettings() : unportableSettings();
|
||||||
#ifdef QT_DEBUG
|
#ifdef QT_DEBUG
|
||||||
qDebug() << "QQmlSettings: stored at" << this->m_settings->fileName();
|
qDebug() << "QQmlSettings: stored at" << this->m_settings->fileName();
|
||||||
#endif
|
#endif
|
||||||
this->load();
|
this->load();
|
||||||
this->m_initialized = true;
|
this->m_initialized = true;
|
||||||
|
emit portableChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,11 +149,16 @@ void MoneroSettings::reset()
|
||||||
if (this->m_initialized && this->m_settings && !this->m_changedProperties.isEmpty())
|
if (this->m_initialized && this->m_settings && !this->m_changedProperties.isEmpty())
|
||||||
this->store();
|
this->store();
|
||||||
if (this->m_settings)
|
if (this->m_settings)
|
||||||
delete this->m_settings;
|
this->m_settings.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MoneroSettings::store()
|
void MoneroSettings::store()
|
||||||
{
|
{
|
||||||
|
if (!m_writable)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
QHash<const char *, QVariant>::const_iterator it = this->m_changedProperties.constBegin();
|
QHash<const char *, QVariant>::const_iterator it = this->m_changedProperties.constBegin();
|
||||||
|
|
||||||
while (it != this->m_changedProperties.constEnd()) {
|
while (it != this->m_changedProperties.constEnd()) {
|
||||||
|
@ -168,6 +174,58 @@ void MoneroSettings::store()
|
||||||
this->m_changedProperties.clear();
|
this->m_changedProperties.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MoneroSettings::portable() const
|
||||||
|
{
|
||||||
|
return this->m_settings && this->m_settings->fileName() == portableFilePath();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MoneroSettings::portableConfigExists() const
|
||||||
|
{
|
||||||
|
QFileInfo info(portableFilePath());
|
||||||
|
return info.exists() && info.isFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString MoneroSettings::portableFilePath() const
|
||||||
|
{
|
||||||
|
static QString filename(QDir(portableFolderName()).absoluteFilePath("settings.ini"));
|
||||||
|
return filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString MoneroSettings::portableFolderName() const
|
||||||
|
{
|
||||||
|
return "monero-storage";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<QSettings> MoneroSettings::portableSettings() const
|
||||||
|
{
|
||||||
|
return std::unique_ptr<QSettings>(new QSettings(portableFilePath(), QSettings::IniFormat));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<QSettings> MoneroSettings::unportableSettings() const
|
||||||
|
{
|
||||||
|
if (this->m_fileName.isEmpty())
|
||||||
|
{
|
||||||
|
return std::unique_ptr<QSettings>(new QSettings());
|
||||||
|
}
|
||||||
|
return std::unique_ptr<QSettings>(new QSettings(this->m_fileName, QSettings::IniFormat));
|
||||||
|
}
|
||||||
|
|
||||||
|
void MoneroSettings::swap(std::unique_ptr<QSettings> newSettings)
|
||||||
|
{
|
||||||
|
const QMetaObject *mo = this->metaObject();
|
||||||
|
const int count = mo->propertyCount();
|
||||||
|
for (int offset = mo->propertyOffset(); offset < count; ++offset)
|
||||||
|
{
|
||||||
|
const QMetaProperty &property = mo->property(offset);
|
||||||
|
const QVariant value = readProperty(property);
|
||||||
|
newSettings->setValue(property.name(), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
this->m_settings.swap(newSettings);
|
||||||
|
this->m_settings->sync();
|
||||||
|
emit portableChanged();
|
||||||
|
}
|
||||||
|
|
||||||
void MoneroSettings::setFileName(const QString &fileName)
|
void MoneroSettings::setFileName(const QString &fileName)
|
||||||
{
|
{
|
||||||
if (fileName != this->m_fileName) {
|
if (fileName != this->m_fileName) {
|
||||||
|
@ -183,6 +241,30 @@ QString MoneroSettings::fileName() const
|
||||||
return this->m_fileName;
|
return this->m_fileName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MoneroSettings::setPortable(bool enabled)
|
||||||
|
{
|
||||||
|
std::unique_ptr<QSettings> newSettings = enabled ? portableSettings() : unportableSettings();
|
||||||
|
if (newSettings->status() != QSettings::NoError)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
setWritable(true);
|
||||||
|
swap(std::move(newSettings));
|
||||||
|
|
||||||
|
if (!enabled)
|
||||||
|
{
|
||||||
|
QFile::remove(portableFilePath());
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MoneroSettings::setWritable(bool enabled)
|
||||||
|
{
|
||||||
|
m_writable = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
void MoneroSettings::timerEvent(QTimerEvent *event)
|
void MoneroSettings::timerEvent(QTimerEvent *event)
|
||||||
{
|
{
|
||||||
if (event->timerId() == this->m_timerId) {
|
if (event->timerId() == this->m_timerId) {
|
||||||
|
|
|
@ -36,6 +36,8 @@
|
||||||
#ifndef MONEROSETTINGS_H
|
#ifndef MONEROSETTINGS_H
|
||||||
#define MONEROSETTINGS_H
|
#define MONEROSETTINGS_H
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
#include <QtQml/qqmlparserstatus.h>
|
#include <QtQml/qqmlparserstatus.h>
|
||||||
#include <QGuiApplication>
|
#include <QGuiApplication>
|
||||||
#include <QClipboard>
|
#include <QClipboard>
|
||||||
|
@ -50,15 +52,23 @@ class MoneroSettings : public QObject, public QQmlParserStatus
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_INTERFACES(QQmlParserStatus)
|
Q_INTERFACES(QQmlParserStatus)
|
||||||
Q_PROPERTY(QString fileName READ fileName WRITE setFileName FINAL)
|
Q_PROPERTY(QString fileName READ fileName WRITE setFileName FINAL)
|
||||||
|
Q_PROPERTY(bool portable READ portable NOTIFY portableChanged)
|
||||||
|
Q_PROPERTY(QString portableFolderName READ portableFolderName CONSTANT)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit MoneroSettings(QObject *parent = nullptr);
|
explicit MoneroSettings(QObject *parent = nullptr);
|
||||||
|
|
||||||
QString fileName() const;
|
QString fileName() const;
|
||||||
void setFileName(const QString &fileName);
|
void setFileName(const QString &fileName);
|
||||||
|
Q_INVOKABLE bool setPortable(bool enabled);
|
||||||
|
Q_INVOKABLE void setWritable(bool enabled);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void _q_propertyChanged();
|
void _q_propertyChanged();
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void portableChanged() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void timerEvent(QTimerEvent *event) override;
|
void timerEvent(QTimerEvent *event) override;
|
||||||
void classBegin() override;
|
void classBegin() override;
|
||||||
|
@ -71,10 +81,19 @@ private:
|
||||||
void load();
|
void load();
|
||||||
void store();
|
void store();
|
||||||
|
|
||||||
|
bool portable() const;
|
||||||
|
bool portableConfigExists() const;
|
||||||
|
QString portableFilePath() const;
|
||||||
|
QString portableFolderName() const;
|
||||||
|
std::unique_ptr<QSettings> portableSettings() const;
|
||||||
|
std::unique_ptr<QSettings> unportableSettings() const;
|
||||||
|
void swap(std::unique_ptr<QSettings> newSettings);
|
||||||
|
|
||||||
QHash<const char *, QVariant> m_changedProperties;
|
QHash<const char *, QVariant> m_changedProperties;
|
||||||
QSettings *m_settings = NULL;
|
std::unique_ptr<QSettings> m_settings;
|
||||||
QString m_fileName = QString("");
|
QString m_fileName = QString("");
|
||||||
bool m_initialized = false;
|
bool m_initialized = false;
|
||||||
|
bool m_writable = true;
|
||||||
int m_timerId = 0;
|
int m_timerId = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue