1
##############################################################################
3
# Copyright (c) 2006 TINY SPRL. (http://tiny.be) All Rights Reserved.
7
# WARNING: This program as such is intended to be used by professional
8
# programmers who take the whole responsability of assessing all potential
9
# consequences resulting from its eventual inadequacies and bugs
10
# End users who are looking for a ready-to-use solution with commercial
11
# garantees and support are strongly adviced to contract a Free Software
14
# This program is Free Software; you can redistribute it and/or
15
# modify it under the terms of the GNU General Public License
16
# as published by the Free Software Foundation; either version 2
17
# of the License, or (at your option) any later version.
19
# This program is distributed in the hope that it will be useful,
20
# but WITHOUT ANY WARRANTY; without even the implied warranty of
21
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22
# GNU General Public License for more details.
24
# You should have received a copy of the GNU General Public License
25
# along with this program; if not, write to the Free Software
26
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28
##############################################################################
33
class AdaptModelGroup(gtk.GenericTreeModel):
35
def __init__(self, model_group):
36
super(AdaptModelGroup, self).__init__()
37
self.model_group = model_group
38
self.models = model_group.models
41
self.set_property('leak_references', False)
43
def added(self, modellist, position):
44
if modellist is self.models:
45
model = self.models[position]
46
self.emit('row_inserted', self.on_get_path(model),
47
self.get_iter(self.on_get_path(model)))
52
def changed_all(self, *args):
53
self.emit('row_deleted', position)
54
self.invalidate_iters()
56
def removed(self, lst, position):
57
self.emit('row_deleted', position)
58
self.invalidate_iters()
60
def append(self, model):
61
self.model_group.model_add(model)
63
def prepend(self, model):
64
self.model_group.model_add(model, 0)
66
def remove(self, iter):
67
idx = self.get_path(iter)[0]
68
self.model_group.model_remove(self.models[idx])
69
self.invalidate_iters()
72
self.sort_asc = not (self.sort_asc and (self.last_sort == name))
75
f = lambda x,y: cmp(x[name].get_client(), y[name].get_client())
77
f = lambda x,y: -1 * cmp(x[name].get_client(), y[name].get_client())
79
for idx, row in enumerate(self.models):
80
iter = self.get_iter(idx)
81
self.row_changed(self.get_path(iter), iter)
84
return self.model_group.writen(id)
87
return len(self.models)
89
## Mandatory GenericTreeModel methods
91
def on_get_flags(self):
92
return gtk.TREE_MODEL_LIST_ONLY
94
def on_get_n_columns(self):
97
def on_get_column_type(self, index):
98
return gobject.TYPE_PYOBJECT
100
def on_get_path(self, iter):
101
return self.models.index(iter)
103
def on_get_iter(self, path):
104
if isinstance(path, tuple):
107
if path<len(self.models):
108
return self.models[path]
114
def on_get_value(self, node, column):
118
def on_iter_next(self, node):
120
return self.on_get_iter(self.on_get_path(node) + 1)
124
def on_iter_has_child(self, node):
127
def on_iter_children(self, node):
130
def on_iter_n_children(self, node):
133
def on_iter_nth_child(self, node, n):
134
if node is None and self.models:
135
return self.on_get_iter(0)
138
def on_iter_parent(self, node):
141
class ViewList(object):
143
def __init__(self, screen, widget, children={}, buttons={}, toolbar=None):
146
self.view_type = 'tree'
147
self.model_add_new = True
149
self.widget.screen = screen
153
self.widget.connect_after('row-activated', self.__sig_switch)
154
selection = self.widget.get_selection()
155
selection.connect('changed', self.__select_changed)
157
def signal_record_changed(self, signal, *args):
160
if signal=='record-added':
161
self.store.added(*args)
162
elif signal=='record-removed':
163
self.store.removed(*args)
165
assert False, 'Unknown Signal !'
171
return 'ViewList (%s)' % self.screen.resource
173
def __getitem__(self, name):
177
self.widget.destroy()
181
def __sig_switch(self, treeview, *args):
182
self.screen.row_activate(self.screen)
184
def __select_changed(self, tree_sel):
185
if tree_sel.get_mode() == gtk.SELECTION_SINGLE:
186
model, iter = tree_sel.get_selected()
188
path = model.get_path(iter)[0]
189
self.screen.current_model = model.models[path]
192
if self.widget.editable:
193
self.widget.set_value()
198
# self.widget.set_model(self.store) could be removed if the store
199
# has not changed -> better ergonomy. To test
202
if (not self.widget.get_model()) or self.screen.models<>self.widget.get_model().model_group:
203
self.store = AdaptModelGroup(self.screen.models)
204
self.widget.set_model(self.store)
205
if self.screen.current_model:
206
path = self.store.on_get_path(self.screen.current_model)
207
self.widget.set_cursor(path, self.widget.get_columns()[0], bool(self.widget.editable))
210
# Should find a simpler solution to do something like
211
#self.widget.set_cursor(None,None,False)
214
self.widget.set_model(self.store)
216
def sel_ids_get(self):
217
def _func_sel_get(store, path, iter, ids):
218
model = store.on_get_iter(path)
222
sel = self.widget.get_selection()
223
sel.selected_foreach(_func_sel_get, ids)
226
def on_change(self, callback):
228
self.screen.on_change(callback)
230
def unset_editable(self):
231
self.widget.editable = False
232
for col in self.widget.get_columns():
233
for renderer in col.get_cell_renderers():
234
renderer.set_property('editable', False)