terminapy 0.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- terminapy-0.0.1/PKG-INFO +3 -0
- terminapy-0.0.1/README.md +0 -0
- terminapy-0.0.1/setup.cfg +4 -0
- terminapy-0.0.1/setup.py +9 -0
- terminapy-0.0.1/terminapy/__init__.py +1 -0
- terminapy-0.0.1/terminapy/main.py +161 -0
- terminapy-0.0.1/terminapy.egg-info/PKG-INFO +3 -0
- terminapy-0.0.1/terminapy.egg-info/SOURCES.txt +8 -0
- terminapy-0.0.1/terminapy.egg-info/dependency_links.txt +1 -0
- terminapy-0.0.1/terminapy.egg-info/top_level.txt +1 -0
terminapy-0.0.1/PKG-INFO
ADDED
|
File without changes
|
terminapy-0.0.1/setup.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .main import screen
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import math
|
|
3
|
+
|
|
4
|
+
def round_down(x):
|
|
5
|
+
fr = math.floor(x)
|
|
6
|
+
if x-fr > 0.5:
|
|
7
|
+
return math.ceil(x)
|
|
8
|
+
return fr
|
|
9
|
+
|
|
10
|
+
tl = "╭" #Top left
|
|
11
|
+
tr = "╮" #Top right
|
|
12
|
+
hr = "─" #Horizontal
|
|
13
|
+
vr = "│" #Vertical
|
|
14
|
+
bl = "╰" #Bottom left
|
|
15
|
+
br = "╯" #Bottom right
|
|
16
|
+
cl = "├" #Cross left
|
|
17
|
+
cc = "┼" #Cross center
|
|
18
|
+
cr = "┤" #Cross right
|
|
19
|
+
ct = "┬" #Cross top
|
|
20
|
+
cb = "┴" #Cross bottom
|
|
21
|
+
|
|
22
|
+
class screen:
|
|
23
|
+
def __init__(self,size=None,name:str="",ratio : tuple[float,float] = (1,1)):
|
|
24
|
+
if name != "":
|
|
25
|
+
name = f"[ {name} ]"
|
|
26
|
+
self.name = name
|
|
27
|
+
self.ratio = ratio
|
|
28
|
+
self.lines : list[str] = []
|
|
29
|
+
self.line_changed = False
|
|
30
|
+
self.split_screens : tuple[screen,screen,str] = None
|
|
31
|
+
self.size_old = None
|
|
32
|
+
self.size = size
|
|
33
|
+
if self.size != None:
|
|
34
|
+
self.change_size(size)
|
|
35
|
+
|
|
36
|
+
def split_horizontally(self,ratio : float):
|
|
37
|
+
self.split_screens = screen(self.size,"",(1,ratio)),screen(self.size,"",(1,1-ratio)),"h"
|
|
38
|
+
|
|
39
|
+
def split_vertical(self,ratio : float):
|
|
40
|
+
self.split_screens = screen(self.size,"",(ratio,1)),screen(self.size,"",(1-ratio,1)),"v"
|
|
41
|
+
|
|
42
|
+
def change_size(self,size,cut=None,sp=""):
|
|
43
|
+
rc = round_down(size.columns*self.ratio[0])
|
|
44
|
+
rl = round_down(size.lines *self.ratio[1])
|
|
45
|
+
if cut is not None:
|
|
46
|
+
if sp == "v" and cut[0]+rc == size.columns:
|
|
47
|
+
rc = round_down(size.columns*self.ratio[0]-1)
|
|
48
|
+
if sp == "h" and cut[1]+rl == size.lines:
|
|
49
|
+
rl = round_down(size.lines *self.ratio[1]-1)
|
|
50
|
+
self.size = os.terminal_size((rc,rl))
|
|
51
|
+
if self.split_screens != None:
|
|
52
|
+
res1 = self.split_screens[0].change_size(self.size)
|
|
53
|
+
self.split_screens[1].change_size(self.size,res1,self.split_screens[2])
|
|
54
|
+
return (rc,rl)
|
|
55
|
+
|
|
56
|
+
def change_lines(self,lines : list[str]):
|
|
57
|
+
self.lines = lines
|
|
58
|
+
|
|
59
|
+
def append(self,message:str):
|
|
60
|
+
self.line_changed = True
|
|
61
|
+
self.lines.append(message)
|
|
62
|
+
|
|
63
|
+
def clear(self):
|
|
64
|
+
self.line_changed = True
|
|
65
|
+
self.lines.clear()
|
|
66
|
+
|
|
67
|
+
def rewwrite_last_line(self,message:str):
|
|
68
|
+
self.line_changed = True
|
|
69
|
+
if len(self.lines) == 0:
|
|
70
|
+
self.lines.append(message)
|
|
71
|
+
else:
|
|
72
|
+
self.lines[-1] = message
|
|
73
|
+
|
|
74
|
+
def get_screen(self,indice : int):
|
|
75
|
+
if 0 <= indice < 2:
|
|
76
|
+
return self.split_screens[indice]
|
|
77
|
+
else:
|
|
78
|
+
raise IndexError
|
|
79
|
+
|
|
80
|
+
def get_terminal_screen(self,no_top : bool = False, no_bot : bool = False,no_left : bool = False, no_right : bool = False , to_list : bool = False) -> str:
|
|
81
|
+
if self.size is None:
|
|
82
|
+
return "BAD SIZE"
|
|
83
|
+
screen = []
|
|
84
|
+
number_line = self.size.lines - (2 - int(no_top) - int(no_bot))
|
|
85
|
+
if self.split_screens == None:
|
|
86
|
+
if not no_top:
|
|
87
|
+
screen.append((hr if no_left else tl) + hr * (self.size.columns - 2) + (hr if no_right else tr))
|
|
88
|
+
for i in range(number_line):
|
|
89
|
+
line = ""
|
|
90
|
+
if (number_line - i) <= len(self.lines):
|
|
91
|
+
line = self.lines[len(self.lines) - (number_line - i)]
|
|
92
|
+
if len(line) > self.size.columns - 2:
|
|
93
|
+
line = line[:self.size.columns - 5] + "..."
|
|
94
|
+
screen.append((" " if no_left else vr) + line + " " * (self.size.columns - 2 - len(line)) + (" " if no_right else vr))
|
|
95
|
+
if not no_bot:
|
|
96
|
+
screen.append((hr if no_left else bl) + hr * (self.size.columns - 2) + (hr if no_right else br))
|
|
97
|
+
if to_list:
|
|
98
|
+
return screen
|
|
99
|
+
else:
|
|
100
|
+
return "\n".join(screen)
|
|
101
|
+
|
|
102
|
+
screen1 = self.split_screens[0]
|
|
103
|
+
screen2 = self.split_screens[1]
|
|
104
|
+
if self.split_screens[2] == "h":
|
|
105
|
+
top_screen_str = screen1.get_terminal_screen(no_top,True, no_left, no_right,True)
|
|
106
|
+
bottom_screen_str = screen2.get_terminal_screen(True,no_bot,no_left, no_right,True)
|
|
107
|
+
screen += top_screen_str
|
|
108
|
+
li = (hr if no_left else cl)
|
|
109
|
+
for i in range(1,self.size.columns - 1):
|
|
110
|
+
if top_screen_str[-1][i] == vr and bottom_screen_str[0][i] == vr:
|
|
111
|
+
li += cc
|
|
112
|
+
elif top_screen_str[-1][i] == vr and bottom_screen_str[0][i] != vr:
|
|
113
|
+
li += cb
|
|
114
|
+
elif top_screen_str[-1][i] != vr and bottom_screen_str[0][i] == vr:
|
|
115
|
+
li += ct
|
|
116
|
+
else:
|
|
117
|
+
li += hr
|
|
118
|
+
li += (hr if no_right else cr)
|
|
119
|
+
screen.append(li)
|
|
120
|
+
screen += bottom_screen_str
|
|
121
|
+
|
|
122
|
+
if self.split_screens[2] == "v":
|
|
123
|
+
left_screen_str = screen1.get_terminal_screen(no_top,no_bot, no_left, True , True)
|
|
124
|
+
right_screen_str = screen2.get_terminal_screen(no_top, no_bot, True,no_right, True)
|
|
125
|
+
screen.append(left_screen_str[0] + (vr if no_top else ct) + right_screen_str[0])
|
|
126
|
+
if len(left_screen_str) != len(right_screen_str):
|
|
127
|
+
raise ValueError("Left and Right screen have different heights")
|
|
128
|
+
for i in range(1,len(left_screen_str)-1):
|
|
129
|
+
md = vr
|
|
130
|
+
if left_screen_str[i][-1] == hr and right_screen_str[i][0] == hr:
|
|
131
|
+
md = cc
|
|
132
|
+
elif left_screen_str[i][-1] == hr and right_screen_str[i][0] != hr:
|
|
133
|
+
md = cr
|
|
134
|
+
elif left_screen_str[i][-1] != hr and right_screen_str[i][0] == hr:
|
|
135
|
+
md = cl
|
|
136
|
+
screen.append(left_screen_str[i] + md + right_screen_str[i])
|
|
137
|
+
screen.append(left_screen_str[-1] + (vr if no_bot else cb) + right_screen_str[-1])
|
|
138
|
+
|
|
139
|
+
if to_list:
|
|
140
|
+
return screen
|
|
141
|
+
|
|
142
|
+
if len(screen) != self.size.lines - 1:
|
|
143
|
+
screen = ["\n"] + screen
|
|
144
|
+
return "\n".join(screen)
|
|
145
|
+
|
|
146
|
+
def need_refresh(self,main_fraim:bool = False) -> bool:
|
|
147
|
+
size = os.get_terminal_size()
|
|
148
|
+
if main_fraim and self.size_old != size:
|
|
149
|
+
self.size_old = size
|
|
150
|
+
self.change_size(size)
|
|
151
|
+
return True
|
|
152
|
+
if self.line_changed:
|
|
153
|
+
self.line_changed = False
|
|
154
|
+
return True
|
|
155
|
+
return False if self.split_screens is None else (self.get_screen(1).need_refresh() or self.get_screen(0).need_refresh())
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def draw_terminal_screen(self):
|
|
159
|
+
if self.need_refresh(True):
|
|
160
|
+
os.sys.stdout.write("\n"+self.get_terminal_screen())
|
|
161
|
+
os.sys.stdout.flush()
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
terminapy
|