コード例 #1
0
ファイル: display.py プロジェクト: mvonthron/rtm-ncurses
    def _clear_draw(self):
        self.lines, self.cols = self._stdscr.getmaxyx()
        self.view_width = self.cols
        self.pad_height = configuration.max_view_height
        self.pad_width = self.nb_views * self.view_width

        # curses windows creation
        self.titleline = TitleLine(1, self.cols, 0, 0)
        self.contentwin = ContentWindow(self.lines - 5, self.cols)
        #~ self.statusline  = StatusLine(1, self.cols, self.lines-2, 0)
        self.statusline = StatusLine(self.lines, self.cols)
        self.inputline = InputLine(1, self.cols, self.lines - 1, 0)

        self.contentwin.fillFromViews(self.views)
        self.statusline.fillFromViewlist(self.positions)
        self.inputline.set_prefix(self.curr_view)
コード例 #2
0
ファイル: display.py プロジェクト: mvonthron/rtm-ncurses
 def _clear_draw(self):
   self.lines, self.cols = self._stdscr.getmaxyx()
   self.view_width  = self.cols
   self.pad_height  = configuration.max_view_height
   self.pad_width   = self.nb_views*self.view_width
   
   # curses windows creation
   self.titleline   = TitleLine(1, self.cols, 0, 0)
   self.contentwin  = ContentWindow(self.lines-5, self.cols)
   #~ self.statusline  = StatusLine(1, self.cols, self.lines-2, 0)
   self.statusline  = StatusLine(self.lines, self.cols)
   self.inputline   = InputLine(1, self.cols, self.lines-1, 0)
   
   self.contentwin.fillFromViews(self.views)
   self.statusline.fillFromViewlist(self.positions)
   self.inputline.set_prefix(self.curr_view)
