diff --git a/CHANGELOG b/CHANGELOG index 689bce4199..8c2cf6e0f9 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,4 @@ +* Popup form dialog has 3 buttons (close, ok, new) * New UI layout * Add DnD on tree view * Merge tree and list views diff --git a/tryton/gui/window/view_form/model/record.py b/tryton/gui/window/view_form/model/record.py index a05f629221..a9940654ab 100644 --- a/tryton/gui/window/view_form/model/record.py +++ b/tryton/gui/window/view_form/model/record.py @@ -224,7 +224,6 @@ class Record(SignalEvent): def cancel(self): self._loaded.clear() - self.reload() def get_timestamp(self): result = {self.model_name + ',' + str(self.id): self._timestamp} diff --git a/tryton/gui/window/view_form/view/form_gtk/many2many.py b/tryton/gui/window/view_form/view/form_gtk/many2many.py index 28df2acef0..bbee21c720 100644 --- a/tryton/gui/window/view_form/view/form_gtk/many2many.py +++ b/tryton/gui/window/view_form/view/form_gtk/many2many.py @@ -149,6 +149,8 @@ class Many2Many(WidgetInterface): win = WinForm(self.screen, self.window) if win.run(): self.screen.current_record.save() + else: + self.screen.current_record.cancel() win.destroy() def _readonly_set(self, value): diff --git a/tryton/gui/window/view_form/view/form_gtk/many2one.py b/tryton/gui/window/view_form/view/form_gtk/many2one.py index 9ae657594d..309c1b2791 100644 --- a/tryton/gui/window/view_form/view/form_gtk/many2one.py +++ b/tryton/gui/window/view_form/view/form_gtk/many2one.py @@ -154,14 +154,11 @@ class Many2One(WidgetInterface): self.focus_out = False screen = self.get_screen() win = WinForm(screen, self.window, new=True) - while win.run(): + if win.run(): if screen.save_current(): value = (screen.current_record.id, screen.current_record.rec_name()) self.field.set_client(self.record, value) - break - else: - screen.display() win.destroy() self.focus_out = True diff --git a/tryton/gui/window/view_form/view/form_gtk/one2many.py b/tryton/gui/window/view_form/view/form_gtk/one2many.py index 23d9b707f0..31d6293697 100644 --- a/tryton/gui/window/view_form/view/form_gtk/one2many.py +++ b/tryton/gui/window/view_form/view/form_gtk/one2many.py @@ -239,12 +239,8 @@ class One2Many(WidgetInterface): self.screen.current_view.widget.set_sensitive(True) else: win = WinForm(self.screen, self.window, new=True, - context=ctx) - while True: - if win.run(): - win.new() - else: - break + many=True, context=ctx) + win.run() win.destroy() if sequence: self.screen.group.set_sequence(field=sequence) diff --git a/tryton/gui/window/view_form/view/form_gtk/reference.py b/tryton/gui/window/view_form/view/form_gtk/reference.py index d204d26415..0397ae38d4 100644 --- a/tryton/gui/window/view_form/view/form_gtk/reference.py +++ b/tryton/gui/window/view_form/view/form_gtk/reference.py @@ -156,15 +156,12 @@ class Reference(WidgetInterface): screen = Screen(model, self.window, mode=['form']) screen.load([obj_id]) win = WinForm(screen, self.window) - while win.run(): + if win.run(): if screen.save_current(): value = (screen.current_record.id, screen.current_record.rec_name()) self.field.set_client(self.record, (model, value), force_change=True) - break - else: - screen.display() win.destroy() elif model: if not self._readonly and ( self.wid_text.get_text() or not leave): @@ -209,14 +206,11 @@ class Reference(WidgetInterface): return screen = Screen(model, self.window, mode=['form']) win = WinForm(screen, self.window, new=True) - while win.run(): + if win.run(): if screen.save_current(): value = (screen.current_record.id, screen.current_record.rec_name()) self.field.set_client(self.record, (model, value)) - break - else: - screen.display() win.destroy() def sig_key_press(self, widget, event): diff --git a/tryton/gui/window/view_form/view/list_gtk/parser.py b/tryton/gui/window/view_form/view/list_gtk/parser.py index bd4aba4dad..57cc13c03c 100644 --- a/tryton/gui/window/view_form/view/list_gtk/parser.py +++ b/tryton/gui/window/view_form/view/list_gtk/parser.py @@ -570,13 +570,10 @@ class M2O(Char): else: win = WinForm(screen, self.window, new=True) value = False - while win.run(): + if win.run(): if screen.save_current(): value = (screen.current_record.id, screen.current_record.rec_name()) - break - else: - screen.display() win.destroy() if value: return True, value diff --git a/tryton/gui/window/win_form.py b/tryton/gui/window/win_form.py index 442e1f9ce1..2675430d71 100644 --- a/tryton/gui/window/win_form.py +++ b/tryton/gui/window/win_form.py @@ -14,7 +14,7 @@ class WinForm(object): "Form window" def __init__(self, screen, parent, view_type='form', new=False, - context=None): + many=False, context=None): self.parent = parent self.screen = screen @@ -33,7 +33,6 @@ class WinForm(object): self.screen.new(context=self.context) self.win = gtk.Dialog(_('Link'), parent, gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT) - self.win.connect('close', self._sig_close) self.win.set_property('default-width', 760) self.win.set_property('default-height', 500) self.win.set_position(gtk.WIN_POS_CENTER_ON_PARENT) @@ -44,16 +43,32 @@ class WinForm(object): self.win.add_accel_group(self.accel_group) self.but_cancel = None + self.but_ok = None + self.but_new = None if new: icon_cancel = gtk.STOCK_CANCEL self.but_cancel = self.win.add_button(icon_cancel, gtk.RESPONSE_CANCEL) - self.but_ok = self.win.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK) - self.but_ok.add_accelerator('clicked', self.accel_group, - gtk.keysyms.Return, gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) + self.but_ok = self.win.add_button(gtk.STOCK_OK, + gtk.RESPONSE_OK) + if new and many: + self.but_ok.add_accelerator('clicked', + self.accel_group, gtk.keysyms.Return, + gtk.gdk.CONTROL_MASK|gtk.gdk.SHIFT_MASK, + gtk.ACCEL_VISIBLE) - self.win.set_default_response(gtk.RESPONSE_OK) + self.but_new = self.win.add_button(gtk.STOCK_NEW, + gtk.RESPONSE_ACCEPT) + self.but_new.add_accelerator('clicked', self.accel_group, + gtk.keysyms.Return, gtk.gdk.CONTROL_MASK, + gtk.ACCEL_VISIBLE) + self.win.set_default_response(gtk.RESPONSE_ACCEPT) + else: + self.but_ok.add_accelerator('clicked', self.accel_group, + gtk.keysyms.Return, gtk.gdk.CONTROL_MASK, + gtk.ACCEL_VISIBLE) + self.win.set_default_response(gtk.RESPONSE_OK) self.win.set_title(self.screen.current_view.title) @@ -272,39 +287,30 @@ class WinForm(object): line = '(%s/%s)' % (name, signal_data[1]) self.label.set_text(line) - def _sig_close(self, widget): - if self.screen.current_view: - self.screen.current_view.set_value() - if self.but_cancel: - self.screen.remove(delete=True) - elif self.screen.current_record and \ - not self.screen.current_record.validate( - self.screen.current_view.get_fields()): - if self.screen.current_view: - self.screen.current_view.set_cursor() - self.screen.current_view.display() - widget.emit_stop_by_name('close') - def run(self): - end = False - while not end: - res = self.win.run() + validate = False + cancel_responses = (gtk.RESPONSE_CANCEL, gtk.RESPONSE_DELETE_EVENT) + while not validate: + response = self.win.run() self.screen.current_view.set_value() - end = (res != gtk.RESPONSE_OK) \ - or (not self.screen.current_record \ - or self.screen.current_record.validate( - self.screen.current_view.get_fields())) - if not end: + if (response in cancel_responses + or self.screen.current_record is None): + break + validate = self.screen.current_record.validate( + self.screen.current_view.get_fields()) + if not validate: self.screen.current_view.set_cursor() self.screen.display() - if self.but_cancel: - self.but_cancel.set_label(gtk.STOCK_CLOSE) - - if res == gtk.RESPONSE_OK: - return True - elif res == gtk.RESPONSE_CANCEL: - self.screen.remove() - return False + continue + if response == gtk.RESPONSE_ACCEPT: + self.new() + validate = False + if (self.but_cancel + and self.screen.current_record + and response in cancel_responses): + self.screen.group.remove(self.screen.current_record, remove=True) + return False + return response not in cancel_responses def new(self): self.screen.new(context=self.context) @@ -312,11 +318,6 @@ class WinForm(object): self.screen.current_view.set_cursor(new=True) def destroy(self): - if self.screen.current_record and \ - self.screen.current_record.id < 0 and \ - not self.screen.current_record.validate( - self.screen.current_view.get_fields()): - self.screen.remove(delete=True) self.screen.screen_container.alternate_view = False viewport = self.screen.screen_container.alternate_viewport if viewport.get_child(): diff --git a/tryton/gui/window/win_search.py b/tryton/gui/window/win_search.py index d6e5a7e787..e05942fb66 100644 --- a/tryton/gui/window/win_search.py +++ b/tryton/gui/window/win_search.py @@ -106,12 +106,9 @@ class WinSearch(object): screen = Screen(self.model_name, self.win, domain=self.domain, context=self.context, mode=['form']) win = WinForm(screen, self.win, new=True) - while win.run(): + if win.run(): if screen.save_current(): res = [screen.current_record.id] - break - else: - screen.display() win.destroy() end = True else: