This commit is contained in:
Dirk Hohndel 2018-07-14 08:14:31 -07:00
commit e834874a7a
14 changed files with 246 additions and 142 deletions

View file

@ -1,3 +1,4 @@
- mobile: show developer menu is now saved on disk and remebered between start of Subsurface
- tests: add qml test harness - tests: add qml test harness
- Dive media: sort thumbnails by timestamp - Dive media: sort thumbnails by timestamp
- Dive media: don't recalculate all pictures on drag & drop - Dive media: don't recalculate all pictures on drag & drop

View file

@ -15,6 +15,7 @@ static qPref *self = new qPref;
void qPref::loadSync(bool doSync) void qPref::loadSync(bool doSync)
{ {
qPrefDisplay::instance()->loadSync(doSync);
} }
const QString qPref::canonical_version() const const QString qPref::canonical_version() const

View file

@ -20,6 +20,8 @@ public:
// Load/Sync local settings (disk) and struct preference // Load/Sync local settings (disk) and struct preference
void loadSync(bool doSync); void loadSync(bool doSync);
void load() { loadSync(false); }
void sync() { loadSync(true); }
public: public:
enum cloud_status { enum cloud_status {

View file

@ -39,7 +39,12 @@ void qPrefDisplay::set_divelist_font(const QString& value)
emit divelist_font_changed(value); emit divelist_font_changed(value);
} }
} }
DISK_LOADSYNC_TXT(Display, "/divelist_font", divelist_font); void qPrefDisplay::disk_divelist_font(bool doSync)
{
LOADSYNC_TXT("/divelist_font", divelist_font);
if (!doSync)
setCorrectFont();
}
GET_PREFERENCE_DOUBLE(Display, font_size); GET_PREFERENCE_DOUBLE(Display, font_size);
void qPrefDisplay::set_font_size(double value) void qPrefDisplay::set_font_size(double value)
@ -53,10 +58,37 @@ void qPrefDisplay::set_font_size(double value)
emit font_size_changed(value); emit font_size_changed(value);
} }
} }
DISK_LOADSYNC_DOUBLE(Display, "/font_size", font_size); void qPrefDisplay::disk_font_size(bool doSync)
{
LOADSYNC_DOUBLE("/font_size", font_size);
if (!doSync)
setCorrectFont();
}
HANDLE_PREFERENCE_BOOL(Display, "/displayinvalid", display_invalid_dives); HANDLE_PREFERENCE_BOOL(Display, "/displayinvalid", display_invalid_dives);
HANDLE_PREFERENCE_BOOL(Display, "/show_developer", show_developer); HANDLE_PREFERENCE_BOOL(Display, "/show_developer", show_developer);
HANDLE_PREFERENCE_TXT(Display, "/theme", theme); HANDLE_PREFERENCE_TXT(Display, "/theme", theme);
void qPrefDisplay::setCorrectFont()
{
// get the font from the settings or our defaults
// respect the system default font size if none is explicitly set
QFont defaultFont(prefs.divelist_font);
if (IS_FP_SAME(system_divelist_default_font_size, -1.0)) {
prefs.font_size = qApp->font().pointSizeF();
system_divelist_default_font_size = prefs.font_size; // this way we don't save it on exit
}
// painful effort to ignore previous default fonts on Windows - ridiculous
QString fontName = defaultFont.toString();
if (fontName.contains(","))
fontName = fontName.left(fontName.indexOf(","));
if (subsurface_ignore_font(qPrintable(fontName)))
defaultFont = QFont(prefs.divelist_font);
else
COPY_TXT(divelist_font, fontName);
defaultFont.setPointSizeF(prefs.font_size);
qApp->setFont(defaultFont);
}

View file

