changeset 1159:85fd02356dba

primitivus: key can be changed in config: - new config module manage configuration - if any configuration error happen, config parsing is stopped, and a popup appear + a log error - key can be changed with key_[action_name] = [shortcut] - early popup (popup happening before main widget is built, e.g. in profile manager) are managed
author Goffi <goffi@goffi.org>
date Thu, 04 Sep 2014 19:05:57 +0200
parents c0f15e52695a
children 2ff15a6c5791
files frontends/src/primitivus/config.py frontends/src/primitivus/constants.py frontends/src/primitivus/primitivus
diffstat 3 files changed, 70 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frontends/src/primitivus/config.py	Thu Sep 04 19:05:57 2014 +0200
@@ -0,0 +1,48 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Primitivus: a SAT frontend
+# Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014 Jérôme Poisson (goffi@goffi.org)
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+"""This module manage configuration specific to Primitivus"""
+
+from sat_frontends.primitivus.constants import Const as C
+from sat_frontends.primitivus.keys import action_key_map
+import ConfigParser
+
+
+def applyConfig():
+    """Parse configuration and apply found change
+
+    raise: can raise various Exceptions if configuration is not good
+    """
+    config = ConfigParser.SafeConfigParser()
+    config.read(C.CONFIG_FILES)
+    try:
+        options = config.items(C.CONFIG_SECTION)
+    except ConfigParser.NoSectionError:
+        options = []
+    shortcuts = {}
+    for name, value in options:
+        if name.startswith(C.CONFIG_OPT_KEY_PREFIX.lower()):
+            action = name[len(C.CONFIG_OPT_KEY_PREFIX):].upper()
+            shortcut = value
+            if not action or not shortcut:
+                raise ValueError("Bad option: {} = {}".format(name, value))
+            shortcuts[action] = shortcut
+
+    action_key_map.replace(shortcuts)
+    action_key_map.check_namespaces()
--- a/frontends/src/primitivus/constants.py	Thu Sep 04 19:05:57 2014 +0200
+++ b/frontends/src/primitivus/constants.py	Thu Sep 04 19:05:57 2014 +0200
@@ -82,3 +82,5 @@
     LOG_OPT_SECTION = APP_NAME.lower()
     LOG_OPT_OUTPUT = ('output', constants.Const.LOG_OPT_OUTPUT_SEP + constants.Const.LOG_OPT_OUTPUT_MEMORY)
 
+    CONFIG_SECTION = APP_NAME.lower()
+    CONFIG_OPT_KEY_PREFIX = "KEY_"
--- a/frontends/src/primitivus/primitivus	Thu Sep 04 19:05:57 2014 +0200
+++ b/frontends/src/primitivus/primitivus	Thu Sep 04 19:05:57 2014 +0200
@@ -37,6 +37,7 @@
 from sat_frontends.primitivus.progress import Progress
 from sat_frontends.primitivus.notify import Notify
 from sat_frontends.primitivus.keys import action_key_map as a_key
+from sat_frontends.primitivus import config
 from sat_frontends.tools.misc import InputHistory
 from sat_frontends.constants import Const as commonConst # FIXME
 from sat_frontends.tools.jid import JID
@@ -235,6 +236,18 @@
         self.loop.set_alarm_in(0,lambda a,b: self.postInit())
         self.loop.run()
 
+    def postInit(self):
+        try:
+            config.applyConfig()
+        except Exception as e:
+            log.error("configuration error: {}".format(e))
+            popup = sat_widgets.Alert(_("Configuration Error"), _("Something went wrong while reading the configuration, please check :messages"), ok_cb=self.removePopUp)
+            if self.options.profile:
+                self._early_popup = popup
+            else:
+                self.showPopUp(popup)
+        super(PrimitivusApp, self).postInit()
+
     def inputFilter(self, input, raw):
         if self.__saved_overlay and input != ['ctrl s']:
             return
@@ -347,6 +360,13 @@
         self.loop.widget = self._buildMainWidget()
         self.redraw()
         QuickApp.plug_profile_1(self, profile_key)
+        try:
+            # if a popup arrived before main widget is build, we need to show it now
+            self.showPopUp(self._early_popup)
+        except AttributeError:
+            pass
+        else:
+            del self._early_popup
 
     def removePopUp(self, widget=None):
         "Remove current pop-up, and if there is other in queue, show it"