Skip to content

Commit

Permalink
implementing the ability to edit messages rather than cancel them une…
Browse files Browse the repository at this point in the history
…xpectedly on certain keypresses paul-nameless#293

This is a bit hacky... left arrow does the same as delete, other control
character open up the editor for further message editing
  • Loading branch information
proycon committed Dec 13, 2022
1 parent 2b0c0cf commit bef3838
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 4 deletions.
2 changes: 1 addition & 1 deletion tg/controllers.py
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,7 @@ def write_short_msg(self) -> None:
self.present_info("Can't send msg in this chat")
return
self.tg.send_chat_action(chat_id, ChatAction.chatActionTyping)
if msg := self.view.status.get_input():
if msg := self.view.status.get_input(view=self.view):
self.model.send_message(text=msg)
self.present_info("Message sent")
else:
Expand Down
36 changes: 33 additions & 3 deletions tg/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
import logging
from datetime import datetime
from typing import Any, Dict, List, Optional, Tuple, Union, cast
from tempfile import NamedTemporaryFile
import shlex

from _curses import window # type: ignore

Expand All @@ -10,7 +12,7 @@
from tg.models import Model, UserModel
from tg.msg import MsgProxy
from tg.tdlib import ChatType, get_chat_type, is_group
from tg.utils import get_color_by_str, num, string_len_dwc, truncate_to_len
from tg.utils import get_color_by_str, num, string_len_dwc, truncate_to_len, suspend

log = logging.getLogger(__name__)

Expand Down Expand Up @@ -124,7 +126,7 @@ def draw(self, msg: str = "") -> None:
self.win.addstr(0, 0, msg.replace("\n", " ")[: self.w])
self._refresh()

def get_input(self, prefix: str = "") -> Optional[str]:
def get_input(self, prefix: str = "", view: Optional[View] = None) -> Optional[str]:
curses.curs_set(1)
buff = ""

Expand All @@ -140,10 +142,38 @@ def get_input(self, prefix: str = "") -> Optional[str]:
key = ord(key)
if key == 10: # return
break
elif key == 127 or key == 8: # del
elif key in (127, 8): # del
if buff:
buff = buff[:-1]
elif key in (7, 27): # (^G, <esc>) cancel
self.win.nodelay(True)
extra = []
while True:
c = self.win.getch()
if c == -1:
break
else:
extra.append(c)
self.win.nodelay(False)
curses.flushinp()
if len(extra) >= 2 and extra[0] == 91:
if extra[1] == 68: #left arrow, treat as delete
if buff:
buff = buff[:-1]
continue
elif view: #another control key, open editor
with NamedTemporaryFile("w+", suffix=".txt") as f, suspend(
view
) as s:
f.write(buff)
f.seek(0)
proc = s.call(config.LONG_MSG_CMD.format(file_path=shlex.quote(f.name)))
if proc.returncode == 0:
with open(f.name) as f:
buff = f.read().strip()
continue
else:
continue #ignore
return None
elif chr(key).isprintable():
buff += chr(key)
Expand Down

0 comments on commit bef3838

Please sign in to comment.