@ -19,6 +19,8 @@ public:
// Load/Sync local settings (disk) and struct preference // Load/Sync local settings (disk) and struct preference
void loadSync(bool doSync); void loadSync(bool doSync);
void load() { loadSync(false); }
void sync() { loadSync(true); }
public: public:
const QString divelist_font() const; const QString divelist_font() const;
@ -51,5 +53,8 @@ private:
void disk_display_invalid_dives(bool doSync); void disk_display_invalid_dives(bool doSync);
void disk_show_developer(bool doSync); void disk_show_developer(bool doSync);
void disk_theme(bool doSync); void disk_theme(bool doSync);
// font helper function
void setCorrectFont();
}; };
#endif #endif

View file

@ -1913,75 +1913,6 @@ void GeneralSettingsObjectWrapper::setAutoRecalculateThumbnails(bool value)
emit autoRecalculateThumbnailsChanged(value); emit autoRecalculateThumbnailsChanged(value);
} }
DisplaySettingsObjectWrapper::DisplaySettingsObjectWrapper(QObject *parent) :
QObject(parent)
{
}
QString DisplaySettingsObjectWrapper::divelistFont() const
{
return prefs.divelist_font;
}
double DisplaySettingsObjectWrapper::fontSize() const
{
return prefs.font_size;
}
bool DisplaySettingsObjectWrapper::displayInvalidDives() const
{
return prefs.display_invalid_dives;
}
void DisplaySettingsObjectWrapper::setDivelistFont(const QString& value)
{
QString newValue = value;
if (value.contains(","))
newValue = value.left(value.indexOf(","));
if (newValue == prefs.divelist_font)
return;
QSettings s;
s.beginGroup(group);
s.setValue("divelist_font", value);
if (!subsurface_ignore_font(qPrintable(newValue))) {
free((void *)prefs.divelist_font);
prefs.divelist_font = copy_qstring(newValue);
qApp->setFont(QFont(newValue));
}
emit divelistFontChanged(newValue);
}
void DisplaySettingsObjectWrapper::setFontSize(double value)
{
if (value == prefs.font_size)
return;
QSettings s;
s.beginGroup(group);
s.setValue("font_size", value);
prefs.font_size = value;
QFont defaultFont = qApp->font();
defaultFont.setPointSizeF(prefs.font_size);
qApp->setFont(defaultFont);
emit fontSizeChanged(value);
}
void DisplaySettingsObjectWrapper::setDisplayInvalidDives(bool value)
{
if (value == prefs.display_invalid_dives)
return;
QSettings s;
s.beginGroup(group);
s.setValue("displayinvalid", value);
prefs.display_invalid_dives = value;
emit displayInvalidDivesChanged(value);
}
LanguageSettingsObjectWrapper::LanguageSettingsObjectWrapper(QObject *parent) : LanguageSettingsObjectWrapper::LanguageSettingsObjectWrapper(QObject *parent) :
QObject(parent) QObject(parent)
{ {
@ -2194,7 +2125,7 @@ QObject(parent),
planner_settings(new DivePlannerSettings(this)), planner_settings(new DivePlannerSettings(this)),
unit_settings(new UnitsSettings(this)), unit_settings(new UnitsSettings(this)),
general_settings(new GeneralSettingsObjectWrapper(this)), general_settings(new GeneralSettingsObjectWrapper(this)),
display_settings(new DisplaySettingsObjectWrapper(this)), display_settings(new qPrefDisplay(this)),
language_settings(new LanguageSettingsObjectWrapper(this)), language_settings(new LanguageSettingsObjectWrapper(this)),
animation_settings(new AnimationsSettingsObjectWrapper(this)), animation_settings(new AnimationsSettingsObjectWrapper(this)),
location_settings(new LocationServiceSettingsObjectWrapper(this)), location_settings(new LocationServiceSettingsObjectWrapper(this)),
@ -2287,29 +2218,7 @@ void SettingsObjectWrapper::load()
GET_BOOL("auto_recalculate_thumbnails", auto_recalculate_thumbnails); GET_BOOL("auto_recalculate_thumbnails", auto_recalculate_thumbnails);
s.endGroup(); s.endGroup();
s.beginGroup("Display"); qPrefDisplay::instance()->load();
// get the font from the settings or our defaults
// respect the system default font size if none is explicitly set
QFont defaultFont = s.value("divelist_font", prefs.divelist_font).value<QFont>();
if (IS_FP_SAME(system_divelist_default_font_size, -1.0)) {
prefs.font_size = qApp->font().pointSizeF();
system_divelist_default_font_size = prefs.font_size; // this way we don't save it on exit
}
prefs.font_size = s.value("font_size", prefs.font_size).toFloat();
// painful effort to ignore previous default fonts on Windows - ridiculous
QString fontName = defaultFont.toString();
if (fontName.contains(","))
fontName = fontName.left(fontName.indexOf(","));
if (subsurface_ignore_font(qPrintable(fontName))) {
defaultFont = QFont(prefs.divelist_font);
} else {
free((void *)prefs.divelist_font);
prefs.divelist_font = copy_qstring(fontName);
}
defaultFont.setPointSizeF(prefs.font_size);
qApp->setFont(defaultFont);
GET_BOOL("displayinvalid", display_invalid_dives);
s.endGroup();
s.beginGroup("Animations"); s.beginGroup("Animations");
GET_INT("animation_speed", animation_speed); GET_INT("animation_speed", animation_speed);
@ -2420,6 +2329,8 @@ void SettingsObjectWrapper::load()
void SettingsObjectWrapper::sync() void SettingsObjectWrapper::sync()
{ {
qPrefDisplay::instance()->sync();
QSettings s; QSettings s;
s.beginGroup("Planner"); s.beginGroup("Planner");
s.setValue("last_stop", prefs.last_stop); s.setValue("last_stop", prefs.last_stop);

View file

@ -6,6 +6,7 @@
#include <QDate> #include <QDate>
#include "core/pref.h" #include "core/pref.h"
#include "core/settings/qPref.h"
/* Wrapper class for the Settings. This will allow /* Wrapper class for the Settings. This will allow
* seamlessy integration of the settings with the QML * seamlessy integration of the settings with the QML
@ -594,28 +595,6 @@ private:
const QString group = QStringLiteral("GeneralSettings"); const QString group = QStringLiteral("GeneralSettings");
}; };
class DisplaySettingsObjectWrapper : public QObject {
Q_OBJECT
Q_PROPERTY(QString divelist_font READ divelistFont WRITE setDivelistFont NOTIFY divelistFontChanged)
Q_PROPERTY(double font_size READ fontSize WRITE setFontSize NOTIFY fontSizeChanged)
Q_PROPERTY(bool display_invalid_dives READ displayInvalidDives WRITE setDisplayInvalidDives NOTIFY displayInvalidDivesChanged)
public:
DisplaySettingsObjectWrapper(QObject *parent);
QString divelistFont() const;
double fontSize() const;
bool displayInvalidDives() const;
public slots:
void setDivelistFont(const QString& value);
void setFontSize(double value);
void setDisplayInvalidDives(bool value);
signals:
void divelistFontChanged(const QString& value);
void fontSizeChanged(double value);
void displayInvalidDivesChanged(bool value);
private:
const QString group = QStringLiteral("Display");
};
class LanguageSettingsObjectWrapper : public QObject { class LanguageSettingsObjectWrapper : public QObject {
Q_OBJECT Q_OBJECT
Q_PROPERTY(QString language READ language WRITE setLanguage NOTIFY languageChanged) Q_PROPERTY(QString language READ language WRITE setLanguage NOTIFY languageChanged)
@ -709,7 +688,7 @@ class SettingsObjectWrapper : public QObject {
Q_PROPERTY(UnitsSettings* units MEMBER unit_settings CONSTANT) Q_PROPERTY(UnitsSettings* units MEMBER unit_settings CONSTANT)
Q_PROPERTY(GeneralSettingsObjectWrapper* general MEMBER general_settings CONSTANT) Q_PROPERTY(GeneralSettingsObjectWrapper* general MEMBER general_settings CONSTANT)
Q_PROPERTY(DisplaySettingsObjectWrapper* display MEMBER display_settings CONSTANT) Q_PROPERTY(qPrefDisplay* display MEMBER display_settings CONSTANT)
Q_PROPERTY(LanguageSettingsObjectWrapper* language MEMBER language_settings CONSTANT) Q_PROPERTY(LanguageSettingsObjectWrapper* language MEMBER language_settings CONSTANT)
Q_PROPERTY(AnimationsSettingsObjectWrapper* animation MEMBER animation_settings CONSTANT) Q_PROPERTY(AnimationsSettingsObjectWrapper* animation MEMBER animation_settings CONSTANT)
Q_PROPERTY(LocationServiceSettingsObjectWrapper* Location MEMBER location_settings CONSTANT) Q_PROPERTY(LocationServiceSettingsObjectWrapper* Location MEMBER location_settings CONSTANT)
@ -728,7 +707,7 @@ public:
DivePlannerSettings *planner_settings; DivePlannerSettings *planner_settings;
UnitsSettings *unit_settings; UnitsSettings *unit_settings;
GeneralSettingsObjectWrapper *general_settings; GeneralSettingsObjectWrapper *general_settings;
DisplaySettingsObjectWrapper *display_settings; qPrefDisplay *display_settings;
LanguageSettingsObjectWrapper *language_settings; LanguageSettingsObjectWrapper *language_settings;
AnimationsSettingsObjectWrapper *animation_settings; AnimationsSettingsObjectWrapper *animation_settings;
LocationServiceSettingsObjectWrapper *location_settings; LocationServiceSettingsObjectWrapper *location_settings;

View file

@ -88,10 +88,10 @@ void PreferencesDefaults::syncSettings()
else if (ui->cloudDefaultFile->isChecked()) else if (ui->cloudDefaultFile->isChecked())
general->setDefaultFileBehavior(CLOUD_DEFAULT_FILE); general->setDefaultFileBehavior(CLOUD_DEFAULT_FILE);
auto display = SettingsObjectWrapper::instance()->display_settings; auto display = qPrefDisplay::instance();
display->setDivelistFont(ui->font->currentFont().toString()); display->set_divelist_font(ui->font->currentFont().toString());
display->setFontSize(ui->fontsize->value()); display->set_font_size(ui->fontsize->value());
display->setDisplayInvalidDives(ui->displayinvalid->isChecked()); display->set_display_invalid_dives(ui->displayinvalid->isChecked());
auto animation = SettingsObjectWrapper::instance()->animation_settings; auto animation = SettingsObjectWrapper::instance()->animation_settings;
animation->setAnimationSpeed(ui->velocitySlider->value()); animation->setAnimationSpeed(ui->velocitySlider->value());

View file

@ -97,6 +97,7 @@ TEST(TestDiveSiteDuplication testdivesiteduplication.cpp)
TEST(TestRenumber testrenumber.cpp) TEST(TestRenumber testrenumber.cpp)
TEST(TestGitStorage testgitstorage.cpp) TEST(TestGitStorage testgitstorage.cpp)
TEST(TestPreferences testpreferences.cpp) TEST(TestPreferences testpreferences.cpp)
TEST(TestQPrefDisplay testqPrefDisplay.cpp)
TEST(TestPicture testpicture.cpp) TEST(TestPicture testpicture.cpp)
TEST(TestMerge testmerge.cpp) TEST(TestMerge testmerge.cpp)
TEST(TestTagList testtaglist.cpp) TEST(TestTagList testtaglist.cpp)
@ -112,6 +113,7 @@ add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND}
TestGitStorage TestGitStorage
TestPlan TestPlan
TestDiveSiteDuplication TestDiveSiteDuplication
TestQPrefDisplay
TestPreferences TestPreferences
TestRenumber TestRenumber
TestPicture TestPicture

View file

@ -445,23 +445,6 @@ void TestPreferences::testPreferences()
TEST(general->pscrRatio(), 1); TEST(general->pscrRatio(), 1);
TEST(general->useDefaultFile(), false); TEST(general->useDefaultFile(), false);
auto display = pref->display_settings;
display->setDivelistFont("comic");
display->setFontSize(10.0);
display->setDisplayInvalidDives(true);
TEST(display->divelistFont(),QStringLiteral("comic"));
TEST(display->fontSize(), 10.0);
TEST(display->displayInvalidDives(), true);
display->setDivelistFont("helvetica");
display->setFontSize(14.0);
display->setDisplayInvalidDives(false);
TEST(display->divelistFont(),QStringLiteral("helvetica"));
TEST(display->fontSize(), 14.0);
TEST(display->displayInvalidDives(), false);
auto language = pref->language_settings; auto language = pref->language_settings;
language->setLangLocale ("en_US"); language->setLangLocale ("en_US");
language->setLanguage ("en"); language->setLanguage ("en");

133
tests/testqPrefDisplay.cpp Normal file
View file

@ -0,0 +1,133 @@
// SPDX-License-Identifier: GPL-2.0
#include "testqPrefDisplay.h"
#include "core/settings/qPrefDisplay.h"
#include "core/pref.h"
#include "core/qthelper.h"
#include <QDate>
void TestQPrefDisplay::initTestCase()
{
QCoreApplication::setOrganizationName("Subsurface");
QCoreApplication::setOrganizationDomain("subsurface.hohndel.org");
QCoreApplication::setApplicationName("SubsurfaceTestQPrefDisplay");
}
void TestQPrefDisplay::test_struct_get()
{
// Test struct pref -> get func.
auto display = qPrefDisplay::instance();
prefs.display_invalid_dives = true;
prefs.divelist_font = copy_qstring("comic");
prefs.font_size = 12.0;
prefs.show_developer = false;
prefs.theme = copy_qstring("myTheme");
QCOMPARE(display->display_invalid_dives(), prefs.display_invalid_dives);
QCOMPARE(display->divelist_font(), QString(prefs.divelist_font));
QCOMPARE(display->font_size(), prefs.font_size);
QCOMPARE(display->show_developer(), prefs.show_developer);
QCOMPARE(display->theme(), QString(prefs.theme));
}
void TestQPrefDisplay::test_set_struct()
{
// Test set func -> struct pref
auto display = qPrefDisplay::instance();
display->set_display_invalid_dives(true);
display->set_divelist_font("comic");
display->set_font_size(12.0);
display->set_show_developer(false);
display->set_theme("myTheme");
QCOMPARE(prefs.display_invalid_dives, true);
QCOMPARE(prefs.divelist_font, "comic");
QCOMPARE(prefs.font_size, 12.0);
QCOMPARE(prefs.show_developer, false);
QCOMPARE(prefs.theme, "myTheme");
}
void TestQPrefDisplay::test_set_load_struct()
{
// test set func -> load -> struct pref
auto display = qPrefDisplay::instance();
display->set_display_invalid_dives(false);
display->set_divelist_font("helvitica");
display->set_font_size(15.0);
display->set_show_developer(true);
display->set_theme("myTheme2");
prefs.display_invalid_dives = true;
prefs.divelist_font = copy_qstring("comic");
prefs.font_size = 12.0;
prefs.show_developer = false;
prefs.theme = copy_qstring("myTheme");
display->load();
QCOMPARE(prefs.display_invalid_dives, false);
QCOMPARE(prefs.divelist_font, "helvitica");
QCOMPARE(prefs.font_size, 15.0);
QCOMPARE(prefs.show_developer, true);
QCOMPARE(prefs.theme, "myTheme2");
}
void TestQPrefDisplay::test_struct_disk()
{
// test struct prefs -> disk
auto display = qPrefDisplay::instance();
prefs.display_invalid_dives = true;
prefs.divelist_font = copy_qstring("helvitica");
prefs.font_size = 17.0;
prefs.show_developer = false;
prefs.theme = copy_qstring("myTheme3");
display->sync();
prefs.display_invalid_dives = false;
prefs.divelist_font = copy_qstring("comic");
prefs.font_size = 11.0;
prefs.show_developer = true;
prefs.theme = copy_qstring("myTheme");
display->load();
QCOMPARE(prefs.display_invalid_dives, true);
QCOMPARE(prefs.divelist_font, "helvitica");
QCOMPARE(prefs.font_size, 17.0);
QCOMPARE(prefs.show_developer, false);
QCOMPARE(prefs.theme, "myTheme3");
}
void TestQPrefDisplay::test_multiple()
{
// test multiple instances have the same information
prefs.display_invalid_dives = false;
prefs.divelist_font = copy_qstring("comic");
prefs.font_size = 11.0;
prefs.show_developer = true;
prefs.theme = copy_qstring("myTheme");
auto display_direct = new qPrefDisplay;
prefs.display_invalid_dives = true;
prefs.divelist_font = copy_qstring("helvetica");
prefs.font_size = 15.0;
prefs.show_developer = false;
prefs.theme = copy_qstring("myTheme8");
auto display = qPrefDisplay::instance();
QCOMPARE(display->display_invalid_dives(), display_direct->display_invalid_dives());
QCOMPARE(display->divelist_font(), display_direct->divelist_font());
QCOMPARE(display->font_size(), display_direct->font_size());
QCOMPARE(display->show_developer(), display_direct->show_developer());
QCOMPARE(display->theme(), display_direct->theme());
}
QTEST_MAIN(TestQPrefDisplay)

19
tests/testqPrefDisplay.h Normal file
View file

@ -0,0 +1,19 @@
// SPDX-License-Identifier: GPL-2.0
#ifndef TESTQPREFDISPLAY_H
#define TESTQPREFDISPLAY_H
#include <QtTest>
class TestQPrefDisplay : public QObject
{
Q_OBJECT
private slots:
void initTestCase();
void test_struct_get();
void test_set_struct();
void test_set_load_struct();
void test_struct_disk();
void test_multiple();
};
#endif // TESTQPREFDISPLAY_H

View file

@ -4,6 +4,7 @@
#include <QtTest> #include <QtTest>
#include <QQmlEngine> #include <QQmlEngine>
#include <QQmlContext> #include <QQmlContext>
#include <QApplication>
#include "core/settings/qPref.h" #include "core/settings/qPref.h"
#include "core/qt-gui.h" #include "core/qt-gui.h"
@ -18,8 +19,12 @@ int main(int argc, char **argv)
QTEST_ADD_GPU_BLACKLIST_SUPPORT QTEST_ADD_GPU_BLACKLIST_SUPPORT
QTEST_SET_MAIN_SOURCE_PATH QTEST_SET_MAIN_SOURCE_PATH
// check that qPref exists // check that qPref classes exists
new qPref; qPref::instance();
qPrefDisplay::instance();
// prepare Qt application
new QApplication(argc, argv);
// check that we have a directory // check that we have a directory
if (argc < 2) { if (argc < 2) {

View file

@ -0,0 +1,31 @@
// SPDX-License-Identifier: GPL-2.0
import QtQuick 2.6
import QtTest 1.2
import org.subsurfacedivelog.mobile 1.0
TestCase {
name: "qPref"
SsrfDisplayPrefs {
id: display
}
function test_variables() {
var x1 = display.divelist_font
display.divelist_font = "helvitica"
compare(display.divelist_font, "helvitica")
var x2 = display.font_size
display.font_size = 12.0
compare(display.font_size, 12.0)
var x3 = display.display_invalid_dives
display.display_invalid_dives = !x3
compare(display.display_invalid_dives, !x3)
var x4 = display.show_developer
display.show_developer = !x4
compare(display.show_developer, !x4)
var x5 = display.theme
display.theme = "myColor"
compare(display.theme, "myColor")
}
}