diff --git a/PlotLine/Views/Timeline/Index.cshtml b/PlotLine/Views/Timeline/Index.cshtml index 5214165..5647b5f 100644 --- a/PlotLine/Views/Timeline/Index.cshtml +++ b/PlotLine/Views/Timeline/Index.cshtml @@ -151,6 +151,119 @@ } return string.Join(Environment.NewLine, lines); } + string AssetMarkerLabel(AssetEvent assetEvent) + { + var typeName = assetEvent.AssetEventTypeName?.Trim() ?? string.Empty; + return typeName.ToLowerInvariant() switch + { + "first mentioned" => "First", + "mentioned" => "Ref", + "found" => "Find", + "lost" => "Lost", + "given" => "Give", + "taken" => "Take", + "stolen" => "Stol", + "hidden" => "Hide", + "moved" or "location changed" => "Move", + "used" => "Use", + "opened" => "Open", + "destroyed" => "X", + "revealed" => "Show", + "investigated" => "?", + "resolved" => "Done", + "state changed" => "State", + _ => string.IsNullOrWhiteSpace(typeName) ? "Asset" : typeName.Length <= 5 ? typeName : typeName[..5] + }; + } + string AssetMarkerMeaning(AssetEvent assetEvent) + { + var typeName = assetEvent.AssetEventTypeName?.Trim() ?? string.Empty; + return typeName.ToLowerInvariant() switch + { + "first mentioned" => "Asset is first mentioned in this scene.", + "mentioned" => "Asset is mentioned in this scene.", + "found" => "Asset is found in this scene.", + "lost" => "Asset is lost in this scene.", + "given" => "Asset changes hands in this scene.", + "taken" => "Asset is taken in this scene.", + "stolen" => "Asset is stolen in this scene.", + "hidden" => "Asset is hidden in this scene.", + "moved" or "location changed" => "Asset changes location in this scene.", + "used" => "Asset is used in this scene.", + "opened" => "Asset is opened in this scene.", + "destroyed" => "Asset is destroyed in this scene.", + "revealed" => "Asset is revealed in this scene.", + "investigated" => "Asset is investigated in this scene.", + "resolved" => "Asset thread is resolved in this scene.", + "state changed" => "Asset state changes in this scene.", + _ => string.IsNullOrWhiteSpace(typeName) ? "Asset event occurs in this scene." : $"Asset event: {typeName}." + }; + } + string AssetMarkerTooltip(AssetEvent assetEvent, Scene scene) + { + var lines = new List + { + AssetMarkerMeaning(assetEvent), + $"Asset: {assetEvent.AssetName}", + $"Event: {assetEvent.EventTitle}", + $"Scene: {scene.SceneNumber:g}: {scene.SceneTitle}" + }; + if (!string.IsNullOrWhiteSpace(assetEvent.ToStateName)) + { + lines.Add($"State changes to: {assetEvent.ToStateName}"); + } + if (!string.IsNullOrWhiteSpace(assetEvent.EventDescription)) + { + lines.Add($"Summary: {assetEvent.EventDescription}"); + } + return string.Join(Environment.NewLine, lines); + } + string CharacterMarkerLabel(SceneCharacter appearance) + { + var presence = appearance.PresenceTypeName?.Trim() ?? string.Empty; + return presence.ToLowerInvariant() switch + { + "present" => "In", + "arrives" => "In+", + "leaves" => "Out", + "nearby" => "Near", + "hidden" => "Hide", + "overhearing" => "Hear", + "mentioned only" => "Ref", + "background" => "Bg", + "off-screen" => "Off", + _ => "Char" + }; + } + string CharacterMarkerMeaning(SceneCharacter appearance) + { + var presence = appearance.PresenceTypeName?.Trim() ?? string.Empty; + return presence.ToLowerInvariant() switch + { + "present" => "Character appears in this scene.", + "arrives" => "Character arrives in this scene.", + "leaves" => "Character leaves in this scene.", + "nearby" => "Character is nearby in this scene.", + "hidden" => "Character is hidden in this scene.", + "overhearing" => "Character overhears this scene.", + "mentioned only" => "Character is mentioned in this scene.", + "background" => "Character is in the background of this scene.", + "off-screen" => "Character is off-screen in this scene.", + _ => "Character appears in this scene." + }; + } + string CharacterMarkerTooltip(SceneCharacter appearance, Scene scene) + { + var lines = new List + { + CharacterMarkerMeaning(appearance), + $"Character: {appearance.CharacterName}", + $"Role: {(string.IsNullOrWhiteSpace(appearance.RoleInSceneTypeName) ? "Not set" : appearance.RoleInSceneTypeName)}", + $"Presence: {(string.IsNullOrWhiteSpace(appearance.PresenceTypeName) ? "Not set" : appearance.PresenceTypeName)}", + $"Scene: {scene.SceneNumber:g}: {scene.SceneTitle}" + }; + return string.Join(Environment.NewLine, lines); + } bool HasLeadSceneRole(CharacterLaneViewModel lane) => lane.SceneSlots .SelectMany(slot => slot.Appearances) .Any(appearance => @@ -1056,6 +1169,7 @@ else
@foreach (var assetEvent in slot?.Events ?? Enumerable.Empty()) { + var assetMarkerTooltip = AssetMarkerTooltip(assetEvent, realAssetScene); - @assetEvent.MarkerText + title="@assetMarkerTooltip" + aria-label="@assetMarkerTooltip"> + @AssetMarkerLabel(assetEvent) }
@@ -1129,6 +1244,7 @@ else
@foreach (var appearance in slot?.Appearances ?? Enumerable.Empty()) { + var characterMarkerTooltip = CharacterMarkerTooltip(appearance, realCharacterScene); - @(!string.IsNullOrWhiteSpace(appearance.PresenceTypeName) ? appearance.PresenceTypeName.Substring(0, 1) : "C") + title="@characterMarkerTooltip" + aria-label="@characterMarkerTooltip"> + @CharacterMarkerLabel(appearance) }