[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