Coverage for /home/deng/Projects/ete4/hackathon/ete4/ete4/smartview/renderer/treestyle.py: 47%
72 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 types import FunctionType, MethodType
2from collections import defaultdict
5from .faces import SelectedRectFace
6from .face_positions import FACE_POSITIONS, AlignedGrid
7from ..utils import InvalidUsage
8from .nodestyle import NodeStyle
11class TreeStyle:
12 def __init__(self):
13 self.aligned_grid = True
14 self.aligned_grid_dxs = defaultdict(lambda: 0)
16 self.collapse_size = 10
18 # Selected face
19 self._selected_face = SelectedRectFace
20 self._selected_face_pos = "branch_right"
22 # Active face
23 self._active_face = SelectedRectFace
24 self._active_face_pos = "branch_right"
26 # Aligned panel headers
27 self._aligned_panel_header = AlignedGrid()
28 self._aligned_panel_footer = AlignedGrid()
30 self._legend = []
32 @property
33 def selected_face(self):
34 return self._selected_face
36 @selected_face.setter
37 def selected_face(self, face):
38 if isinstance(face, Face):
39 self._selected_face = face
40 else:
41 raise ValueError(f'{type(face)} is not a valid Face instance')
43 @property
44 def selected_face_pos(self):
45 return self._selected_face_pos
47 @selected_face_pos.setter
48 def selected_face_pos(self, pos):
49 if pos in FACE_POSITIONS:
50 self._selected_face_pos = pos
51 else:
52 raise ValueError(f'{pos} is not a valid Face position. ' +
53 'Please provide one of the following values' +
54 ', '.join(FACE_POSITIONS + '.'))
56 @property
57 def active_face(self):
58 return self._active_face
60 @active_face.setter
61 def active_face(self, face):
62 if isinstance(face, Face):
63 self._active_face = face
64 else:
65 raise ValueError(f'{type(face)} is not a valid Face instance')
67 @property
68 def active_face_pos(self):
69 return self._active_face_pos
71 @active_face_pos.setter
72 def active_face_pos(self, pos):
73 if pos in FACE_POSITIONS:
74 self._active_face_pos = pos
75 else:
76 raise ValueError(f'{pos} is not a valid Face position. ' +
77 'Please provide one of the following values' +
78 ', '.join(FACE_POSITIONS + '.'))
80 @property
81 def aligned_panel_header(self):
82 return self._aligned_panel_header
84 @aligned_panel_header.setter
85 def aligned_panel_header(self, value):
86 raise invalidUsage('Attribute "aligned_panel_header" can only be accessed.')
88 @property
89 def aligned_panel_footer(self):
90 return self._aligned_panel_footer
92 @aligned_panel_footer.setter
93 def aligned_panel_footer(self, value):
94 raise invalidUsage('Attribute "aligned_panel_footer" can only be accessed.')
96 def add_legend(self, title,
97 variable="discrete",
98 colormap={},
99 value_range=None,
100 color_range=None):
102 entry = { "title": title, "variable": variable }
104 if variable == "discrete" and colormap:
105 entry["colormap"] = colormap
107 elif variable == "continuous" and value_range and color_range:
108 entry = { **entry, "value_range": value_range,
109 "color_range": color_range }
110 else:
111 return
113 self._legend.append(entry)
115 def get_legend(self):
116 return list(self._legend)