Add scroll bar, up/down keys for item, customer lookup dialogs
This commit is contained in:
parent
e59c398b45
commit
4ed006a93f
|
@ -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,
|
||||||
border=ft.border.all(1, 'black'),
|
on_click=self.select_click,
|
||||||
border_radius=ft.border_radius.all(5),
|
|
||||||
on_click=self.select_object,
|
|
||||||
disabled=True,
|
disabled=True,
|
||||||
bgcolor=self.disabled_bgcolor,
|
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(
|
return ft.Column(
|
||||||
|
@ -118,17 +141,24 @@ 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.no_results,
|
|
||||||
],
|
|
||||||
expand=True,
|
|
||||||
),
|
|
||||||
self.select_button,
|
self.select_button,
|
||||||
|
ft.Row(),
|
||||||
|
ft.Row(),
|
||||||
|
ft.Row(),
|
||||||
|
ft.Row(),
|
||||||
|
ft.Row(),
|
||||||
|
self.up_button,
|
||||||
|
self.down_button,
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
vertical_alignment=ft.CrossAxisAlignment.START,
|
||||||
|
),
|
||||||
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
def get_results_columns(self):
|
def get_results_columns(self):
|
||||||
|
@ -190,7 +220,8 @@ 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(
|
||||||
|
ft.DataRow(
|
||||||
cells=[self.make_cell(row)
|
cells=[self.make_cell(row)
|
||||||
for row in self.make_result_row(obj)],
|
for row in self.make_result_row(obj)],
|
||||||
on_select_changed=self.select_changed,
|
on_select_changed=self.select_changed,
|
||||||
|
@ -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 select_changed(self, e):
|
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
|
||||||
|
|
||||||
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.disabled = False
|
||||||
self.select_button.bgcolor = 'blue'
|
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 select_changed(self, e):
|
||||||
|
if e.data: # selected
|
||||||
|
self.set_selection(e.control)
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
def select_object(self, e):
|
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 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:
|
||||||
|
|
Loading…
Reference in a new issue