Skip to content

Commit 3ebcd20

Browse files
authored
Merge pull request #288
Moved things from _SortCallbackWrapper to sort
2 parents 149bdc7 + 749c717 commit 3ebcd20

File tree

1 file changed

+37
-28
lines changed

1 file changed

+37
-28
lines changed

pysimplesql/pysimplesql.py

+37-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,18 @@ 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, and
2288+
table header sort marker.
2289+
:param sort_order: Passed to `Dataset.update_headings`. A SORT_* constant
2290+
(SORT_NONE, SORT_ASC, SORT_DESC). Note that the update_elements parameter
2291+
must = True to use this parameter.
22832292
:returns: None
22842293
"""
22852294
pk = self.get_current_pk()
@@ -2292,32 +2301,49 @@ def sort(self, table: str) -> None:
22922301
self.rows.attrs["sort_column"], table, self.rows.attrs["sort_reverse"]
22932302
)
22942303
self.set_by_pk(
2295-
pk, update_elements=True, requery_dependents=False, skip_prompt_save=True
2304+
pk,
2305+
update_elements=False,
2306+
requery_dependents=False,
2307+
skip_prompt_save=True,
22962308
)
2309+
if update_elements and len(self.rows.index):
2310+
self.frm.update_selectors(self.table)
2311+
self.frm.update_elements(self.table, edit_protect_only=True)
2312+
self.update_headings(self.rows.attrs["sort_column"], sort_order)
22972313

2298-
def sort_cycle(self, column: str, table: str) -> int:
2314+
def sort_cycle(self, column: str, table: str, update_elements: bool = True) -> int:
22992315
"""
23002316
Cycle between original sort order of the DataFrame, ASC by column, and DESC by
23012317
column with each call.
23022318
23032319
:param column: The column name to cycle the sort on
23042320
:param table: The table that the column belongs to
2321+
:param update_elements: Passed to `Dataset.sort` to update update associated
2322+
selectors and navigation buttons, and table header sort marker.
23052323
:returns: A sort constant; SORT_NONE, SORT_ASC, or SORT_DESC
23062324
"""
23072325
if column != self.rows.attrs["sort_column"]:
23082326
self.rows.attrs["sort_column"] = column
23092327
self.rows.attrs["sort_reverse"] = False
2310-
self.sort(table)
2328+
self.sort(table, update_elements=update_elements, sort_order=SORT_ASC)
23112329
return SORT_ASC
23122330
if not self.rows.attrs["sort_reverse"]:
23132331
self.rows.attrs["sort_reverse"] = True
2314-
self.sort(table)
2332+
self.sort(table, update_elements=update_elements, sort_order=SORT_DESC)
23152333
return SORT_DESC
23162334
self.rows.attrs["sort_reverse"] = False
23172335
self.rows.attrs["sort_column"] = None
2318-
self.sort(table)
2336+
self.sort(table, update_elements=update_elements, sort_order=SORT_NONE)
23192337
return SORT_NONE
23202338

2339+
def update_headings(self, column, sort_order):
2340+
for e in self.selector:
2341+
element = e["element"]
2342+
if element.metadata["TableHeading"]:
2343+
element.metadata["TableHeading"].update_headings(
2344+
element, column, sort_order
2345+
)
2346+
23212347
def insert_row(self, row: dict, idx: int = None) -> None:
23222348
"""
23232349
Insert a new virtual row into the DataFrame. Virtual rows are ones that exist
@@ -2877,9 +2903,7 @@ def auto_map_elements(self, win: sg.Window, keys: List[str] = None) -> None:
28772903
# 3 Run update_elements() to see the changes
28782904
table_heading.enable_sorting(
28792905
element,
2880-
_SortCallbackWrapper(
2881-
self, data_key, element, table_heading
2882-
),
2906+
_SortCallbackWrapper(self, data_key),
28832907
)
28842908

28852909
else:
@@ -5246,34 +5270,19 @@ class _SortCallbackWrapper:
52465270

52475271
"""Internal class used when sg.Table column headers are clicked."""
52485272

5249-
def __init__(
5250-
self, frm_reference: Form, data_key: str, element: sg.Element, table_heading
5251-
):
5273+
def __init__(self, frm_reference: Form, data_key: str):
52525274
"""
52535275
Create a new _SortCallbackWrapper object.
52545276
52555277
:param frm_reference: `Form` object
52565278
:param data_key: `DataSet` key
5257-
:param element: PySimpleGUI sg.Table element
5258-
:param table_heading: `TableHeading` object
52595279
:returns: None
52605280
"""
52615281
self.frm: Form = frm_reference
52625282
self.data_key = data_key
5263-
self.element = element
5264-
self.table_heading: TableHeadings = table_heading
52655283

52665284
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)
5285+
self.frm[self.data_key].sort_cycle(column, self.data_key, update_elements=True)
52775286

52785287

52795288
# ======================================================================================

0 commit comments

Comments
 (0)