Fix stock display layout: Adjust chart positioning and spacing to prevent overlap with symbol information

This commit is contained in:
ChuckBuilds
2025-04-23 16:07:57 -05:00
parent 9c1220b605
commit f684f914c7
2 changed files with 17 additions and 19 deletions

View File

@@ -28,7 +28,7 @@
"display_durations": { "display_durations": {
"clock": 15, "clock": 15,
"weather": 15, "weather": 15,
"stocks": 20, "stocks": 30,
"hourly_forecast": 15, "hourly_forecast": 15,
"daily_forecast": 15, "daily_forecast": 15,
"stock_news": 20, "stock_news": 20,

View File

@@ -401,7 +401,7 @@ class StockManager:
def _create_stock_display(self, symbol: str, price: float, change: float, change_percent: float, is_crypto: bool = False) -> Image.Image: def _create_stock_display(self, symbol: str, price: float, change: float, change_percent: float, is_crypto: bool = False) -> Image.Image:
"""Create a display image for a stock or crypto with logo, symbol, price, and change.""" """Create a display image for a stock or crypto with logo, symbol, price, and change."""
# Create a wider image for scrolling # Create a wider image for scrolling
width = self.display_manager.matrix.width * 2 # Reduced from 3x to 2x since we'll handle spacing in display_stocks width = self.display_manager.matrix.width * 2
height = self.display_manager.matrix.height height = self.display_manager.matrix.height
image = Image.new('RGB', (width, height), color=(0, 0, 0)) image = Image.new('RGB', (width, height), color=(0, 0, 0))
draw = ImageDraw.Draw(image) draw = ImageDraw.Draw(image)
@@ -409,8 +409,8 @@ class StockManager:
# Draw large stock/crypto logo on the left # Draw large stock/crypto logo on the left
logo = self._get_stock_logo(symbol, is_crypto) logo = self._get_stock_logo(symbol, is_crypto)
if logo: if logo:
# Position logo on the left side with minimal spacing # Position logo on the left side
logo_x = 0 # Already at 0, keeping it at the far left logo_x = 0
logo_y = (height - logo.height) // 2 logo_y = (height - logo.height) // 2
image.paste(logo, (logo_x, logo_y), logo) image.paste(logo, (logo_x, logo_y), logo)
@@ -421,9 +421,9 @@ class StockManager:
# Create smaller versions of the fonts for symbol and price # Create smaller versions of the fonts for symbol and price
symbol_font = ImageFont.truetype(self.display_manager.regular_font.path, symbol_font = ImageFont.truetype(self.display_manager.regular_font.path,
int(self.display_manager.regular_font.size * 0.8)) # 80% of regular size int(self.display_manager.regular_font.size * 0.8))
price_font = ImageFont.truetype(self.display_manager.regular_font.path, price_font = ImageFont.truetype(self.display_manager.regular_font.path,
int(self.display_manager.regular_font.size * 0.8)) # 80% of regular size int(self.display_manager.regular_font.size * 0.8))
# Calculate text dimensions for proper spacing # Calculate text dimensions for proper spacing
symbol_text = symbol symbol_text = symbol
@@ -461,14 +461,14 @@ class StockManager:
# Draw mini chart on the right # Draw mini chart on the right
if symbol in self.stock_data and 'price_history' in self.stock_data[symbol]: if symbol in self.stock_data and 'price_history' in self.stock_data[symbol]:
price_history = self.stock_data[symbol]['price_history'] price_history = self.stock_data[symbol]['price_history']
if len(price_history) >= 2: # Need at least 2 points to draw a line if len(price_history) >= 2:
# Extract prices from price history # Extract prices from price history
chart_data = [p['price'] for p in price_history] chart_data = [p['price'] for p in price_history]
# Calculate chart dimensions - make it slightly smaller # Calculate chart dimensions
chart_width = int(width // 2.5) # Reduced from width//2.5 to width//3 to prevent overlap chart_width = int(width // 3) # Reduced from width//2.5 to prevent overlap
chart_height = height // 1.5 chart_height = height // 2
chart_x = width - chart_width - 10 # Increased right margin to 10 pixels chart_x = width - chart_width - 5 # Added 5px margin
chart_y = (height - chart_height) // 2 chart_y = (height - chart_height) // 2
# Find min and max prices for scaling # Find min and max prices for scaling
@@ -477,7 +477,7 @@ class StockManager:
# Add padding to avoid flat lines when prices are very close # Add padding to avoid flat lines when prices are very close
price_range = max_price - min_price price_range = max_price - min_price
if price_range < 0.01: # If prices are very close if price_range < 0.01:
min_price -= 0.01 min_price -= 0.01
max_price += 0.01 max_price += 0.01
price_range = 0.02 price_range = 0.02
@@ -486,20 +486,18 @@ class StockManager:
points = [] points = []
for i, price in enumerate(chart_data): for i, price in enumerate(chart_data):
x = chart_x + (i * chart_width) // (len(chart_data) - 1) x = chart_x + (i * chart_width) // (len(chart_data) - 1)
# Invert y-axis (higher price = lower y value) y = chart_y + chart_height - int(((price - min_price) / price_range) * chart_height)
y = chart_y + chart_height - ((price - min_price) / price_range * chart_height)
points.append((x, y)) points.append((x, y))
# Draw the line # Draw the line
if len(points) >= 2: if len(points) >= 2:
draw.line(points, fill=(0, 255, 0) if change >= 0 else (255, 0, 0), width=1) draw.line(points, fill=change_color, width=1)
# Draw dots at each point # Draw dots at start and end points only
for point in points: for point in [points[0], points[-1]]:
draw.ellipse([point[0]-1, point[1]-1, point[0]+1, point[1]+1], draw.ellipse([point[0]-1, point[1]-1, point[0]+1, point[1]+1],
fill=(0, 255, 0) if change >= 0 else (255, 0, 0)) fill=change_color)
# Return the full image without cropping
return image return image
def _update_stock_display(self, symbol: str, data: Dict[str, Any], width: int, height: int) -> None: def _update_stock_display(self, symbol: str, data: Dict[str, Any], width: int, height: int) -> None: