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