Adding the viewport hack so you can get the current item selected in Maemo 5
[quicknote] / src / simple_list.py
1 #!/usr/bin/env python2.5\r
2 # -*- coding: utf-8 -*-\r
3 \r
4 """\r
5  Copyright (C) 2007 Christoph Würstle and in big parts by Gerold Penz\r
6 \r
7 This program is free software; you can redistribute it and/or modify\r
8 it under the terms of the GNU General Public License version 2 as\r
9 published by the Free Software Foundation.\r
10 """\r
11 \r
12 import logging\r
13 \r
14 import pango\r
15 import gtk\r
16 \r
17 import hildonize\r
18 import gtk_toolbox\r
19 \r
20 \r
21 try:\r
22         _\r
23 except NameError:\r
24         _ = lambda x: x\r
25 \r
26 \r
27 _moduleLogger = logging.getLogger("simple_list")\r
28 \r
29 \r
30 class SimpleList(object):\r
31         """\r
32         Stellt eine einfache Liste mit Laufbalken dar. Das wird mit\r
33         den Objekten ScrolledWindow und TreeView erreicht.\r
34         """\r
35 \r
36         KEY_IDX = 0\r
37         VALUE_IDX = 1\r
38 \r
39         def __init__(self):\r
40                 """\r
41                 Initialisieren\r
42                 """\r
43                 self._selectedItem = None # (<Position>, <Key>, <Value>)\r
44 \r
45                 # Treeview\r
46                 self._itemlist = gtk.ListStore(str, str)\r
47                 self._itemView = gtk.TreeView(self._itemlist)\r
48                 self._itemView.set_headers_visible(False)\r
49                 self._itemView.get_selection().set_mode(gtk.SELECTION_SINGLE)\r
50                 self._itemView.connect("cursor-changed", self._on_cursor_changed)\r
51                 self._itemView.connect("row-activated", self._on_row_activated)\r
52                 self._itemView.show()\r
53 \r
54                 # Key-Spalte hinzuf�gen\r
55                 self._keyCell = gtk.CellRendererText()\r
56                 self._keyColumn = gtk.TreeViewColumn("Key")\r
57                 self._keyColumn.pack_start(self._keyCell, True)\r
58                 self._keyColumn.add_attribute(self._keyCell, "text", self.KEY_IDX)\r
59                 self._keyColumn.set_visible(False)\r
60                 self._itemView.append_column(self._keyColumn)\r
61 \r
62                 # Value-Spalte hinzufügen\r
63                 self._valueCell = gtk.CellRendererText()\r
64                 self._valueCell.set_property("ellipsize", pango.ELLIPSIZE_END)\r
65                 self._valueColumn = gtk.TreeViewColumn("Caption")\r
66                 self._valueColumn.pack_start(self._valueCell, True)\r
67                 self._valueColumn.add_attribute(self._valueCell, "text", self.VALUE_IDX)\r
68                 self._itemView.append_column(self._valueColumn)\r
69 \r
70                 # Suchspalte setzen\r
71                 # Leider funktioniert die Suche im Moment nicht so \r
72                 # wie ich das möchte. Deshalb habe ich die Suche abgeschaltet.\r
73                 self._itemView.set_enable_search(False)\r
74 \r
75                 self._maemo5HackVBox = gtk.VBox()\r
76                 self._maemo5HackVBox.pack_start(self._itemView)\r
77                 self._maemo5HackViewport = gtk.Viewport()\r
78                 self._maemo5HackViewport.add(self._maemo5HackVBox)\r
79 \r
80                 # ScrolledWindow\r
81                 self._scrolledWindow = gtk.ScrolledWindow()\r
82                 self._scrolledWindow.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)\r
83                 self._scrolledWindow.set_shadow_type(gtk.SHADOW_IN)\r
84                 self._scrolledWindow.add(self._maemo5HackViewport)\r
85 \r
86                 self._scrolledWindow = hildonize.hildonize_scrollwindow(self._scrolledWindow)\r
87                 self._scrolledWindow.show()\r
88 \r
89         @property\r
90         def widget(self):\r
91                 return self._scrolledWindow\r
92 \r
93         def append_item(self, value, key = ""):\r
94                 """\r
95                 F�gt der Liste Werte und wenn gew�nscht, Schl�ssel hinzu.\r
96                 """\r
97 \r
98                 self._itemlist.append([key, value])\r
99 \r
100         def select_last_item(self):\r
101                 path = str(len(self._itemlist)-1)\r
102                 self._itemView.set_cursor(path, self._valueColumn)\r
103                 return len(self._itemlist)-1\r
104 \r
105         def change_item(self, pos, value, key = ""):\r
106                 self._itemlist[pos] = [key, value]\r
107 \r
108         def remove_item(self, pos):\r
109                 model = self._itemView.get_model()\r
110                 self._itemlist.remove(model.get_iter(str(pos)))\r
111 \r
112         def get_item(self, pos):\r
113                 return self._itemlist[pos]\r
114 \r
115         def clear_items(self):\r
116                 self._itemlist.clear()\r
117 \r
118         def get_selection_data(self):\r
119                 """\r
120                 Gibt die Variable self._selectedItem zur�ck.\r
121                 Diese enth�lt ein Tupel. (<Position>, <Key>, <Value>)\r
122                 """\r
123 \r
124                 return self._selectedItem  # (<Position>, <Key>, <Value>)\r
125 \r
126         def set_eventfunction_cursor_changed(self, function):\r
127                 """\r
128                 Verbindet die �bergebene Funktion mit dem \r
129                 Signal "cursor-changed".\r
130                 """\r
131 \r
132                 self._itemView.connect("cursor-changed", function)\r
133                 self._itemView.connect("row-activated", function)\r
134 \r
135         @gtk_toolbox.log_exception(_moduleLogger)\r
136         def _on_row_activated(self, treeview, path, view_column, data = None):\r
137                 """\r
138                 Sets the value of self._selectedItems. This value can\r
139                 be retrieved using the method "get_selection_data.\r
140                 """\r
141 \r
142                 iter = self._itemlist.get_iter(path)\r
143                 if not iter:\r
144                         return\r
145 \r
146                 self._selectedItem = (\r
147                         path[0], # Position\r
148                         self._itemlist.get_value(iter, self.KEY_IDX), # Key\r
149                         self._itemlist.get_value(iter, self.VALUE_IDX) # Value\r
150                 )\r
151 \r
152         @gtk_toolbox.log_exception(_moduleLogger)\r
153         def _on_cursor_changed(self, widget, data1 = None, data2 = None):\r
154                 """\r
155                 Sets the value of self._selectedItems. This value can\r
156                 be retrieved using the method "get_selection_data.\r
157                 """\r
158 \r
159                 selection = widget.get_selection()\r
160                 (model, iter) = selection.get_selected()\r
161                 if not iter:\r
162                         return\r
163 \r
164                 self._selectedItem = (\r
165                         int(selection.get_selected_rows()[1][0][0]), # Position\r
166                         str(model.get_value(iter, self.KEY_IDX)), # Key\r
167                         str(model.get_value(iter, self.VALUE_IDX)) # Value\r
168                 )\r