1"""Non-keyboard events used in bpython curtsies REPL"""
2
3import time
4from typing import Sequence
5
6import curtsies.events
7
8
9class ReloadEvent(curtsies.events.Event):
10    """Request to rerun REPL session ASAP because imported modules changed"""
11
12    def __init__(self, files_modified: Sequence[str] = ("?",)) -> None:
13        self.files_modified = files_modified
14
15    def __repr__(self) -> str:
16        return "<ReloadEvent from {}>".format(" & ".join(self.files_modified))
17
18
19class RefreshRequestEvent(curtsies.events.Event):
20    """Request to refresh REPL display ASAP"""
21
22    def __repr__(self) -> str:
23        return "<RefreshRequestEvent for now>"
24
25
26class ScheduledRefreshRequestEvent(curtsies.events.ScheduledEvent):
27    """Request to refresh the REPL display at some point in the future
28
29    Used to schedule the disappearance of status bar message that only shows
30    for a few seconds"""
31
32    def __init__(self, when: float) -> None:
33        super().__init__(when)
34
35    def __repr__(self) -> str:
36        return "<RefreshRequestEvent for {} seconds from now>".format(
37            self.when - time.time()
38        )
39
40
41class RunStartupFileEvent(curtsies.events.Event):
42    """Request to run the startup file."""
43
44
45class UndoEvent(curtsies.events.Event):
46    """Request to undo."""
47
48    def __init__(self, n: int = 1) -> None:
49        self.n = n
50