From 784380f0cd8f14f8f33ac3cc2a83890ba412574a Mon Sep 17 00:00:00 2001 From: Andras Becsi Date: Tue, 4 Aug 2015 19:30:24 +0200 Subject: [PATCH] Add SettingsView and refactor settings handling to be generic This connects the simplest settings first, for toggling offTheRecord we need more advanced logic. --- src/engine.cpp | 10 +-- src/engine.h | 6 +- src/qml/BrowserWindow.qml | 32 ++++--- src/qml/HomeScreen.qml | 11 +-- src/qml/NavigationBar.qml | 13 ++- src/qml/PageView.qml | 11 ++- src/qml/SettingsView.qml | 176 ++++++++++++++++++++++++++++++++++++++ src/resources.qrc | 1 + src/src.pro | 1 + 9 files changed, 228 insertions(+), 33 deletions(-) create mode 100644 src/qml/SettingsView.qml diff --git a/src/engine.cpp b/src/engine.cpp index 093a0d0..fae28f5 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -43,7 +43,7 @@ Engine::Engine(QObject *parent) : QObject(parent) - , m_bookmarks(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) % QDir::separator() % "bookmarks.ini", QSettings::IniFormat, this) + , m_settings(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) % QDir::separator() % "settings.ini", QSettings::IniFormat, this) { } @@ -72,12 +72,12 @@ QString Engine::fallbackColor() return colors[index]; } -QString Engine::restoreBookmarks() +QString Engine::restoreSetting(const QString &name, const QString &defaultValue) { - return m_bookmarks.value("bookmarks").toString(); + return m_settings.value(name, defaultValue).toString(); } -void Engine::saveBookmarks(const QString & list) +void Engine::saveSetting(const QString &name, const QString &value) { - m_bookmarks.setValue("bookmarks", list); + m_settings.setValue(name, value); } diff --git a/src/engine.h b/src/engine.h index c9acdce..e905d72 100644 --- a/src/engine.h +++ b/src/engine.h @@ -78,7 +78,7 @@ class Engine : public QObject { Q_PROPERTY(QObject * rootWindow READ rootWindow FINAL CONSTANT) - QSettings m_bookmarks; + QSettings m_settings; public: Engine(QObject *parent); @@ -90,8 +90,8 @@ public: Q_INVOKABLE QUrl fromUserInput(const QString& userInput); Q_INVOKABLE QString domainFromString(const QString& urlString); Q_INVOKABLE QString fallbackColor(); - Q_INVOKABLE QString restoreBookmarks(); - Q_INVOKABLE void saveBookmarks(const QString & list); + Q_INVOKABLE QString restoreSetting(const QString &name, const QString &defaultValue = QString()); + Q_INVOKABLE void saveSetting(const QString &name, const QString &value); }; #endif // ENGINE_H diff --git a/src/qml/BrowserWindow.qml b/src/qml/BrowserWindow.qml index 3cf2b15..245c49d 100644 --- a/src/qml/BrowserWindow.qml +++ b/src/qml/BrowserWindow.qml @@ -44,7 +44,6 @@ import QtQuick.Controls.Styles 1.0 import QtQuick.Layouts 1.0 import QtQuick.Window 2.1 import QtQuick.Controls.Private 1.0 -import Qt.labs.settings 1.0 import QtQuick.Dialogs 1.2 import "assets" @@ -82,15 +81,7 @@ Item { width: 1024 height: 600 visible: true -/* - Settings { - id : appSettings - property alias autoLoadImages: loadImages.checked; - property alias javaScriptEnabled: javaScriptEnabled.checked; - property alias errorPageEnabled: errorPageEnabled.checked; - property alias pluginsEnabled: pluginsEnabled.checked; - } -*/ + Action { shortcut: "Ctrl+D" onTriggered: { @@ -153,8 +144,24 @@ Item { onOptionClicked: newTabAction.trigger() } + UIToolBar { + id: settingsToolBar + z: 5 + title: qsTr("Settings") + visible: opacity != 0.0 + + anchors { + left: parent.left + right: parent.right + top: navigation.top + } + + onDoneClicked: { + settingsView.state = "disabled" + tabView.interactive = true } } + NavigationBar { id: navigation @@ -163,6 +170,7 @@ Item { right: parent.right } } + PageView { id: tabView interactive: !sslDialog.visible && homeScreen.state == "disabled" @@ -247,6 +255,10 @@ Item { left: parent.left right: parent.right } + } + + SettingsView { + id: settingsView height: parent.height - toolBarSize anchors { top: navigation.bottom diff --git a/src/qml/HomeScreen.qml b/src/qml/HomeScreen.qml index 984b3cc..7ef446e 100644 --- a/src/qml/HomeScreen.qml +++ b/src/qml/HomeScreen.qml @@ -118,7 +118,7 @@ Rectangle { id: listModel Component.onCompleted: { listModel.clear() - var string = engine.restoreBookmarks() + var string = engine.restoreSetting("bookmarks") if (!string) return var list = JSON.parse(string) @@ -134,7 +134,7 @@ Rectangle { } if (!list.length) return - engine.saveBookmarks(JSON.stringify(list)) + engine.saveSetting("bookmarks", JSON.stringify(list)) } } @@ -473,6 +473,7 @@ Rectangle { font.family: defaultFontFamily font.pixelSize: message.font.pixelSize text: "Oops!..." + color: iconOverlayColor } } @@ -496,12 +497,12 @@ Rectangle { top: message.bottom left: parent.left right: parent.right - bottomMargin: toolBarSize + bottomMargin: 70 } UIButton { color: uiColor - implicitWidth: 160 - implicitHeight: 65 + implicitWidth: 180 + implicitHeight: 70 visible: messageBox.state != "empty" anchors { horizontalCenter: parent.horizontalCenter diff --git a/src/qml/NavigationBar.qml b/src/qml/NavigationBar.qml index 29114aa..7017d2d 100644 --- a/src/qml/NavigationBar.qml +++ b/src/qml/NavigationBar.qml @@ -20,7 +20,10 @@ ToolBar { } function refresh() { - bookmarksButton.bookmarked = homeScreen.contains(urlBar.text) !== -1 + if (urlBar.text == "") + bookmarksButton.bookmarked = false + else + bookmarksButton.bookmarked = homeScreen.contains(urlBar.text) !== -1 } state: "enabled" @@ -285,6 +288,7 @@ ToolBar { } UIButton { id: bookmarksButton + enabled: urlBar.text != "" property bool bookmarked: false source: bookmarked ? "qrc:///star_checked" : "qrc:///star" onClicked: { @@ -314,9 +318,10 @@ ToolBar { UIButton { id: settingsButton source: "qrc:///settings" - checkable: true - checked: false - onClicked: tabView.interactive = !checked + onClicked: { + tabView.interactive = false + settingsView.state = "enabled" + } } } ProgressBar { diff --git a/src/qml/PageView.qml b/src/qml/PageView.qml index 1ada1b4..58bdfb8 100644 --- a/src/qml/PageView.qml +++ b/src/qml/PageView.qml @@ -138,12 +138,11 @@ Rectangle { // Trigger a refresh to check if the new url is bookmarked. onUrlChanged: navigation.refresh() -/* - settings.autoLoadImages: appSettings.autoLoadImages - settings.javascriptEnabled: appSettings.javaScriptEnabled - settings.errorPageEnabled: appSettings.errorPageEnabled - settings.pluginsEnabled: appSettings.pluginsEnabled -*/ + + settings.autoLoadImages: settingsView.autoLoadImages + settings.javascriptEnabled: !settingsView.javaScriptDisabled + settings.pluginsEnabled: settingsView.pluginsEnabled + onLoadingChanged: { if (loading) navigation.state = "enabled" diff --git a/src/qml/SettingsView.qml b/src/qml/SettingsView.qml new file mode 100644 index 0000000..e373960 --- /dev/null +++ b/src/qml/SettingsView.qml @@ -0,0 +1,176 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtBrowser project. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPLv2 included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtQuick.Layouts 1.0 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 +import Qt.labs.settings 1.0 + +Rectangle { + id: root + + property bool autoLoadImages: get(0) + property bool javaScriptDisabled: get(1) + property bool httpDiskCacheEnabled: get(2) + property bool pluginsEnabled: get(3) + property bool privateBrowsingEnabled: get(4) + + property var defaultValues: [{ "name": "Auto Load Images", "active": true }, + { "name": "Disable JavaScript", "active": false }, + { "name": "Enable HTTP Disk Cache", "active": true }, + { "name": "Enable Plugins", "active": false }, + { "name": "Private Browsing", "active": false }] + + function get(index) { + var elem = listModel.get(index) + if (!elem) + return defaultValues[index].active + return elem.active + } + + state: "enabled" + + states: [ + State { + name: "enabled" + AnchorChanges { + target: root + anchors.top: navigation.bottom + } + PropertyChanges { + target: settingsToolBar + opacity: 1.0 + } + }, + State { + name: "disabled" + AnchorChanges { + target: root + anchors.top: root.parent.bottom + } + PropertyChanges { + target: settingsToolBar + opacity: 0.0 + } + } + ] + + transitions: Transition { + AnchorAnimation { duration: animationDuration; easing.type : Easing.InSine } + } + + ListModel { + id: listModel + } + + ListView { + id: listView + leftMargin: 230 + rightMargin: leftMargin + anchors.fill: parent + model: listModel + delegate: Rectangle { + height: 100 + width: 560 + Text { + anchors.verticalCenter: parent.verticalCenter + font.family: defaultFontFamily + font.pixelSize: 28 + text: name + color: tch.checked ? "black" : "#929495" + } + Rectangle { + anchors { + right: parent.right + verticalCenter: parent.verticalCenter + } + Switch { + id: tch + anchors.centerIn: parent + checked: active + onClicked: { + listModel.get(index).active = checked + listView.save() + } + style: SwitchStyle { + handle: Rectangle { + width: 42 + height: 42 + radius: height / 2 + color: "white" + border.color: control.checked ? "#5caa14" : "#9b9b9b" + border.width: 1 + } + + groove: Rectangle { + implicitWidth: 72 + height: 42 + radius: height / 2 + border.color: control.checked ? "#5caa14" : "#9b9b9b" + color: control.checked ? "#5cff14" : "white" + border.width: 1 + } + } + } + } + } + function save() { + var list = [] + for (var i = 0; i < listModel.count; ++i) { + var elem = listModel.get(i) + list[i] = { "name": elem.name, "active": elem.active } + } + + if (!list.length) + return + + engine.saveSetting("settings", JSON.stringify(list)) + } + + Component.onCompleted: { + var string = engine.restoreSetting("settings", JSON.stringify(defaultValues)) + var list = JSON.parse(string) + for (var i = 0; i < list.length; ++i) { + var elem = list[i] + listModel.append({ "name": elem.name, "active": elem.active }) + } + listView.forceLayout() + } + Component.onDestruction: save() + } +} diff --git a/src/resources.qrc b/src/resources.qrc index 521da57..7eada49 100644 --- a/src/resources.qrc +++ b/src/resources.qrc @@ -6,6 +6,7 @@ qml/PageView.qml qml/NavigationBar.qml qml/HomeScreen.qml + qml/SettingsView.qml qml/assets/UIButton.qml qml/assets/UIToolBar.qml qml/assets/icons/Btn_Home.png diff --git a/src/src.pro b/src/src.pro index 82a9f92..913ae42 100644 --- a/src/src.pro +++ b/src/src.pro @@ -26,6 +26,7 @@ OTHER_FILES = \ qml/PageView.qml \ qml/NavigationBar.qml \ qml/HomeScreen.qml \ + qml/SettingsView.qml \ QT += qml quick webengine QT_PRIVATE += quick-private gui-private core-private -- 2.39.2