[Scummvm-git-logs] scummvm-sites director-buildbot -> 29a7ba26d5ed7c9ed4881df2a217abb5b8522052
sev-
noreply at scummvm.org
Wed Aug 26 08:38:23 UTC 2026
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm-sites' repo located at https://api.github.com/repos/scummvm/scummvm-sites .
Summary:
29a7ba26d5 IMAGEDIFF: Fix table header alignment and intermediate cells display
Commit: 29a7ba26d5ed7c9ed4881df2a217abb5b8522052
https://github.com/scummvm/scummvm-sites/commit/29a7ba26d5ed7c9ed4881df2a217abb5b8522052
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2026-08-26T10:37:37+02:00
Commit Message:
IMAGEDIFF: Fix table header alignment and intermediate cells display
Changed paths:
imagediff/main.py
imagediff/templates/target.html
diff --git a/imagediff/main.py b/imagediff/main.py
index 91e2293..6072a3c 100644
--- a/imagediff/main.py
+++ b/imagediff/main.py
@@ -467,44 +467,41 @@ def target_data_api(target):
movies = sorted(list(all_movies))
- # Define display_builds early: include previous page's last build for continuity
- display_builds = []
- if start_index > 0:
- # Include last build from previous page for continuity
- display_builds.append(builds[start_index - 1])
- display_builds.extend(current_page_builds)
-
- # True if a build is the context/carry-over build from the previous page
+ # Context build is used only for determining "previous" state,
+ # but NOT included in output (output must match current_page_builds columns)
context_build = builds[start_index - 1] if start_index > 0 else None
continuous_bars = {}
- # Create continuous bars for visualization with updated skip logic
+ # Create continuous bars for visualization
for movie in movies:
continuous_bars[movie] = []
movie_build_list = movie_builds_index[movie]
- for i, current_build in enumerate(display_builds):
- prev_build = display_builds[i-1] if i > 0 else None
+ # Find the next build (globally) where this movie reappears after a given build
+ def find_next_appearance(after_build):
+ try:
+ after_num = int(after_build)
+ except ValueError:
+ return None
+ for b in movie_build_list:
+ try:
+ if int(b) > after_num:
+ return b
+ except ValueError:
+ continue
+ return None
+
+ for i, current_build in enumerate(current_page_builds):
+ # Determine the effective previous build for comparison
+ if i == 0:
+ prev_build = context_build
+ else:
+ prev_build = current_page_builds[i - 1]
- is_context_build = (current_build == context_build)
has_in_current = movie in build_movie_frames.get(current_build, {})
current_frames = build_movie_frames.get(current_build, {}).get(movie, [])
- # For the context build: show green if the movie ever appeared before
- if is_context_build and not has_in_current:
- if movie_build_list:
- continuous_bars[movie].append({
- 'build': current_build,
- 'type': 'no_prev'
- })
- else:
- continuous_bars[movie].append({
- 'build': current_build,
- 'type': 'missing'
- })
- continue
-
prev_frames = []
if prev_build:
prev_frames = build_movie_frames.get(prev_build, {}).get(movie, [])
@@ -523,13 +520,15 @@ def target_data_api(target):
reference_build = reference_data['build']
if reference_build:
+ next_build = find_next_appearance(current_build)
continuous_bars[movie].append({
'build': current_build,
'reference_build': reference_build,
'type': 'diff',
'has_diff': False,
'is_skipped': True,
- 'compare_with': reference_build
+ 'compare_with': reference_build,
+ 'next_appearance': next_build
})
else:
continuous_bars[movie].append({
@@ -595,13 +594,15 @@ def target_data_api(target):
reference_data = movie_reference_builds[movie].get(current_build, {'build': None, 'frames': []})
reference_build = reference_data['build']
if reference_build:
+ next_build = find_next_appearance(current_build)
continuous_bars[movie].append({
'build': current_build,
'reference_build': reference_build,
'type': 'diff',
'has_diff': False,
'is_skipped': True,
- 'compare_with': reference_build
+ 'compare_with': reference_build,
+ 'next_appearance': next_build
})
else:
continuous_bars[movie].append({
@@ -627,7 +628,7 @@ def target_data_api(target):
# Return all data to frontend
data = {
'target': target,
- 'builds': display_builds,
+ 'builds': current_page_builds,
'movies': movies,
'display_movies': [decode_string(m) for m in movies],
'continuous_bars': continuous_bars,
diff --git a/imagediff/templates/target.html b/imagediff/templates/target.html
index 931ec62..cf19663 100644
--- a/imagediff/templates/target.html
+++ b/imagediff/templates/target.html
@@ -18,6 +18,14 @@
right: 0;
}
+ .clickable-cell {
+ cursor: pointer;
+ }
+
+ .clickable-cell:hover {
+ opacity: 0.7;
+ }
+
/* Loading animation styles */
#loading-overlay {
position: fixed;
@@ -252,12 +260,17 @@
// Generate HTML based on cell type
if (cell.type === 'diff') {
if (cell.is_skipped) {
- return `<td class="success no-diff" title="No changes since build ${cell.reference_build}">
- <a href="${urls.single_build_url
- .replace('BUILD_PLACEHOLDER', cell.reference_build)
+ if (cell.next_appearance) {
+ return `<td class="success no-diff clickable-cell" title="No changes between builds ${cell.reference_build} and ${cell.next_appearance}" onclick="window.location.href='${urls.compare_url
+ .replace('BUILD1_PLACEHOLDER', cell.reference_build)
+ .replace('BUILD2_PLACEHOLDER', cell.next_appearance)
.replace('TARGET_PLACEHOLDER', target)
- .replace('MOVIE_PLACEHOLDER', movie)}" style="opacity:0.4">ð</a>
- </td>`;
+ .replace('MOVIE_PLACEHOLDER', movie)}'"></td>`;
+ }
+ return `<td class="success no-diff clickable-cell" title="No changes since build ${cell.reference_build}" onclick="window.location.href='${urls.single_build_url
+ .replace('BUILD_PLACEHOLDER', cell.reference_build)
+ .replace('TARGET_PLACEHOLDER', target)
+ .replace('MOVIE_PLACEHOLDER', movie)}'"></td>`;
} else if (cell.is_partial) {
if (cell.has_diff) {
return `
More information about the Scummvm-git-logs
mailing list