feat: complete legacy parity and modernize operator UI

This commit is contained in:
2026-07-22 12:34:46 +09:00
parent fc4007d676
commit 939c252d23
149 changed files with 26515 additions and 1736 deletions

View File

@@ -33,9 +33,6 @@ internal static class LegacySceneRuntimeFactory
var imageQuoteLoader = new S6001SceneDataLoader(executor);
var worldMapLoader = new S8067SceneDataLoader(executor);
var candleLoader = new S8010SceneDataLoader(executor);
var fiveRowLoader = new S5074SceneDataLoader(executor);
var sixRowLoader = new S5077SceneDataLoader(executor);
var twelveRowLoader = new S5088SceneDataLoader(executor);
var parameterizedRequestResolver = new LegacyParameterizedSceneRequestResolver(executor);
var oneColumnLoader = new S5001SceneDataLoader(executor);
var futuresPairLoader = new S5032SceneDataLoader(executor);
@@ -359,6 +356,46 @@ internal static class LegacySceneRuntimeFactory
cancellationToken).ConfigureAwait(false);
return new LegacySceneDataPage("s8010", data, 1);
}),
.. CreatePagedQuoteRoutes(executor, trustedViSource)
]);
LegacySceneRuntimeCoverage.Validate(dataSource);
if (compositionOptions is not null && compositionOptionsSource is not null)
{
throw new ArgumentException(
"Specify either fixed or mutable scene composition options, not both.");
}
var cueProvider = compositionOptionsSource is null
? new RegisteredLegacySceneCueProvider(dataSource, options: compositionOptions)
: new RegisteredLegacySceneCueProvider(dataSource, compositionOptionsSource);
return new LegacyPlayoutWorkflow(engine, cueProvider);
}
/// <summary>
/// Creates the read-only PageN boundary used when a fixed 5-, 6-, or 12-row
/// action is first added to the operator playlist. This path does not create a
/// cue, dispatch an engine command, or touch COM/vendor objects.
/// </summary>
public static ILegacyScenePagePlanProvider CreatePagePlanProvider(
IDataQueryExecutor executor,
ITrustedViStockNameSnapshotSource? trustedViSource = null)
{
ArgumentNullException.ThrowIfNull(executor);
var dataSource = new LegacySceneDataSourceRouter(
CreatePagedQuoteRoutes(executor, trustedViSource));
return new RegisteredLegacySceneCueProvider(dataSource);
}
private static IReadOnlyList<LegacySceneDataSourceRoute> CreatePagedQuoteRoutes(
IDataQueryExecutor executor,
ITrustedViStockNameSnapshotSource? trustedViSource)
{
var fiveRowLoader = new S5074SceneDataLoader(executor);
var sixRowLoader = new S5077SceneDataLoader(executor);
var twelveRowLoader = new S5088SceneDataLoader(executor);
return
[
new LegacySceneDataSourceRoute(["5074"], async (entry, page, cancellationToken) =>
{
var selection = RequireSelection(entry);
@@ -412,19 +449,7 @@ internal static class LegacySceneRuntimeFactory
.ConfigureAwait(false);
return new LegacySceneDataPage("s5088", data, data.Rows.Count);
})
]);
LegacySceneRuntimeCoverage.Validate(dataSource);
if (compositionOptions is not null && compositionOptionsSource is not null)
{
throw new ArgumentException(
"Specify either fixed or mutable scene composition options, not both.");
}
var cueProvider = compositionOptionsSource is null
? new RegisteredLegacySceneCueProvider(dataSource, options: compositionOptions)
: new RegisteredLegacySceneCueProvider(dataSource, compositionOptionsSource);
return new LegacyPlayoutWorkflow(engine, cueProvider);
];
}
private static LegacySceneSelection RequireSelection(LegacyPlaylistEntry entry) =>
@@ -532,6 +557,9 @@ internal static class LegacySceneRuntimeFactory
return value;
}
private static string ResolveNxtThemeLoaderTitle(LegacySceneSelection selection)
=> RequireLookupValue(selection.Subject, "NXT theme");
private static bool HasClosedFlag(string value, string flag) =>
value.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries)
.Contains(flag, StringComparer.Ordinal);
@@ -565,16 +593,17 @@ internal static class LegacySceneRuntimeFactory
page),
"PAGED_THEME" => new ThemePagedQuoteLoadRequest(
RequireLookupValue(selection.DataCode, "theme code"),
RequireLookupValue(selection.Subject, "theme"),
RequireLookupValue(selection.ExactSubject ?? selection.Subject, "theme"),
ParseThemeSort(selection.GraphicType),
ParseThemeValueKind(selection.Subtype),
page),
"PAGED_NXT_THEME" => new NxtThemePagedQuoteLoadRequest(
RequireLookupValue(selection.DataCode, "NXT theme code"),
RequireLookupValue(selection.Subject, "NXT theme"),
ResolveNxtThemeLoaderTitle(selection),
ParseThemeSort(selection.Subtype),
ParseNxtSession(selection.GraphicType),
page),
page,
selection.ExactSubject),
"PAGED_EXPERT" => new ExpertPagedQuoteLoadRequest(
RequireLookupValue(selection.DataCode, "expert code"),
RequireLookupValue(selection.Subject, "expert"),