feat: truncate long slide names in progress bar
Browse filesAdded automatic truncation of long slide names in the progress bar
to improve readability and prevent UI overflow.
Changes:
- Added _truncate_name() helper function
- Truncates names longer than 40 characters
- Keeps file extension visible (e.g., "very_long_name...svs")
- Applied in SlideProgressWrapper for all progress messages
Examples:
- "short.svs" → "short.svs" (unchanged)
- "this_is_a_very_long_filename_that_should_be_truncated.svs"
→ "this_is_a_very_long_filename_that....svs" (40 chars)
- "TCGA-A1-A0SB-01Z-00-DX1.6a0ea716-a5f2-47f3-880b-537a5cdc2324.svs"
→ "TCGA-A1-A0SB-01Z-00-DX1.6a0ea716-....svs" (40 chars)
Benefits:
- Better progress bar readability
- Prevents UI overflow with very long TCGA filenames
- Extension always visible for file type identification
Testing:
- All 10 UI event tests pass
- All 3 generator behavior tests pass
- Verified truncation logic with multiple edge cases
Co-Authored-By: Claude (claude-sonnet-4.5) <noreply@anthropic.com>
- src/mosaic/ui/app.py +24 -1
|
@@ -186,6 +186,28 @@ def analyze_slides(
|
|
| 186 |
):
|
| 187 |
global _model_download_thread, _model_download_complete, _core_models_complete
|
| 188 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 189 |
# Initialize telemetry tracking
|
| 190 |
from mosaic.telemetry import TelemetryTracker
|
| 191 |
|
|
@@ -311,7 +333,8 @@ def analyze_slides(
|
|
| 311 |
self.base_progress = base_progress
|
| 312 |
self.slide_idx = slide_idx
|
| 313 |
self.total_slides = total_slides
|
| 314 |
-
|
|
|
|
| 315 |
self.slides_remaining = total_slides - slide_idx
|
| 316 |
|
| 317 |
def __call__(self, current_progress=None, desc=None):
|
|
|
|
| 186 |
):
|
| 187 |
global _model_download_thread, _model_download_complete, _core_models_complete
|
| 188 |
|
| 189 |
+
def _truncate_name(name: str, max_length: int = 40) -> str:
|
| 190 |
+
"""Truncate long filenames for progress display.
|
| 191 |
+
|
| 192 |
+
Args:
|
| 193 |
+
name: Filename to truncate
|
| 194 |
+
max_length: Maximum length before truncation
|
| 195 |
+
|
| 196 |
+
Returns:
|
| 197 |
+
Truncated filename with ellipsis if needed
|
| 198 |
+
"""
|
| 199 |
+
if len(name) <= max_length:
|
| 200 |
+
return name
|
| 201 |
+
# Keep the extension visible
|
| 202 |
+
stem = Path(name).stem
|
| 203 |
+
ext = Path(name).suffix
|
| 204 |
+
# Reserve space for extension (including dot) and ellipsis (3 chars)
|
| 205 |
+
available = max_length - len(ext) - 3
|
| 206 |
+
if available > 0:
|
| 207 |
+
return f"{stem[:available]}...{ext}"
|
| 208 |
+
# Edge case: extension itself is very long
|
| 209 |
+
return f"{name[:max_length-3]}..."
|
| 210 |
+
|
| 211 |
# Initialize telemetry tracking
|
| 212 |
from mosaic.telemetry import TelemetryTracker
|
| 213 |
|
|
|
|
| 333 |
self.base_progress = base_progress
|
| 334 |
self.slide_idx = slide_idx
|
| 335 |
self.total_slides = total_slides
|
| 336 |
+
# Truncate long slide names for better progress display
|
| 337 |
+
self.slide_name = _truncate_name(slide_name)
|
| 338 |
self.slides_remaining = total_slides - slide_idx
|
| 339 |
|
| 340 |
def __call__(self, current_progress=None, desc=None):
|