From 16f905c8d7e6571ca0b121aa39ecea7f62961e98 Mon Sep 17 00:00:00 2001 From: gramps Date: Mon, 17 Aug 2026 07:53:03 -0700 Subject: [PATCH] feat: Elements panel, Countdown/Web sources, webcam border config (TASK 14 Branch 2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - New SourceType.Countdown (Starting/BRB only, timer 1-60 min) and SourceType.WebSource (all scenes, URI) - Elements panel beneath Sources: per-element config with live preview, ✕ revert / ✓ applied indicator - Webcam border: hex color input + swatch picker, thickness 0-10 slider - Countdown: timer minutes slider (1-60, default 15), Web: URI text input - SourceTypeToVisibilityConverter for conditional panel visibility - Snapshot/revert mechanism in code-behind for live-preview cancel --- HANDOFF.md | 10 +- Helpers/SourceTypeToVisibilityConverter.cs | 21 ++++ MainWindow.xaml | 107 +++++++++++++++++++++ MainWindow.xaml.cs | 70 ++++++++++++++ Models/Source.cs | 16 ++- TASKS.md | 6 +- ViewModels/MainViewModel.cs | 6 ++ 7 files changed, 230 insertions(+), 6 deletions(-) create mode 100644 Helpers/SourceTypeToVisibilityConverter.cs diff --git a/HANDOFF.md b/HANDOFF.md index 25c7cdc..bced246 100644 --- a/HANDOFF.md +++ b/HANDOFF.md @@ -5,10 +5,10 @@ > a problem. Conventions: [`schema.md`](schema.md). Rewrite this file at session > end, compaction, or any interruption. -## Session state (last updated: 2026-08-17, creator feedback batch Branch 1) +## Session state (last updated: 2026-08-17, creator feedback batch complete) -- **Branch:** `main`, tracking `origin/main`. Working tree: **TASK 14 Branch 1 (quick fixes)** — TRAX volume, tooltip, mic meter boost, click-to-position sliders, backdrop visibility + rename. Build **0 warnings**, **207 tests passing**. Ready to commit. -- **TASK 14 — CREATOR FEEDBACK BATCH — IN PROGRESS.** Branch 1 shipped: TRAX volume 0.2× factor, TRAX tooltip z-order fix, mic meter +20% boost, click-to-position volume sliders, backdrop visibility binding + compositor guard, rename "Backdrop" → "Game Capture". Branch 2 pending: Elements panel, webcam border config, Countdown source (Starting/BRB), Web source. +- **Branch:** `main`, tracking `origin/main`. Working tree: **TASK 14 complete** — all creator feedback items shipped. Build **0 warnings**, **207 tests passing**. Ready to commit. +- **TASK 14 — CREATOR FEEDBACK BATCH — SHIPPED.** Both branches complete: TRAX volume/tooltip, mic meter boost, click-to-position sliders, backdrop visibility + rename, Elements panel (webcam border config, Countdown source, Web source). - **TASK 9 — REUSABLE STREAM + HEALTH BANNER — SHIPPED 2026-08-16 (items 1–3).** - **Items 1–2 (reusable stream):** `_rtmpUrlProvider` now yields a real RTMP URL. `YouTubeStreamService` gains `GetOrCreateReusableStreamAsync` (lists `liveStreams?mine=true`, @@ -40,7 +40,9 @@ - **TASK 13 added** — marcom/launch kit. Business details moved to `MARCOM.md`. Queued after all v1 features. - **Backlog updated** — removed v0.3 (stream scheduling, not needed for casual streamers). Multi-destination restreaming noted as "congrats, you're ready for OBS" moment. -- **Resume point (next branch):** **TASK 14 Branch 2** — Elements panel beneath Sources (per-element config with live preview, ✕ revert / ✓ commit), webcam border config (color #RRGGBB + picker, thickness 0–10), Countdown source (Starting/BRB scenes, timer 1–60 min), Web source (all scenes, URI input). Then **TASK 9 item 4 — live chat**. +- **Resume point (next branch):** **TASK 9 item 4 — live chat** (`liveChat/messages` poll, right-panel + render, Super Chat + membership badges). Then item 5 (error handling), item 6 (visibility unlock), + item 7 (full broadcast form), then TASK 10 (billing + unlock + support). - **TASK 12 — MASTER LIMITER — COMMITTED + PUSHED 2026-08-15.** Queued from the TRAX discussion: the live mix summed mic + loopback with no ceiling, so hot gains could pass 0 dBFS and clip the AAC encode. New pure `Services/Audio/MasterLimiter.cs` (−1 dBFS ceiling, instant attack per frame, diff --git a/Helpers/SourceTypeToVisibilityConverter.cs b/Helpers/SourceTypeToVisibilityConverter.cs new file mode 100644 index 0000000..c2e323a --- /dev/null +++ b/Helpers/SourceTypeToVisibilityConverter.cs @@ -0,0 +1,21 @@ +using System.Globalization; +using System.Windows; +using System.Windows.Data; +using ytLive.Models; + +namespace ytLive.Helpers; + +public class SourceTypeToVisibilityConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is not SourceType current || parameter is not string targetName) + return Visibility.Collapsed; + return Enum.TryParse(targetName, true, out var target) && current == target + ? Visibility.Visible + : Visibility.Collapsed; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + => throw new NotSupportedException(); +} diff --git a/MainWindow.xaml b/MainWindow.xaml index a9aa416..55441fa 100644 --- a/MainWindow.xaml +++ b/MainWindow.xaml @@ -37,6 +37,11 @@ xmlns:Helpers="clr-namespace:ytLive.Helpers"/> + + @@ -162,6 +167,9 @@ + + + + + + + + + + + + + +