Coverage for /home/deng/Projects/ete4/hackathon/ete4/ete4/smartview/renderer/treelayout.py: 41%
49 statements
« prev ^ index » next coverage.py v7.2.7, created at 2024-03-21 09:19 +0100
« prev ^ index » next coverage.py v7.2.7, created at 2024-03-21 09:19 +0100
1from .faces import TextFace
2from .draw_helpers import summary, Padding
5class TreeLayout:
6 def __init__(self, name, ts=None, ns=None, aligned_faces=False,
7 active=True, legend=True):
8 self.name = name
9 self.active = active
10 self.aligned_faces = aligned_faces
11 self.description = ""
12 self.legend = legend
14 self.always_render = False
16 self.ts = ts
17 self.ns = ns
19 def set_tree_style(self, tree, style):
20 if self.aligned_faces:
21 style.aligned_panel = True
23 if self.ts:
24 self.ts(style)
26 def set_node_style(self, node):
27 if self.ns:
28 self.ns(node)
31class _LayoutNodeProperty(TreeLayout):
32 def __init__(self, prop, column,
33 name=None, pos='aligned',
34 summarize=True, show_header=False,
35 color='black',
36 ftype='sans-serif',
37 min_fsize=4, max_fsize=15,
38 padding_x=5, padding_y=0):
39 super().__init__(name or f'{prop} layout')
40 self.prop = prop
41 self.pos = pos
42 self.column = column
43 self.aligned_faces = self.pos == 'aligned'
44 self.show_header = show_header
45 self.color = color
46 self.ftype = ftype
47 self.min_fsize = min_fsize
48 self.max_fsize = max_fsize
49 self.padding = Padding(padding_x, padding_y)
51 self.summarize = summarize
53 def set_node_style(self, node):
54 prop = node.props.get(self.prop)
55 if prop:
56 node.add_face(
57 TextFace(
58 prop, name="leaf_name",
59 color=self.color, ftype=self.ftype,
60 min_fsize=self.min_fsize, max_fsize=self.max_fsize,
61 padding_x=self.padding.x, padding_y=self.padding.y),
62 position=self.pos, column=self.column,
63 collapsed_only=(not node.is_leaf))
64 elif self.summarize:
65 # Collapsed face
66 names = summary(node.children, self.prop)
67 texts = names if len(names) < 6 else (names[:3] + ['...'] + names[-2:])
68 for i, text in enumerate(texts):
69 node.add_face(
70 TextFace(text, name='leaf_name',
71 color=self.color, ftype=self.ftype,
72 min_fsize=self.min_fsize, max_fsize=self.max_fsize,
73 padding_x=self.padding.x, padding_y=self.padding.y),
74 position=self.pos, column=self.column, collapsed_only=True)
76 def set_tree_style(self, tree, tree_style):
77 if self.pos == "aligned" and self.show_header:
78 face = TextFace(self.name, padding_y=5)
79 tree_style.aligned_panel_header.add_face(face, column=self.column)
82def cased_name(txt):
83 # 'one_two three' -> 'OneTwoThree'
84 return ''.join(word.capitalize() for word in txt.replace('_', ' ').split())