Skip to content

Commit e20faaf

Browse files
authored
Merge pull request #319 from ODM2/saveAction
Save action
2 parents ef1f364 + 0d32a79 commit e20faaf

File tree

17 files changed

+688
-689
lines changed

17 files changed

+688
-689
lines changed

odmtools/controller/frmDataTable.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,14 @@ def __init__(self, parent, **kwargs):
1313
self.memDB = None
1414
DataTable.__init__(self, parent, **kwargs)
1515

16+
def init(self, memDB):
17+
self.memDB = memDB
18+
self.olvDataTable.init(self.memDB)
1619

17-
def init_publishers(self):
1820
Publisher.subscribe(self.onChangeSelection, "changeTableSelection")
1921
Publisher.subscribe(self.onRefresh, "refreshTable")
2022
Publisher.subscribe(self.olvDataTable.onDeselectAll, "deselectAllDataTable")
2123

22-
def init(self, memDB):
23-
self.memDB = memDB
24-
self.olvDataTable.init(self.memDB)
25-
self.init_publishers()
26-
2724
def onItemSelected(self, event):
2825
pass
2926

odmtools/controller/olvDataTable.py

Lines changed: 85 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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

odmtools/gui/mnuRibbon.py

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ def _init_ctrls(self, prnt):
129129

130130
# -------------------------------------------------------------------------------
131131
editPage = RB.RibbonPage(self, wx.ID_ANY, "Edit")
132+
# editPage.Bind(wx.EVT_ENTER_WINDOW, self.on_mouse_enter)
132133

133134
main_panel = RB.RibbonPanel(editPage, wx.ID_ANY, "Main", wx.NullBitmap, wx.DefaultPosition, wx.DefaultSize,
134135
RB.RIBBON_PANEL_NO_AUTO_MINIMISE)
@@ -204,14 +205,28 @@ def _init_ctrls(self, prnt):
204205
self.CurrPage = 1
205206
self.SetActivePageByIndex(self.CurrPage)
206207

207-
self.bindEvents()
208+
self.__bind_events()
208209
self.initPubSub()
209210

210211
def __init__(self, parent, id, name):
211212
self.parent = parent
212213
self._init_ctrls(parent)
213214

214-
def bindEvents(self):
215+
def on_mouse_enter(self, event):
216+
ribbon_panel = event.GetEventObject().GetParent()
217+
ribbon_panel._hovered = True
218+
219+
self.Refresh()
220+
event.Skip()
221+
222+
def on_mouse_leave(self, event):
223+
ribbon_panel = event.GetEventObject().GetParent()
224+
ribbon_panel._hovered = False
225+
226+
self.Refresh()
227+
event.Skip()
228+
229+
def __bind_events(self):
215230
###Docking Window Selection
216231
self.Bind(RB.EVT_RIBBONBUTTONBAR_CLICKED, self.onDocking, id=wxID_RIBBONVIEWTABLE)
217232
self.Bind(RB.EVT_RIBBONBUTTONBAR_CLICKED, self.onDocking, id=wxID_RIBBONVIEWSERIES)
@@ -262,6 +277,24 @@ def bindEvents(self):
262277
###Ribbon Event
263278
self.Bind(RB.EVT_RIBBONBAR_PAGE_CHANGED, self.onFileMenu, id=wxID_PANEL1)
264279

280+
# ENTER
281+
self.main_bar.Bind(wx.EVT_ENTER_WINDOW, self.on_mouse_enter) # 1
282+
self.edit_bar.Bind(wx.EVT_ENTER_WINDOW, self.on_mouse_enter) # 2
283+
self.record_bar.Bind(wx.EVT_ENTER_WINDOW, self.on_mouse_enter) # 3
284+
self.PlotsOptions_bar.Bind(wx.EVT_ENTER_WINDOW, self.on_mouse_enter) # 4
285+
self.plots_bar.Bind(wx.EVT_ENTER_WINDOW, self.on_mouse_enter) # 5
286+
self.dateTime_buttonbar.Bind(wx.EVT_ENTER_WINDOW, self.on_mouse_enter) # 6
287+
self.scriptBar.Bind(wx.EVT_ENTER_WINDOW, self.on_mouse_enter) # 7
288+
289+
# LEAVE
290+
self.main_bar.Bind(wx.EVT_LEAVE_WINDOW, self.on_mouse_leave) # 1
291+
self.edit_bar.Bind(wx.EVT_LEAVE_WINDOW, self.on_mouse_leave) # 2
292+
self.record_bar.Bind(wx.EVT_LEAVE_WINDOW, self.on_mouse_leave) # 3
293+
self.PlotsOptions_bar.Bind(wx.EVT_LEAVE_WINDOW, self.on_mouse_leave) # 4
294+
self.plots_bar.Bind(wx.EVT_LEAVE_WINDOW, self.on_mouse_leave) # 5
295+
self.dateTime_buttonbar.Bind(wx.EVT_LEAVE_WINDOW, self.on_mouse_leave) # 6
296+
self.scriptBar.Bind(wx.EVT_LEAVE_WINDOW, self.on_mouse_leave) # 7
297+
265298
def initPubSub(self):
266299
Publisher.subscribe(self.toggleEditButtons, "EnableEditButtons")
267300
Publisher.subscribe(self.enableButtons, "EnablePlotButtons")

0 commit comments

Comments
 (0)