Package libxyz :: Package ui :: Module entry |
[hide private]
[frames] | no frames]

# Source Code for Module libxyz.ui.entry

      1  #-*- coding: utf8 -*
      2  #
      3  # Max E. Kuznecov ~syhpoon <syhpoon@syhpoon.name> 2008
      4  #
      5  # This file is part of XYZCommander.
      6  # XYZCommander is free software: you can redistribute it and/or modify
      7  # it under the terms of the GNU Lesser Public License as published by
      8  # the Free Software Foundation, either version 3 of the License, or
      9  # (at your option) any later version.
     10  # XYZCommander is distributed in the hope that it will be useful,
     11  # but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
     13  # GNU Lesser Public License for more details.
     14  # You should have received a copy of the GNU Lesser Public License
     15  # along with XYZCommander. If not, see <http://www.gnu.org/licenses/>.
     16
     17  from libxyz.core.utils import ustring
     18  from libxyz.ui import lowui
     19  import libxyz.ui
     20
     21 -class ListEntry(lowui.FlowWidget):
     22      """
     23      List entry
     24      """
     25
     26 -    def __init__(self, msg, selected_attr, entry_attr=None):
     27          """
     28          @param msg: Message
     29          @param selected_attr: Atrribute of selected entry
     30          @param entry_attr: Entry text attribute
     31          """
     32
     33          super(ListEntry, self).__init__()
     34
     35          self._text = msg
     36          self._sel_attr = selected_attr
     37          self._entry_attr = entry_attr
     38          self._content = lowui.Text(self._text)
     39
     40      #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     41
     42 -    def selectable(self):
     43          return True
     44
     45      #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     46
     47 -    def rows(self, (maxcol,), focus=False):
     48          return len(self._content.get_line_translation(maxcol))
     49
     50      #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     51
     52 -    def render(self, (maxcol,), focus=False):
     53          if focus:
     54              self._content.set_text((self._sel_attr, self._text))
     55          else:
     56              if self._entry_attr is not None:
     57                  self._content.set_text((self._entry_attr, self._text))
     58              else:
     59                  self._content.set_text(self._text)
     60
     61          return self._content.render((maxcol,), focus)
     62
     63      #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     64
     65 -    def keypress(self, (maxcol,), key):
     66          return key
     67
     68      #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     69
     70      text = property(lambda self: self._text)
     71
     72  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     73
     74 -class NumEntry(ListEntry):
     75      """
     76      Entry in list box which can be activated by pressing corresponding number
     77      """
     78
     79 -    def __init__(self, msg, selected_attr, num_order, entry_attr=None,
     80                   enter_cb=None):
     81          """
     82          @param msg: Message
     83          @param selected_attr: Atrribute of selected entry
     84          @param entry_attr: Entry text attribute
     85          @param num_order: Entry number
     86          @param enter_cb: Callback to be executed upon ENTER pressed
     87          """
     88
     89          self._num = []
     90
     91          if callable(enter_cb):
     92              self._enter_cb = enter_cb
     93          else:
     94              self._enter_cb = None
     95
     96          self.num_order = num_order
     97          self._keys = libxyz.ui.Keys()
     98          _msg = u"%d: %s" % (num_order, msg)
     99
    100          super(NumEntry, self).__init__(_msg, selected_attr, entry_attr)
    101
    102      #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    103
    104 -    def keypress(self, (maxcol,), key):
    105          if key == self._keys.ENTER and callable(self._enter_cb):
    106              if self._num:
    107                  _index = int("".join(self._num))
    108                  self._num = []
    109              else:
    110                  _index = self.num_order
    111              try:
    112                  self._enter_cb(_index)
    113              except Exception, e:
    114                  xyzlog.error(_(u"Error in entry callback: %s" %
    115                             ustring(str(e))))
    116                  xyzlog.debug(ustring(traceback.format_exc()))
    117
    118              return key
    119          elif key.isdigit():
    120              self._num.append(key)
    121          else:
    122              return key
    123