b3f10c941bb15bbfff00ae7504e76f62f9cf94d3
[hooke.git] / hooke / ui / gui / hookeresults.py
1 #!/usr/bin/env python\r
2 \r
3 import sys\r
4 import wx\r
5 from wx.lib.mixins.listctrl import CheckListCtrlMixin\r
6 \r
7 import prettyformat\r
8 \r
9 class CheckListCtrl(wx.ListCtrl, CheckListCtrlMixin):\r
10     def __init__(self, parent):\r
11         wx.ListCtrl.__init__(self, parent, -1, style=wx.LC_REPORT)\r
12         CheckListCtrlMixin.__init__(self)\r
13         self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated)\r
14 \r
15     def OnItemActivated(self, evt):\r
16         self.ToggleItem(evt.m_itemIndex)\r
17 \r
18 \r
19 class Results(wx.Panel):\r
20     def __init__(self, parent):\r
21         wx.Panel.__init__(self, parent, -1)\r
22         self.results_list = CheckListCtrl(self)\r
23         sizer = wx.BoxSizer()\r
24         sizer.Add(self.results_list, 1, wx.EXPAND)\r
25         self.SetSizer(sizer)\r
26         self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, self.results_list)\r
27         self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.OnItemDeselected, self.results_list)\r
28         #self.results_list.OnCheckItem = self.OnCheckItem\r
29 \r
30     def _GetWidthInPixels(self, text):\r
31         #TODO:\r
32         #Returns the width of a string in pixels\r
33         #Unfortunately, it does not work terribly well (although it should).\r
34         #Thus, we have to add a bit afterwards.\r
35         #Annoys the heck out of me.\r
36         font = self.results_list.GetFont()\r
37         dc = wx.WindowDC(self.results_list)\r
38         dc.SetFont(font)\r
39         width, height = dc.GetTextExtent(text)\r
40         return width\r
41 \r
42     def ClearResults(self):\r
43         self.results_list.ClearAll()\r
44 \r
45     def DisplayResults(self, results):\r
46         self.ClearResults()\r
47         header = results.header_as_list()\r
48         self.results_list.InsertColumn(0, 'Show')\r
49         for index, column in enumerate(header):\r
50             self.results_list.InsertColumn(index + 1, column, wx.LIST_FORMAT_RIGHT)\r
51 \r
52         for result in results.results:\r
53             done = False\r
54             for index, column in enumerate(results.columns):\r
55                 value_str = results.get_pretty_value(column, result.result[column])\r
56                 if not done:\r
57                     index_col = self.results_list.InsertStringItem(sys.maxint, '')\r
58                     done = True\r
59                 column_width = len(self.results_list.GetColumn(index + 1).GetText())\r
60                 value_str = value_str.center(column_width)\r
61                 self.results_list.SetStringItem(index_col, index + 1, value_str)\r
62                 #self.results_list.SetItemData(index, result)\r
63 \r
64         for index, result in enumerate(results.results):\r
65             if result.visible:\r
66                 #if we use 'CheckItem' then 'UpdatePlot' is called (ie repeated updates)\r
67                 self.results_list.SetItemImage(index, 1)\r
68                 #self.results_list.CheckItem(index)\r
69         for index in range(self.results_list.GetColumnCount()):\r
70             column_text = self.results_list.GetColumn(index).GetText()\r
71             column_width = self._GetWidthInPixels(column_text)\r
72             self.results_list.SetColumnWidth(index, column_width + 15)\r
73 \r
74     def OnItemSelected(self, evt):\r
75         pass\r
76 \r
77     def OnItemDeselected(self, evt):\r
78         pass\r