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

1from types import FunctionType, MethodType 

2from collections import defaultdict 

3 

4 

5from .faces import SelectedRectFace 

6from .face_positions import FACE_POSITIONS, AlignedGrid 

7from ..utils import InvalidUsage 

8from .nodestyle import NodeStyle 

9 

10 

11class TreeStyle: 

12 def __init__(self): 

13 self.aligned_grid = True 

14 self.aligned_grid_dxs = defaultdict(lambda: 0) 

15 

16 self.collapse_size = 10 

17 

18 # Selected face 

19 self._selected_face = SelectedRectFace 

20 self._selected_face_pos = "branch_right" 

21 

22 # Active face 

23 self._active_face = SelectedRectFace 

24 self._active_face_pos = "branch_right" 

25 

26 # Aligned panel headers 

27 self._aligned_panel_header = AlignedGrid() 

28 self._aligned_panel_footer = AlignedGrid() 

29 

30 self._legend = [] 

31 

32 @property 

33 def selected_face(self): 

34 return self._selected_face 

35 

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') 

42 

43 @property 

44 def selected_face_pos(self): 

45 return self._selected_face_pos 

46 

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 + '.')) 

55 

56 @property 

57 def active_face(self): 

58 return self._active_face 

59 

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') 

66 

67 @property 

68 def active_face_pos(self): 

69 return self._active_face_pos 

70 

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 + '.')) 

79 

80 @property 

81 def aligned_panel_header(self): 

82 return self._aligned_panel_header 

83 

84 @aligned_panel_header.setter 

85 def aligned_panel_header(self, value): 

86 raise invalidUsage('Attribute "aligned_panel_header" can only be accessed.') 

87 

88 @property 

89 def aligned_panel_footer(self): 

90 return self._aligned_panel_footer 

91 

92 @aligned_panel_footer.setter 

93 def aligned_panel_footer(self, value): 

94 raise invalidUsage('Attribute "aligned_panel_footer" can only be accessed.') 

95 

96 def add_legend(self, title, 

97 variable="discrete", 

98 colormap={}, 

99 value_range=None, 

100 color_range=None): 

101 

102 entry = { "title": title, "variable": variable } 

103 

104 if variable == "discrete" and colormap: 

105 entry["colormap"] = colormap 

106 

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 

112 

113 self._legend.append(entry) 

114 

115 def get_legend(self): 

116 return list(self._legend)