208 lines
6.1 KiB
Python
208 lines
6.1 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Debug script to visualize interactive elements in overlays.
|
|
Shows where clickable links are located.
|
|
"""
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
sys.path.insert(0, str(Path(__file__).parent))
|
|
|
|
from dreader.application import EbookReader
|
|
from dreader.overlays.settings import SettingsOverlay
|
|
from dreader.overlays.navigation import NavigationOverlay
|
|
from PIL import Image, ImageDraw, ImageFont
|
|
|
|
def find_all_links(overlay_reader, panel_width, panel_height):
|
|
"""Scan overlay to find all interactive link positions."""
|
|
link_positions = {}
|
|
|
|
if not overlay_reader or not overlay_reader.manager:
|
|
print("No overlay reader available")
|
|
return link_positions
|
|
|
|
page = overlay_reader.manager.get_current_page()
|
|
if not page:
|
|
print("No page available")
|
|
return link_positions
|
|
|
|
print(f"Scanning {panel_width}x{panel_height} overlay for interactive elements...")
|
|
|
|
# Scan with moderate granularity (every 5 pixels)
|
|
for y in range(0, panel_height, 5):
|
|
for x in range(0, panel_width, 5):
|
|
result = page.query_point((x, y))
|
|
if result and result.link_target:
|
|
if result.link_target not in link_positions:
|
|
link_positions[result.link_target] = {
|
|
'first_pos': (x, y),
|
|
'bounds': result.bounds,
|
|
'text': result.text
|
|
}
|
|
|
|
return link_positions
|
|
|
|
|
|
def visualize_settings_overlay():
|
|
"""Visualize interactive elements in settings overlay."""
|
|
print("\n" + "="*70)
|
|
print("SETTINGS OVERLAY - Interactive Element Map")
|
|
print("="*70)
|
|
|
|
# Create reader
|
|
reader = EbookReader(page_size=(800, 1200))
|
|
|
|
# Load a test book
|
|
test_book = Path(__file__).parent / "tests" / "data" / "library-epub" / "pg11-images-3.epub"
|
|
if not test_book.exists():
|
|
print(f"Test book not found: {test_book}")
|
|
return
|
|
|
|
reader.load_epub(str(test_book))
|
|
|
|
# Create settings overlay
|
|
settings_overlay = SettingsOverlay(reader)
|
|
base_page = reader.get_current_page()
|
|
|
|
# Open overlay
|
|
overlay_image = settings_overlay.open(
|
|
base_page,
|
|
font_scale=1.0,
|
|
line_spacing=5,
|
|
inter_block_spacing=15,
|
|
word_spacing=0
|
|
)
|
|
|
|
# Find all interactive elements
|
|
panel_width = 480 # 60% of 800
|
|
panel_height = 840 # 70% of 1200
|
|
|
|
link_positions = find_all_links(
|
|
settings_overlay._overlay_reader,
|
|
panel_width,
|
|
panel_height
|
|
)
|
|
|
|
print(f"\nFound {len(link_positions)} interactive elements:")
|
|
for link_target, info in sorted(link_positions.items()):
|
|
x, y = info['first_pos']
|
|
bounds = info['bounds']
|
|
text = info['text']
|
|
print(f" {link_target:30s} at ({x:3d}, {y:3d}) - \"{text}\"")
|
|
print(f" Bounds: {bounds}")
|
|
|
|
# Create visualization
|
|
print("\nCreating visualization...")
|
|
|
|
# Get just the overlay panel (not the composited image)
|
|
overlay_panel = settings_overlay._cached_overlay_image.copy()
|
|
draw = ImageDraw.Draw(overlay_panel)
|
|
|
|
# Draw markers on each interactive element
|
|
for link_target, info in link_positions.items():
|
|
x, y = info['first_pos']
|
|
|
|
# Draw red circle at first detected position
|
|
radius = 8
|
|
draw.ellipse(
|
|
[x - radius, y - radius, x + radius, y + radius],
|
|
outline=(255, 0, 0),
|
|
width=2
|
|
)
|
|
|
|
# Draw crosshair
|
|
draw.line([(x - 15, y), (x + 15, y)], fill=(255, 0, 0), width=1)
|
|
draw.line([(x, y - 15), (x, y + 15)], fill=(255, 0, 0), width=1)
|
|
|
|
# Save visualization
|
|
output_path = Path(__file__).parent / "overlay_links_debug.png"
|
|
overlay_panel.save(output_path)
|
|
print(f"\nVisualization saved to: {output_path}")
|
|
print("Red circles show clickable link positions")
|
|
|
|
reader.close()
|
|
|
|
|
|
def visualize_navigation_overlay():
|
|
"""Visualize interactive elements in navigation overlay."""
|
|
print("\n" + "="*70)
|
|
print("NAVIGATION OVERLAY - Interactive Element Map")
|
|
print("="*70)
|
|
|
|
# Create reader
|
|
reader = EbookReader(page_size=(800, 1200))
|
|
|
|
# Load a test book
|
|
test_book = Path(__file__).parent / "tests" / "data" / "library-epub" / "pg11-images-3.epub"
|
|
if not test_book.exists():
|
|
print(f"Test book not found: {test_book}")
|
|
return
|
|
|
|
reader.load_epub(str(test_book))
|
|
|
|
# Create navigation overlay
|
|
nav_overlay = NavigationOverlay(reader)
|
|
base_page = reader.get_current_page()
|
|
|
|
# Get chapters
|
|
chapters = reader.get_chapters()
|
|
|
|
# Open overlay
|
|
overlay_image = nav_overlay.open(
|
|
base_page,
|
|
chapters=chapters,
|
|
bookmarks=[],
|
|
active_tab="contents"
|
|
)
|
|
|
|
# Find all interactive elements
|
|
panel_width = 480 # 60% of 800
|
|
panel_height = 840 # 70% of 1200
|
|
|
|
link_positions = find_all_links(
|
|
nav_overlay._overlay_reader,
|
|
panel_width,
|
|
panel_height
|
|
)
|
|
|
|
print(f"\nFound {len(link_positions)} interactive elements:")
|
|
for link_target, info in sorted(link_positions.items()):
|
|
x, y = info['first_pos']
|
|
text = info['text']
|
|
print(f" {link_target:30s} at ({x:3d}, {y:3d}) - \"{text}\"")
|
|
|
|
# Create visualization
|
|
print("\nCreating visualization...")
|
|
|
|
# Get just the overlay panel
|
|
overlay_panel = nav_overlay._cached_overlay_image.copy()
|
|
draw = ImageDraw.Draw(overlay_panel)
|
|
|
|
# Draw markers on each interactive element
|
|
for link_target, info in link_positions.items():
|
|
x, y = info['first_pos']
|
|
|
|
# Draw green circle
|
|
radius = 8
|
|
draw.ellipse(
|
|
[x - radius, y - radius, x + radius, y + radius],
|
|
outline=(0, 255, 0),
|
|
width=2
|
|
)
|
|
|
|
# Save visualization
|
|
output_path = Path(__file__).parent / "nav_overlay_links_debug.png"
|
|
overlay_panel.save(output_path)
|
|
print(f"\nVisualization saved to: {output_path}")
|
|
print("Green circles show clickable link positions")
|
|
|
|
reader.close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
visualize_settings_overlay()
|
|
visualize_navigation_overlay()
|
|
print("\n" + "="*70)
|
|
print("Debug complete! Check the generated PNG files.")
|
|
print("="*70)
|