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
disabled_bgcolor = '#aaaaaa'
long_scroll_delta = 500
def __init__(self, *args, **kwargs):
self.initial_search = kwargs.pop('initial_search', None)
self.on_select = kwargs.pop('on_select', None)
@ -45,7 +47,7 @@ class WuttaLookup(WuttaControl):
# track current selection
self.selected_uuid = None
self.selected_control = None
self.selected_datarow = None
def build(self):
@ -57,22 +59,43 @@ class WuttaLookup(WuttaControl):
self.search_results = ft.DataTable(
columns=[ft.DataColumn(self.make_cell_text(text))
for text in self.get_results_columns()],
data_row_min_height=50,
)
self.no_results = ft.Text("NO RESULTS", size=32, color='red',
weight=ft.FontWeight.BOLD,
visible=False)
self.select_button = ft.Container(
content=ft.Text("Select", size=self.font_size * 0.8),
alignment=ft.alignment.center,
height=self.default_button_height_dlg * 0.8,
width=self.default_button_height_dlg * 1.3,
border=ft.border.all(1, 'black'),
border_radius=ft.border_radius.all(5),
on_click=self.select_object,
disabled=True,
bgcolor=self.disabled_bgcolor,
self.select_button = self.make_button("Select",
font_size=self.font_size * 0.8,
height=self.default_button_height_dlg * 0.8,
width=self.default_button_height_dlg * 1.3,
on_click=self.select_click,
disabled=True,
bgcolor=self.disabled_bgcolor)
self.up_button = self.make_button("",
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(
@ -118,15 +141,22 @@ class WuttaLookup(WuttaControl):
ft.Divider(),
ft.Row(
[
self.search_results_wrapper,
ft.VerticalDivider(),
ft.Column(
[
self.search_results,
self.no_results,
self.select_button,
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:
for obj in results:
self.search_results.rows.append(ft.DataRow(
cells=[self.make_cell(row)
for row in self.make_result_row(obj)],
on_select_changed=self.select_changed,
data={'uuid': obj['uuid']},
))
self.search_results.rows.append(
ft.DataRow(
cells=[self.make_cell(row)
for row in self.make_result_row(obj)],
on_select_changed=self.select_changed,
data={'uuid': obj['uuid']},
))
self.no_results.visible = False
else:
@ -210,33 +241,65 @@ class WuttaLookup(WuttaControl):
self.search_results.rows.clear()
self.no_results.visible = False
self.selected_uuid = None
self.selected_datarow = None
self.select_button.disabled = True
self.select_button.bgcolor = self.disabled_bgcolor
self.searchbox.focus()
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):
if e.data: # selected
if self.selected_control:
self.selected_control.color = None
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
self.set_selection(e.control)
self.update()
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()
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:
raise RuntimeError("no record selected?")
if self.on_select: