Skip to content

Commit a2cdd3c

Browse files
Copilotfsmosca
andcommitted
Optimize review PGN game loading
Agent-Logs-Url: https://github.com/fsmosca/Python-Easy-Chess-GUI/sessions/fe404be6-5d97-4f31-bafa-06f431201259 Co-authored-by: fsmosca <22366935+fsmosca@users.noreply.github.com>
1 parent a0bc1fd commit a2cdd3c

1 file changed

Lines changed: 38 additions & 15 deletions

File tree

python_easy_chess_gui.py

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,10 @@
6464
)
6565

6666

67-
APP_NAME = 'Python Easy Chess GUI'
68-
APP_VERSION = 'v1.19.0'
69-
BOX_TITLE = f'{APP_NAME} {APP_VERSION}'
67+
APP_NAME = 'Python Easy Chess GUI'
68+
APP_VERSION = 'v1.19.0'
69+
BOX_TITLE = f'{APP_NAME} {APP_VERSION}'
70+
REVIEW_MAX_DISPLAY_GAMES = 5000
7071

7172

7273
platform = sys.platform
@@ -2507,20 +2508,32 @@ def save_game(self):
25072508
with open(self.pecg_auto_save_game, mode='a+') as f:
25082509
f.write('{}\n\n'.format(self.game))
25092510

2510-
def load_pgn_games(self, pgn):
2511-
"""Load all games from a pgn file."""
2511+
def load_pgn_games(self, pgn, max_games=REVIEW_MAX_DISPLAY_GAMES):
2512+
"""Load review game headers up to a display limit."""
25122513
games = []
2514+
is_truncated = False
25132515
with open(pgn, encoding='utf-8', errors='replace') as h:
2514-
while True:
2515-
game = chess.pgn.read_game(h)
2516-
if game is None:
2516+
while len(games) < max_games:
2517+
offset = h.tell()
2518+
headers = chess.pgn.read_headers(h)
2519+
if headers is None:
25172520
break
2518-
games.append(game)
2519-
return games
2521+
games.append({'offset': offset, 'headers': headers})
2522+
2523+
if len(games) == max_games and chess.pgn.read_headers(h) is not None:
2524+
is_truncated = True
2525+
2526+
return games, is_truncated
2527+
2528+
def load_review_game(self, pgn, game_entry):
2529+
"""Load a single review game from its file offset."""
2530+
with open(pgn, encoding='utf-8', errors='replace') as h:
2531+
h.seek(game_entry['offset'])
2532+
return chess.pgn.read_game(h)
25202533

25212534
def get_review_game_text(self, game, index):
25222535
"""Return one-line summary of a game for review list."""
2523-
headers = game.headers
2536+
headers = game.headers if hasattr(game, 'headers') else game['headers']
25242537
white = headers.get('White', '?')
25252538
black = headers.get('Black', '?')
25262539
result = headers.get('Result', '*')
@@ -2568,7 +2581,7 @@ def select_review_game(self, pgn_file=None, games=None):
25682581
continue
25692582

25702583
try:
2571-
selected_games = self.load_pgn_games(selected_pgn)
2584+
selected_games, is_truncated = self.load_pgn_games(selected_pgn)
25722585
except (FileNotFoundError, OSError, UnicodeError) as exc:
25732586
logging.exception(
25742587
f'Failed to load pgn games from {selected_pgn}: {exc}')
@@ -2588,8 +2601,12 @@ def select_review_game(self, pgn_file=None, games=None):
25882601
for index, game in enumerate(selected_games)
25892602
]
25902603
w['game_k'].Update(selection_list, set_to_index=[0])
2591-
w['status_k'].Update(
2592-
f'Status: Loaded {len(selected_games)} game(s). Select one and press OK.')
2604+
if is_truncated:
2605+
w['status_k'].Update(
2606+
f'Status: Showing first {len(selected_games)} games only. Select one and press OK.')
2607+
else:
2608+
w['status_k'].Update(
2609+
f'Status: Loaded {len(selected_games)} game(s). Select one and press OK.')
25932610
continue
25942611

25952612
if e == 'OK':
@@ -2600,11 +2617,17 @@ def select_review_game(self, pgn_file=None, games=None):
26002617
continue
26012618

26022619
selected_index = selection_list.index(selected_text)
2620+
selected_game_obj = self.load_review_game(
2621+
selected_pgn, selected_games[selected_index])
2622+
if selected_game_obj is None:
2623+
w['status_k'].Update('Status: Failed to load selected game.')
2624+
continue
2625+
26032626
selected_game = {
26042627
'pgn_file': selected_pgn,
26052628
'games': selected_games,
26062629
'game_index': selected_index,
2607-
'game': selected_games[selected_index]
2630+
'game': selected_game_obj
26082631
}
26092632
break
26102633

0 commit comments

Comments
 (0)