Skip to content

Commit aa7c8ac

Browse files
committed
Move from _SortCallbackWrapper to sort
1 parent 32266f1 commit aa7c8ac

File tree

1 file changed

+35
-28
lines changed

1 file changed

+35
-28
lines changed

pysimplesql/pysimplesql.py

+35-28
Original file line numberDiff line numberDiff line change
@@ -1002,13 +1002,17 @@ def requery(
10021002
# We want to store our sort settings before we wipe out the current DataFrame
10031003
try:
10041004
sort_settings = self.store_sort_settings()
1005-
except AttributeError:
1005+
except (AttributeError, KeyError):
10061006
sort_settings = [None, SORT_NONE] # default for first query
10071007

10081008
rows = self.driver.execute(query)
10091009
self.rows = rows
1010-
print(self.rows)
1010+
10111011
if len(self.rows.index):
1012+
if "sort_order" not in self.rows.attrs:
1013+
# Store the sort order as a dictionary in the attrs of the DataFrame
1014+
sort_order = self.rows[self.pk_column].to_list()
1015+
self.rows.attrs["sort_order"] = {self.pk_column: sort_order}
10121016
# now we can restore the sort order
10131017
self.load_sort_settings(sort_settings)
10141018
self.sort(self.table)
@@ -2273,13 +2277,16 @@ def sort_reset(self) -> None:
22732277
# Restore the original sort order
22742278
self.rows.sort_index(inplace=True)
22752279

2276-
def sort(self, table: str) -> None:
2280+
def sort(self, table: str, update_elements: bool = True, sort_order=None) -> None:
22772281
"""
22782282
Sort according to the internal sort_column and sort_reverse variables. This is a
22792283
good way to re-sort without changing the sort_cycle.
22802284
22812285
:param table: The table associated with this DataSet. Passed along to
22822286
`DataSet.sort_by_column()`
2287+
:param update_elements: Update associated selectors and navigation buttons.
2288+
:param sort_order: Passed to `Dataset.update_headings`. A SORT_* constant
2289+
(SORT_NONE, SORT_ASC, SORT_DESC)
22832290
:returns: None
22842291
"""
22852292
pk = self.get_current_pk()
@@ -2292,32 +2299,49 @@ def sort(self, table: str) -> None:
22922299
self.rows.attrs["sort_column"], table, self.rows.attrs["sort_reverse"]
22932300
)
22942301
self.set_by_pk(
2295-
pk, update_elements=True, requery_dependents=False, skip_prompt_save=True
2302+
pk,
2303+
update_elements=False,
2304+
requery_dependents=False,
2305+
skip_prompt_save=True,
22962306
)
2307+
if update_elements and len(self.rows.index):
2308+
self.frm.update_selectors(self.table)
2309+
self.frm.update_elements(self.table, edit_protect_only=True)
2310+
self.update_headings(self.rows.attrs["sort_column"], sort_order)
22972311

2298-
def sort_cycle(self, column: str, table: str) -> int:
2312+
def sort_cycle(self, column: str, table: str, update_elements: bool = True) -> int:
22992313
"""
23002314
Cycle between original sort order of the DataFrame, ASC by column, and DESC by
23012315
column with each call.
23022316
23032317
:param column: The column name to cycle the sort on
23042318
:param table: The table that the column belongs to
2319+
:param update_elements: Passed to `Dataset.sort` to update update associated
2320+
selectors and navigation buttons, and table header sort marker.
23052321
:returns: A sort constant; SORT_NONE, SORT_ASC, or SORT_DESC
23062322
"""
23072323
if column != self.rows.attrs["sort_column"]:
23082324
self.rows.attrs["sort_column"] = column
23092325
self.rows.attrs["sort_reverse"] = False
2310-
self.sort(table)
2326+
self.sort(table, update_elements=update_elements, sort_order=SORT_ASC)
23112327
return SORT_ASC
23122328
if not self.rows.attrs["sort_reverse"]:
23132329
self.rows.attrs["sort_reverse"] = True
2314-
self.sort(table)
2330+
self.sort(table, update_elements=update_elements, sort_order=SORT_DESC)
23152331
return SORT_DESC
23162332
self.rows.attrs["sort_reverse"] = False
23172333
self.rows.attrs["sort_column"] = None
2318-
self.sort(table)
2334+
self.sort(table, update_elements=update_elements, sort_order=SORT_NONE)
23192335
return SORT_NONE
23202336

2337+
def update_headings(self, column, sort_order):
2338+
for e in self.selector:
2339+
element = e["element"]
2340+
if element.metadata["TableHeading"]:
2341+
element.metadata["TableHeading"].update_headings(
2342+
element, column, sort_order
2343+
)
2344+
23212345
def insert_row(self, row: dict, idx: int = None) -> None:
23222346
"""
23232347
Insert a new virtual row into the DataFrame. Virtual rows are ones that exist
@@ -2877,9 +2901,7 @@ def auto_map_elements(self, win: sg.Window, keys: List[str] = None) -> None:
28772901
# 3 Run update_elements() to see the changes
28782902
table_heading.enable_sorting(
28792903
element,
2880-
_SortCallbackWrapper(
2881-
self, data_key, element, table_heading
2882-
),
2904+
_SortCallbackWrapper(self, data_key),
28832905
)
28842906

28852907
else:
@@ -5246,34 +5268,19 @@ class _SortCallbackWrapper:
52465268

52475269
"""Internal class used when sg.Table column headers are clicked."""
52485270

5249-
def __init__(
5250-
self, frm_reference: Form, data_key: str, element: sg.Element, table_heading
5251-
):
5271+
def __init__(self, frm_reference: Form, data_key: str):
52525272
"""
52535273
Create a new _SortCallbackWrapper object.
52545274
52555275
:param frm_reference: `Form` object
52565276
:param data_key: `DataSet` key
5257-
:param element: PySimpleGUI sg.Table element
5258-
:param table_heading: `TableHeading` object
52595277
:returns: None
52605278
"""
52615279
self.frm: Form = frm_reference
52625280
self.data_key = data_key
5263-
self.element = element
5264-
self.table_heading: TableHeadings = table_heading
52655281

52665282
def __call__(self, column):
5267-
# store the pk:
5268-
pk = self.frm[self.data_key].get_current_pk()
5269-
sort_order = self.frm[self.data_key].sort_cycle(column, self.data_key)
5270-
# We only need to update the selectors not all elements,
5271-
# so first set by the primary key, then update_selectors()
5272-
self.frm[self.data_key].set_by_pk(
5273-
pk, update_elements=False, requery_dependents=False, skip_prompt_save=True
5274-
)
5275-
self.frm.update_selectors(self.data_key)
5276-
self.table_heading.update_headings(self.element, column, sort_order)
5283+
self.frm[self.data_key].sort_cycle(column, self.data_key, update_elements=True)
52775284

52785285

52795286
# ======================================================================================

0 commit comments

Comments
 (0)