Add the Collect page

The collector becomes usable. The page is a close copy of the parse page's
shape - same proxy gate, same batched flush to the observable collection, same
truncation cap that reports rather than truncates silently - because that shape
was built for streaming outcomes and the collector produces exactly those.

Two differences that are not cosmetic. The batch drops from 512 to 64: items
arrive at network speed, roughly one a second, and a batch of five hundred would
mean the list never visibly moved. And progress is explicitly indeterminate
until a source finishes listing, because a paginated listing genuinely does not
know its total until the last page - a bar pretending otherwise would be lying.

The input swaps shape with the source: an endpoint source wants one address, a
pasted-list source wants many lines. The proxy gate is unchanged in substance -
only network sources are gated, and the banner keeps its x:Name because the
headless tests find it that way.

Rendering the page caught a defect the tests could not: IsVisible sat on the
caption inside the header border rather than on the border, so hiding the text
left its padding and divider behind as an empty bar above the input.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Leonid Pershin
2026-08-13 21:39:21 +03:00
co-authored by Claude Opus 5
parent 6909884851
commit 70fb3a1df3
12 changed files with 1774 additions and 1 deletions
+5 -1
View File
@@ -47,6 +47,8 @@ public enum AppTheme
/// <param name="ProxyProbeConcurrency">How many probes run at once during a pool sweep.</param>
/// <param name="ProxyMinimumLive">How many working proxies a startup warm-up aims for.</param>
/// <param name="AllowDirectConnection">Whether network parsers may run without a proxy.</param>
/// <param name="LastSourceId">Id of the media source selected last time; resolved leniently on load.</param>
/// <param name="MaxConcurrentDownloads">How many downloads may be in flight at once.</param>
public sealed record AppSettings(
AppTheme Theme = AppTheme.System,
AppLanguage Language = AppLanguage.System,
@@ -63,7 +65,9 @@ public sealed record AppSettings(
int ProxyProbeTimeoutSeconds = 8,
int ProxyProbeConcurrency = 64,
int ProxyMinimumLive = 10,
bool AllowDirectConnection = false
bool AllowDirectConnection = false,
string? LastSourceId = null,
int MaxConcurrentDownloads = 4
)
{
/// <summary>Projects the proxy-related settings onto <see cref="ProxyOptions"/>.</summary>