summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraqua <aqua@iserlohn-fortress.net>2022-09-08 10:27:30 +0300
committeraqua <aqua@iserlohn-fortress.net>2022-09-08 16:33:03 +0300
commitaf1eff03c9e839914aab4109970c4a9f6fac8a99 (patch)
treeae11034560b0e1c270614077ffd8f0f7485c7381
parentAdd RekonqWindow tests (diff)
downloadrekonq-af1eff03c9e839914aab4109970c4a9f6fac8a99.tar.xz
RekonqSettings: add resetValue and remove value's defaultValue parameter
- generate default rekonqrc and include it in libsettings - Settings uses :/settings/rekonqrc to provide default values - Add Settings::path() to get the default settings location
-rw-r--r--.gitignore3
-rw-r--r--CMakeLists.txt2
-rw-r--r--include/rsettings.hpp3
-rwxr-xr-xscripts/rekonf.py52
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/application.cpp10
-rw-r--r--src/main.cpp1
-rw-r--r--src/rekonq.kcfg2
-rw-r--r--src/settings/CMakeLists.txt13
-rw-r--r--src/settings/settings.cpp51
-rw-r--r--src/settings/settings.hpp14
-rw-r--r--src/settings/settings.qrc (renamed from src/settings/test/test_settings.qrc)2
-rw-r--r--src/settings/settingsdialog.cpp16
-rw-r--r--src/settings/settingswidget.cpp42
-rw-r--r--src/settings/settingswidgets.hpp6
-rw-r--r--src/settings/test/rekonqrc37
-rw-r--r--src/settings/test/settings_mock.hpp3
-rw-r--r--src/settings/test/test_settings.cpp82
-rw-r--r--src/settings/test/test_settingsdialog.cpp9
-rw-r--r--src/tabbar/CMakeLists.txt2
-rw-r--r--src/urlbar/CMakeLists.txt2
21 files changed, 189 insertions, 165 deletions
diff --git a/.gitignore b/.gitignore
index 9add7aa9..136cbf6d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,6 +11,9 @@ CMakeCache.txt
debug.log
.gdb_history
+.cache
+compile_commands.json
cmake-build-debug/
cmake-build-coverage/
cmake-build-release/
+src/settings/rekonqrc
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ea9ef655..540ed7e2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -117,7 +117,7 @@ add_executable(rekonq ${rekonq_SRCS} third-party/resources.qrc)
target_include_directories(rekonq PRIVATE src)
target_link_libraries(rekonq
spdlog::spdlog Qt6::Widgets SingleApplication::SingleApplication
- settings pluginloader tabbar urlbar
+ settings pluginloader
)
add_custom_target(rekonq_check_license python scripts/check_license.py ${rekonq_SRCS}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
diff --git a/include/rsettings.hpp b/include/rsettings.hpp
index 9f0fc4d0..67eb46e2 100644
--- a/include/rsettings.hpp
+++ b/include/rsettings.hpp
@@ -23,7 +23,8 @@ public:
virtual void endGroup() = 0;
virtual void setValue(const QString &key, const QVariant &value) = 0;
- [[nodiscard]] virtual QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const = 0;
+ virtual void resetValue(const QString &key) = 0;
+ [[nodiscard]] virtual QVariant value(const QString &key) const = 0;
[[nodiscard]] virtual QString filePath() const = 0;
diff --git a/scripts/rekonf.py b/scripts/rekonf.py
index 941c29c7..6bb5d084 100755
--- a/scripts/rekonf.py
+++ b/scripts/rekonf.py
@@ -13,42 +13,42 @@ import sys
from xml.etree import ElementTree
-def write_int_entry(obj, name, default):
- """Add a QSpinBox connected to an Int (obj, name, default)"""
+def write_int_entry(obj, name):
+ """Add a QSpinBox connected to an Int"""
print(f' auto* { obj } = new QSpinBox(this);')
- print(f' { obj }->setValue(s->value("{ obj }", { default }).toInt());')
+ print(f' { obj }->setValue(s->value("{ obj }").toInt());')
print(f' connect({ obj }, &QSpinBox::valueChanged, this, [this]() {{ emit changed(); }});')
print(f' formLayout->addRow(tr("{ name }"), { obj });')
-def write_bool_entry(obj, name, default):
- """Add a QCheckBox connected to a Bool (obj, name, default)"""
+def write_bool_entry(obj, name):
+ """Add a QCheckBox connected to a Bool"""
print(f' auto* { obj } = new QCheckBox(tr("{ name }"), this);')
- print(f' { obj }->setChecked(s->value("{ obj }", { default }).toBool());')
+ print(f' { obj }->setChecked(s->value("{ obj }").toBool());')
print(f' connect({ obj }, &QCheckBox::stateChanged, this, [this]() {{ emit changed(); }});')
print(f' formLayout->addRow(QString(), { obj });')
-def write_string_entry(obj, name, default):
- """Add a QLineEdit connected to a String (obj, name, default)"""
+def write_string_entry(obj, name):
+ """Add a QLineEdit connected to a String"""
print(f' auto* {obj} = new QLineEdit(this);')
- print(f' { obj }->setText(s->value("{ obj }", "{ default }").toString());')
+ print(f' { obj }->setText(s->value("{ obj }").toString());')
print(f' connect({ obj }, &QLineEdit::textChanged, this, [this]() {{ emit changed(); }});')
print(f' formLayout->addRow(tr("{ name }"), { obj });')
-def write_font_entry(obj, name, default):
- """Add a QFontComboBox connected to a Font (obj, name, default)"""
+def write_font_entry(obj, name):
+ """Add a QFontComboBox connected to a Font"""
print(f' auto* { obj } = new QFontComboBox(this);')
- print(f' { obj }->setCurrentFont(s->value("{ obj }", "{ default }").toString());')
+ print(f' { obj }->setCurrentFont(s->value("{ obj }").toString());')
print(f' connect({ obj }, &QFontComboBox::currentFontChanged, this, [this]() {{ emit changed(); }});')
print(f' formLayout->addRow(tr("{ name }"), { obj });')
-def write_shortcut_entry(obj, name, default):
- """Add a QKeySequenceEdit connected to a Shortcut (obj, name, default)"""
+def write_shortcut_entry(obj, name):
+ """Add a QKeySequenceEdit connected to a Shortcut"""
print(f' auto* { obj } = new QKeySequenceEdit(this);')
- print(f' { obj }->setKeySequence(s->value("{ obj }", "{ default }").toString());')
+ print(f' { obj }->setKeySequence(s->value("{ obj }").toString());')
print(f' connect({ obj }, &QKeySequenceEdit::keySequenceChanged, this, [this]() {{ emit changed(); }});')
print(f' formLayout->addRow(tr("{ name }"), { obj });')
@@ -69,7 +69,6 @@ def generate_group_widget(root, group):
# includes
print('// Includes')
print('#include "settingswidgets.hpp"')
- print('#include "helpers.hpp"')
print('#include <QFormLayout>')
print('#include <QLineEdit>')
print('#include <QSpinBox>')
@@ -97,16 +96,29 @@ def generate_group_widget(root, group):
else:
obj = entry.attrib['key']
name = entry.attrib["name"]
- default = entry.find('{*}default').text
- write_entry_fn.get(entry.attrib['type'])(obj, name, default)
+ write_entry_fn.get(entry.attrib['type'])(obj, name)
print(f' { obj }->setObjectName("{ obj }");')
- print(f' { obj }->setProperty("defaultValue", "{ default }");')
print('')
if class_group != 'General':
- print(' s->endGroup();')
+ print(' m_settings->endGroup();')
print('}\n')
+ # reset
+ print(f'void { class_name }::reset() {{')
+ if class_group != 'General':
+ print(f' m_settings->beginGroup("{ class_group }");')
+
+ for entry in group.findall('{http://www.kde.org/standards/kcfg/1.0}entry'):
+ if entry.attrib.get("hidden") == "true":
+ print(f' // hidden entry { entry.attrib.get("name") }')
+ else:
+ key = entry.attrib['key']
+ print(f' m_settings->resetValue("{ key }");')
+
+ if class_group != 'General':
+ print(' m_settings->endGroup();')
+ print('}\n')
def generate_group_ini(group):
"""Generate settings in ini format for group"""
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index b9712235..a4193a16 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -3,8 +3,6 @@
ADD_SUBDIRECTORY( data )
add_subdirectory(settings)
add_subdirectory(plugins)
-add_subdirectory(tabbar)
-add_subdirectory(urlbar)
### ------- sources --------
diff --git a/src/application.cpp b/src/application.cpp
index 295d2708..c3858a4a 100644
--- a/src/application.cpp
+++ b/src/application.cpp
@@ -29,17 +29,13 @@ Application::Application(int &argc, char *argv[]) : SingleApplication(argc, argv
connect(this, &SingleApplication::receivedMessage, this, &Application::parseCommandLine);
// updating rekonq configuration
- const auto settingsPath =
- QDir(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation)).filePath("rekonqrc");
+ const auto settingsPath = Settings::path();
spdlog::info("Loading rekonq configuration: {}", qUtf8Printable(settingsPath));
m_settings = new Settings(settingsPath, this);
- if (m_settings->value("FirstRun", true).toBool()) {
+ if (m_settings->value("FirstRun").toBool()) {
spdlog::info("First run");
- if ((new SettingsDialog(m_settings, nullptr))->exec()) {
- spdlog::info("new settings saved");
- m_settings->setValue("FirstRun", false);
- }
+ if ((new SettingsDialog(m_settings, nullptr))->exec()) spdlog::info("Settings saved");
}
// load default plugins
diff --git a/src/main.cpp b/src/main.cpp
index 51e68716..a537be8b 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -17,6 +17,7 @@ int main(int argc, char **argv)
#ifdef QT_DEBUG
spdlog::set_level(spdlog::level::debug);
#endif
+ Q_INIT_RESOURCE(settings);
// When loading QtWebEngine from a plugin, set Qt::AA_ShareOpenGLContexts using QCoreApplication::setAttribute
QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts, true);
diff --git a/src/rekonq.kcfg b/src/rekonq.kcfg
index f3013859..eab64724 100644
--- a/src/rekonq.kcfg
+++ b/src/rekonq.kcfg
@@ -27,7 +27,7 @@
<default>https://duckduckgo.com/?q=%1</default>
</entry>
<entry name="Profile Path" key="profilePath" type="String">
- <default code="true">TODO: change type to Path</default>
+ <default>TODO: change type to Path</default>
</entry>
<entry name="Load plugins from" key="pluginPath" type="String">
<default>TODO: change type to Path</default>
diff --git a/src/settings/CMakeLists.txt b/src/settings/CMakeLists.txt
index 712fd57a..38a35cf6 100644
--- a/src/settings/CMakeLists.txt
+++ b/src/settings/CMakeLists.txt
@@ -15,11 +15,20 @@ add_custom_command(OUTPUT shortcutssettingswidget.cpp DEPENDS ${PROJECT_SOURCE_D
--group=Shortcuts --output=shortcutssettingswidget.cpp
${PROJECT_SOURCE_DIR}/src/rekonq.kcfg)
+# generate rekonqrc
+execute_process(
+ COMMAND python3 ${PROJECT_SOURCE_DIR}/scripts/rekonf.py --group=all --output=rekonqrc ${PROJECT_SOURCE_DIR}/src/rekonq.kcfg
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ #OUTPUT rekonqrc
+ #DEPENDS ${PROJECT_SOURCE_DIR}/scripts/rekonf.py ${PROJECT_SOURCE_DIR}/src/rekonq.kcfg
+)
+
add_library(settings STATIC
${PROJECT_SOURCE_DIR}/include/rsettings.hpp settings.cpp settings.hpp
settingsdialog.cpp settingsdialog.h settingsdialog.ui
settingswidgets.hpp settingswidget.cpp helpers.hpp
generalsettingswidget.cpp appearancesettingswidget.cpp networksettingswidget.cpp shortcutssettingswidget.cpp
+ settings.qrc rekonqrc
)
target_link_libraries(settings PUBLIC Qt6::Widgets)
@@ -27,7 +36,7 @@ IF(${CMAKE_BUILD_TYPE} STREQUAL "Debug")
add_executable(test_settingsdialog test/test_settingsdialog.cpp test/settings_mock.hpp)
target_link_libraries(test_settingsdialog GTest::gmock settings)
- add_executable(test_settings test/test_settings.cpp test/test_settings.qrc test/settings_mock.hpp)
+ add_executable(test_settings test/test_settings.cpp test/settings_mock.hpp)
target_link_libraries(test_settings PRIVATE GTest::gtest GTest::gmock settings)
- gtest_discover_tests(test_settings EXTRA_ARGS rekonqrc)
+ gtest_discover_tests(test_settings)
endif()
diff --git a/src/settings/settings.cpp b/src/settings/settings.cpp
index 190bc977..d7216b2e 100644
--- a/src/settings/settings.cpp
+++ b/src/settings/settings.cpp
@@ -8,23 +8,66 @@
* ============================================================ */
#include "settings.hpp"
+#include "../rekonq.hpp"
+#include "helpers.hpp"
+#include <QDir>
#include <QSettings>
+#include <QStandardPaths>
+
+QString Settings::path()
+{
+ return QDir(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation)).filePath("rekonqrc");
+}
Settings::Settings(const QString &path, QObject *parent) : RekonqSettings(parent)
{
d = new QSettings(path, QSettings::IniFormat, this);
+ b = new QSettings(":/settings/rekonqrc", QSettings::IniFormat, this);
}
-void Settings::beginGroup(const QString &prefix) { d->beginGroup(prefix); }
+Settings::~Settings()
+{
+ delete d;
+ delete b;
+}
-void Settings::endGroup() { d->endGroup(); }
+void Settings::beginGroup(const QString &prefix)
+{
+ d->beginGroup(prefix);
+ b->beginGroup(prefix);
+}
+
+void Settings::endGroup()
+{
+ d->endGroup();
+ b->endGroup();
+}
void Settings::setValue(const QString &key, const QVariant &value)
{
- d->setValue(key, value);
+ if (value == b->value(key)) d->remove(key);
+ else
+ d->setValue(key, value);
emit changed(key, value);
}
-QVariant Settings::value(const QString &key, const QVariant &defaultValue) const { return d->value(key, defaultValue); }
+void Settings::resetValue(const QString &key) { d->remove(key); }
+
+QVariant Settings::value(const QString &key) const
+{
+ auto v = d->value(key);
+ if (v.isValid()) return v;
+
+ if (key == QL1S("standardFontFamily")) return getFont(QFont::System).family();
+ if (key == QL1S("fixedFontFamily")) return getFont(QFont::Monospace).family();
+ if (key == QL1S("serifFontFamily")) return getFont(QFont::Times).family();
+ if (key == QL1S("sansSerifFontFamily")) return getFont(QFont::Helvetica).family();
+ if (key == QL1S("cursiveFontFamily")) return getFont(QFont::Cursive).family();
+ if (key == QL1S("fantasyFontFamily")) return getFont(QFont::Fantasy).family();
+
+ v = b->value(key);
+ Q_ASSERT_X(v.isValid(), __PRETTY_FUNCTION__, qUtf8Printable(key));
+ return v;
+}
QString Settings::filePath() const { return d->fileName(); }
diff --git a/src/settings/settings.hpp b/src/settings/settings.hpp
index 713ce38d..8d413985 100644
--- a/src/settings/settings.hpp
+++ b/src/settings/settings.hpp
@@ -12,22 +12,28 @@
#include <rsettings.hpp>
class QSettings;
-class Settings final : public RekonqSettings {
+class Settings : public RekonqSettings {
Q_OBJECT
public:
+ [[nodiscard]] static QString path();
+
explicit Settings(const QString &settingsPath, QObject *parent = nullptr);
- ~Settings() override = default;
+ ~Settings() override;
void beginGroup(const QString &prefix) override;
void endGroup() override;
void setValue(const QString &key, const QVariant &value) override;
- [[nodiscard]] QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const override;
+ void resetValue(const QString &key) override;
+ [[nodiscard]] QVariant value(const QString &key) const override;
[[nodiscard]] QString filePath() const override;
+protected:
+ QSettings *d;
+ QSettings *b;
+
private:
Q_DISABLE_COPY_MOVE(Settings)
- QSettings *d;
};
diff --git a/src/settings/test/test_settings.qrc b/src/settings/settings.qrc
index 16e74fef..71e19674 100644
--- a/src/settings/test/test_settings.qrc
+++ b/src/settings/settings.qrc
@@ -1,7 +1,7 @@
<?xml version='1.0' encoding='utf-8' standalone='yes'?>
<!DOCTYPE RCC>
<RCC version="1.0">
- <qresource prefix="/">
+ <qresource prefix="/settings">
<file alias="rekonqrc">rekonqrc</file>
</qresource>
</RCC>
diff --git a/src/settings/settingsdialog.cpp b/src/settings/settingsdialog.cpp
index 68fa7a26..66a47140 100644
--- a/src/settings/settingsdialog.cpp
+++ b/src/settings/settingsdialog.cpp
@@ -23,7 +23,7 @@ SettingsDialog::SettingsDialog(RekonqSettings *settings, QWidget *parent) : QDia
restoreDefaultsBtn = ui->buttonBox->button(QDialogButtonBox::RestoreDefaults);
Q_CHECK_PTR(restoreDefaultsBtn);
- if (!settings->value("FirstRun", true).toBool()) saveBtn->setEnabled(false);
+ if (!settings->value("FirstRun").toBool()) saveBtn->setEnabled(false);
addPage(new GeneralSettingsWidget(settings, this));
addPage(new AppearanceSettingsWidget(settings, this));
@@ -32,16 +32,14 @@ SettingsDialog::SettingsDialog(RekonqSettings *settings, QWidget *parent) : QDia
connect(ui->listWidget, &QListWidget::currentRowChanged, ui->stackedWidget, &QStackedWidget::setCurrentIndex);
- connect(restoreDefaultsBtn, &QPushButton::clicked, this, [this]() {
- for (auto *w : ui->stackedWidget->findChildren<SettingsWidget *>(QString(), Qt::FindDirectChildrenOnly)) {
- w->reset();
- }
+ connect(restoreDefaultsBtn, &QPushButton::clicked, this, [this, settings]() {
+ for (auto *w : ui->stackedWidget->findChildren<SettingsWidget *>(QString(), Qt::FindDirectChildrenOnly)) w->reset();
+ settings->setValue("FirstRun", false);
+ close();
});
connect(this, &QDialog::accepted, this, [this]() {
- for (auto *w : ui->stackedWidget->findChildren<SettingsWidget *>(QString(), Qt::FindDirectChildrenOnly)) {
- w->save();
- }
+ for (auto *w : ui->stackedWidget->findChildren<SettingsWidget *>(QString(), Qt::FindDirectChildrenOnly)) w->save();
});
}
@@ -54,4 +52,4 @@ void SettingsDialog::addPage(SettingsWidget *page)
ui->stackedWidget->addWidget(page);
connect(page, &SettingsWidget::changed, this, [this]() { saveBtn->setEnabled(true); });
-} \ No newline at end of file
+}
diff --git a/src/settings/settingswidget.cpp b/src/settings/settingswidget.cpp
index b5a2432c..60f2bf62 100644
--- a/src/settings/settingswidget.cpp
+++ b/src/settings/settingswidget.cpp
@@ -37,45 +37,3 @@ void SettingsWidget::save()
if (objectName() != QLatin1String("General")) m_settings->endGroup();
}
-
-void SettingsWidget::reset()
-{
- if (objectName() != QLatin1String("General")) m_settings->beginGroup(objectName());
-
- // Int
- for (auto *spinbox : findChildren<QSpinBox *>(QString(), Qt::FindDirectChildrenOnly)) {
- const auto value = spinbox->property("defaultValue");
- spinbox->setValue(value.toInt());
- m_settings->setValue(spinbox->objectName(), value);
- }
-
- // Bool
- for (auto *checkbox : findChildren<QCheckBox *>(QString(), Qt::FindDirectChildrenOnly)) {
- const auto value = checkbox->property("defaultValue");
- checkbox->setChecked(value.toBool());
- m_settings->setValue(checkbox->objectName(), value);
- }
-
- // String
- for (auto *lineedit : findChildren<QLineEdit *>(QString(), Qt::FindDirectChildrenOnly)) {
- const auto value = lineedit->property("defaultValue");
- lineedit->setText(value.toString());
- m_settings->setValue(lineedit->objectName(), value);
- }
-
- // Font
- for (auto *font : findChildren<QFontComboBox *>(QString(), Qt::FindDirectChildrenOnly)) {
- const auto value = font->property("defaultValue");
- font->setFont(QFont(value.toString()));
- m_settings->setValue(font->objectName(), value);
- }
-
- // Shortcut
- for (auto *shortcut : findChildren<QKeySequenceEdit *>(QString(), Qt::FindDirectChildrenOnly)) {
- const auto value = shortcut->property("defaultValue");
- shortcut->setKeySequence(value.toString());
- m_settings->setValue(shortcut->objectName(), value);
- }
-
- if (objectName() != QLatin1String("General")) m_settings->endGroup();
-} \ No newline at end of file
diff --git a/src/settings/settingswidgets.hpp b/src/settings/settingswidgets.hpp
index cb08b591..532a5683 100644
--- a/src/settings/settingswidgets.hpp
+++ b/src/settings/settingswidgets.hpp
@@ -27,7 +27,7 @@ signals:
public slots:
void save();
- void reset();
+ virtual void reset() = 0;
protected:
RekonqSettings *m_settings;
@@ -38,6 +38,7 @@ class GeneralSettingsWidget final : public SettingsWidget {
public:
explicit GeneralSettingsWidget(RekonqSettings *, QWidget *parent = nullptr);
~GeneralSettingsWidget() override = default;
+ void reset() override;
};
class AppearanceSettingsWidget final : public SettingsWidget {
@@ -45,6 +46,7 @@ class AppearanceSettingsWidget final : public SettingsWidget {
public:
explicit AppearanceSettingsWidget(RekonqSettings *, QWidget *parent = nullptr);
~AppearanceSettingsWidget() override = default;
+ void reset() override;
};
class NetworkSettingsWidget final : public SettingsWidget {
@@ -52,6 +54,7 @@ class NetworkSettingsWidget final : public SettingsWidget {
public:
explicit NetworkSettingsWidget(RekonqSettings *, QWidget *parent = nullptr);
~NetworkSettingsWidget() override = default;
+ void reset() override;
};
class ShortcutsSettingsWidget final : public SettingsWidget {
@@ -59,4 +62,5 @@ class ShortcutsSettingsWidget final : public SettingsWidget {
public:
explicit ShortcutsSettingsWidget(RekonqSettings *, QWidget *parent = nullptr);
~ShortcutsSettingsWidget() override = default;
+ void reset() override;
};
diff --git a/src/settings/test/rekonqrc b/src/settings/test/rekonqrc
deleted file mode 100644
index fe67194c..00000000
--- a/src/settings/test/rekonqrc
+++ /dev/null
@@ -1,37 +0,0 @@
-[General]
-FirstRun=true
-lang=TODO: change type to StringList
-homepage=about:blank
-newtab=about:blank
-searchUrl=https://duckduckgo.com/?q=%1
-pluginPath=TODO: change type to Path
-
-[Network]
-downloadPath=TODO: change type to Path
-downloadPathAsk=true
-userAgent=TODO
-
-[Appearance]
-IconTheme=tabler
-defaultFontSize=16
-minFontSize=7
-defaultEncoding=ISO 8859-1
-defaultZoom=10
-
-[Shortcuts]
-actionShowSidebar=Ctrl+B
-actionShowSearchBar=Ctrl+F
-actionSettings=Ctrl+S
-actionQuit=Ctrl+Q
-actionNewTab=Ctrl+T
-actionCloseTab=Ctrl+W
-actionSwitchTabLeft=Ctrl+Left
-actionSwitchTabRight=Ctrl+Right
-actionFocusAddressBar=F6
-actionBack=Alt+Left
-actionForward=Alt+Right
-actionRefresh=F5
-actionReload=Ctrl+F5
-actionOpen=Ctrl+O
-actionBookmark=Ctrl+D
-
diff --git a/src/settings/test/settings_mock.hpp b/src/settings/test/settings_mock.hpp
index bc3fbc2f..bf0e137a 100644
--- a/src/settings/test/settings_mock.hpp
+++ b/src/settings/test/settings_mock.hpp
@@ -21,7 +21,8 @@ public:
MOCK_METHOD(void, endGroup, (), (override));
MOCK_METHOD(void, setValue, (const QString &, const QVariant &), (override));
- MOCK_METHOD(QVariant, value, (const QString &, const QVariant &), (const, override));
+ MOCK_METHOD(void, resetValue, (const QString &), (override));
+ MOCK_METHOD(QVariant, value, (const QString &), (const, override));
MOCK_METHOD(QString, filePath, (), (const, override));
};
diff --git a/src/settings/test/test_settings.cpp b/src/settings/test/test_settings.cpp
index 6efc64c3..a797a224 100644
--- a/src/settings/test/test_settings.cpp
+++ b/src/settings/test/test_settings.cpp
@@ -7,9 +7,10 @@
#include <QApplication>
#include <QDialogButtonBox>
-#include <QDir>
+#include <QFile>
#include <QLineEdit>
#include <QPushButton>
+#include <QSettings>
#include <QStandardPaths>
#include <gtest/gtest.h>
@@ -19,9 +20,10 @@
#include "../settingsdialog.h"
#include "settings_mock.hpp"
-using ::testing::_;
+using ::testing::_; // NOLINT(bugprone-reserved-identifier)
using ::testing::AtLeast;
using ::testing::ContainerEq;
+using ::testing::Return;
using ::testing::ReturnArg;
MATCHER_P(QStringEq, a, "")
@@ -32,7 +34,7 @@ MATCHER_P(QStringEq, a, "")
MATCHER_P(QVariantEq, a, "")
{
*result_listener << "where the arg is " << qUtf8Printable(arg.toString());
- return arg.toString().compare(a) == 0;
+ return arg == QVariant(a);
}
TEST(settings, getFont)
@@ -46,15 +48,30 @@ TEST(settings, getFont)
TEST(settings, settingsPath)
{
- const auto path = QDir(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation)).filePath("rekonqrc");
+ const auto path = Settings::path();
EXPECT_FALSE(path.isEmpty());
EXPECT_TRUE(path.endsWith("rekonqrc"));
+
+ QFile defaultSettingsPath(":/settings/rekonqrc");
+ EXPECT_TRUE(defaultSettingsPath.exists());
}
+class TestSettings : public Settings {
+public:
+ TestSettings(const QString &path = QString()) : Settings(path, nullptr){};
+ ~TestSettings() override = default;
+
+ [[nodiscard]] auto groups() const { return d->childGroups(); }
+ [[nodiscard]] auto keys() const { return d->childKeys(); }
+};
+
TEST(settings, Settings)
{
- Settings settings(":rekonqrc");
- EXPECT_THAT(settings.filePath(), QStringEq(":rekonqrc"));
+ TestSettings settings;
+ EXPECT_TRUE(settings.filePath().isEmpty());
+
+ EXPECT_TRUE(settings.groups().isEmpty());
+ EXPECT_TRUE(settings.keys().isEmpty());
const auto FirstRun = settings.value("FirstRun");
EXPECT_TRUE(FirstRun.isValid());
@@ -63,6 +80,9 @@ TEST(settings, Settings)
settings.setValue("FirstRun", false);
EXPECT_FALSE(settings.value("FirstRun").toBool());
+ EXPECT_TRUE(settings.groups().isEmpty());
+ EXPECT_EQ(settings.keys().count(), 1);
+
settings.beginGroup("Network");
const auto downloadPathAsk = settings.value("downloadPathAsk");
EXPECT_TRUE(downloadPathAsk.isValid());
@@ -72,9 +92,12 @@ TEST(settings, Settings)
const auto searchUrl = settings.value("searchUrl");
EXPECT_TRUE(searchUrl.isValid());
EXPECT_EQ(searchUrl.toString(), QString("https://duckduckgo.com/?q=%1"));
+
+ EXPECT_TRUE(settings.groups().isEmpty());
+ EXPECT_EQ(settings.keys().count(), 1);
}
-TEST(settings, SettingsDialog)
+TEST(settings, SettingsDialog_mock)
{
constexpr unsigned n_settings = 36; // there are 36 settings in total
MockSettings mockSettings;
@@ -82,16 +105,20 @@ TEST(settings, SettingsDialog)
// beginGroup/endGroup are called twice: during the ctor and when accepted
EXPECT_CALL(mockSettings, beginGroup).Times(3 * 4);
EXPECT_CALL(mockSettings, endGroup).Times(3 * 4);
- EXPECT_CALL(mockSettings, value).Times(n_settings * 2).WillRepeatedly(ReturnArg<1>());
- // 1 setting is hidden and won't be set by the dialog
- // save and reset will both call setValue on all non-hidden settings
- EXPECT_CALL(mockSettings, setValue(_, _)).Times(n_settings * 2 - 3);
+ EXPECT_CALL(mockSettings, value).Times(n_settings * 2 - 2).WillRepeatedly(ReturnArg<0>());
+ EXPECT_CALL(mockSettings, value(QStringEq("homepage"))).Times(2).WillRepeatedly(Return(QVariant("about:blank")));
+ // expect accept to call setValue on all non-hidden settings
+ EXPECT_CALL(mockSettings, setValue(_, _)).Times(n_settings - 2);
EXPECT_CALL(mockSettings, setValue(QStringEq("homepage"), QVariantEq("https://kde.org")));
+ EXPECT_CALL(mockSettings, setValue(QStringEq("FirstRun"), QVariantEq(false)));
+ // expect resetBtn to call resetValue on all non-hidden settings
+ EXPECT_CALL(mockSettings, resetValue).Times(n_settings - 1);
// change setting
{
SettingsDialog dlg(&mockSettings);
auto *homepage = dlg.findChild<QLineEdit *>("homepage");
+ ASSERT_FALSE(homepage == nullptr);
EXPECT_TRUE(homepage->text() == QLatin1String("about:blank")) << qUtf8Printable(homepage->text());
homepage->setText("https://kde.org");
dlg.accept();
@@ -101,24 +128,37 @@ TEST(settings, SettingsDialog)
{
SettingsDialog dlg(&mockSettings);
auto *resetBtn = dlg.findChild<QDialogButtonBox *>()->button(QDialogButtonBox::RestoreDefaults);
- EXPECT_FALSE(resetBtn == nullptr);
+ ASSERT_FALSE(resetBtn == nullptr);
resetBtn->click();
}
}
+TEST(settings, SettingsDialog)
+{
+ const auto path = Settings::path();
+ ASSERT_FALSE(QFile::exists(path));
+
+ {
+ Settings settings(path);
+ EXPECT_TRUE(settings.value("FirstRun").toBool());
+
+ SettingsDialog dlg(&settings);
+ auto *resetBtn = dlg.findChild<QDialogButtonBox *>()->button(QDialogButtonBox::RestoreDefaults);
+ ASSERT_FALSE(resetBtn == nullptr);
+ resetBtn->click();
+ }
+
+ ASSERT_TRUE(QFile::exists(path));
+ ASSERT_TRUE(QFile::remove(path));
+}
+
int main(int argc, char **argv)
{
::testing::InitGoogleTest(&argc, argv);
+ Q_INIT_RESOURCE(settings);
- // handling fonts requires a QGuiApplication
- // The proper platform name needs to be added to the argument list before the QGuiApplication constructor is called
- // This needs to be done here for gtest_discover_tests to work
- QList<char *> args;
- for (int i = 0; i < argc; ++i) args.append(argv[i]);
- args.append({"-platform", "offscreen"});
- int args_count = args.count();
-
- QApplication app(args_count, args.data());
+ QApplication app(argc, argv);
+ QStandardPaths::setTestModeEnabled(true);
return RUN_ALL_TESTS();
}
diff --git a/src/settings/test/test_settingsdialog.cpp b/src/settings/test/test_settingsdialog.cpp
index a50cf307..a89ec82d 100644
--- a/src/settings/test/test_settingsdialog.cpp
+++ b/src/settings/test/test_settingsdialog.cpp
@@ -5,20 +5,15 @@
* Copyright (C) 2022 aqua <aqua@iserlohn-fortress.net>
* ============================================================ */
+#include "../settings.hpp"
#include "../settingsdialog.h"
-#include "settings_mock.hpp"
#include <QApplication>
-using ::testing::AtLeast;
-using ::testing::NiceMock;
-using ::testing::ReturnArg;
-
int main(int argc, char **argv)
{
QApplication app(argc, argv);
- NiceMock<MockSettings> settings;
- EXPECT_CALL(settings, value).WillRepeatedly(ReturnArg<1>());
+ Settings settings(Settings::path());
SettingsDialog dlg(&settings);
dlg.show();
diff --git a/src/tabbar/CMakeLists.txt b/src/tabbar/CMakeLists.txt
deleted file mode 100644
index 9333ef0a..00000000
--- a/src/tabbar/CMakeLists.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-add_library(tabbar STATIC tabbar.cpp tabbar.h)
-target_link_libraries(tabbar PUBLIC Qt6::Widgets) \ No newline at end of file
diff --git a/src/urlbar/CMakeLists.txt b/src/urlbar/CMakeLists.txt
deleted file mode 100644
index 7827dfb2..00000000
--- a/src/urlbar/CMakeLists.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-add_library(urlbar STATIC urlbar.cpp urlbar.hpp completer.cpp completer.hpp)
-target_link_libraries(urlbar PUBLIC Qt6::Widgets)