Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions custom_components/camera_snapshot_processor/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,9 @@
CONF_STATE_ICON_FONT_SIZE = "state_icon_font_size"
CONF_OVERLAY_COLOR = "overlay_color"
CONF_OVERLAY_BACKGROUND = "overlay_background"
CONF_OVERLAY_BACKGROUND_OPACITY = "overlay_background_opacity"
CONF_STATE_ICON_BACKGROUND = "state_icon_background"
CONF_STATE_ICON_BACKGROUND_OPACITY = "state_icon_background_opacity"

# State icons configuration (multiple icons supported)
CONF_STATE_ICONS = "state_icons"
Expand Down
68 changes: 53 additions & 15 deletions custom_components/camera_snapshot_processor/frontend/panel.html
Original file line number Diff line number Diff line change
Expand Up @@ -68,26 +68,32 @@ <h1 id="camera-title">Camera Configuration</h1>
<!-- Left: Configuration Tabs -->
<div class="config-panel">
<div class="tabs">
<button class="tab active" data-tab="dimensions">📐 Dimensions</button>
<button class="tab" data-tab="crop">✂️ Crop</button>
<button class="tab active" data-tab="crop">✂️ Crop</button>
<button class="tab" data-tab="dimensions">📐 Dimensions</button>
<button class="tab" data-tab="overlays">🎨 Overlays</button>
<button class="tab" data-tab="state-icons">💡 State Icons</button>
<button class="tab" data-tab="stream">📡 Stream</button>
</div>

<div class="tab-content">
<!-- Dimensions Tab -->
<div class="tab-pane active" id="tab-dimensions">
<div class="tab-pane" id="tab-dimensions">
<h3>Image Dimensions & Quality</h3>

<!-- Info tip at top -->
<div class="info-tip">
<span class="info-icon">ℹ️</span>
<span class="info-text">
For custom values or upscaling, type directly in the input fields.
<strong>Step 2:</strong> Resize the image to these dimensions.<br>
If cropping is enabled, the cropped area will be resized. Otherwise, the full camera image will be resized.
</span>
</div>

<!-- Source dimensions display -->
<div id="source-size-info" style="background: #e8f5e9; border: 2px solid #4caf50; border-radius: 8px; padding: 12px; margin-bottom: 20px; font-size: 14px;">
<strong>Source Image Size:</strong> <span id="effective-source-dimensions">Loading...</span>
</div>

<div class="form-group checkbox-group">
<label>
<input type="checkbox" id="keep_ratio" checked>
Expand Down Expand Up @@ -128,9 +134,17 @@ <h3>Image Dimensions & Quality</h3>
</div>

<!-- Crop Tab -->
<div class="tab-pane" id="tab-crop">
<div class="tab-pane active" id="tab-crop">
<h3>Crop Settings</h3>

<!-- Info tip at top -->
<div class="info-tip">
<span class="info-icon">ℹ️</span>
<span class="info-text">
<strong>Optional Step 1:</strong> Crop a specific area from the camera image. If enabled, cropping happens before resizing (Dimensions tab).
</span>
</div>

<div class="form-group checkbox-group">
<label>
<input type="checkbox" id="crop_enabled">
Expand Down Expand Up @@ -254,6 +268,12 @@ <h4>Overlay Styling</h4>
<input type="hidden" id="overlay_background" value="#00000000">
<small class="help-text">Click "Clear" for no background</small>
</div>

<div class="form-group">
<label for="overlay_background_opacity">Background Opacity</label>
<input type="range" id="overlay_background_opacity" min="0" max="1" step="0.1" value="1.0">
<span class="value-display" id="overlay_background_opacity-value">1.0</span>
</div>
</div>
</div>

Expand All @@ -280,6 +300,12 @@ <h4>State Icon Background</h4>
<input type="hidden" id="state_icon_background" value="#00000000">
<small class="help-text">Background color for all state icons. Click "Clear" for no background</small>
</div>

<div class="form-group">
<label for="state_icon_background_opacity">Background Opacity</label>
<input type="range" id="state_icon_background_opacity" min="0" max="1" step="0.1" value="1.0">
<span class="value-display" id="state_icon_background_opacity-value">1.0</span>
</div>
</div>
</div>

Expand All @@ -304,20 +330,32 @@ <h3>Live Preview</h3>
<div class="spinner"></div>
<p>Loading preview...</p>
</div>
<div id="preview-image-wrapper" class="preview-image-wrapper">
<img id="preview-image" alt="Preview">
<div id="crop-overlay" class="crop-overlay" style="display: none;">
<div class="crop-box">
<div class="crop-handle nw"></div>
<div class="crop-handle ne"></div>
<div class="crop-handle sw"></div>
<div class="crop-handle se"></div>
<!-- Original/Source Image with Crop Overlay -->
<div id="source-image-section" style="display: none;">
<h4 class="crop-section-title">Source Image (adjust crop area)</h4>
<div id="source-image-wrapper" class="preview-image-wrapper">
<img id="source-image" alt="Source Image">
<div id="crop-overlay" class="crop-overlay" style="display: none;">
<div class="crop-box">
<div class="crop-handle nw"></div>
<div class="crop-handle ne"></div>
<div class="crop-handle sw"></div>
<div class="crop-handle se"></div>
</div>
</div>
</div>
<div id="crop-message" class="crop-message" style="display: none;">
To change cropping - use 🔄 Reset button
</div>
<!-- Cropped Preview Image -->
<div id="cropped-preview-section" style="display: none;">
<h4 class="crop-section-title">Cropped Result Preview</h4>
<div id="cropped-preview-wrapper" class="preview-image-wrapper">
<canvas id="cropped-preview-canvas"></canvas>
</div>
</div>
<!-- Main Preview Image (shown when not cropping) -->
<div id="preview-image-wrapper" class="preview-image-wrapper">
<img id="preview-image" alt="Preview">
</div>
</div>
<div class="preview-info">
<p id="preview-dimensions"></p>
Expand Down
Loading
Loading