Created
May 19, 2014 06:46
-
-
Save yoavlt/1ada3e94c8ca8269ab7c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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