1+ import wx
2+ import logging
3+ from odmtools .common .logger import LoggerTool
4+ from lib .ObjectListView import VirtualObjectListView , ObjectListView , ColumnDefn
5+ import pandas as pd
6+
7+ tool = LoggerTool ()
8+ logger = tool .setupLogger (__name__ , __name__ + '.log' , 'w' , logging .DEBUG )
9+
10+ __author__ = 'jmeline'
11+
12+
13+ class OLVDataTable (VirtualObjectListView ):
14+ def __init__ (self , parent , ** kwargs ):
15+ VirtualObjectListView .__init__ (self , parent , ** kwargs )
16+ self .SetEmptyListMsg ("No Series Selected for Editing" )
17+ self .EnableSorting ()
18+ self .sortedColumnIndex = - 1
19+ self .currentItem = None
20+ self .dataframe = None
21+
22+ def init (self , memDB ):
23+ self .memDB = memDB
24+ columns = [ColumnDefn (x .strip (), align = "left" , valueGetter = i , minimumWidth = 125 , width = 125 ,
25+ stringConverter = '%Y-%m-%d %H:%M:%S' if "date" in x .lower () else '%s' )
26+ for x , i in self .memDB .getEditColumns ()]
27+ self .useAlternateBackColors = True
28+ self .oddRowsBackColor = wx .Colour (191 , 217 , 217 )
29+ self .SetColumns (columns )
30+ self .dataframe = self .memDB .getDataValuesDF ()
31+ sort_by_index = list (self .dataframe .columns ).index ("LocalDateTime" )
32+ self .dataframe .sort (self .dataframe .columns [sort_by_index ], inplace = True )
33+ self .dataObjects = self .dataframe .values .tolist ()
34+
35+ self .SetObjectGetter (self .ObjectGetter )
36+ self .SetItemCount (len (self .dataframe ))
37+
38+ def EnableSorting (self ):
39+ self .Bind (wx .EVT_LIST_COL_CLICK , self .onColSelected )
40+ if not self .smallImageList :
41+ self .SetImageLists ()
42+ if (not self .smallImageList .HasName (ObjectListView .NAME_DOWN_IMAGE ) and
43+ self .smallImageList .GetSize (0 ) == (16 , 16 )):
44+ self .RegisterSortIndicators ()
45+
46+ def ObjectGetter (self , index ):
47+ """
48+ A Virtual list has to have a callable installed that says which model object is shown
49+ at a given index
50+ """
51+ return self .dataObjects [index % len (self .dataObjects )]
52+
53+ def onColSelected (self , evt ):
54+ """
55+ Allows users to sort by clicking on columns
56+ """
57+ if isinstance (self .dataframe , pd .DataFrame ):
58+ if self .dataframe .empty :
59+ return
60+ else :
61+ if not self .dataframe :
62+ return
63+
64+ logger .debug ("Column: %s" % evt .m_col )
65+ self .sortColumn (evt .m_col )
66+
67+ def sortColumn (self , selected_column ):
68+ oldSortColumnIndex = self .sortedColumnIndex
69+ self .sortedColumnIndex = selected_column
70+ ascending = self .sortAscending
71+ if ascending :
72+ self .dataframe .sort (self .dataframe .columns [selected_column ], inplace = True )
73+ self .sortAscending = False
74+ elif not ascending :
75+ self .dataframe .sort (self .dataframe .columns [selected_column ], ascending = False , inplace = True )
76+ self .sortAscending = True
77+
78+ self ._UpdateColumnSortIndicators (selected_column , oldSortColumnIndex )
79+
80+ self .dataObjects = self .dataframe .values .tolist ()
81+ if self .GetItemCount :
82+ itemFrom = self .GetTopItem ()
83+ itemTo = self .GetTopItem () + 1 + self .GetCountPerPage ()
84+ itemTo = min (itemTo , self .GetItemCount () - 1 )
85+ self .RefreshItems (itemFrom , itemTo )
86+
87+ def onItemSelected (self , event ):
88+ """
89+
90+ Disable selecting of an item in the DataTable, only sorting is available
91+ """
92+ if not self .enableSelectDataTable :
93+ self .SetItemState (event .m_itemIndex , 0 , wx .LIST_STATE_SELECTED )
94+
95+ def onDeselectAll (self ):
96+ selected_item = self .GetFirstSelected ()
97+ while selected_item != - 1 :
98+ self .SetItemState (selected_item , 0 , wx .LIST_STATE_SELECTED )
99+ selected_item = self .GetNextSelected (selected_item )
100+
101+ def _rowFormatter (self , listItem , object ):
102+ """Handles the formatting of rows for object list view
103+ :param: wx.ListCtrl listitem
104+ :param: ModelObject object
105+
106+ :rtype: None
107+ """
108+ objects = self .GetSelectedObjects ()
109+
110+ # if self.currentItem and object in self.currentItem:
111+ if objects and object in objects :
112+
113+ # font type: wx.DEFAULT, wx.DECORATIVE, wx.ROMAN, wx.SCRIPT, wx.SWISS, wx.MODERN
114+ # slant: wx.NORMAL, wx.SLANT or wx.ITALIC
115+ # weight: wx.NORMAL, wx.LIGHT or wx.BOLD
116+ #font1 = wx.Font(10, wx.SWISS, wx.ITALIC, wx.NORMAL)
117+ # use additional fonts this way ...
118+ #font1 = wx.Font(10, wx.SWISS, wx.NORMAL, wx.NORMAL, False, u'Comic Sans MS')
119+ listItem .SetFont (
120+ wx .Font (9 , wx .DECORATIVE , wx .ITALIC , wx .BOLD ))
121+ else :
122+ listItem .SetFont (wx .Font (9 , wx .SWISS , wx .NORMAL , wx .NORMAL , False , u'Tahoma' ))
0 commit comments