64
64
self.wid_but_remove.connect('clicked', self._sig_remove)
65
65
hb.pack_start(self.wid_but_remove, expand=False, fill=False)
67
hb.pack_start(gtk.VSeparator(), expand=False, fill=True)
69
tooltips = gtk.Tooltips()
70
self.eb_prev_page = gtk.EventBox()
71
tooltips.set_tip(self.eb_prev_page, _('Previous Page'))
72
self.eb_prev_page.set_events(gtk.gdk.BUTTON_PRESS)
73
self.eb_prev_page.connect('button_press_event', self._sig_prev_page)
74
img_first = gtk.Image()
75
img_first.set_from_stock('gtk-goto-first', gtk.ICON_SIZE_MENU)
76
img_first.set_alignment(0.5, 0.5)
77
self.eb_prev_page.add(img_first)
78
hb.pack_start(self.eb_prev_page, expand=False, fill=False)
81
self.eb_pre = gtk.EventBox()
82
tooltips.set_tip(self.eb_pre, _('Previous Record'))
83
self.eb_pre.set_events(gtk.gdk.BUTTON_PRESS)
84
self.eb_pre.connect('button_press_event', self._sig_previous)
86
img_pre.set_from_stock('gtk-go-back', gtk.ICON_SIZE_MENU)
87
img_pre.set_alignment(0.5, 0.5)
88
self.eb_pre.add(img_pre)
89
hb.pack_start(self.eb_pre, expand=False, fill=False)
91
self.label = gtk.Label('(0,0)')
92
hb.pack_start(self.label, expand=False, fill=False)
95
self.eb_next = gtk.EventBox()
96
tooltips.set_tip(self.eb_next, _('Next Record'))
97
self.eb_next.set_events(gtk.gdk.BUTTON_PRESS)
98
self.eb_next.connect('button_press_event', self._sig_next)
99
img_next = gtk.Image()
100
img_next.set_from_stock('gtk-go-forward', gtk.ICON_SIZE_MENU)
101
img_next.set_alignment(0.5, 0.5)
102
self.eb_next.add(img_next)
103
hb.pack_start(self.eb_next, expand=False, fill=False)
106
self.eb_next_page = gtk.EventBox()
107
tooltips.set_tip(self.eb_next_page, _('Next Page'))
108
self.eb_next_page.set_events(gtk.gdk.BUTTON_PRESS)
109
self.eb_next_page.connect('button_press_event', self._sig_next_page)
110
img_last = gtk.Image()
111
img_last.set_from_stock('gtk-goto-last', gtk.ICON_SIZE_MENU)
112
img_last.set_alignment(0.5, 0.5)
113
self.eb_next_page.add(img_last)
114
hb.pack_start(self.eb_next_page, expand=False, fill=False)
116
hb.pack_start(gtk.VSeparator(), expand=False, fill=True)
119
self.cb = gtk.combo_box_new_text()
120
for limit in ['20','40','80','100']:
121
self.cb.append_text(limit)
122
self.cb.set_active(0)
123
tooltips.set_tip(self.cb, _('Choose Limit'))
124
self.cb.connect('changed', self.limit_changed)
125
hb.pack_start(self.cb, expand=False, fill=False)
67
127
self.widget.pack_start(hb, expand=False, fill=False)
68
128
self.widget.pack_start(gtk.HSeparator(), expand=False, fill=True)
73
133
scroll.set_shadow_type(gtk.SHADOW_NONE)
75
135
self.screen = Screen(attrs['relation'], view_type=['tree'],
76
views_preload=attrs.get('views', {}),row_activate=self.row_activate)
136
views_preload=attrs.get('views', {}),row_activate=self.row_activate, limit=20)
137
self.screen.signal_connect(self, 'record-message', self._sig_label)
77
138
self.screen.type = 'many2many'
78
139
scroll.add_with_viewport(self.screen.widget)
79
140
self.widget.pack_start(scroll, expand=True, fill=True)
82
self.avail_ids = set()
84
def check_exist(self):
85
if not len(self.screen.models.models):
86
self.avail_ids.clear()
88
for i in self.screen.models.models:
89
self.avail_ids.add(i.id)
142
self.pager = pager(object=self, relation=attrs['relation'], screen=self.screen)
144
self.model_field = None
145
self.name = attrs['name']
91
147
def row_activate(self, screen):
92
148
gui_window = service.LocalService('gui.window')
105
164
def _menu_sig_default(self, obj):
106
res = rpc.session.rpc_exec_auth('/object', 'execute', self.attrs['model'], 'default_get', [self.attrs['name']])
107
self.value = res.get(self.attrs['name'], False)
165
res = rpc.session.rpc_exec_auth('/object', 'execute', self.attrs['model'], 'default_get', [self.name])
166
self.value = res.get(self.name, False)
109
168
def _sig_add(self, *args):
112
169
domain = self._view.modelfield.domain_get(self._view.model)
113
170
context = self._view.modelfield.context_get(self._view.model)
115
172
ids = rpc.session.rpc_exec_auth('/object', 'execute', self.attrs['relation'], 'name_search', self.wid_text.get_text(), domain, 'ilike', context)
116
173
ids = map(lambda x: x[0], ids)
119
174
win = win_search(self.attrs['relation'], sel_multi=True, ids=ids, context=context, domain=domain, parent=self._window)
124
if len(self.avail_ids) and len(ids):
126
if i not in self.avail_ids:
133
self.screen.load(ids)
135
self.avail_ids.add(i)
136
self.screen.display()
177
if ids == None: ids = []
178
if self.name in self.model.m2m_cache:
179
self.model.m2m_cache[self.name] = list(set(self.model.m2m_cache[self.name] + ids))
181
self.model.m2m_cache[self.name] = ids
182
self.model.is_m2m_modified = True
137
183
self.wid_text.set_text('')
138
184
self._focus_out()
185
self.pager.reset_pager()
186
self.pager.search_count()
140
188
def _sig_remove(self, *args):
143
rem_id=self.screen.current_view.sel_ids_get()
145
self.avail_ids.remove(i)
147
self.screen.display()
189
rem_id = self.screen.current_view.sel_ids_get()
191
[self.model.m2m_cache[self.name].remove(id) \
192
for id in rem_id if id in self.model.m2m_cache[self.name]]
193
self.model.is_m2m_modified = True
195
self.screen.display()
197
self.pager.reset_pager()
198
self.pager.search_count()
150
200
def _sig_activate(self, *args):
156
206
self.wid_but_remove.set_sensitive(not ro)
157
207
self.wid_but_add.set_sensitive(not ro)
209
def limit_changed(self,*args):
210
self.pager.limit_changed()
213
def _sig_prev_page(self, *args):
214
self.pager.prev_page()
216
def _sig_next_page(self, *args):
217
self.pager.next_page()
219
def _sig_next(self, *args):
221
if event.type == gtk.gdk.BUTTON_PRESS:
222
self.pager.next_record()
225
def _sig_previous(self, *args):
227
if event.type == gtk.gdk.BUTTON_PRESS:
228
self.pager.prev_record()
230
def _sig_label(self, screen, signal_data):
232
if signal_data[0] >= 0:
233
name = str(signal_data[0] + 1)
234
line = '(%s/%s of %s)' % (name, signal_data[1], signal_data[2])
235
self.label.set_text(line)
159
237
def display(self, model, model_field):
239
self.model_field = model_field
160
240
super(many2many, self).display(model, model_field)
163
243
ids = model_field.get_client(model)
165
244
self.screen.clear()
166
245
self.screen.load(ids)
168
self.avail_ids.clear()
169
246
self.screen.display()
247
if self.screen.models.models:
248
self.screen.current_models = self.screen.models.models[0]
249
if model and model.id:
250
self.pager.search_count()
251
self.pager.set_sensitivity()
252
self.screen.current_view.set_cursor()
172
255
def set_value(self, model, model_field):
173
model_field.set_client(model, [x.id for x in self.screen.models.models])
256
if self.name in model.m2m_cache:
257
model_field.set_client(model, model.m2m_cache[self.name])
175
259
def grab_focus(self):
176
260
return self.wid_text.grab_focus()