@@ -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,62 @@ 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+ if self .annotations_grouped :
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+ if (self .annotations ):
72+ anno_list = self .annotations .values .tolist ()
73+
74+ anno = {}
75+ for i in range (0 , len (anno_list )):
76+ value_id = anno_list [i ][1 ]
77+ annotation_code = anno_list [i ][- 1 ]
78+ if value_id in anno :
79+ anno [value_id ].append (annotation_code )
80+ else :
81+ anno [value_id ] = [annotation_code ]
82+
83+ return anno
84+ else :
85+ return None
4386
4487 def EnableSorting (self ):
45- self .Bind (wx .EVT_LIST_COL_CLICK , self .onColSelected )
88+ self .Bind (wx .EVT_LIST_COL_CLICK , self .on_column_selected )
4689 if not self .smallImageList :
4790 self .SetImageLists ()
4891 if (not self .smallImageList .HasName (ObjectListView .NAME_DOWN_IMAGE ) and
@@ -56,40 +99,58 @@ def ObjectGetter(self, index):
5699 """
57100 return self .dataObjects [index % len (self .dataObjects )]
58101
59- def onColSelected (self , evt ):
102+ def on_column_selected (self , event ):
60103 """
61104 Allows users to sort by clicking on columns
62105 """
63- if isinstance (self .dataframe , pd .DataFrame ):
64- if self .dataframe .empty :
65- return
66- else :
67- if not self .dataframe :
68- return
106+ if not isinstance (self .dataframe , pd .DataFrame ):
107+ return
108+
109+ if self .dataframe .empty :
110+ return
111+
112+ if not len (self .dataObjects ):
113+ return
69114
70- logger .debug ("Column: %s" % evt .m_col )
71- self .sortColumn (evt .m_col )
115+ self .sortColumn (event .Column )
72116
73117 def sortColumn (self , selected_column ):
118+ self .sortAscending = not self .sortAscending
119+
74120 oldSortColumnIndex = self .sortedColumnIndex
75121 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
83122
84123 self ._UpdateColumnSortIndicators (selected_column , oldSortColumnIndex )
85124
86- self .dataObjects = self .dataframe .values .tolist ()
87- if self .GetItemCount :
125+ if selected_column >= len (self .dataframe .columns ):
126+ self .dataObjects = self .sort_columns_by_annotation_code (reverse = self .sortAscending )
127+ else :
128+ self .dataframe .sort_values (self .dataframe .columns [selected_column ], ascending = self .sortAscending , inplace = True )
129+ self .dataObjects = self .__merge_dataframe_with_annotations ()
130+
131+ if self .GetItemCount ():
88132 itemFrom = self .GetTopItem ()
89133 itemTo = self .GetTopItem () + 1 + self .GetCountPerPage ()
90134 itemTo = min (itemTo , self .GetItemCount () - 1 )
91135 self .RefreshItems (itemFrom , itemTo )
92136
137+ def sort_columns_by_annotation_code (self , reverse = False ):
138+ rows_with_annotation = []
139+ rows_without_annotation = []
140+
141+ column_number_of_dataframe = len (self .dataframe .columns )
142+
143+ for i in self .dataObjects :
144+ if len (i ) > column_number_of_dataframe :
145+ rows_with_annotation .append (i )
146+ else :
147+ rows_without_annotation .append (i )
148+
149+ if reverse :
150+ return rows_without_annotation + rows_with_annotation
151+ else :
152+ return rows_with_annotation + rows_without_annotation
153+
93154 def onItemSelected (self , event ):
94155 """
95156
0 commit comments