view getan/nodes.py @ 273:a5c5675b6fa4

Give more "weight" to the description when displaying the project node entry With this change the project description will get more space in the row then the time. This avoids cutting long description texts even if the there is enough free space. With urwid 1.1 it would even better to user ("pack", time) for this.
author Björn Ricks <bjoern.ricks@intevation.de>
date Fri, 12 Apr 2013 09:34:18 +0200
parents 0190f1c30e3e
children c7f9997a5492
line wrap: on
line source
# -*- coding: utf-8 -*-
#
# (c) 2013 by Björn Ricks <bjoern.ricks@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 logging

import urwid

from getan.utils import short_time, format_datetime, human_time
from getan.resources import gettext as _

logger = logging.getLogger(__name__)

class Node(urwid.WidgetWrap):

    def __init__(self, item):
        self.selected = False
        self.has_focus = False
        self.item = item
        w = urwid.AttrMap(self.get_widget(), None)
        self.__super.__init__(w)

    def get_widget(self):
        return urwid.Text(' %s ' % (self.get_item_text()), wrap='clip')

    def get_item_text(self):
        return str(self.item)

    def update_w(self):
        if self.has_focus:
            if self.selected:
                self._w.set_focus_map({None: 'selected focus entry'})
                self._w.set_attr_map({None: 'selected focus entry'})
            else:
                self._w.set_focus_map({None: 'focus entry'})
                self._w.set_attr_map({None: 'focus entry'})
        else:
            if self.selected:
                self._w.set_focus_map({None: 'selected entry'})
                self._w.set_attr_map({None: 'selected entry'})
            else:
                self._w.set_focus_map({None: 'entry body'})
                self._w.set_attr_map({None: 'entry body'})

    def select(self):
        self.selected = not self.selected
        logger.debug("Node: update selection of item '%s' selected %s"
                     % (self.item, self.selected))
        self._invalidate()

    def get_item(self):
        return self.item

    def selectable(self):
        return True

    def keypress(self, size, key):
        if "enter" in key:
            self.select()
            return None
        return key

    def render(self, size, focus=False):
        self.has_focus = focus
        self.update_w()
        return self._w.render(size, focus)

    def update(self):
        self._w = self.get_widget()


class ProjectNode(Node):

    MODES = [
        (0, _('Total')),
        (1, _('Year')),
        (2, _('Month')),
        (3, _('Week')),
        (4, _('Day'))
    ]

    def __init__(self, proj, mode=3, indent=0):
        self.indent = indent
        self.mode = self.MODES[mode]
        super(ProjectNode, self).__init__(proj)

    def get_widget(self):
        time_str = self._get_formatted_time()
        proj_desc = self.item.desc
        if proj_desc is None:
            proj_desc = ""

        description = urwid.Text([' ' * self.indent,
            ('project_key', self.item.key), (' '), (proj_desc)], wrap="clip")
        if self._get_time():
            time = urwid.Text('%s (%s)' % (self.mode[1], time_str),
                    align="right")
        else:
            time = urwid.Text('')
        return urwid.AttrMap(urwid.Columns([("weight", 2, description), time],
            dividechars=1), None)

    def _get_formatted_time(self):
        return human_time(self._get_time())

    def _get_time(self):
        if self.mode == self.MODES[0]:
            return self.item.total
        if self.mode == self.MODES[1]:
            return self.item.year()
        if self.mode == self.MODES[2]:
            return self.item.month()
        if self.mode == self.MODES[3]:
            return self.item.week()
        if self.mode == self.MODES[4]:
            return self.item.day()
        return self.item.week()

    def switch_time_mode(self):
        tmp = self.mode[0] + 1
        if tmp > 4:
            self.mode = self.MODES[0]
        else:
            self.mode = self.MODES[tmp]
        self._w = self.get_widget()


class EntryNode(Node):

    def __init__(self, entry):
        super(EntryNode, self).__init__(entry)

    def get_widget(self):
        logger.debug("EntryNode: update entry '%s'." % self.item.desc)
        row = urwid.Text(' %s [%s] %s' \
                         % (format_datetime(self.item.start), 
                            short_time(self.item.duration().seconds),
                            self.item.desc), wrap='clip')
        return urwid.AttrMap(row, None)
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)