@@ -1002,13 +1002,17 @@ def requery(
1002
1002
# We want to store our sort settings before we wipe out the current DataFrame
1003
1003
try :
1004
1004
sort_settings = self .store_sort_settings ()
1005
- except AttributeError :
1005
+ except ( AttributeError , KeyError ) :
1006
1006
sort_settings = [None , SORT_NONE ] # default for first query
1007
1007
1008
1008
rows = self .driver .execute (query )
1009
1009
self .rows = rows
1010
- print ( self . rows )
1010
+
1011
1011
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 }
1012
1016
# now we can restore the sort order
1013
1017
self .load_sort_settings (sort_settings )
1014
1018
self .sort (self .table )
@@ -2273,13 +2277,16 @@ def sort_reset(self) -> None:
2273
2277
# Restore the original sort order
2274
2278
self .rows .sort_index (inplace = True )
2275
2279
2276
- def sort (self , table : str ) -> None :
2280
+ def sort (self , table : str , update_elements : bool = True , sort_order = None ) -> None :
2277
2281
"""
2278
2282
Sort according to the internal sort_column and sort_reverse variables. This is a
2279
2283
good way to re-sort without changing the sort_cycle.
2280
2284
2281
2285
:param table: The table associated with this DataSet. Passed along to
2282
2286
`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)
2283
2290
:returns: None
2284
2291
"""
2285
2292
pk = self .get_current_pk ()
@@ -2292,32 +2299,49 @@ def sort(self, table: str) -> None:
2292
2299
self .rows .attrs ["sort_column" ], table , self .rows .attrs ["sort_reverse" ]
2293
2300
)
2294
2301
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 ,
2296
2306
)
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 )
2297
2311
2298
- def sort_cycle (self , column : str , table : str ) -> int :
2312
+ def sort_cycle (self , column : str , table : str , update_elements : bool = True ) -> int :
2299
2313
"""
2300
2314
Cycle between original sort order of the DataFrame, ASC by column, and DESC by
2301
2315
column with each call.
2302
2316
2303
2317
:param column: The column name to cycle the sort on
2304
2318
: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.
2305
2321
:returns: A sort constant; SORT_NONE, SORT_ASC, or SORT_DESC
2306
2322
"""
2307
2323
if column != self .rows .attrs ["sort_column" ]:
2308
2324
self .rows .attrs ["sort_column" ] = column
2309
2325
self .rows .attrs ["sort_reverse" ] = False
2310
- self .sort (table )
2326
+ self .sort (table , update_elements = update_elements , sort_order = SORT_ASC )
2311
2327
return SORT_ASC
2312
2328
if not self .rows .attrs ["sort_reverse" ]:
2313
2329
self .rows .attrs ["sort_reverse" ] = True
2314
- self .sort (table )
2330
+ self .sort (table , update_elements = update_elements , sort_order = SORT_DESC )
2315
2331
return SORT_DESC
2316
2332
self .rows .attrs ["sort_reverse" ] = False
2317
2333
self .rows .attrs ["sort_column" ] = None
2318
- self .sort (table )
2334
+ self .sort (table , update_elements = update_elements , sort_order = SORT_NONE )
2319
2335
return SORT_NONE
2320
2336
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
+
2321
2345
def insert_row (self , row : dict , idx : int = None ) -> None :
2322
2346
"""
2323
2347
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:
2877
2901
# 3 Run update_elements() to see the changes
2878
2902
table_heading .enable_sorting (
2879
2903
element ,
2880
- _SortCallbackWrapper (
2881
- self , data_key , element , table_heading
2882
- ),
2904
+ _SortCallbackWrapper (self , data_key ),
2883
2905
)
2884
2906
2885
2907
else :
@@ -5246,34 +5268,19 @@ class _SortCallbackWrapper:
5246
5268
5247
5269
"""Internal class used when sg.Table column headers are clicked."""
5248
5270
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 ):
5252
5272
"""
5253
5273
Create a new _SortCallbackWrapper object.
5254
5274
5255
5275
:param frm_reference: `Form` object
5256
5276
:param data_key: `DataSet` key
5257
- :param element: PySimpleGUI sg.Table element
5258
- :param table_heading: `TableHeading` object
5259
5277
:returns: None
5260
5278
"""
5261
5279
self .frm : Form = frm_reference
5262
5280
self .data_key = data_key
5263
- self .element = element
5264
- self .table_heading : TableHeadings = table_heading
5265
5281
5266
5282
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 )
5277
5284
5278
5285
5279
5286
# ======================================================================================
0 commit comments