Cleaning up the import style
[ejpi] / src / gtkhistory.py
1 #!/usr/bin/env python
2
3 """
4 http://www.grigoriev.ru/svgmath/ (MathML->SVG in Python)
5 http://helm.cs.unibo.it/mml-widget/ (MathML widget in C++)
6 """
7
8
9 import gobject
10 import pango
11 import gtk
12
13
14 import history
15 import operation
16
17
18 class GtkCalcHistory(history.AbstractHistory):
19
20         BUTTON_IDX = 0
21         VIEW_DATA_IDX = 1
22         VIEW_RESULT_IDX = 2
23         DATA_IDX = 3
24         RESULT_IDX = 4
25
26         def __init__(self, view):
27                 super(GtkCalcHistory, self).__init__()
28                 self.__prettyRenderer = operation.render_number()
29                 self._historyView = view
30
31                 # stock-id, display, value
32                 self.__historyStore = gtk.ListStore(
33                         gobject.TYPE_STRING, # stock id for pixbuf
34                         gobject.TYPE_STRING, # view of data
35                         gobject.TYPE_STRING, # view of result
36                         object, # data
37                         object, # result
38                 )
39                 self._historyView.set_model(self.__historyStore)
40
41                 # create the TreeViewColumns to display the data
42                 self.__closeColumn = gtk.TreeViewColumn('')
43                 self._historyView.append_column(self.__closeColumn)
44
45                 self.__historyColumn = gtk.TreeViewColumn('History')
46                 self.__historyColumn.set_sort_column_id(0)
47                 self.__historyColumn.set_expand(True)
48                 self._historyView.append_column(self.__historyColumn)
49
50                 self.__resultColumn = gtk.TreeViewColumn('')
51                 self.__resultColumn.set_sort_column_id(0)
52                 self._historyView.append_column(self.__resultColumn)
53
54                 # create a CellRenderers to render the data
55                 self.__closeCell = gtk.CellRendererPixbuf()
56                 self.__closeColumn.pack_start(self.__closeCell, False)
57                 self.__closeColumn.set_attributes(self.__closeCell, stock_id=0)
58
59                 self.__expressionCell = gtk.CellRendererText()
60                 self.__expressionCell.set_property("ellipsize", pango.ELLIPSIZE_MIDDLE)
61                 self.__historyColumn.pack_start(self.__expressionCell, True)
62                 self.__historyColumn.set_attributes(self.__expressionCell, text=1)
63
64                 self.__valueCell = gtk.CellRendererText()
65                 self.__valueCell.set_property("ellipsize", pango.ELLIPSIZE_NONE)
66                 self.__resultColumn.pack_end(self.__valueCell, False)
67                 self.__resultColumn.set_attributes(self.__valueCell, text=2)
68
69                 self._historyView.set_reorderable(True)
70                 self._historyView.connect("row-activated", self._on_close_activated)
71
72         def push(self, node):
73                 simpleNode = node.simplify()
74                 self.__historyStore.prepend([
75                         gtk.STOCK_CLOSE,
76                         operation.render_operation(self.__prettyRenderer, node),
77                         operation.render_operation(self.__prettyRenderer, simpleNode),
78                         node,
79                         simpleNode
80                 ])
81
82         def pop(self):
83                 if len(self.__historyStore) == 0:
84                         raise IndexError("Not enough items in the history for the operation")
85
86                 row = self.__historyStore[0]
87                 data = row[self.DATA_IDX]
88                 del self.__historyStore[0]
89
90                 return data
91
92         def peek(self):
93                 if len(self.__historyStore) == 0:
94                         raise IndexError("Not enough items in the history for the operation")
95                 row = self.__historyStore[0]
96                 data = row[self.DATA_IDX]
97                 return data
98
99         def clear(self):
100                 self.__historyStore.clear()
101
102         def __len__(self):
103                 return len(self.__historyStore)
104
105         def __iter__(self):
106                 for row in iter(self.__historyStore):
107                         data = row[self.DATA_IDX]
108                         yield data
109
110         def _on_close_activated(self, treeView, path, viewColumn):
111                 if viewColumn is self.__closeColumn:
112                         del self.__historyStore[path[0]]
113                 elif viewColumn is self.__resultColumn:
114                         row = self.__historyStore[path[0]]
115                         data = row[self.RESULT_IDX]
116                         self.push(data)
117                 elif viewColumn is self.__historyColumn:
118                         row = self.__historyStore[path[0]]
119                         data = row[self.DATA_IDX]
120                         self.push(data)
121                 else:
122                         assert False