コード例 #3
0
ファイル: display.py プロジェクト: mvonthron/rtm-ncurses
class Display(object):
  
  def __init__(self, stdscr):
    self._stdscr = stdscr
    #self.lines, self.cols = self._stdscr.getmaxyx()
    
    self.init_colors()
    
    # views
    self.views       = {
      'default': View(0, 0, ""),
    }
    self.positions   = self.views.keys()
    self.curr_view   = self.positions[0]
    self.nb_views    = len(self.views)
    
    # screen variables
    # self.view_h      = curses.LINES-5
    #~ self.view_width  = curses.COLS
    #~ self.pad_height  = configuration.max_view_height
    #~ self.pad_width   = self.nb_views*self.view_width
    #~ 
    #~ # curses windows creation
    #~ self.titleline   = TitleLine()
    #~ self.contentwin  = ContentWindow()
    #~ self.statusline  = StatusLine()
    #~ self.inputline   = InputLine()
    #~ 
    #~ self.contentwin.fillFromViews(self.views)
    #~ self.statusline.fillFromViewlist(self.positions)
    #~ self.inputline.set_prefix(self.curr_view)
    
    self._clear_draw()
    
  def _clear_draw(self):
    self.lines, self.cols = self._stdscr.getmaxyx()
    self.view_width  = self.cols
    self.pad_height  = configuration.max_view_height
    self.pad_width   = self.nb_views*self.view_width
    
    # curses windows creation
    self.titleline   = TitleLine(1, self.cols, 0, 0)
    self.contentwin  = ContentWindow(self.lines-5, self.cols)
    #~ self.statusline  = StatusLine(1, self.cols, self.lines-2, 0)
    self.statusline  = StatusLine(self.lines, self.cols)
    self.inputline   = InputLine(1, self.cols, self.lines-1, 0)
    
    self.contentwin.fillFromViews(self.views)
    self.statusline.fillFromViewlist(self.positions)
    self.inputline.set_prefix(self.curr_view)
    
    
  
  def init_colors(self):
    curses.start_color()
    curses.use_default_colors()
    
    self.colorslist = {
      "yellow":  3,
      "red":     4,
      "green":   5,
      "cyan":    6,
      "magenta": 7,
    }
    
    curses.init_pair(1, curses.COLOR_WHITE, -1)
    curses.init_pair(2, curses.COLOR_WHITE, curses.COLOR_BLUE)
    curses.init_pair(3, curses.COLOR_YELLOW, curses.COLOR_BLUE)
    curses.init_pair(4, curses.COLOR_RED, curses.COLOR_BLUE)
    curses.init_pair(5, curses.COLOR_GREEN, curses.COLOR_BLUE)
    curses.init_pair(6, curses.COLOR_CYAN, curses.COLOR_BLUE)
    curses.init_pair(7, curses.COLOR_MAGENTA, curses.COLOR_BLUE)


  def resize(self, signum=None, frame=None):
    try:
      curses.endwin()
    except:
      pass
    
    self._stdscr = curses.initscr()
    self._clear_draw()
    #self.titleline.resize()
    #self.inputline.refresh()
    #self.statusline.refresh()
    #self.contentwin.refresh()
    
    self.write("RESIZING [%d, %d]" % self._stdscr.getmaxyx())
    
  #
  # view management methods
  #
  def _getView(self, viewid=None):
    """returns name of a view
    if argument 'viewid' is an int, the name of the view at the position is returned
    if argument is None or omitted, the name of current view is returned
    if argument is a string, just check if the view exists and return the name
    """
    
    if viewid is None:
      return self.curr_view
    elif isinstance(viewid, int):
      if viewid < len(self.positions):
        return self.positions[viewid]
      else:
        raise UnknownView()
    elif isinstance(viewid, str):
      if viewid in self.views:
        return viewid
      else:
        raise UnknownView()
    else:
      raise ArgumentError()
  
  
  def addView(self, name, buffer="", pos=None, switch=True):
    """Add a view to the display.
    if pos is none: placed at the end
    """
    if name in self.views:
      raise Exception("Invalid name")
    
    self.views[name] = View(self.nb_views*curses.COLS, 0, buffer)
    self.nb_views = len(self.views)
    self.pad_width += self.view_width
    self.contentwin.resize_pad(self.pad_width, self.pad_height)

    if not pos is None and isinstance(pos, int):
      self.positions.insert(pos, name)
    else:
      self.positions.append(name)

    # something cleaner ?
    self.contentwin.fillFromViews(self.views)
    self.statusline.fillFromViewlist(self.positions)
    
    if(switch):
      self.switchToView(name)


  def removeView(self, viewid=None):
    """remove view"""
    view = self._getView(viewid)

    self.positions.remove(view)
    self.statusline.fillFromViewlist(self.positions)
    
  def swapViews(self, dest_id, origin_id=None):
    """swap views"""
    origin = self.positions.index( self._getView(origin_id) )
    dest   = self.positions.index( self._getView(dest_id) )
    
    self.positions[origin], self.positions[dest] = self.positions[dest], self.positions[origin], 
    self.statusline.fillFromViewlist(self.positions)

  def switchToView(self, viewid):
    """switch requested view"""
    view = self._getView(viewid)
    self.inputline.set_prefix(view)
    self.contentwin.refresh(self.views[view].x, self.views[view].y)
    self.curr_view = view
  
  
  def first(self):
    """Switch to first view"""
    self.switchToView( 0 )
    
  def last(self):
    """Switch to last view"""
    self.switchToView( len(self.positions)-1 )
  
  def next(self):
    """switch to next view: manage contentwin as well as status, etc."""
    current_id = self.positions.index(self.curr_view)
    if current_id != self.nb_views-1:
      self.switchToView( current_id + 1 )
    else:
      # already at last view
      # @todo add conf.circular condition
      self.first()

  def prev(self):
    """switch to previous view"""
    current_id = self.positions.index(self.curr_view)
    
    if current_id > 0:
      self.switchToView( current_id - 1 )
    else:
      # @todo add conf.circular condition
      self.last()
  
  def setName(self, new_name, viewid=None):
    """change name of the current views, affects views list as well as prefix on input bar"""
    view = self._getView(viewid)
    if not isinstance(new_name, str):
      raise ArgumentError()
    
    if viewid is None:
      self.curr_view = new_name
    self.views[new_name] = self.views[view]
    del self.views[view]
    self.positions[ self.positions.index(view) ] = new_name
    self.statusline.fillFromViewlist(self.positions)
    self.inputline.set_prefix(new_name)
    
  #
  # content management methods
  #
  def clear(self, viewid=None):
    """clear content in targeted view, current if arg is omitted"""
    view = self._getView(viewid)
    self.views[view].buffer = ""
    self.views[view].cursor = 0
    self.contentwin.fillFromViews(self.views)
    
  def write(self, content, viewid=None):
    """print content into view, current if arg is omitted"""
    view = self._getView(viewid)
    self.views[view].buffer  = ''.join([self.views[view].buffer, content, '\n'])
    
    for line in content.split('\n'):
      self.contentwin.write(self.views[view].cursor, self.views[view].x, line, refresh=False)
      self.views[view].cursor += 1
    
    self.contentwin.refresh(self.views[view].x, self.views[view].y)

  # others
  def set_color(self, color):
    view = self._getView(None)
    if color in self.colorslist:
      self.statusline.set_color(view, curses.color_pair(self.colorslist[color]))
