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