From 49a66a895c75396e4bcf8e4c35d4f7ef641262e2 Mon Sep 17 00:00:00 2001 From: Nick Denry Date: Tue, 12 May 2020 18:06:16 +0300 Subject: [PATCH] Settings dialog and functionality --- app/controllers/settings-controller.js | 14 +++- app/services/app-state-service.js | 3 +- app/services/chimeverse-service.js | 5 +- app/services/credentials-service.js | 10 +-- app/services/settings-service.js | 99 ++++++++++++++++++++++++++ app/views/settings/page.html | 23 ++++++ index.html | 3 +- main.js | 70 ++++++++++++++++-- modules/menu-service.js | 15 ++-- renderer.js | 5 +- resources/css/app.css | 2 +- resources/css/page-settings.css | 12 ++++ 12 files changed, 240 insertions(+), 21 deletions(-) create mode 100644 app/services/settings-service.js create mode 100644 app/views/settings/page.html create mode 100644 resources/css/page-settings.css diff --git a/app/controllers/settings-controller.js b/app/controllers/settings-controller.js index 4121336..f779bf9 100644 --- a/app/controllers/settings-controller.js +++ b/app/controllers/settings-controller.js @@ -1,6 +1,16 @@ - let angApp = require(__dirname+'/../init') -angApp.controller('SettingsController', function ($scope, ChimeVerseService) { +angApp.controller('SettingsController', function ($scope, AppStateService, SettingsService) { + + $scope.closeSettings = () => { + AppStateService.set(AppStateService.previousState) + } + + $scope.saveSettings = () => { + SettingsService.saveAll($scope.settings) + $scope.closeSettings() + } + + $scope.settings = SettingsService.loadAll() }) \ No newline at end of file diff --git a/app/services/app-state-service.js b/app/services/app-state-service.js index c5c8d8c..430b69b 100644 --- a/app/services/app-state-service.js +++ b/app/services/app-state-service.js @@ -10,7 +10,8 @@ angApp.factory('AppStateService', [ '$rootScope', ($rootScope) => { stateService.APP_STATE_ABOUT = 'about' stateService.set = (state) => { - stateService.previousState = stateService.state + stateService.previousState = typeof stateService.state !== 'undefined' ? + stateService.state : stateService.APP_STATE_DEFAULT stateService.state = state $rootScope.$broadcast('app:state:changed', stateService.state); } diff --git a/app/services/chimeverse-service.js b/app/services/chimeverse-service.js index aebd7ec..e89ad33 100644 --- a/app/services/chimeverse-service.js +++ b/app/services/chimeverse-service.js @@ -1,6 +1,6 @@ let angApp = require(__dirname + '/../init') -angApp.factory('ChimeVerseService', ($window, CredentialsServise, SystemService, AppStateService) => { +angApp.factory('ChimeVerseService', ($window, CredentialsServise, SystemService, AppStateService, SettingsService) => { let chimeverseService = {} @@ -27,8 +27,9 @@ angApp.factory('ChimeVerseService', ($window, CredentialsServise, SystemService, chimeverseService.initConverse = (bosh, login, password) => { AppStateService.set(AppStateService.APP_STATE_DEFAULT) // Always set to default state before init let lang = navigator.language + let allowBookmarks = SettingsService.get('allowBookmarks') converse.initialize({ - allow_bookmarks: false, + allow_bookmarks: allowBookmarks, bosh_service_url: bosh, view_mode: 'embedded', jid: login + '/chimeverse', diff --git a/app/services/credentials-service.js b/app/services/credentials-service.js index 712f566..ae24d2c 100644 --- a/app/services/credentials-service.js +++ b/app/services/credentials-service.js @@ -5,9 +5,9 @@ angApp.factory('CredentialsServise', () => { const keytar = require('keytar') const settings = require('electron-settings') - let settingsService = {} + let credentialsService = {} - settingsService.getCredentials = () => { + credentialsService.getCredentials = () => { let credentials = {} credentials.login = settings.get('login') let promise = new Promise((resolve, reject) => { @@ -27,14 +27,14 @@ angApp.factory('CredentialsServise', () => { return promise } - settingsService.addCredentials = (bosh, login, password) => { + credentialsService.addCredentials = (bosh, login, password) => { let xmppService = login.split('@').pop() settings.set('bosh', bosh) settings.set('login', login) keytar.setPassword(xmppService, login, password) } - settingsService.removeCredentials = (login) => { + credentialsService.removeCredentials = (login) => { let xmppService = login.split('@').pop() passwordDelete = keytar.deletePassword(xmppService, login) let promise = new Promise((resolve, reject) => { @@ -49,6 +49,6 @@ angApp.factory('CredentialsServise', () => { return promise } - return settingsService + return credentialsService }) diff --git a/app/services/settings-service.js b/app/services/settings-service.js new file mode 100644 index 0000000..20e937d --- /dev/null +++ b/app/services/settings-service.js @@ -0,0 +1,99 @@ +let angApp = require(__dirname+'/../init') + +angApp.factory('SettingsService', () => { + + let settingsService = {} + + const electronSettings = require('electron-settings') + + const settings = { + chimeverse: { + runMinimized: { + default: false, + title: 'Run minimized', + hint: 'Default: false. Whether run Chimeverse minimized to tray or not.' + }, + minimizeOnClose: { + default: false, + title: 'Minimize on close', + hint: 'Default: false. Minimize or close Chimeverse window.' + }, + preserveWindowSize: { + default: true, + title: 'Preserve window size', + hint: 'Default: true, 800x600 otherwise.' + }, + preserveWindowPosition: { + default: true, + title: 'Preserve window position', + hint: 'Default: true, screen center otherwise.' + } + }, + conversejs: { + allowBookmarks: { + default: false, + title: 'Allow server bookmarks', + hint: 'Default: false. Enables/disables chatroom bookmarks functionality.' + } + } + } + + const iterateSettings = (callback, settingsObj) => { + if(typeof settingsObj === "undefined") { + settingsObj = settings + } + angular.forEach(settingsObj, (value, key) => { + let settingsList = settingsObj[key] + angular.forEach(settingsList, (value, key) => { + let itemDefault = settingsList[key]['default'] + callback(key, itemDefault, settingsList) + }) + }) + } + + // Callback + // TODO: replace with promise? + const saveDefault = (key, value) => { + if (!electronSettings.has(key)) { + electronSettings.set(key, value) + } + } + + // Callback + const save = (key, defaultValue, settingsList) => { + let value = settingsList[key]['value'] + electronSettings.set(key, value) + } + + // Callback + const loadAll = (key, defaultValue, settingsList) => { + if (!electronSettings.has(key)) { + settingsList[key]['value'] = defaultValue + } + settingsList[key]['value'] = electronSettings.get(key) + } + + /** + * SettingsService + */ + settingsService.initDefaults = () => { + iterateSettings(saveDefault) + } + + settingsService.get = (key) => { + return electronSettings.get(key) + } + + settingsService.loadAll = () => { + let currentSettings = angular.copy(settings) + iterateSettings(loadAll, currentSettings) + return currentSettings + } + + settingsService.saveAll = (currentSettings) => { + iterateSettings(save, currentSettings) + } + + return settingsService +}) + diff --git a/app/views/settings/page.html b/app/views/settings/page.html new file mode 100644 index 0000000..9e5cbd4 --- /dev/null +++ b/app/views/settings/page.html @@ -0,0 +1,23 @@ +
+
+

Chimeverse settings

+
+ +
{{item.hint}}
+
+

Converse.js settings

+
+ +
{{item.hint}}
+
+
+ + +
+
+
+ \ No newline at end of file diff --git a/index.html b/index.html index c351fa4..8e64b6a 100644 --- a/index.html +++ b/index.html @@ -10,6 +10,7 @@ + @@ -25,7 +26,7 @@
- settings +