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

1from .faces import TextFace 

2from .draw_helpers import summary, Padding 

3 

4 

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 

13 

14 self.always_render = False 

15 

16 self.ts = ts 

17 self.ns = ns 

18 

19 def set_tree_style(self, tree, style): 

20 if self.aligned_faces: 

21 style.aligned_panel = True 

22 

23 if self.ts: 

24 self.ts(style) 

25 

26 def set_node_style(self, node): 

27 if self.ns: 

28 self.ns(node) 

29 

30 

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) 

50 

51 self.summarize = summarize 

52 

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) 

75 

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) 

80 

81 

82def cased_name(txt): 

83 # 'one_two three' -> 'OneTwoThree' 

84 return ''.join(word.capitalize() for word in txt.replace('_', ' ').split())