Added ACC flipping of page
This commit is contained in:
+26
-2
@@ -507,7 +507,28 @@ class EbookReader:
|
||||
Current font scale factor
|
||||
"""
|
||||
return self.settings_manager.get_font_size()
|
||||
|
||||
|
||||
def set_font_family(self, font_family) -> Optional[Image.Image]:
|
||||
"""
|
||||
Set the font family and re-render current page.
|
||||
|
||||
Args:
|
||||
font_family: BundledFont enum value (SERIF, SANS, MONOSPACE) or None for document default
|
||||
|
||||
Returns:
|
||||
PIL Image of the re-rendered page
|
||||
"""
|
||||
return self.settings_manager.set_font_family(font_family)
|
||||
|
||||
def get_font_family(self):
|
||||
"""
|
||||
Get the current font family.
|
||||
|
||||
Returns:
|
||||
Current BundledFont or None if using document default
|
||||
"""
|
||||
return self.settings_manager.get_font_family()
|
||||
|
||||
def set_line_spacing(self, spacing: int) -> Optional[Image.Image]:
|
||||
"""
|
||||
Set line spacing using pyWebLayout's native support.
|
||||
@@ -989,6 +1010,8 @@ class EbookReader:
|
||||
line_spacing = self.page_style.line_spacing
|
||||
inter_block_spacing = self.page_style.inter_block_spacing
|
||||
word_spacing = self.page_style.word_spacing
|
||||
font_family = self.get_font_family()
|
||||
font_family_name = font_family.name if font_family else "Default"
|
||||
|
||||
# Use the Settings sub-application
|
||||
overlay_subapp = self._overlay_subapps[OverlayState.SETTINGS]
|
||||
@@ -997,7 +1020,8 @@ class EbookReader:
|
||||
font_scale=font_scale,
|
||||
line_spacing=line_spacing,
|
||||
inter_block_spacing=inter_block_spacing,
|
||||
word_spacing=word_spacing
|
||||
word_spacing=word_spacing,
|
||||
font_family=font_family_name
|
||||
)
|
||||
|
||||
# Update state
|
||||
|
||||
@@ -197,6 +197,7 @@ def generate_settings_overlay(
|
||||
line_spacing: int = 5,
|
||||
inter_block_spacing: int = 15,
|
||||
word_spacing: int = 0,
|
||||
font_family: str = "Default",
|
||||
page_size: tuple = (800, 1200)
|
||||
) -> str:
|
||||
"""
|
||||
@@ -210,6 +211,7 @@ def generate_settings_overlay(
|
||||
line_spacing: Current line spacing in pixels
|
||||
inter_block_spacing: Current inter-block spacing in pixels
|
||||
word_spacing: Current word spacing in pixels
|
||||
font_family: Current font family ("Default", "SERIF", "SANS", "MONOSPACE")
|
||||
page_size: Page dimensions (width, height) for sizing the overlay
|
||||
|
||||
Returns:
|
||||
@@ -218,6 +220,15 @@ def generate_settings_overlay(
|
||||
# Format current values for display
|
||||
font_percent = int(font_scale * 100)
|
||||
|
||||
# Map font family names to display names
|
||||
font_display_names = {
|
||||
"Default": "Document Default",
|
||||
"SERIF": "Serif",
|
||||
"SANS": "Sans-Serif",
|
||||
"MONOSPACE": "Monospace"
|
||||
}
|
||||
font_family_display = font_display_names.get(font_family, font_family)
|
||||
|
||||
html = f'''
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
@@ -237,6 +248,22 @@ def generate_settings_overlay(
|
||||
</p>
|
||||
|
||||
<div style="margin: 15px 0;">
|
||||
<p style="padding: 12px; margin: 5px 0; background-color: #f0f0f0; border-left: 3px solid #6f42c1;">
|
||||
<b>Font Family: {font_family_display}</b>
|
||||
</p>
|
||||
<p style="margin: 5px 0; background-color: #f0f0f0;">
|
||||
<a href="setting:font_family_default" style="text-decoration: none; color: #000; display: block; padding: 12px;">Document Default</a>
|
||||
</p>
|
||||
<p style="margin: 5px 0; background-color: #f0f0f0;">
|
||||
<a href="setting:font_family_serif" style="text-decoration: none; color: #000; display: block; padding: 12px;">Serif</a>
|
||||
</p>
|
||||
<p style="margin: 5px 0; background-color: #f0f0f0;">
|
||||
<a href="setting:font_family_sans" style="text-decoration: none; color: #000; display: block; padding: 12px;">Sans-Serif</a>
|
||||
</p>
|
||||
<p style="margin: 5px 0; background-color: #f0f0f0;">
|
||||
<a href="setting:font_family_monospace" style="text-decoration: none; color: #000; display: block; padding: 12px;">Monospace</a>
|
||||
</p>
|
||||
|
||||
<p style="padding: 12px; margin: 5px 0; background-color: #f0f0f0; border-left: 3px solid #007bff;">
|
||||
<b>Font Size: {font_percent}%</b>
|
||||
</p>
|
||||
|
||||
@@ -9,14 +9,16 @@ from typing import Dict, Any, Optional
|
||||
from PIL import Image
|
||||
|
||||
from pyWebLayout.layout.ereader_manager import EreaderLayoutManager
|
||||
from pyWebLayout.style.fonts import BundledFont
|
||||
|
||||
|
||||
class SettingsManager:
|
||||
"""
|
||||
Manages font size, spacing, and rendering settings.
|
||||
Manages font size, spacing, font family, and rendering settings.
|
||||
|
||||
Responsibilities:
|
||||
- Font scale adjustment
|
||||
- Font family selection (serif, sans-serif, monospace)
|
||||
- Line spacing control
|
||||
- Inter-block spacing control
|
||||
- Word spacing control
|
||||
@@ -27,6 +29,7 @@ class SettingsManager:
|
||||
"""Initialize the settings manager."""
|
||||
self.font_scale = 1.0
|
||||
self.font_scale_step = 0.1 # 10% change per step
|
||||
self.font_family: Optional[BundledFont] = None # None = use document default
|
||||
self.manager: Optional[EreaderLayoutManager] = None
|
||||
|
||||
def set_manager(self, manager: EreaderLayoutManager):
|
||||
@@ -38,6 +41,7 @@ class SettingsManager:
|
||||
"""
|
||||
self.manager = manager
|
||||
self.font_scale = manager.font_scale
|
||||
self.font_family = manager.get_font_family()
|
||||
|
||||
def set_font_size(self, scale: float) -> Optional[Image.Image]:
|
||||
"""
|
||||
@@ -89,6 +93,36 @@ class SettingsManager:
|
||||
"""
|
||||
return self.font_scale
|
||||
|
||||
def set_font_family(self, font_family: Optional[BundledFont]) -> Optional[Image.Image]:
|
||||
"""
|
||||
Set the font family and re-render current page.
|
||||
|
||||
Args:
|
||||
font_family: BundledFont enum value (SERIF, SANS, MONOSPACE) or None for document default
|
||||
|
||||
Returns:
|
||||
Rendered page with new font family, or None if no manager
|
||||
"""
|
||||
if not self.manager:
|
||||
return None
|
||||
|
||||
try:
|
||||
self.font_family = font_family
|
||||
page = self.manager.set_font_family(font_family)
|
||||
return page.render() if page else None
|
||||
except Exception as e:
|
||||
print(f"Error setting font family: {e}")
|
||||
return None
|
||||
|
||||
def get_font_family(self) -> Optional[BundledFont]:
|
||||
"""
|
||||
Get the current font family.
|
||||
|
||||
Returns:
|
||||
Current BundledFont or None if using document default
|
||||
"""
|
||||
return self.font_family
|
||||
|
||||
def set_line_spacing(self, spacing: int) -> Optional[Image.Image]:
|
||||
"""
|
||||
Set line spacing using pyWebLayout's native support.
|
||||
@@ -195,6 +229,7 @@ class SettingsManager:
|
||||
if not self.manager:
|
||||
return {
|
||||
'font_scale': self.font_scale,
|
||||
'font_family': self.font_family.name if self.font_family else None,
|
||||
'line_spacing': 5,
|
||||
'inter_block_spacing': 15,
|
||||
'word_spacing': 0
|
||||
@@ -202,6 +237,7 @@ class SettingsManager:
|
||||
|
||||
return {
|
||||
'font_scale': self.font_scale,
|
||||
'font_family': self.font_family.name if self.font_family else None,
|
||||
'line_spacing': self.manager.page_style.line_spacing,
|
||||
'inter_block_spacing': self.manager.page_style.inter_block_spacing,
|
||||
'word_spacing': self.manager.page_style.word_spacing
|
||||
@@ -214,7 +250,7 @@ class SettingsManager:
|
||||
This should be called after loading a book to restore user preferences.
|
||||
|
||||
Args:
|
||||
settings: Dictionary with settings (font_scale, line_spacing, etc.)
|
||||
settings: Dictionary with settings (font_scale, font_family, line_spacing, etc.)
|
||||
|
||||
Returns:
|
||||
True if settings applied successfully, False otherwise
|
||||
@@ -223,6 +259,19 @@ class SettingsManager:
|
||||
return False
|
||||
|
||||
try:
|
||||
# Apply font family
|
||||
font_family_name = settings.get('font_family', None)
|
||||
if font_family_name:
|
||||
try:
|
||||
font_family = BundledFont[font_family_name]
|
||||
if font_family != self.font_family:
|
||||
self.set_font_family(font_family)
|
||||
except KeyError:
|
||||
print(f"Warning: Unknown font family '{font_family_name}', using default")
|
||||
elif font_family_name is None and self.font_family is not None:
|
||||
# Restore to document default
|
||||
self.set_font_family(None)
|
||||
|
||||
# Apply font scale
|
||||
font_scale = settings.get('font_scale', 1.0)
|
||||
if font_scale != self.font_scale:
|
||||
|
||||
@@ -44,6 +44,7 @@ class SettingsOverlay(OverlaySubApplication):
|
||||
line_spacing: Current line spacing in pixels
|
||||
inter_block_spacing: Current inter-block spacing in pixels
|
||||
word_spacing: Current word spacing in pixels
|
||||
font_family: Current font family name (e.g., "SERIF", "SANS", "MONOSPACE", or None)
|
||||
|
||||
Returns:
|
||||
Composited image with settings overlay
|
||||
@@ -52,6 +53,7 @@ class SettingsOverlay(OverlaySubApplication):
|
||||
line_spacing = kwargs.get('line_spacing', 5)
|
||||
inter_block_spacing = kwargs.get('inter_block_spacing', 15)
|
||||
word_spacing = kwargs.get('word_spacing', 0)
|
||||
font_family = kwargs.get('font_family', 'Default')
|
||||
|
||||
# Calculate panel size (60% width, 70% height)
|
||||
panel_size = self._calculate_panel_size(0.6, 0.7)
|
||||
@@ -62,6 +64,7 @@ class SettingsOverlay(OverlaySubApplication):
|
||||
line_spacing=line_spacing,
|
||||
inter_block_spacing=inter_block_spacing,
|
||||
word_spacing=word_spacing,
|
||||
font_family=font_family,
|
||||
page_size=panel_size
|
||||
)
|
||||
|
||||
@@ -132,7 +135,8 @@ class SettingsOverlay(OverlaySubApplication):
|
||||
font_scale: float,
|
||||
line_spacing: int,
|
||||
inter_block_spacing: int,
|
||||
word_spacing: int = 0) -> Image.Image:
|
||||
word_spacing: int = 0,
|
||||
font_family: str = "Default") -> Image.Image:
|
||||
"""
|
||||
Refresh the settings overlay with updated values and background page.
|
||||
|
||||
@@ -146,6 +150,7 @@ class SettingsOverlay(OverlaySubApplication):
|
||||
line_spacing: Updated line spacing
|
||||
inter_block_spacing: Updated inter-block spacing
|
||||
word_spacing: Updated word spacing
|
||||
font_family: Updated font family
|
||||
|
||||
Returns:
|
||||
Composited image with updated settings overlay
|
||||
@@ -159,6 +164,7 @@ class SettingsOverlay(OverlaySubApplication):
|
||||
line_spacing=line_spacing,
|
||||
inter_block_spacing=inter_block_spacing,
|
||||
word_spacing=word_spacing,
|
||||
font_family=font_family,
|
||||
page_size=panel_size
|
||||
)
|
||||
|
||||
@@ -177,16 +183,26 @@ class SettingsOverlay(OverlaySubApplication):
|
||||
Apply a setting change and refresh the overlay.
|
||||
|
||||
Args:
|
||||
action: Setting action (e.g., "font_increase", "line_spacing_decrease")
|
||||
action: Setting action (e.g., "font_increase", "line_spacing_decrease", "font_family_serif")
|
||||
|
||||
Returns:
|
||||
GestureResponse with SETTING_CHANGED action
|
||||
"""
|
||||
from pyWebLayout.style.fonts import BundledFont
|
||||
|
||||
# Apply the setting change via reader
|
||||
if action == "font_increase":
|
||||
self.reader.increase_font_size()
|
||||
elif action == "font_decrease":
|
||||
self.reader.decrease_font_size()
|
||||
elif action == "font_family_default":
|
||||
self.reader.set_font_family(None)
|
||||
elif action == "font_family_serif":
|
||||
self.reader.set_font_family(BundledFont.SERIF)
|
||||
elif action == "font_family_sans":
|
||||
self.reader.set_font_family(BundledFont.SANS)
|
||||
elif action == "font_family_monospace":
|
||||
self.reader.set_font_family(BundledFont.MONOSPACE)
|
||||
elif action == "line_spacing_increase":
|
||||
new_spacing = self.reader.page_style.line_spacing + 2
|
||||
self.reader.set_line_spacing(new_spacing)
|
||||
@@ -211,18 +227,24 @@ class SettingsOverlay(OverlaySubApplication):
|
||||
page = self.reader.manager.get_current_page()
|
||||
updated_page = page.render()
|
||||
|
||||
# Get font family for display
|
||||
font_family = self.reader.get_font_family()
|
||||
font_family_name = font_family.name if font_family else "Default"
|
||||
|
||||
# Refresh the settings overlay with updated values and page
|
||||
self.refresh(
|
||||
updated_base_page=updated_page,
|
||||
font_scale=self.reader.base_font_scale,
|
||||
line_spacing=self.reader.page_style.line_spacing,
|
||||
inter_block_spacing=self.reader.page_style.inter_block_spacing,
|
||||
word_spacing=self.reader.page_style.word_spacing
|
||||
word_spacing=self.reader.page_style.word_spacing,
|
||||
font_family=font_family_name
|
||||
)
|
||||
|
||||
return GestureResponse(ActionType.SETTING_CHANGED, {
|
||||
"action": action,
|
||||
"font_scale": self.reader.base_font_scale,
|
||||
"font_family": font_family_name,
|
||||
"line_spacing": self.reader.page_style.line_spacing,
|
||||
"inter_block_spacing": self.reader.page_style.inter_block_spacing,
|
||||
"word_spacing": self.reader.page_style.word_spacing
|
||||
|
||||
Reference in New Issue
Block a user