@@ -20,6 +20,8 @@ def __init__(self, parent, **kwargs):
2020 self .sortedColumnIndex = - 1
2121 self .currentItem = None
2222 self .dataframe = None
23+ self .annotations = None
24+ self .annotations_grouped = {}
2325
2426 def init (self , memDB ):
2527 self .memDB = memDB
@@ -28,21 +30,59 @@ def init(self, memDB):
2830 self .oddRowsBackColor = wx .Colour (191 , 217 , 217 )
2931
3032 self .dataframe = self .memDB .getDataValuesDF ()
31- sort_by_index = list (self .dataframe .columns ).index ("valuedatetime" )
33+ self .annotations = self .memDB .get_annotations ()
34+
35+ sort_by_index = self .dataframe .columns .tolist ().index ("valuedatetime" )
3236 self .dataframe .sort_values (self .dataframe .columns [sort_by_index ], inplace = True )
33- self .dataObjects = self .dataframe .values .tolist ()
37+
38+ self .annotations_grouped = self .__group_annotations ()
39+ self .dataObjects = self .__merge_dataframe_with_annotations ()
40+
41+ col = self .memDB .get_columns_with_annotations ()
42+
3443 columns = \
3544 [ColumnDefn (x .strip (), align = "left" , valueGetter = i , minimumWidth = 125 , width = 125 ,
36- stringConverter = '%Y-%m-%d %H:%M:%S' if "valuedatetime" == x .lower () else '%s' )
37- for x , i in self .memDB .getEditColumns ()]
45+ stringConverter = '%Y-%m-%d %H:%M:%S' if "valuedatetime" == x .lower () else '%s' )
46+ for x , i in col ]
47+
3848 self .SetColumns (columns )
3949
4050
4151 self .SetObjectGetter (self .ObjectGetter )
42- self .SetItemCount (len (self .dataframe ))
52+ self .SetItemCount (len (self .dataObjects ))
53+
54+ def __merge_dataframe_with_annotations (self ):
55+ data_list = self .dataframe .values .tolist ()
56+ data = data_list
57+
58+ for key , value in self .annotations_grouped .iteritems ():
59+ for i in range (0 , len (data_list )):
60+ if key in data [i ]:
61+ data [i ].append (value )
62+ break
63+
64+ return data
65+
66+ def __group_annotations (self ):
67+ """
68+ Ideally, this method should only be called once. Use self.grouped_annotations after calling this method
69+ :return:
70+ """
71+ anno_list = self .annotations .values .tolist ()
72+
73+ anno = {}
74+ for i in range (0 , len (anno_list )):
75+ value_id = anno_list [i ][1 ]
76+ annotation_code = anno_list [i ][- 1 ]
77+ if value_id in anno :
78+ anno [value_id ].append (annotation_code )
79+ else :
80+ anno [value_id ] = [annotation_code ]
81+
82+ return anno
4383
4484 def EnableSorting (self ):
45- self .Bind (wx .EVT_LIST_COL_CLICK , self .onColSelected )
85+ self .Bind (wx .EVT_LIST_COL_CLICK , self .on_column_selected )
4686 if not self .smallImageList :
4787 self .SetImageLists ()
4888 if (not self .smallImageList .HasName (ObjectListView .NAME_DOWN_IMAGE ) and
@@ -56,40 +96,58 @@ def ObjectGetter(self, index):
5696 """
5797 return self .dataObjects [index % len (self .dataObjects )]
5898
59- def onColSelected (self , evt ):
99+ def on_column_selected (self , event ):
60100 """
61101 Allows users to sort by clicking on columns
62102 """
63- if isinstance (self .dataframe , pd .DataFrame ):
64- if self .dataframe .empty :
65- return
66- else :
67- if not self .dataframe :
68- return
103+ if not isinstance (self .dataframe , pd .DataFrame ):
104+ return
105+
106+ if self .dataframe .empty :
107+ return
69108
70- logger .debug ("Column: %s" % evt .m_col )
71- self .sortColumn (evt .m_col )
109+ if not len (self .dataObjects ):
110+ return
111+
112+ self .sortColumn (event .Column )
72113
73114 def sortColumn (self , selected_column ):
115+ self .sortAscending = not self .sortAscending
116+
74117 oldSortColumnIndex = self .sortedColumnIndex
75118 self .sortedColumnIndex = selected_column
76- ascending = self .sortAscending
77- if ascending :
78- self .dataframe .sort_values (self .dataframe .columns [selected_column ], inplace = True )
79- self .sortAscending = False
80- elif not ascending :
81- self .dataframe .sort_values (self .dataframe .columns [selected_column ], ascending = False , inplace = True )
82- self .sortAscending = True
83119
84120 self ._UpdateColumnSortIndicators (selected_column , oldSortColumnIndex )
85121
86- self .dataObjects = self .dataframe .values .tolist ()
87- if self .GetItemCount :
122+ if selected_column >= len (self .dataframe .columns ):
123+ self .dataObjects = self .sort_columns_by_annotation_code (reverse = self .sortAscending )
124+ else :
125+ self .dataframe .sort_values (self .dataframe .columns [selected_column ], ascending = self .sortAscending , inplace = True )
126+ self .dataObjects = self .__merge_dataframe_with_annotations ()
127+
128+ if self .GetItemCount ():
88129 itemFrom = self .GetTopItem ()
89130 itemTo = self .GetTopItem () + 1 + self .GetCountPerPage ()
90131 itemTo = min (itemTo , self .GetItemCount () - 1 )
91132 self .RefreshItems (itemFrom , itemTo )
92133
134+ def sort_columns_by_annotation_code (self , reverse = False ):
135+ rows_with_annotation = []
136+ rows_without_annotation = []
137+
138+ column_number_of_dataframe = len (self .dataframe .columns )
139+
140+ for i in self .dataObjects :
141+ if len (i ) > column_number_of_dataframe :
142+ rows_with_annotation .append (i )
143+ else :
144+ rows_without_annotation .append (i )
145+
146+ if reverse :
147+ return rows_without_annotation + rows_with_annotation
148+ else :
149+ return rows_with_annotation + rows_without_annotation
150+
93151 def onItemSelected (self , event ):
94152 """
95153
0 commit comments