view getan/config.py @ 148:f0a2beb17f9b

Add config classes to provide keybindings The new Config class to be able to configure getan. Until now it is only possible to configure the Keybinding. The config is read from $HOME/.getan/getanrc and /etc/getanrc of the first file isn't found. If both files aren't available a default is used.
author Björn Ricks <bjoern.ricks@intevation.de>
date Thu, 06 Dec 2012 12:25:58 +0100
parents 13e3ec26dc36
children 90abd423fc0c
line wrap: on
line source
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# (c) 2010 by Ingo Weinzierl <ingo.weinzierl@intevation.de>
#
# This is Free Software licensed under the terms of GPLv3 or later.
# For details see LICENSE coming with the source of 'getan'.
#

import locale
import logging
import os

from ConfigParser import SafeConfigParser, NoSectionError, NoOptionError

logger = None

def initialize(level=logging.INFO, filename="getan.log"):
    setup_logging(level, filename)
    setup_locale()


def setup_logging(level, filename):
    global logger
    logging.basicConfig(level=level,
                        format='%(asctime)s %(levelname)s %(message)s',
                        filename=filename,
                        filemode='w')
    logger = logging.getLogger()


def setup_locale():
    for var in ('LANGUAGE', 'LC_ALL', 'LC_MESSAGES', 'LANG'):
        if var in os.environ:
            break
    else:
        default_locale = locale.getdefaultlocale()
        # The default is normally a tuple of two strings.  It may
        # contain None, objects under some circumstances, though.
        if len(default_locale) > 1:
            lang = default_locale[0]
            if isinstance(lang, str):
                os.environ["LANG"] = lang


class Config(object):

    def __init__(self):
        self.config = self.load([os.path.expanduser("~/.getan/getanrc"),
                                 "/etc/getanrc"])
        self.keybinding = Keybinding(self)

    def load(self, filenames):
        configparser = SafeConfigParser()
        configparser.read(filenames)
        return configparser

    def get(self, section, key):
        return self.config.get(section, key)

    def items(self, section):
        return self.config.items(section)

    def get_keybinding(self):
        return self.keybinding


class Keybinding(object):

    KEYBINDINGS = "keybindings"

    KEY_SWITCH_TIME_MODE = "switch_time_mode"
    KEY_SWITCH_PROJECT_ORDER = "switch_project_order"
    KEY_SWITCH_LISTS = "switch_lists"
    KEY_ENTER = "enter"
    KEY_INSERT = "insert"
    KEY_DELETE = "delete"
    KEY_ESCAPE = "escape"
    KEY_ENTRY_DELETE = "entry_delete"
    KEY_ENTRY_UP = "entry_up"
    KEY_ENTRY_DOWN = "entry_down"
    KEY_ENTRY_MOVE = "entry_move"
    KEY_ENTRY_EDIT = "entry_edit"
    KEY_ADD_TIME = "add_time"
    KEY_SUBTRACT_TIME = "subtract_time"
    KEY_PAUSE_PROJECT = "pause_project"

    DEFAULT_KEYBINDINGS = {
            KEY_SWITCH_TIME_MODE : "f1",
            KEY_SWITCH_PROJECT_ORDER : "f2",
            KEY_SWITCH_LISTS : "tab",
            KEY_ENTER : "enter",
            KEY_INSERT : "insert",
            KEY_DELETE : "delete",
            KEY_ESCAPE : "esc",
            KEY_ENTRY_UP : "up",
            KEY_ENTRY_DOWN : "down",
            KEY_ENTRY_DELETE : "d",
            KEY_ENTRY_MOVE : "m",
            KEY_ENTRY_EDIT : "e",
            KEY_ADD_TIME : "+",
            KEY_SUBTRACT_TIME : "-",
            KEY_PAUSE_PROJECT : " ",
            }


    def __init__(self, config):
        logger.debug("Keybindings are: %r" % config.items(self.KEYBINDINGS))
        self.config = config

    def get_binding(self, key):
        value = None
        try:
            value = self.config.get(self.KEYBINDINGS, key)
        except (NoSectionError, NoOptionError):
            pass

        if not value:
            value = self.DEFAULT_KEYBINDINGS[key]
        return value

    def get_switch_time_mode(self):
        return self.get_binding(self.KEY_SWITCH_TIME_MODE)

    def get_switch_project_order(self):
        return self.get_binding(self.KEY_SWITCH_PROJECT_ORDER)

    def get_switch_lists(self):
        return self.get_binding(self.KEY_SWITCH_LISTS)

    def get_enter(self):
        return self.get_binding(self.KEY_ENTER)

    def get_insert(self):
        return self.get_binding(self.KEY_INSERT)

    def get_delete(self):
        return self.get_binding(self.KEY_DELETE)

    def get_escape(self):
        return self.get_binding(self.KEY_ESCAPE)

    def get_entry_delete(self):
        return self.get_binding(self.KEY_ENTRY_DELETE)

    def get_entry_move(self):
        return self.get_binding(self.KEY_ENTRY_MOVE)

    def get_entry_edit(self):
        return self.get_binding(self.KEY_ENTRY_EDIT)

    def get_entry_up(self):
        return self.get_binding(self.KEY_ENTRY_UP)

    def get_entry_down(self):
        return self.get_binding(self.KEY_ENTRY_DOWN)

    def get_add_time(self):
        return self.get_binding(self.KEY_ADD_TIME)

    def get_subtract_time(self):
        return self.get_binding(self.KEY_SUBTRACT_TIME)

    def get_pause_project(self):
        return self.get_binding(self.KEY_PAUSE_PROJECT)
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)