Skip to content

Instantly share code, notes, and snippets.

@yoavlt
Created May 19, 2014 06:46
Show Gist options
  • Save yoavlt/1ada3e94c8ca8269ab7c to your computer and use it in GitHub Desktop.
Save yoavlt/1ada3e94c8ca8269ab7c to your computer and use it in GitHub Desktop.
import curses
import subprocess
class Window(object):
def __init__(self, x = None, y = None, width = None, height = None):
self._x = x
self._y = y
self._width = width
self._height = height
@property
def x(self):
return self._x
@x.setter
def x(self, value):
self._x = value
self.update()
@property
def y(self):
return self._y
@y.setter
def y(self, value):
self._y = value
self.update()
@property
def width(self):
return self._width;
@width.setter
def width(self, value):
self._width = value
self.update()
@property
def height(self):
return self._height
@height.setter
def height(self, value):
self._height = value
def update(self):
if self.width and self.height and self.x and self.y:
self._win = curses.newwin(self.height, self.width, self.y, self.x)
self._win.border(0)
self._content = curses.newwin(
self.height - 2,
self.width - 4,
self.y + 1,
self.x + 3
)
def refresh(self):
"""reflesh this window"""
self._win.refresh()
self._content.refresh()
def draw_title(self, message):
"""draw title in this window"""
self._win.addstr(0, 0, message, curses.A_REVERSE)
def draw_message(self, message):
"""draw message in this window"""
self._content.addstr(1, 0, message)
class DecorateWindow(Window):
def __init__(self, title, message):
super(DecorateWindow, self).__init__()
self._title = title
self._message = message
@property
def title(self):
return self._title
@title.setter
def title(self, value):
self._title = value
self._draw_title()
@property
def message(self):
return self._message
@message.setter
def message(self, value):
self._message = value
self._draw_message()
def refresh(self):
self._draw_title()
self._draw_message()
super(DecorateWindow, self).refresh()
def _draw_title(self):
"""draw title in this window"""
self._win.addstr(0, 0, self._title, curses.A_REVERSE)
def _draw_message(self):
"""draw message in this window"""
self._content.addstr(1, 0, self._message)
class WindowManager(object):
def __init__(self, sub_windows, global_win = None):
self._global = curses.initscr() if global_win is None else global_win
self._global.border(0)
self._windows = [] if sub_windows is None else sub_windows
@property
def global_window(self):
return self._global
def organize(self):
""" organize windows """
maxy, maxx = self._global.getmaxyx()
between_length = 10
betweens = between_length * (len(self._windows) + 1)
window_width = (maxx - betweens) / len(self._windows)
x = between_length
for win in self._windows:
win.width = window_width
win.height = maxy - between_length
win.x = x
x += window_width + between_length
win.y = 5
def add_window(self, window):
self._windows.append(window)
def repaint(self):
self._global.refresh()
for win in self._windows:
win.refresh()
def main():
"""sample application using curses"""
current_files = subprocess.check_output(['ls', '-a'])
ls_window = DecorateWindow("Current files", current_files)
git_status = subprocess.check_output(['git', 'status'])
stats_window = DecorateWindow("git status", git_status)
git_ls_files = subprocess.check_output(['git', 'ls-files'])
files_window = DecorateWindow("git ls-files", git_ls_files)
manager = WindowManager([ls_window, stats_window, files_window])
manager.organize()
manager.repaint()
manager.global_window.getch()
curses.endwin()
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment