@@ -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,18 @@ 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, 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.
2283
2292
:returns: None
2284
2293
"""
2285
2294
pk = self .get_current_pk ()
@@ -2292,32 +2301,49 @@ def sort(self, table: str) -> None:
2292
2301
self .rows .attrs ["sort_column" ], table , self .rows .attrs ["sort_reverse" ]
2293
2302
)
2294
2303
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 ,
2296
2308
)
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 )
2297
2313
2298
- def sort_cycle (self , column : str , table : str ) -> int :
2314
+ def sort_cycle (self , column : str , table : str , update_elements : bool = True ) -> int :
2299
2315
"""
2300
2316
Cycle between original sort order of the DataFrame, ASC by column, and DESC by
2301
2317
column with each call.
2302
2318
2303
2319
:param column: The column name to cycle the sort on
2304
2320
: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.
2305
2323
:returns: A sort constant; SORT_NONE, SORT_ASC, or SORT_DESC
2306
2324
"""
2307
2325
if column != self .rows .attrs ["sort_column" ]:
2308
2326
self .rows .attrs ["sort_column" ] = column
2309
2327
self .rows .attrs ["sort_reverse" ] = False
2310
- self .sort (table )
2328
+ self .sort (table , update_elements = update_elements , sort_order = SORT_ASC )
2311
2329
return SORT_ASC
2312
2330
if not self .rows .attrs ["sort_reverse" ]:
2313
2331
self .rows .attrs ["sort_reverse" ] = True
2314
- self .sort (table )
2332
+ self .sort (table , update_elements = update_elements , sort_order = SORT_DESC )
2315
2333
return SORT_DESC
2316
2334
self .rows .attrs ["sort_reverse" ] = False
2317
2335
self .rows .attrs ["sort_column" ] = None
2318
- self .sort (table )
2336
+ self .sort (table , update_elements = update_elements , sort_order = SORT_NONE )
2319
2337
return SORT_NONE
2320
2338
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
+
2321
2347
def insert_row (self , row : dict , idx : int = None ) -> None :
2322
2348
"""
2323
2349
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:
2877
2903
# 3 Run update_elements() to see the changes
2878
2904
table_heading .enable_sorting (
2879
2905
element ,
2880
- _SortCallbackWrapper (
2881
- self , data_key , element , table_heading
2882
- ),
2906
+ _SortCallbackWrapper (self , data_key ),
2883
2907
)
2884
2908
2885
2909
else :
@@ -5246,34 +5270,19 @@ class _SortCallbackWrapper:
5246
5270
5247
5271
"""Internal class used when sg.Table column headers are clicked."""
5248
5272
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 ):
5252
5274
"""
5253
5275
Create a new _SortCallbackWrapper object.
5254
5276
5255
5277
:param frm_reference: `Form` object
5256
5278
:param data_key: `DataSet` key
5257
- :param element: PySimpleGUI sg.Table element
5258
- :param table_heading: `TableHeading` object
5259
5279
:returns: None
5260
5280
"""
5261
5281
self .frm : Form = frm_reference
5262
5282
self .data_key = data_key
5263
- self .element = element
5264
- self .table_heading : TableHeadings = table_heading
5265
5283
5266
5284
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 )
5277
5286
5278
5287
5279
5288
# ======================================================================================
0 commit comments