From efb5ca5351132709921cbecd665b31f2e9fcf95d Mon Sep 17 00:00:00 2001 From: calzoneman Date: Wed, 9 Oct 2013 00:16:08 -0500 Subject: [PATCH 1/4] Start rewriting some of the ui code --- main.py | 2 -- ui.py | 68 ++++++++++++++++++--------------------------------------- 2 files changed, 21 insertions(+), 49 deletions(-) diff --git a/main.py b/main.py index 54083e2..b720b4c 100644 --- a/main.py +++ b/main.py @@ -5,8 +5,6 @@ def main(stdscr): stdscr.clear() ui = ChatUI(stdscr) name = ui.wait_input("Username: ") - ui.userlist.append(name) - ui.redraw_userlist() inp = "" while inp != "/quit": inp = ui.wait_input() diff --git a/ui.py b/ui.py index 12ceaab..1a7dba0 100644 --- a/ui.py +++ b/ui.py @@ -1,5 +1,9 @@ import curses +stderr = open("stderr.txt", "w") +def dbg(s): + print(s, file=stderr) + class ChatUI: def __init__(self, stdscr, userlist_width=16): self.stdscr = stdscr @@ -7,45 +11,31 @@ def __init__(self, stdscr, userlist_width=16): self.inputbuffer = "" self.linebuffer = [] self.chatbuffer = [] - - # Curses, why must you confuse me with your height, width, y, x - userlist_hwyx = (curses.LINES - 2, userlist_width - 1, 0, 0) - chatbuffer_hwyx = (curses.LINES - 2, curses.COLS-userlist_width-1, - 0, userlist_width + 1) - chatline_yx = (curses.LINES - 1, 0) - self.win_userlist = stdscr.derwin(*userlist_hwyx) - self.win_chatline = stdscr.derwin(*chatline_yx) - self.win_chatbuffer = stdscr.derwin(*chatbuffer_hwyx) - + self.h, self.w = self.stdscr.getmaxyx() + self.win_chatbuffer = stdscr.derwin(self.h - 2, self.w, 0, 0) + self.win_chatline = stdscr.derwin(self.h - 1, 0) self.redraw_ui() def resize(self): """Handles a change in terminal size""" - u_h, u_w = self.win_userlist.getmaxyx() h, w = self.stdscr.getmaxyx() self.win_chatline.mvwin(h - 1, 0) self.win_chatline.resize(1, w) - self.win_userlist.resize(h - 2, u_w) - self.win_chatbuffer.resize(h - 2, w - u_w - 2) + self.win_chatbuffer.resize(h - 2, w) self.linebuffer = [] - for msg in self.chatbuffer: - self._linebuffer_add(msg) - self.redraw_ui() def redraw_ui(self): """Redraws the entire UI""" h, w = self.stdscr.getmaxyx() - u_h, u_w = self.win_userlist.getmaxyx() + self.stdscr.clear() - self.stdscr.vline(0, u_w + 1, "|", h - 2) self.stdscr.hline(h - 2, 0, "-", w) self.stdscr.refresh() - self.redraw_userlist() self.redraw_chatbuffer() self.redraw_chatline() @@ -59,27 +49,22 @@ def redraw_chatline(self): self.win_chatline.addstr(0, 0, self.inputbuffer[start:]) self.win_chatline.refresh() - def redraw_userlist(self): - """Redraw the userlist""" - self.win_userlist.clear() - h, w = self.win_userlist.getmaxyx() - for i, name in enumerate(self.userlist): - if i >= h: - break - #name = name.ljust(w - 1) + "|" - self.win_userlist.addstr(i, 0, name[:w - 1]) - self.win_userlist.refresh() - def redraw_chatbuffer(self): """Redraw the chat message buffer""" self.win_chatbuffer.clear() h, w = self.win_chatbuffer.getmaxyx() - j = len(self.linebuffer) - h - if j < 0: - j = 0 - for i in range(min(h, len(self.linebuffer))): - self.win_chatbuffer.addstr(i, 0, self.linebuffer[j]) - j += 1 + lines = [] + for msg in self.chatbuffer[-1:-h:-1][::-1]: + while len(msg) > w: + lines.append(msg[:w]) + msg = msg[w:] + else: + lines.append(msg) + dbg(str(lines)) + i = 0 + for msg in lines[-1:-h:-1][::-1]: + self.win_chatbuffer.addstr(i, 0, msg) + i += 1 self.win_chatbuffer.refresh() def chatbuffer_add(self, msg): @@ -90,21 +75,10 @@ def chatbuffer_add(self, msg): """ self.chatbuffer.append(msg) - self._linebuffer_add(msg) self.redraw_chatbuffer() self.redraw_chatline() self.win_chatline.cursyncup() - def _linebuffer_add(self, msg): - h, w = self.stdscr.getmaxyx() - u_h, u_w = self.win_userlist.getmaxyx() - w = w - u_w - 2 - while len(msg) >= w: - self.linebuffer.append(msg[:w]) - msg = msg[w:] - if msg: - self.linebuffer.append(msg) - def prompt(self, msg): """Prompts the user for input and returns it""" self.inputbuffer = msg From 00f3653c608d491a0868bdb770495fdb3c3b92ff Mon Sep 17 00:00:00 2001 From: calzoneman Date: Wed, 9 Oct 2013 00:50:35 -0500 Subject: [PATCH 2/4] Work on re-adding userlist support; kinda broken --- main.py | 3 ++- ui.py | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 52 insertions(+), 8 deletions(-) diff --git a/main.py b/main.py index b720b4c..2b04973 100644 --- a/main.py +++ b/main.py @@ -3,8 +3,9 @@ def main(stdscr): stdscr.clear() - ui = ChatUI(stdscr) + ui = ChatUI(stdscr, userlist_width=16) name = ui.wait_input("Username: ") + ui.userlist.append(name) inp = "" while inp != "/quit": inp = ui.wait_input() diff --git a/ui.py b/ui.py index 1a7dba0..c41de53 100644 --- a/ui.py +++ b/ui.py @@ -3,41 +3,71 @@ stderr = open("stderr.txt", "w") def dbg(s): print(s, file=stderr) + stderr.flush() class ChatUI: - def __init__(self, stdscr, userlist_width=16): + def __init__(self, stdscr, userlist_width=0): self.stdscr = stdscr self.userlist = [] self.inputbuffer = "" - self.linebuffer = [] self.chatbuffer = [] self.h, self.w = self.stdscr.getmaxyx() - self.win_chatbuffer = stdscr.derwin(self.h - 2, self.w, 0, 0) + + if userlist_width > 0: + self.userlist_width = userlist_width + self.hide_userlist = False + self.want_userlist = False + cbw = self.w - userlist_width - 1 + self.win_chatbuffer = stdscr.derwin(self.h - 2, cbw, 0, 0) + self.win_userlist = stdscr.derwin(self.h - 2, userlist_width, + 0, cbw + 1) + else: + self.userlist_width = 0 + self.hide_userlist = True + self.want_userlist = True + self.win_chatbuffer = stdscr.derwin(self.h - 2, self.w, 0, 0) + self.win_chatline = stdscr.derwin(self.h - 1, 0) self.redraw_ui() def resize(self): """Handles a change in terminal size""" h, w = self.stdscr.getmaxyx() + self.h = h + self.w = w + + if self.userlist_width >= w - 1: + self.hide_userlist = True + else: + self.hide_userlist = self.want_userlist self.win_chatline.mvwin(h - 1, 0) self.win_chatline.resize(1, w) - self.win_chatbuffer.resize(h - 2, w) + if not self.hide_userlist: + cbw = w - self.userlist_width - 1 + self.win_chatbuffer.resize(h - 2, cbw) + self.win_userlist.mvwin(0, cbw + 1) + self.win_userlist.resize(h - 2, self.userlist_width) + else: + self.win_chatbuffer.resize(h - 2, w) - self.linebuffer = [] self.redraw_ui() def redraw_ui(self): """Redraws the entire UI""" - h, w = self.stdscr.getmaxyx() + h, w = self.h, self.w self.stdscr.clear() self.stdscr.hline(h - 2, 0, "-", w) + if not self.hide_userlist: + self.stdscr.vline(0, w - self.userlist_width - 1, "|", h - 2) self.stdscr.refresh() self.redraw_chatbuffer() + self.redraw_userlist() self.redraw_chatline() + self.win_chatline.cursyncup() def redraw_chatline(self): """Redraw the user input textbox""" @@ -49,6 +79,20 @@ def redraw_chatline(self): self.win_chatline.addstr(0, 0, self.inputbuffer[start:]) self.win_chatline.refresh() + def redraw_userlist(self): + if self.hide_userlist: + return + + self.win_userlist.clear() + + h, w = self.win_userlist.getmaxyx() + dbg((self.win_userlist.getbegyx(), (self.w, self.h))) + i = 0 + for name in self.userlist[:h]: + self.win_userlist.addstr(i, 0, name[:w]) + i += 1 + self.win_userlist.refresh() + def redraw_chatbuffer(self): """Redraw the chat message buffer""" self.win_chatbuffer.clear() @@ -60,7 +104,6 @@ def redraw_chatbuffer(self): msg = msg[w:] else: lines.append(msg) - dbg(str(lines)) i = 0 for msg in lines[-1:-h:-1][::-1]: self.win_chatbuffer.addstr(i, 0, msg) From 67a07a6d9a7f6c77d607d2a26a2729bb10d5ffd0 Mon Sep 17 00:00:00 2001 From: calzoneman Date: Wed, 9 Oct 2013 11:00:49 -0500 Subject: [PATCH 3/4] Fix resizing --- ui.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ui.py b/ui.py index c41de53..02af1f4 100644 --- a/ui.py +++ b/ui.py @@ -41,12 +41,14 @@ def resize(self): else: self.hide_userlist = self.want_userlist + self.win_chatline.mvderwin(h - 1, 0) self.win_chatline.mvwin(h - 1, 0) self.win_chatline.resize(1, w) if not self.hide_userlist: cbw = w - self.userlist_width - 1 self.win_chatbuffer.resize(h - 2, cbw) + self.win_userlist.mvderwin(0, cbw + 1) self.win_userlist.mvwin(0, cbw + 1) self.win_userlist.resize(h - 2, self.userlist_width) else: @@ -86,7 +88,6 @@ def redraw_userlist(self): self.win_userlist.clear() h, w = self.win_userlist.getmaxyx() - dbg((self.win_userlist.getbegyx(), (self.w, self.h))) i = 0 for name in self.userlist[:h]: self.win_userlist.addstr(i, 0, name[:w]) From f7b7bce4b8b953e0673be3e4106a7f1f70269922 Mon Sep 17 00:00:00 2001 From: calzoneman Date: Wed, 9 Oct 2013 11:08:47 -0500 Subject: [PATCH 4/4] Support hiding/showing nicklist --- main.py | 9 ++++++++- ui.py | 18 +++++++++++++++--- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/main.py b/main.py index 2b04973..e081bcd 100644 --- a/main.py +++ b/main.py @@ -9,6 +9,13 @@ def main(stdscr): inp = "" while inp != "/quit": inp = ui.wait_input() - ui.chatbuffer_add(inp) + if inp == "/hidenicks": + ui.set_userlist_visible(False) + ui.redraw_ui() + elif inp == "/shownicks": + ui.set_userlist_visible(True) + ui.redraw_ui() + else: + ui.chatbuffer_add(inp) wrapper(main) diff --git a/ui.py b/ui.py index 02af1f4..4611baa 100644 --- a/ui.py +++ b/ui.py @@ -12,11 +12,12 @@ def __init__(self, stdscr, userlist_width=0): self.inputbuffer = "" self.chatbuffer = [] self.h, self.w = self.stdscr.getmaxyx() + self.tabhandler = lambda: None if userlist_width > 0: self.userlist_width = userlist_width self.hide_userlist = False - self.want_userlist = False + self.want_userlist = True cbw = self.w - userlist_width - 1 self.win_chatbuffer = stdscr.derwin(self.h - 2, cbw, 0, 0) self.win_userlist = stdscr.derwin(self.h - 2, userlist_width, @@ -24,7 +25,7 @@ def __init__(self, stdscr, userlist_width=0): else: self.userlist_width = 0 self.hide_userlist = True - self.want_userlist = True + self.want_userlist = False self.win_chatbuffer = stdscr.derwin(self.h - 2, self.w, 0, 0) self.win_chatline = stdscr.derwin(self.h - 1, 0) @@ -39,7 +40,7 @@ def resize(self): if self.userlist_width >= w - 1: self.hide_userlist = True else: - self.hide_userlist = self.want_userlist + self.hide_userlist = not self.want_userlist self.win_chatline.mvderwin(h - 1, 0) self.win_chatline.mvwin(h - 1, 0) @@ -81,6 +82,15 @@ def redraw_chatline(self): self.win_chatline.addstr(0, 0, self.inputbuffer[start:]) self.win_chatline.refresh() + def set_userlist_visible(self, visible): + self.hide_userlist = not visible + self.want_userlist = visible + if self.hide_userlist: + self.win_chatbuffer.resize(self.h - 2, self.w) + else: + cbw = self.w - self.userlist_width - 1 + self.win_chatbuffer.resize(self.h - 2, cbw) + def redraw_userlist(self): if self.hide_userlist: return @@ -155,6 +165,8 @@ def wait_input(self, prompt=""): self.inputbuffer = self.inputbuffer[:-1] elif last == curses.KEY_RESIZE: self.resize() + elif last == ord('\t'): + self.tabhandler() elif 32 <= last <= 126: self.inputbuffer += chr(last) self.redraw_chatline()