From ea0d460146feb41d0f3d384961f28e70efa87e5f Mon Sep 17 00:00:00 2001 From: Stavros Sachtouris <saxtouri@admin.grnet.gr> Date: Mon, 20 Apr 2015 14:53:44 +0300 Subject: [PATCH] Manage settings, gray-out GUI options when unready Settings are loaded and updated in protocol.py If the client is not ready yet, some GUI options are not gray and unclickable until the client is ready. --- agkyra/agkyra/gui/menu.html | 134 +++++++++++++++++++------------- agkyra/agkyra/gui/protocol.js | 4 +- agkyra/agkyra/gui/settings.html | 8 +- agkyra/agkyra/protocol.py | 21 +++-- 4 files changed, 101 insertions(+), 66 deletions(-) diff --git a/agkyra/agkyra/gui/menu.html b/agkyra/agkyra/gui/menu.html index 7ba6e4f..bcba22b 100644 --- a/agkyra/agkyra/gui/menu.html +++ b/agkyra/agkyra/gui/menu.html @@ -42,7 +42,7 @@ menu.append(new gui.MenuItem({type: 'separator'})); pause_item = new gui.MenuItem({ // pause menu item icon: 'images/play_pause.png', - label: '', + label: 'NOT READY', type: 'normal', click: function() { if (paused) {post_start(socket);} else {post_pause(socket);} @@ -51,84 +51,43 @@ pause_item = new gui.MenuItem({ pause_item.enabled = false; menu.append(pause_item); -// Update progress -window.setInterval(function() { - var status = globals['status']; - var new_progress = progress_item.label; - var new_pause = pause_item.label; - var menu_modified = false; - if (status['paused'] !== null) { - switch(pause_item.label) { - case pause_syncing: if (status['paused']) { - // Update to "Paused - start syncing" - paused = true; - new_pause = start_syncing; - menu_modified = true; - } // else continue syncing - new_progress = status['progress'] + '%' + ' synced'; - break; - case start_syncing: if (status['paused']) return; - // else update to "Syncing - pause syncing" - paused = false; - new_pause = pause_syncing; - new_progress = status['progress'] + '%' + ' synced'; - menu_modified = true; - break; - default: - if (status['paused']) {new_pause = start_syncing; paused=true;} - else {new_pause = pause_syncing; paused=false;} - new_progress = status['progress'] + '%' + ' synced'; - pause_item.enabled = true; - menu_modified = true; - } - } - if (new_pause != pause_item.label) { - pause_item.label = new_pause; - menu_modified = true; - } - if (new_progress != progress_item.label) { - progress_item.label = new_progress; - menu_modified = true; - } - if (menu_modified) { - if (paused) progress_item.label += ' - paused'; - tray.menu = menu; - } - get_status(socket); -}, 1500); - // Menu actions contents -menu.append(new gui.MenuItem({ +var local_folder_menu = new gui.MenuItem({ label: 'Open local folder', icon: 'images/folder.png', + enabled: false, click: function () { var dir = globals['settings']['directory']; console.log('Open ' + dir); gui.Shell.showItemInFolder(dir); } -})); +}) +menu.append(local_folder_menu); -menu.append(new gui.MenuItem({ +var pithos_page_menu = new gui.MenuItem({ label: 'Launch Pithos+ page', icon: 'images/pithos.png', + enabled: false, click: function () { var pithos_ui = globals['settings']['pithos_ui']; console.log('Visit ' + pithos_ui); gui.Shell.openExternal(pithos_ui); } -})); +}); +menu.append(pithos_page_menu); // Settings and About menu.append(new gui.MenuItem({type: 'separator'})); -menu.append(new gui.MenuItem({ +var settings_menu = new gui.MenuItem({ label: 'Settings', icon: 'images/settings.png', + enabled: false, click: function () { export_settings(globals.settings); if (windows['settings']) windows['settings'].close(); windows['settings'] = gui.Window.open("settings.html", { toolbar: false, focus: true, - width: 841, height: 520, + width: 841, height: 520 }); windows['settings'].on('closed', function() { new_settings = import_settings(); @@ -137,7 +96,8 @@ menu.append(new gui.MenuItem({ get_settings(socket); }); }, -})); +}); +menu.append(settings_menu); menu.append(new gui.MenuItem({ label: 'About', @@ -159,6 +119,72 @@ menu.append(new gui.MenuItem({ click: function() {post_shutdown(socket);} })); + +// Update progress +var client_ready = false; +window.setInterval(function() { + if (!client_ready) { + if (globals.authenticated) { + settings_menu.enabled = true; + client_ready = true; + } else return; + } + + if (client_ready) { + if (!pithos_page_menu.enabled) { + // GET pithos page with tokenless operations + } + if (!local_folder_menu.enabled) { + if (globals.settings.directory) { + local_folder_menu.enabled = true; + } + } + } + + var status = globals['status']; + var new_progress = progress_item.label; + var new_pause = pause_item.label; + var menu_modified = false; + if (status['paused'] !== null) { + switch(pause_item.label) { + case pause_syncing: if (status['paused']) { + // Update to "Paused - start syncing" + paused = true; + new_pause = start_syncing; + menu_modified = true; + } // else continue syncing + new_progress = status['progress'] + '%' + ' synced'; + break; + case start_syncing: if (status['paused']) return; + // else update to "Syncing - pause syncing" + paused = false; + new_pause = pause_syncing; + new_progress = status['progress'] + '%' + ' synced'; + menu_modified = true; + break; + default: + if (status['paused']) {new_pause = start_syncing; paused=true;} + else {new_pause = pause_syncing; paused=false;} + new_progress = status['progress'] + '%' + ' synced'; + pause_item.enabled = true; + menu_modified = true; + } + } + if (new_pause != pause_item.label) { + pause_item.label = new_pause; + menu_modified = true; + } + if (new_progress != progress_item.label) { + progress_item.label = new_progress; + menu_modified = true; + } + if (menu_modified) { + if (paused) progress_item.label += ' - paused'; + tray.menu = menu; + } + get_status(socket); +}, 1500); + tray.menu = menu; </script> diff --git a/agkyra/agkyra/gui/protocol.js b/agkyra/agkyra/gui/protocol.js index 44f79a2..87b56e8 100644 --- a/agkyra/agkyra/gui/protocol.js +++ b/agkyra/agkyra/gui/protocol.js @@ -19,7 +19,8 @@ var globals = { 'pithos_ui': null, 'exclude': null }, - 'status': {"progress": null, "paused": null} + 'status': {"progress": null, "paused": null}, + 'authenticated': false } // Protocol: requests ::: responses @@ -71,6 +72,7 @@ socket.onmessage = function(e) { if (r['ACCEPTED'] === 202) { get_settings(this); get_status(this); + globals.authenticated = true; } else { console.log('Helper: ' + JSON.stringify(r)); closeWindows(); diff --git a/agkyra/agkyra/gui/settings.html b/agkyra/agkyra/gui/settings.html index adf0661..5975734 100644 --- a/agkyra/agkyra/gui/settings.html +++ b/agkyra/agkyra/gui/settings.html @@ -18,9 +18,11 @@ if (container) $('#container').val(container); var directory = get_setting('directory'); if (directory) $('#directory').html(directory); - exclude = get_setting('exclude'); - if (exclude) $('#exclude').val( - fs.readFileSync(exclude, encoding='utf-8')); + var exclude = get_setting('exclude'); + if (exclude) try { + $('#exclude').val( + fs.readFileSync(exclude, encoding='utf-8')); + } catch (err) {console.log(err);} var pithos_ui = get_setting('pithos_ui'); if (pithos_ui) { $('#get_creds').show(); diff --git a/agkyra/agkyra/protocol.py b/agkyra/agkyra/protocol.py index 9cde1f7..d5700aa 100644 --- a/agkyra/agkyra/protocol.py +++ b/agkyra/agkyra/protocol.py @@ -72,6 +72,7 @@ class WebSocketProtocol(WebSocket): cnf = AgkyraConfig() def _load_settings(self): + LOG.debug('Start loading settings') sync = self.cnf.get('global', 'default_sync') cloud = self.cnf.get_sync(sync, 'cloud') @@ -94,7 +95,10 @@ class WebSocketProtocol(WebSocket): for option in ('container', 'directory', 'exclude'): self.settings[option] = self.cnf.get_sync(sync, option) + LOG.debug('Finished loading settings') + def _dump_settings(self): + LOG.debug('Saving settings') sync = self.cnf.get('global', 'default_sync') cloud = self.cnf.get_sync(sync, 'cloud') @@ -113,6 +117,9 @@ class WebSocketProtocol(WebSocket): for option in ('directory', 'container', 'exclude'): self.cnf.set_sync(sync, option, self.settings[option]) + self.cnf.write() + LOG.debug('Settings saved') + # Syncer-related methods def get_status(self): from random import randint @@ -121,7 +128,6 @@ class WebSocketProtocol(WebSocket): return self.status def get_settings(self): - self._load_settings() return self.settings def set_settings(self, new_settings): @@ -137,7 +143,6 @@ class WebSocketProtocol(WebSocket): # WebSocket connection methods def opened(self): LOG.debug('Helper: connection established') - self._load_settings() def closed(self, *args): LOG.debug('Helper: connection closed') @@ -149,7 +154,6 @@ class WebSocketProtocol(WebSocket): # Protocol handling methods def _post(self, r): """Handle POST requests""" - LOG.debug('CALLED with %s' % r) if self.accepted: action = r['path'] if action == 'shutdown': @@ -161,6 +165,7 @@ class WebSocketProtocol(WebSocket): }[action]() self.send_json({'OK': 200, 'action': 'post %s' % action}) elif r['gui_id'] == self.gui_id: + self._load_settings() self.accepted = True self.send_json({'ACCEPTED': 202, 'action': 'post gui_id'}) else: @@ -170,16 +175,16 @@ class WebSocketProtocol(WebSocket): def _put(self, r): """Handle PUT requests""" - if not self.accepted: - action = r['path'] - self.send_json({'UNAUTHORIZED': 401, 'action': 'put %s' % action}) - self.terminate() - else: + if self.accepted: LOG.debug('put %s' % r) action = r.pop('path') self.set_settings(r) r.update({'CREATED': 201, 'action': 'put %s' % action}) self.send_json(r) + else: + action = r['path'] + self.send_json({'UNAUTHORIZED': 401, 'action': 'put %s' % action}) + self.terminate() def _get(self, r): """Handle GET requests""" -- GitLab