-
Notifications
You must be signed in to change notification settings - Fork 0
/
view_layout.py
104 lines (95 loc) · 3.34 KB
/
view_layout.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
from typing import Union
from component import Component
import string_util as su
import debug
import keys
class ViewLayout(Component):
def __init__(self,
parent: Component,
structure:list[list[Component]],
width:int,
height:int,
name:str="ViewLayout",
):
super().__init__(width,height,name,parent)
self.structure=structure
self.focus=[0,0]
self.is_view_layout = True
def get_row_columns(self,row:int) -> int:
i = 0
for comp in self.structure[row]:
if comp.visible:
i += 1
return i
def move_focus(self,dx:int,dy:int):
self.get_focused_component().onunfocus()
row_columns = self.get_row_columns(self.focus[1])
self.focus[0] = (self.focus[0] + dx) % row_columns
self.focus[1] = (self.focus[1] + dy) % len(self.structure)
self.get_focused_component().onfocus()
debug.log(f"Moved focus to {self.focus} '{self.get_focused_component().name}'")
def set_focus(self,x:int,y:int):
self.get_focused_component().onunfocus()
row_columns = self.get_row_columns(self.focus[1])
self.focus[0] = x % row_columns
self.focus[1] = y % len(self.structure)
self.get_focused_component().onfocus()
debug.log(f"Set focus to {self.focus} '{self.get_focused_component().name}'")
def set_focus_by_name(self,name:str):
y=0
for row in self.structure:
x=0
for comp in row:
if comp.name == name:
self.set_focus(x,y)
x+=1
y+=1
def get_focused_component(self) -> Component:
return self.structure[self.focus[1]][self.focus[0]]
def get_child_by_name(self,name) -> Component:
names=[]
for row in self.structure:
for comp in row:
names.append(comp.name)
if comp.name == name:
return comp
debug.log(f"Search for '{name}' failed, options were {names}")
return None
def input(self,text:str):
if text==keys.ctrl_up:
self.move_focus(0,-1)
elif text==keys.ctrl_down:
self.move_focus(0,1)
elif text==keys.ctrl_left:
self.move_focus(-1,0)
elif text==keys.ctrl_right:
self.move_focus(1,0)
else:
focused_comp=self.get_focused_component()
debug.log(f"{focused_comp.name} got {repr(text)}")
focused_comp.input(text)
def view(self) -> str:
s = ""
for row in self.structure:
row_str = ""
for comp in row:
if not comp.visible:
continue
row_str = su.join_horizontal(
row_str,
su.set_height(
su.set_width(
comp.view(),
comp.width
),
comp.height
),
padding_char=f" {su.normal_border.left} "
)
s += su.normal_border.top*su.text_width(row_str)
s += "\n"
s += row_str
s += "\n"
s += f"focus.x={self.focus[0]}"
s += f" focus.y={self.focus[1]}"
return s