Package libxyz :: Package ui :: Module box_input

[hide private]
[frames] | no frames]

# Source Code for Module libxyz.ui.box_input

      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  from libxyz.ui import Box
     20  from libxyz.ui import Border
     21
     22  import libxyz.ui
     23
     24 -class InputBox(Box):
     25      """
     26      Shows a message and waits for input
     27      """
     28
     29      # Skin rulesets resolution order
     30      resolution = (u"input_box", u"box", u"widget")
     31
     32 -    def __init__(self, xyz, body, message, title="", text="", width=70):
     33          """
     34          @param xyz: XYZ dictionary
     35          @param body: Top-level widget
     36          @param message: Message to display
     37          @param title: Box title
     38          @param width: Box width (including mount box)
     39
     40          Required resources: title, box, border, mount, input, button
     41          """
     42
     43          super(InputBox, self).__init__(xyz, body, message, title, width)
     44          self.calc_size(7)
     45
     46          self.keys = libxyz.ui.Keys()
     47
     48          _hint = lowui.Text(_(u"Press ENTER to submit value. ESCAPE to quit"),
     49                             align=align.CENTER)
     50
     51          _title = self._strip_title(title.replace(u"\n", u" "))
     52
     53          if _title:
     54              _title_attr = self._attr(u"title")
     55          else:
     56              _title, _title_attr = None, None
     57
     58          _mount = lowui.AttrWrap(lowui.Filler(lowui.Text(u"")),
     59                                  self._attr(u"mount"))
     60
     61          # Main dialog text
     62          _text = lowui.Text((self._attr(u"box"), message), align.CENTER)
     63          _blank = lowui.Text((self._attr(u"box"), ""))
     64
     65          self._edit = lowui.AttrWrap(lowui.Edit(wrap="clip", edit_text=text),
     66                                      self._attr(u"input"))
     67
     68          _widgets = [_text, _blank, self._edit, _blank, _hint]
     69          _box = lowui.Filler(lowui.Pile(_widgets), valign=align.BOTTOM)
     70          _box = Border(_box, _title, _title_attr, self._attr(u"border"))
     71          _box = lowui.AttrWrap(_box, self._attr(u"box"))
     72
     73          _mount = lowui.Overlay(_mount, body, align.CENTER, self.full_width,
     74                               align.MIDDLE, self.full_height)
     75          _box = lowui.Overlay(_box, _mount, align.CENTER, self.box_width,
     76                               align.MIDDLE, self.box_height)
     77
     78          self.parent_init(_box)
     79
     80      #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     81
     82 -    def show(self, dim=None):
     83          """
     84          Show box and return input value.
     85          Return None if Escape was pressed
     86          """
     87
     88          if dim is None:
     89              dim = self.screen.get_cols_rows()
     90          while True:
     91              try:
     92                  self.screen.draw_screen(dim, self.render(dim, focus=True))
     93
     94                  _keys = self.xyz.input.get()
     95
     96                  if self.xyz.input.WIN_RESIZE in _keys:
     97                      dim = self.screen.get_cols_rows()
     98                      continue
     99
    100                  if self.keys.ESCAPE in _keys:
    101                      return None
    102
    103                  if self.keys.ENTER in _keys:
    104                      return self._edit.get_edit_text()
    105
    106                  for k in _keys:
    107                      self._edit.keypress((dim[0],), k)
    108              except KeyboardInterrupt:
    109                  continue
    110