コード例 #4
0
ファイル: display.py プロジェクト: mvonthron/rtm-ncurses
class Display(object):
    def __init__(self, stdscr):
        self._stdscr = stdscr
        #self.lines, self.cols = self._stdscr.getmaxyx()

        self.init_colors()

        # views
        self.views = {
            'default': View(0, 0, ""),
        }
        self.positions = self.views.keys()
        self.curr_view = self.positions[0]
        self.nb_views = len(self.views)

        # screen variables
        # self.view_h      = curses.LINES-5
        #~ self.view_width  = curses.COLS
        #~ self.pad_height  = configuration.max_view_height
        #~ self.pad_width   = self.nb_views*self.view_width
        #~
        #~ # curses windows creation
        #~ self.titleline   = TitleLine()
        #~ self.contentwin  = ContentWindow()
        #~ self.statusline  = StatusLine()
        #~ self.inputline   = InputLine()
        #~
        #~ self.contentwin.fillFromViews(self.views)
        #~ self.statusline.fillFromViewlist(self.positions)
        #~ self.inputline.set_prefix(self.curr_view)

        self._clear_draw()

    def _clear_draw(self):
        self.lines, self.cols = self._stdscr.getmaxyx()
        self.view_width = self.cols
        self.pad_height = configuration.max_view_height
        self.pad_width = self.nb_views * self.view_width

        # curses windows creation
        self.titleline = TitleLine(1, self.cols, 0, 0)
        self.contentwin = ContentWindow(self.lines - 5, self.cols)
        #~ self.statusline  = StatusLine(1, self.cols, self.lines-2, 0)
        self.statusline = StatusLine(self.lines, self.cols)
        self.inputline = InputLine(1, self.cols, self.lines - 1, 0)

        self.contentwin.fillFromViews(self.views)
        self.statusline.fillFromViewlist(self.positions)
        self.inputline.set_prefix(self.curr_view)

    def init_colors(self):
        curses.start_color()
        curses.use_default_colors()

        self.colorslist = {
            "yellow": 3,
            "red": 4,
            "green": 5,
            "cyan": 6,
            "magenta": 7,
        }

        curses.init_pair(1, curses.COLOR_WHITE, -1)
        curses.init_pair(2, curses.COLOR_WHITE, curses.COLOR_BLUE)
        curses.init_pair(3, curses.COLOR_YELLOW, curses.COLOR_BLUE)
        curses.init_pair(4, curses.COLOR_RED, curses.COLOR_BLUE)
        curses.init_pair(5, curses.COLOR_GREEN, curses.COLOR_BLUE)
        curses.init_pair(6, curses.COLOR_CYAN, curses.COLOR_BLUE)
        curses.init_pair(7, curses.COLOR_MAGENTA, curses.COLOR_BLUE)

    def resize(self, signum=None, frame=None):
        try:
            curses.endwin()
        except:
            pass

        self._stdscr = curses.initscr()
        self._clear_draw()
        #self.titleline.resize()
        #self.inputline.refresh()
        #self.statusline.refresh()
        #self.contentwin.refresh()

        self.write("RESIZING [%d, %d]" % self._stdscr.getmaxyx())

    #
    # view management methods
    #
    def _getView(self, viewid=None):
        """returns name of a view
    if argument 'viewid' is an int, the name of the view at the position is returned
    if argument is None or omitted, the name of current view is returned
    if argument is a string, just check if the view exists and return the name
    """

        if viewid is None:
            return self.curr_view
        elif isinstance(viewid, int):
            if viewid < len(self.positions):
                return self.positions[viewid]
            else:
                raise UnknownView()
        elif isinstance(viewid, str):
            if viewid in self.views:
                return viewid
            else:
                raise UnknownView()
        else:
            raise ArgumentError()

    def addView(self, name, buffer="", pos=None, switch=True):
        """Add a view to the display.
    if pos is none: placed at the end
    """
        if name in self.views:
            raise Exception("Invalid name")

        self.views[name] = View(self.nb_views * curses.COLS, 0, buffer)
        self.nb_views = len(self.views)
        self.pad_width += self.view_width
        self.contentwin.resize_pad(self.pad_width, self.pad_height)

        if not pos is None and isinstance(pos, int):
            self.positions.insert(pos, name)
        else:
            self.positions.append(name)

        # something cleaner ?
        self.contentwin.fillFromViews(self.views)
        self.statusline.fillFromViewlist(self.positions)

        if (switch):
            self.switchToView(name)

    def removeView(self, viewid=None):
        """remove view"""
        view = self._getView(viewid)

        self.positions.remove(view)
        self.statusline.fillFromViewlist(self.positions)

    def swapViews(self, dest_id, origin_id=None):
        """swap views"""
        origin = self.positions.index(self._getView(origin_id))
        dest = self.positions.index(self._getView(dest_id))

        self.positions[origin], self.positions[dest] = self.positions[
            dest], self.positions[origin],
        self.statusline.fillFromViewlist(self.positions)

    def switchToView(self, viewid):
        """switch requested view"""
        view = self._getView(viewid)
        self.inputline.set_prefix(view)
        self.contentwin.refresh(self.views[view].x, self.views[view].y)
        self.curr_view = view

    def first(self):
        """Switch to first view"""
        self.switchToView(0)

    def last(self):
        """Switch to last view"""
        self.switchToView(len(self.positions) - 1)

    def next(self):
        """switch to next view: manage contentwin as well as status, etc."""
        current_id = self.positions.index(self.curr_view)
        if current_id != self.nb_views - 1:
            self.switchToView(current_id + 1)
        else:
            # already at last view
            # @todo add conf.circular condition
            self.first()

    def prev(self):
        """switch to previous view"""
        current_id = self.positions.index(self.curr_view)

        if current_id > 0:
            self.switchToView(current_id - 1)
        else:
            # @todo add conf.circular condition
            self.last()

    def setName(self, new_name, viewid=None):
        """change name of the current views, affects views list as well as prefix on input bar"""
        view = self._getView(viewid)
        if not isinstance(new_name, str):
            raise ArgumentError()

        if viewid is None:
            self.curr_view = new_name
        self.views[new_name] = self.views[view]
        del self.views[view]
        self.positions[self.positions.index(view)] = new_name
        self.statusline.fillFromViewlist(self.positions)
        self.inputline.set_prefix(new_name)

    #
    # content management methods
    #
    def clear(self, viewid=None):
        """clear content in targeted view, current if arg is omitted"""
        view = self._getView(viewid)
        self.views[view].buffer = ""
        self.views[view].cursor = 0
        self.contentwin.fillFromViews(self.views)

    def write(self, content, viewid=None):
        """print content into view, current if arg is omitted"""
        view = self._getView(viewid)
        self.views[view].buffer = ''.join(
            [self.views[view].buffer, content, '\n'])

        for line in content.split('\n'):
            self.contentwin.write(self.views[view].cursor,
                                  self.views[view].x,
                                  line,
                                  refresh=False)
            self.views[view].cursor += 1

        self.contentwin.refresh(self.views[view].x, self.views[view].y)

    # others
    def set_color(self, color):
        view = self._getView(None)
        if color in self.colorslist:
            self.statusline.set_color(
                view, curses.color_pair(self.colorslist[color]))