Tool windows: - Every editor (scenario, scene builder, map, interactive objects, lighting, catalog export) is rebuilt on the interface ToolWindow chrome and the denser ToolTheme: header with title/close, status bar, Ctrl+S, dirty-state confirmation. - Shared building blocks in src/Common: ToolUi (rows, buttons, sections), CollapsibleSection, FilteredList, ModFileSelector, DragHandle and BackgroundCanvas (scene background with pan/zoom). - The map, interactive and light editors draw on canvases (MapEditorCanvas, InteractiveEditorCanvas, LightEditorCanvas) instead of one Control "handle" node per object; the *Handle classes are removed. - Scenario editor: tab data model (TabData), automatic graph layout (ScenarioGraphLayout), file tree/info/thumbnail panel updates. - Services: ModFileService (mod file listing and writing), SceneBackgroundService; MapFileService/ModResourceService follow. - Catalog export: per-language name/description editing. - Locale (en/ru) regrouped under tools/*; unused keys removed. Novel Editor: - collections/novel_editor.json: a "game" whose entry scene is an authoring workspace over the novel engine and the story content. - NovelEditorHub (scenes/novel_editor_hub.tscn) lists every installed tool through IToolProvider.AddMenuButton; ToolsInitializer registers it as the logical scene "novel_editor".
71 lines
2.4 KiB
C#
71 lines
2.4 KiB
C#
using System.Linq;
|
|
using Cthangover.Tools.Services;
|
|
using Godot;
|
|
|
|
namespace Cthangover.Core.UI.Tool.ScenarioEditor
|
|
{
|
|
/// <summary>Row of background thumbnails referenced by the scenario in the active text tab.</summary>
|
|
public partial class ScenarioThumbnailPanel : ScrollContainer
|
|
{
|
|
private HBoxContainer _thumbContainer;
|
|
|
|
/// <summary>
|
|
/// Container lookup is lazy: the tscn builder runs the constructor
|
|
/// before the child nodes exist.
|
|
/// </summary>
|
|
private HBoxContainer Thumbs => _thumbContainer ??= GetNode<HBoxContainer>("ThumbContainer");
|
|
|
|
/// <summary>Loads the background thumbnails referenced by the given scenario text (missing ones render as placeholders).</summary>
|
|
public void Load(string text)
|
|
{
|
|
Clear();
|
|
|
|
if (string.IsNullOrEmpty(text))
|
|
return;
|
|
|
|
var refs = ScenarioFileService.ExtractReferences(text);
|
|
|
|
if (refs.BackgroundRefs.Count == 0)
|
|
{
|
|
Thumbs.AddChild(new Label
|
|
{
|
|
Text = TranslationServer.Translate("tools/scenario_editor/no_backgrounds")
|
|
});
|
|
return;
|
|
}
|
|
|
|
foreach (var id in refs.BackgroundRefs.Distinct())
|
|
{
|
|
var tex = ModResourceService.LoadBackgroundTexture(id);
|
|
|
|
if (tex != null)
|
|
{
|
|
Thumbs.AddChild(new TextureRect
|
|
{
|
|
Texture = tex,
|
|
ExpandMode = TextureRect.ExpandModeEnum.IgnoreSize,
|
|
StretchMode = TextureRect.StretchModeEnum.KeepAspectCentered,
|
|
CustomMinimumSize = new Vector2(120, 90),
|
|
TooltipText = id
|
|
});
|
|
}
|
|
else
|
|
{
|
|
Thumbs.AddChild(new Label
|
|
{
|
|
Text = $"[? {id}]",
|
|
TooltipText = string.Format(TranslationServer.Translate("tools/scenario_editor/bg_missing"), id)
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>Removes every thumbnail from the row.</summary>
|
|
public new void Clear()
|
|
{
|
|
foreach (var c in Thumbs.GetChildren())
|
|
c.QueueFree();
|
|
}
|
|
}
|
|
}
|