From b0c60b4f9426cc7e3251e6462cad87317d1498e9 Mon Sep 17 00:00:00 2001 From: dannygb Date: Mon, 26 Aug 2019 19:04:12 +0100 Subject: [PATCH] #12 adds auto logout time as a setting #42 Save the last opened database --- KeePit/KeePit.qrc | 3 + KeePit/qml/ListEntryItems.qml | 9 ++- KeePit/qml/Main.qml | 96 +++++++++++++++++++++------ KeePit/qml/OpenDatabase.qml | 9 +++ KeePit/qml/Selector.qml | 2 + KeePit/qml/Settings.qml | 79 +++++++++++++++++++--- KeePit/qml/SettingsForm.qml | 119 ++++++++++++++++++++++++++++++++++ 7 files changed, 284 insertions(+), 33 deletions(-) create mode 100644 KeePit/qml/SettingsForm.qml diff --git a/KeePit/KeePit.qrc b/KeePit/KeePit.qrc index 717d852..ff2cff4 100644 --- a/KeePit/KeePit.qrc +++ b/KeePit/KeePit.qrc @@ -32,4 +32,7 @@ qml/Settings.qml + + qml/SettingsForm.qml + diff --git a/KeePit/qml/ListEntryItems.qml b/KeePit/qml/ListEntryItems.qml index 43faa7d..254e5e8 100644 --- a/KeePit/qml/ListEntryItems.qml +++ b/KeePit/qml/ListEntryItems.qml @@ -109,11 +109,14 @@ Page { saveTheme() } }, - /*Action { + Action { text: i18n.tr("Settings") iconName: "settings" - onTriggered: PopupUtils.open(settingsDisabledComponent) - },*/ + onTriggered: { + pageStack.push(settingsForm) + settingsForm.loadSettings() + } + }, Action { iconName: "home" text: i18n.tr("Home") diff --git a/KeePit/qml/Main.qml b/KeePit/qml/Main.qml index f6ac36a..8b00979 100644 --- a/KeePit/qml/Main.qml +++ b/KeePit/qml/Main.qml @@ -51,8 +51,12 @@ MainView { property string keyFileName property date currentDate: new Date() property var locale: Qt.locale() - property var selectedDatabaseToDelete: ({}); - property var pageTitleStack: []; + property var selectedDatabaseToDelete: ({}) + property var pageTitleStack: [] + property var timeoutSettings: { + "enabled": false, + "interval": 0 + } function goHome() { database.loadHome() @@ -63,29 +67,38 @@ MainView { pageStack.push(listEntryItems) } - Component.onCompleted: { - readTheme() - openDatabase.actTheme.iconName = getTheme() - listEntryItems.actTheme.iconName = getTheme() - } + Component.onCompleted: { + setTheme() + } Database { id: database property var selectedEntry onError: { - PopupUtils.open(dialog, '', {text: i18n.tr(msg)}); + PopupUtils.open(dialog, '', {text: i18n.tr(msg)}) } onSuccess: { - pageStack.clear(); - pageStack.push(listEntryItems); - //resetTimer.start() + pageStack.clear() + pageStack.push(listEntryItems) + setTimer() } } PageStack { id: pageStack - Component.onCompleted: { - push(databaseListView) + Component.onCompleted: { + var lastOpenDb = { + name: settings.getSetting("lastOpenDbName"), + path: settings.getSetting("lastOpenDbPath") + } + + if(lastOpenDb.name === "" || lastOpenDb.path === "" ) { + push(databaseListView) + } else { + databaseFileName = lastOpenDb.name + databaseFilePath = lastOpenDb.path + push(openDatabase) + } } onCurrentPageChanged: { if(currentPage != null) { @@ -141,6 +154,10 @@ MainView { Selector { id: databaseListView visible: false + onDatabaseSelected: { + settings.saveSetting("lastOpenDbName", dbName) + settings.saveSetting("lastOpenDbPath", dbPath) + } } Importer { @@ -153,8 +170,17 @@ MainView { Settings { id: settings + onSettingsChanged: { + setTimer() + setTheme() + } } - } + + SettingsForm { + id: settingsForm + visible: false + } + } Component { id: dialog @@ -224,7 +250,6 @@ MainView { Timer { id: resetTimer - interval: 60000 running: false repeat: false onTriggered: reset() @@ -245,20 +270,46 @@ MainView { //Clipboard.clear() // Consistently crashes the app on phone (not desktop though) see bug: https://bugs.launchpad.net/ubuntu/+source/ubuntu-ui-toolkit/+bug/1457361 } + function setTimer() { + getTimeout() + startTimer() + } + + function startTimer() { + console.debug("startTimer: " + timeoutSettings.enabled + "("+timeoutSettings.interval+")") + if(timeoutSettings.enabled) { + resetTimer.interval = timeoutSettings.interval + resetTimer.stop() + resetTimer.start() + } else { + resetTimer.stop() + } + } + function resetLogoutTimer() { - //resetTimer.restart(); + if(timeoutSettings.enabled) { + resetTimer.restart() + } else { + resetTimer.stop() + } + } + + function setTheme() { + readTheme() + openDatabase.actTheme.iconName = getTheme() + listEntryItems.actTheme.iconName = getTheme() } function getTheme() { - return (theme.name == "Ubuntu.Components.Themes.SuruDark") + return (theme.name == settings.dark) ? "torch-off" : "torch-on" } function switchTheme() { - theme.name = (theme.name == "Ubuntu.Components.Themes.SuruDark") - ? "Ubuntu.Components.Themes.Ambiance" - : "Ubuntu.Components.Themes.SuruDark" + theme.name = (theme.name == settings.dark) + ? settings.light + : settings.dark } function saveTheme() { @@ -268,4 +319,9 @@ MainView { function readTheme() { theme.name = settings.getSetting("theme") } + + function getTimeout() { + timeoutSettings.enabled = settings.getSetting("timeoutEnabled") != "0" + timeoutSettings.interval = settings.getSetting("timeout") + } } diff --git a/KeePit/qml/OpenDatabase.qml b/KeePit/qml/OpenDatabase.qml index fc0a190..ba3cc90 100644 --- a/KeePit/qml/OpenDatabase.qml +++ b/KeePit/qml/OpenDatabase.qml @@ -52,6 +52,15 @@ Page { saveTheme() } }, + + Action { + text: i18n.tr("Settings") + iconName: "settings" + onTriggered: { + pageStack.push(settingsForm) + settingsForm.loadSettings() + } + }, Action { iconName: "import" text: i18n.tr("Import key") diff --git a/KeePit/qml/Selector.qml b/KeePit/qml/Selector.qml index 6e8028c..c182344 100644 --- a/KeePit/qml/Selector.qml +++ b/KeePit/qml/Selector.qml @@ -32,6 +32,7 @@ Page { property string pageTitle : appTitle + " - " + i18n.tr("Databases") property bool keyMode: false + signal databaseSelected(string dbName, string dbPath) function setKeyMode() { keyMode = true @@ -58,6 +59,7 @@ Page { databaseFileName = model.fileName keyFilePath = '' keyFileName = '' + databaseSelected(databaseFileName, databaseFilePath) } pageStack.clear() diff --git a/KeePit/qml/Settings.qml b/KeePit/qml/Settings.qml index 562850a..2f681cd 100644 --- a/KeePit/qml/Settings.qml +++ b/KeePit/qml/Settings.qml @@ -21,7 +21,18 @@ import QtQuick 2.4 import QtQuick.LocalStorage 2.0 Item { + signal settingsChanged() property var db: null + property bool settingsLoaded: false + property var values: { + "theme": "Ubuntu.Components.Themes.Ambiance", + "timeout": "60000", + "timeoutEnabled": "1", + "lastOpenDbName": "", + "lastOpenDbFilePath": "" + } + property var dark: "Ubuntu.Components.Themes.SuruDark" + property var light: "Ubuntu.Components.Themes.Ambiance" function openDB() { if(db !== null) return; @@ -29,7 +40,7 @@ Item { db = LocalStorage.openDatabaseSync(appTitle, "0.1", "KeepIt Password Safe", 100000); try { - db.transaction(function(tx){ + db.transaction(function(tx) { tx.executeSql('CREATE TABLE IF NOT EXISTS settings(key TEXT UNIQUE, value TEXT)'); var table = tx.executeSql("SELECT * FROM settings"); // Seed the table with default values @@ -44,19 +55,67 @@ Item { } function saveSetting(key, value) { - openDB(); - db.transaction( function(tx){ - tx.executeSql('INSERT OR REPLACE INTO settings VALUES(?, ?)', [key, value]); - }); + values[key] = value + saveSettings(values) } function getSetting(key) { + console.debug("getSetting:" + key) + if (settingsLoaded) { + console.debug(values[key]) + return values[key] + } + + getSettings() + + console.debug(values[key]) + + return values[key] + } + + function getSettings() { + + if (settingsLoaded) { + console.debug("getSettings (cached): " + JSON.stringify(values)) + return values + } + openDB(); - var res = ""; db.transaction(function(tx) { - var rs = tx.executeSql('SELECT value FROM settings WHERE key=?;', [key]); - res = rs.rows.item(0).value; - }); - return res; + var rs = tx.executeSql('SELECT key, value FROM settings;'); + + for (var i=0, len=rs.rows.length; i. +*/ + +import QtQuick 2.4 +import QtQuick.LocalStorage 2.0 +import QtQuick.Layouts 1.1 +import Ubuntu.Components.ListItems 1.3 +import Ubuntu.Components 1.3 + +Page { + + property var loadedSettings: {} + + function loadSettings() { + loadedSettings = settings.getSettings() + var themeName = loadedSettings["theme"] + cboTheme.text = (themeName === settings.dark) + ? i18n.tr("Dark") + : i18n.tr("Light") + txtTimeout.text = loadedSettings["timeout"] + swTimeout.checked = loadedSettings["timeoutEnabled"] != "0" + } + + header: PageHeader { + id: pageHeader + title: i18n.tr("Settings") + } + + Column { + spacing: units.gu(2) + anchors { + margins: units.gu(2) + fill: parent + topMargin: pageHeader.height + units.gu(2) + } + + Label { + width: parent.width + text: i18n.tr("Theme") + } + + ComboButton { + id: cboTheme + text: "Theme" + onClicked: expanded = false + UbuntuListView { + width: parent.width + height: cboTheme.comboListHeight + model: ListModel { + ListElement { + name: "Dark" + } + ListElement { + name: "Light" + } + } + delegate: Standard { + text: name + onClicked: { + cboTheme.text = text; + cboTheme.expanded = false; + } + } + } + } + + Label { + width: parent.width + text: i18n.tr("Timeout Enabled") + } + + Switch { + id: swTimeout + } + + Label { + width: parent.width + text: i18n.tr("Timeout") + } + + TextField { + id: txtTimeout + width: parent.width + } + + Button { + objectName: "button" + width: parent.width + color: UbuntuColors.green + text: i18n.tr("Save") + + onClicked: { + loadedSettings.theme = (cboTheme.text == "Dark") + ? "Ubuntu.Components.Themes.SuruDark" + : "Ubuntu.Components.Themes.Ambiance" + loadedSettings.timeout = txtTimeout.text + loadedSettings.timeoutEnabled = swTimeout.checked + settings.saveSettings(loadedSettings) + pageStack.pop() + } + } + } +} \ No newline at end of file