Sort message newest at the bottom

Jump with H/J keys 10 msgs up/down
This commit is contained in:
Paul Nameless 2019-02-18 19:49:01 +01:00
parent 5aa9a73f16
commit 73065f5f45
3 changed files with 39 additions and 13 deletions

View file

@ -29,8 +29,8 @@ class Controller:
def handle_msgs(self): def handle_msgs(self):
# set width to 0.25, move window to left # set width to 0.25, move window to left
# refresh everything # refresh everything
self.view.chats.resize(0.25) self.view.chats.resize(0.2)
self.view.msgs.resize(0.25) self.view.msgs.resize(0.2)
self.refresh_chats() self.refresh_chats()
while True: while True:
@ -45,6 +45,12 @@ class Controller:
elif key == '[': elif key == '[':
if self.model.prev_chat(): if self.model.prev_chat():
self.refresh_chats() self.refresh_chats()
elif key == 'J':
if self.model.jump_next_msg():
self.refresh_msgs()
elif key == 'K':
if self.model.jump_prev_msg():
self.refresh_msgs()
elif key == 'j': elif key == 'j':
if self.model.next_msg(): if self.model.next_msg():
self.refresh_msgs() self.refresh_msgs()
@ -119,7 +125,7 @@ class Controller:
self.view.draw_status() self.view.draw_status()
def refresh_msgs(self): def refresh_msgs(self):
msgs = self.model.get_current_msgs() msgs = self.model.get_current_msgs(limit=self.view.msgs.h)
self.view.draw_msgs(self.model.get_current_msg(), msgs) self.view.draw_msgs(self.model.get_current_msg(), msgs)
def update_handler(self, update): def update_handler(self, update):

View file

@ -38,6 +38,14 @@ class Model:
chat_id = self.chats.chat_ids[self.current_chat] chat_id = self.chats.chat_ids[self.current_chat]
return self.msgs.prev_msg(chat_id) return self.msgs.prev_msg(chat_id)
def jump_next_msg(self):
chat_id = self.chats.chat_ids[self.current_chat]
return self.msgs.jump_next_msg(chat_id)
def jump_prev_msg(self):
chat_id = self.chats.chat_ids[self.current_chat]
return self.msgs.jump_prev_msg(chat_id)
def get_chats(self, offset=0, limit=10): def get_chats(self, offset=0, limit=10):
return self.chats.get_chats(offset=offset, limit=limit) return self.chats.get_chats(offset=offset, limit=limit)
@ -137,6 +145,19 @@ class MsgModel:
return True return True
return False return False
def jump_next_msg(self, chat_id):
if self.current_msgs[chat_id] - 10 > 0:
self.current_msgs[chat_id] -= 10
else:
self.current_msgs[chat_id] = 0
return True
def jump_prev_msg(self, chat_id):
if self.current_msgs[chat_id] + 10 < len(self.msgs[chat_id]):
self.current_msgs[chat_id] += 10
return True
return False
def prev_msg(self, chat_id): def prev_msg(self, chat_id):
if self.current_msgs[chat_id] < len(self.msgs[chat_id]): if self.current_msgs[chat_id] < len(self.msgs[chat_id]):
self.current_msgs[chat_id] += 1 self.current_msgs[chat_id] += 1
@ -145,7 +166,7 @@ class MsgModel:
def get_msgs(self, chat_id, offset=0, limit=10): def get_msgs(self, chat_id, offset=0, limit=10):
if offset + limit < len(self.msgs[chat_id]): if offset + limit < len(self.msgs[chat_id]):
return sorted(self.msgs[chat_id], key=lambda d: d['id'])[::-1][offset:limit][::-1] return sorted(self.msgs[chat_id], key=lambda d: d['id'])[::-1][offset:limit]
for i in range(3): for i in range(3):
if len(self.msgs[chat_id]): if len(self.msgs[chat_id]):
@ -167,7 +188,7 @@ class MsgModel:
if len(self.msgs[chat_id]) >= offset + limit: if len(self.msgs[chat_id]) >= offset + limit:
break break
return sorted(self.msgs[chat_id], key=lambda d: d['id'])[::-1][offset:limit][::-1] return sorted(self.msgs[chat_id], key=lambda d: d['id'])[::-1][offset:limit]
class UserModel: class UserModel:

15
view.py
View file

@ -105,8 +105,8 @@ class StatusView:
self.win.wmove(self.y, self.x) self.win.wmove(self.y, self.x)
def draw(self, msg): def draw(self, msg):
msg = ' ' * (self.w - 1) msg = '-' * (self.w - 1)
self.win.addstr(0, 0, msg, curses.A_REVERSE) self.win.addstr(0, 0, msg)
class ChatView: class ChatView:
@ -151,8 +151,6 @@ class MsgView:
self.x = 0 self.x = 0
# self.win = stdscr.subwin(self.h, self.w, 0, self.x) # self.win = stdscr.subwin(self.h, self.w, 0, self.x)
self.win = None self.win = None
# self.win.scrollok(True)
# self.win.idlok(True)
self.lines = 0 self.lines = 0
def resize(self, p=0.5): def resize(self, p=0.5):
@ -162,6 +160,8 @@ class MsgView:
# if self.win is None: # if self.win is None:
self.win = self.stdscr.subwin(self.h, self.w, 0, self.x) self.win = self.stdscr.subwin(self.h, self.w, 0, self.x)
# self.win.scrollok(True)
# self.win.idlok(True)
# else: # else:
# self.win.resize(self.h, self.w) # self.win.resize(self.h, self.w)
# self.win.mvwin(0, self.x) # self.win.mvwin(0, self.x)
@ -169,8 +169,7 @@ class MsgView:
def draw(self, current, msgs): def draw(self, current, msgs):
logger.info('Dwaring msgs') logger.info('Dwaring msgs')
self.win.clear() self.win.clear()
count = 0 count = self.h
current = len(msgs) - current - 1
for i, msg in enumerate(msgs): for i, msg in enumerate(msgs):
s = self._parse_msg(msg) s = self._parse_msg(msg)
@ -178,14 +177,14 @@ class MsgView:
if len(s) < self.w: if len(s) < self.w:
s += ' ' * (self.w - len(s) - 1) s += ' ' * (self.w - len(s) - 1)
offset = math.ceil(len(s) / self.w) offset = math.ceil(len(s) / self.w)
if count + offset > self.h-1: count -= offset
if count <= 0:
logger.warning('Reched end of lines') logger.warning('Reched end of lines')
break break
if i == current: if i == current:
self.win.addstr(count, 0, s, curses.A_REVERSE) self.win.addstr(count, 0, s, curses.A_REVERSE)
else: else:
self.win.addstr(count, 0, s) self.win.addstr(count, 0, s)
count += offset
self.lines = count self.lines = count
self.win.refresh() self.win.refresh()