Add scroll bar, up/down keys for item, customer lookup dialogs

This commit is contained in:
Lance Edgar 2023-10-05 17:23:11 -05:00
parent e59c398b45
commit 4ed006a93f

View file

@ -37,6 +37,8 @@ class WuttaLookup(WuttaControl):
default_button_height_dlg = 80 default_button_height_dlg = 80
disabled_bgcolor = '#aaaaaa' disabled_bgcolor = '#aaaaaa'
long_scroll_delta = 500
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self.initial_search = kwargs.pop('initial_search', None) self.initial_search = kwargs.pop('initial_search', None)
self.on_select = kwargs.pop('on_select', None) self.on_select = kwargs.pop('on_select', None)
@ -45,7 +47,7 @@ class WuttaLookup(WuttaControl):
# track current selection # track current selection
self.selected_uuid = None self.selected_uuid = None
self.selected_control = None self.selected_datarow = None
def build(self): def build(self):
@ -57,22 +59,43 @@ class WuttaLookup(WuttaControl):
self.search_results = ft.DataTable( self.search_results = ft.DataTable(
columns=[ft.DataColumn(self.make_cell_text(text)) columns=[ft.DataColumn(self.make_cell_text(text))
for text in self.get_results_columns()], for text in self.get_results_columns()],
data_row_min_height=50,
) )
self.no_results = ft.Text("NO RESULTS", size=32, color='red', self.no_results = ft.Text("NO RESULTS", size=32, color='red',
weight=ft.FontWeight.BOLD, weight=ft.FontWeight.BOLD,
visible=False) visible=False)
self.select_button = ft.Container( self.select_button = self.make_button("Select",
content=ft.Text("Select", size=self.font_size * 0.8), font_size=self.font_size * 0.8,
alignment=ft.alignment.center, height=self.default_button_height_dlg * 0.8,
height=self.default_button_height_dlg * 0.8, width=self.default_button_height_dlg * 1.3,
width=self.default_button_height_dlg * 1.3, on_click=self.select_click,
border=ft.border.all(1, 'black'), disabled=True,
border_radius=ft.border_radius.all(5), bgcolor=self.disabled_bgcolor)
on_click=self.select_object,
disabled=True, self.up_button = self.make_button("",
bgcolor=self.disabled_bgcolor, font_size=self.font_size,
height=self.default_button_height_dlg,
width=self.default_button_height_dlg,
on_click=self.up_click,
on_long_press=self.up_longpress)
self.down_button = self.make_button("",
font_size=self.font_size,
height=self.default_button_height_dlg,
width=self.default_button_height_dlg,
on_click=self.down_click,
on_long_press=self.down_longpress)
self.search_results_wrapper = ft.Column(
[
self.search_results,
self.no_results,
],
expand=True,
height=400,
scroll=ft.ScrollMode.AUTO,
) )
return ft.Column( return ft.Column(
@ -118,15 +141,22 @@ class WuttaLookup(WuttaControl):
ft.Divider(), ft.Divider(),
ft.Row( ft.Row(
[ [
self.search_results_wrapper,
ft.VerticalDivider(),
ft.Column( ft.Column(
[ [
self.search_results, self.select_button,
self.no_results, ft.Row(),
ft.Row(),
ft.Row(),
ft.Row(),
ft.Row(),
self.up_button,
self.down_button,
], ],
expand=True,
), ),
self.select_button,
], ],
vertical_alignment=ft.CrossAxisAlignment.START,
), ),
], ],
) )
@ -190,12 +220,13 @@ class WuttaLookup(WuttaControl):
if results: if results:
for obj in results: for obj in results:
self.search_results.rows.append(ft.DataRow( self.search_results.rows.append(
cells=[self.make_cell(row) ft.DataRow(
for row in self.make_result_row(obj)], cells=[self.make_cell(row)
on_select_changed=self.select_changed, for row in self.make_result_row(obj)],
data={'uuid': obj['uuid']}, on_select_changed=self.select_changed,
)) data={'uuid': obj['uuid']},
))
self.no_results.visible = False self.no_results.visible = False
else: else:
@ -210,33 +241,65 @@ class WuttaLookup(WuttaControl):
self.search_results.rows.clear() self.search_results.rows.clear()
self.no_results.visible = False self.no_results.visible = False
self.selected_uuid = None self.selected_uuid = None
self.selected_datarow = None
self.select_button.disabled = True self.select_button.disabled = True
self.select_button.bgcolor = self.disabled_bgcolor self.select_button.bgcolor = self.disabled_bgcolor
self.searchbox.focus() self.searchbox.focus()
self.update() self.update()
def set_selection(self, row):
if self.selected_datarow:
self.selected_datarow.color = None
row.color = ft.colors.BLUE
self.selected_uuid = row.data['uuid']
self.selected_datarow = row
self.select_button.disabled = False
self.select_button.bgcolor = 'blue'
def select_changed(self, e): def select_changed(self, e):
if e.data: # selected if e.data: # selected
if self.selected_control: self.set_selection(e.control)
self.selected_control.color = None self.update()
self.selected_uuid = e.control.data['uuid']
self.selected_control = e.control
self.selected_control.color = ft.colors.BLUE
self.select_button.disabled = False
self.select_button.bgcolor = 'blue'
else:
if self.selected_control:
self.selected_control.color = None
self.selected_control = None
self.selected_uuid = None
self.select_button.disabled = True
self.select_button.bgcolor = self.disabled_bgcolor
e.control.color = None
def up_click(self, e):
# select previous row, if selection in progress
if self.selected_datarow:
i = self.search_results.rows.index(self.selected_datarow)
if i > 0:
self.search_results_wrapper.scroll_to(delta=-48, duration=100)
self.set_selection(self.search_results.rows[i - 1])
self.update()
return
self.search_results_wrapper.scroll_to(delta=-50, duration=100)
self.update() self.update()
def select_object(self, e): def up_longpress(self, e):
self.search_results_wrapper.scroll_to(delta=-self.long_scroll_delta, duration=100)
self.update()
def down_click(self, e):
# select next row, if selection in progress
if self.selected_datarow:
i = self.search_results.rows.index(self.selected_datarow)
if (i + 1) < len(self.search_results.rows):
self.search_results_wrapper.scroll_to(delta=48, duration=100)
self.set_selection(self.search_results.rows[i + 1])
self.update()
return
self.search_results_wrapper.scroll_to(delta=50, duration=100)
self.update()
def down_longpress(self, e):
self.search_results_wrapper.scroll_to(delta=self.long_scroll_delta, duration=100)
self.update()
def select_click(self, e):
if not self.selected_uuid: if not self.selected_uuid:
raise RuntimeError("no record selected?") raise RuntimeError("no record selected?")
if self.on_select: if self.on_select: