Add breadcrumb as title of window form

issue7167
review343151002
This commit is contained in:
Cédric Krier committed 2021-02-14 15:45:21 +01:00
1 parent 68900c7473
commit b2cfb5cd85
9 files changed
+67 -33

No files matched your search

+1
View File
@@ -1,3 +1,4 @@
* Add breadcrumb as title of window form
* Display revision on dialog
* Execute report asynchronously
* Add support for Python 3.9
+3 -3
View File
@@ -45,13 +45,13 @@ class Form(SignalEvent, TabContent):
self.view_ids = attributes.get('view_ids')
self.dialogs = []
self.screen = Screen(self.model, **attributes)
self.screen.widget.show()
if not name:
name = common.MODELNAME.get(model)
self.name = name
self.screen = Screen(self.model, breadcrumb=[self.name], **attributes)
self.screen.widget.show()
self.create_tabcontent()
self.set_buttons_sensitive()
@@ -76,6 +76,7 @@ class Screen(SignalEvent):
self.screen_container.alternate_view = attributes.get(
'alternate_view', False)
self.widget = self.screen_container.widget_get()
self.breadcrumb = attributes.get('breadcrumb') or []
self.context_screen = None
if attributes.get('context_model'):
@@ -182,10 +182,14 @@ class Many2Many(Widget):
context = self.field.get_context(self.record)
# Remove the first tree view as mode is form only
view_ids = self.attrs.get('view_ids', '').split(',')[1:]
return Screen(self.attrs['relation'], domain=domain,
model = self.attrs['relation']
breadcrumb = list(self.view.screen.breadcrumb)
breadcrumb.append(
self.attrs.get('string') or common.MODELNAME.get(model))
return Screen(model, domain=domain,
view_ids=view_ids,
mode=['form'], views_preload=self.attrs.get('views', {}),
context=context)
context=context, breadcrumb=breadcrumb)
def _sig_edit(self):
if not self.screen.current_record:
@@ -202,7 +206,7 @@ class Many2Many(Widget):
self.screen.current_record.cancel()
# Force a display to clear the CellCache
self.screen.display()
WinForm(screen, callback, title=self.attrs.get('string'))
WinForm(screen, callback)
def _sig_new(self):
screen = self._get_screen_form()
@@ -217,7 +221,7 @@ class Many2Many(Widget):
self.focus_out = False
WinForm(screen, callback, new=True, save_current=True,
title=self.attrs.get('string'), rec_name=self.wid_text.get_text())
rec_name=self.wid_text.get_text())
def _readonly_set(self, value):
self._readonly = value
@@ -152,10 +152,15 @@ class Many2One(Widget):
context = self.field.get_context(self.record)
# Remove first tree view as mode is form only
view_ids = self.attrs.get('view_ids', '').split(',')[1:]
return Screen(self.get_model(), domain=domain, context=context,
model = self.get_model()
breadcrumb = list(self.view.screen.breadcrumb)
breadcrumb.append(
self.attrs.get('string') or common.MODELNAME.get(model))
return Screen(model, domain=domain, context=context,
mode=['form'], view_ids=view_ids,
views_preload=self.attrs.get('views', {}), readonly=self._readonly,
exclude_field=self.attrs.get('relation_field'))
exclude_field=self.attrs.get('relation_field'),
breadcrumb=breadcrumb)
def sig_new(self, *args):
model = self.get_model()
@@ -171,7 +176,7 @@ class Many2One(Widget):
screen.current_record.rec_name()))
self.focus_out = True
WinForm(screen, callback, new=True, save_current=True,
title=self.attrs.get('string'), rec_name=self.wid_text.get_text())
rec_name=self.wid_text.get_text())
def sig_edit(self, entry=None, icon_pos=None, *args):
model = self.get_model()
@@ -204,8 +209,7 @@ class Many2One(Widget):
force_change=True)
self.focus_out = True
self.changed = True
WinForm(screen, callback, save_current=True,
title=self.attrs.get('string'))
WinForm(screen, callback, save_current=True)
return
if not self._readonly:
domain = self.field.domain_get(self.record)
@@ -156,14 +156,19 @@ class One2Many(Widget):
frame.set_shadow_type(Gtk.ShadowType.OUT)
vbox.pack_start(frame, expand=False, fill=True, padding=0)
self.screen = Screen(attrs['relation'],
model = attrs['relation']
breadcrumb = list(self.view.screen.breadcrumb)
breadcrumb.append(
attrs.get('string') or common.MODELNAME.get(model))
self.screen = Screen(model,
mode=attrs.get('mode', 'tree,form').split(','),
view_ids=attrs.get('view_ids', '').split(','),
views_preload=attrs.get('views', {}),
order=attrs.get('order'),
row_activate=self._on_activate,
exclude_field=attrs.get('relation_field', None),
limit=None)
limit=None,
breadcrumb=breadcrumb)
self.screen.pre_validate = bool(int(attrs.get('pre_validate', 0)))
self.screen.signal_connect(self, 'record-message', self._sig_label)
@@ -353,7 +358,7 @@ class One2Many(Widget):
field_size = self.record.expr_eval(self.attrs.get('size')) or -1
field_size -= len(self.field.get_eval(self.record)) + 1
WinForm(self.screen, lambda a: update_sequence(), new=True,
many=field_size, title=self.attrs.get('string'))
many=field_size)
def _new_product(self):
fields = self.attrs['product'].split(',')
@@ -414,8 +419,7 @@ class One2Many(Widget):
return
record = self.screen.current_record
if record:
WinForm(self.screen, lambda a: None,
title=self.attrs.get('string'))
WinForm(self.screen, lambda a: None)
def _sig_next(self, widget):
if not self._validate():
@@ -838,9 +838,13 @@ class M2O(GenericText):
return
target_id = self.id_from_value(field.get(record))
breadcrumb = list(self.view.screen.breadcrumb)
breadcrumb.append(
field.attrs.get('string') or common.MODELNAME.get(model))
screen = Screen(model, domain=domain, context=context,
mode=['form'], view_ids=self.attrs.get('view_ids', '').split(','),
exclude_field=field.attrs.get('relation_field'))
exclude_field=field.attrs.get('relation_field'),
breadcrumb=breadcrumb)
def open_callback(result):
if result:
@@ -853,11 +857,10 @@ class M2O(GenericText):
callback()
if target_id and target_id >= 0:
screen.load([target_id])
WinForm(screen, open_callback, save_current=True,
title=field.attrs.get('string'))
WinForm(screen, open_callback, save_current=True)
else:
WinForm(screen, open_callback, new=True, save_current=True,
title=field.attrs.get('string'), rec_name=text)
rec_name=text)
def search_remote(self, record, field, text, callback=None):
model = self.get_model(record, field)
@@ -970,17 +973,20 @@ class O2M(GenericText):
if not access['read']:
return
breadcrumb = list(self.view.screen.breadcrumb)
breadcrumb.append(
field.attrs.get('string') or common.MODELNAME.get(relation))
screen = Screen(relation, mode=['tree', 'form'],
view_ids=self.attrs.get('view_ids', '').split(','),
exclude_field=field.attrs.get('relation_field'))
exclude_field=field.attrs.get('relation_field'),
breadcrumb=breadcrumb)
screen.pre_validate = bool(int(self.attrs.get('pre_validate', 0)))
screen.group = group
def open_callback(result):
if callback:
callback()
WinForm(screen, open_callback, view_type='tree', context=context,
title=field.attrs.get('string'))
WinForm(screen, open_callback, view_type='tree', context=context)
class M2M(O2M):
@@ -993,16 +999,20 @@ class M2M(O2M):
context = field.get_context(record)
domain = field.domain_get(record)
breadcrumb = list(self.view.screen.breadcrumb)
breadcrumb.append(
field.attrs.get('string') or common.MODELNAME.get(relation))
screen = Screen(relation, mode=['tree', 'form'],
view_ids=self.attrs.get('view_ids', '').split(','),
exclude_field=field.attrs.get('relation_field'))
exclude_field=field.attrs.get('relation_field'),
breadcrumb=breadcrumb)
screen.group = group
def open_callback(result):
if callback:
callback()
WinForm(screen, open_callback, view_type='tree', domain=domain,
context=context, title=field.attrs.get('string'))
context=context)
class Selection(GenericText, SelectionMixin, PopdownMixin):
+14 -3
View File
@@ -1,5 +1,6 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from itertools import chain
import gettext
from gi.repository import Gdk, Gtk, Pango
@@ -30,9 +31,19 @@ class WinForm(NoModal, InfoBar):
self.domain = domain
self.context = context
self.save_current = save_current
if not title:
title = MODELNAME.get(screen.model_name)
self.title = title
if screen.breadcrumb:
breadcrumb = list(screen.breadcrumb)
if title:
breadcrumb.append(title)
self.title = ' › '.join(chain(
(common.ellipsize(x, 30) for x in breadcrumb[-3:-1]),
breadcrumb[-1:]))
if len(breadcrumb) > 3:
self.title = '... › ' + self.title
else:
if not title:
title = MODELNAME.get(screen.model_name)
self.title = title
self.prev_view = self.screen.current_view
self.screen.screen_container.alternate_view = True
self.screen.switch_view(view_type=view_type)
+3 -4
View File
@@ -134,7 +134,8 @@ class WinSearch(NoModal):
screen = Screen(self.model_name, domain=self.domain,
context=self.context, order=self.order, mode=['form'],
view_ids=view_ids, views_preload=self.views_preload,
exclude_field=self.exclude_field)
exclude_field=self.exclude_field,
breadcrumb=[self.title])
def callback(result):
if result:
@@ -144,9 +145,7 @@ class WinSearch(NoModal):
else:
self.callback(None)
self.destroy()
WinForm(
screen, callback, new=True, save_current=True,
title=self.title)
WinForm(screen, callback, new=True, save_current=True)
return
if res:
group = self.screen.group