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

# Source Code for Module libxyz.ui.box

      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.ui import lowui
     18  from libxyz.ui import align
     19
     20 -class Box(lowui.WidgetWrap):
     21      """
     22      Base box
     23      """
     24
     25      # Skin rulesets resolution order
     26      resolution = (u"box", u"widget")
     27
     28 -    def __init__(self, xyz, body, message, title="", width=70):
     29          """
     30          @param xyz: XYZ data
     31          @param body: Top-level widget
     32          @param message: Message to display
     33          @param title: Box title
     34          @param width: Box width
     35
     36          Required resources: title, box, mount
     37          """
     38
     39          self.xyz = xyz
     40          self.screen = xyz.screen
     41          self.skin = xyz.skin
     42          self.message = message
     43          self.full_width = width
     44          self._enc = xyzenc
     45
     46          self.mount_span = {u"vertical": 2, u"horizontal": 2}
     47
     48          self._attr = lambda name: self.skin.attr(self.resolution, name)
     49
     50      #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     51
     52 -    def calc_size(self, rowspan):
     53          """
     54          Calculate size
     55          """
     56
     57          self.rowspan = rowspan
     58          self.box_width = self.full_width - self.mount_span[u"horizontal"]
     59          self.box_height = self._rows(self.message)
     60          self.full_height = self.box_height + self.mount_span[u"vertical"]
     61
     62      #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     63
     64 -    def parent_init(self, box):
     65          """
     66          Init parent class
     67          """
     68
     69          super(Box, self).__init__(box)
     70
     71      #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     72
     73 -    def show(self, dim=None, wait=True):
     74          """
     75          Show box
     76          @param dim: Dimension
     77          @param wait: If True wait for key pressed
     78          """
     79
     80          if dim is None:
     81              dim = self.screen.get_cols_rows()
     82
     83          self.screen.draw_screen(dim, self.render(dim, True))
     84
     85          _input = None
     86
     87          if wait:
     88              while True:
     89                  _input = self.xyz.input.get()
     90
     91                  if _input:
     92                      break
     93
     94          return _input
     95
     96      #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     97
     98 -    def _rows(self, msg):
     99          """
    100          Calculate required rows
    101          """
    102
    103          # 2 for two rows: on top and bottom
    104          _maxrows = self.screen.get_cols_rows()[1] - \
    105                     2 - self.mount_span[u"vertical"]
    106          _lines = msg.count("\n")
    107
    108          if _lines + self.rowspan > _maxrows:
    109              _rows = _maxrows
    110          else:
    111              _rows = _lines + self.rowspan
    112
    113          return _rows
    114
    115      #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    116
    117 -    def _strip_title(self, title):
    118          """
    119          Strip title if needed
    120          """
    121
    122          _maxlen = self.box_width - 6
    123          _len = len(title)
    124
    125          _stripped = title
    126
    127          if _len >= _maxlen:
    128              _stripped = u"%s..." % title[:_maxlen - 3]
    129
    130          return _stripped
    131