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.
@@ -0,0 +1,3 @@
1
+ Metadata-Version: 2.4
2
+ Name: terminapy
3
+ Version: 0.0.1
File without changes
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,9 @@
1
+ from setuptools import setup, find_packages
2
+
3
+ setup(
4
+ name='terminapy',
5
+ version='0.0.1',
6
+ packages=find_packages(),
7
+ install_requires=[
8
+ ]
9
+ )
@@ -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,3 @@
1
+ Metadata-Version: 2.4
2
+ Name: terminapy
3
+ Version: 0.0.1
@@ -0,0 +1,8 @@
1
+ README.md
2
+ setup.py
3
+ terminapy/__init__.py
4
+ terminapy/main.py
5
+ terminapy.egg-info/PKG-INFO
6
+ terminapy.egg-info/SOURCES.txt
7
+ terminapy.egg-info/dependency_links.txt
8
+ terminapy.egg-info/top_level.txt
@@ -0,0 +1 @@
1
+ terminapy