Files
2026-07-13 13:13:17 +08:00

193 lines
6.7 KiB
C#

#nullable enable
using System.IO;
using ImGuiNET;
using T3.Core.DataTypes.Vector;
using T3.Core.Settings;
using T3.Core.SystemUi;
using T3.Editor.Gui.AutoBackup;
using T3.Editor.Gui.Hub;
using T3.Editor.Gui.Input;
using T3.Editor.Gui.Styling;
using T3.Editor.Gui.Styling.Markdown;
using T3.Editor.Gui.UiHelpers;
using T3.Editor.Gui.Window;
using T3.Editor.UiModel;
namespace T3.Editor.Gui.Dialog;
/// <summary>
/// Floating, non-modal welcome window for stable builds, shown the first time a user runs a version
/// they haven't run in this folder before. A Settings-style sidebar splits it into Welcome (intro +
/// release notes), Getting Started (learn links), and Projects (jump back into a project).
/// Reopenable via Help → Welcome. Alpha builds show the <see cref="WelcomeAlphaWindow"/> instead.
/// </summary>
[HelpUiID("WelcomeWindow")]
internal sealed class WelcomeWindow : WelcomeWindowBase
{
internal WelcomeWindow()
{
Config.Title = "Welcome to TiXL";
}
protected override void DrawContent()
{
if (!_isInitialized)
{
Initialize();
_isInitialized = true;
}
NavigationSidebar.BeginLayout();
DrawHeaderBand($"Welcome to TiXL v{FileLocations.TixlVersion}");
DrawSidebar();
DrawContentPanel();
}
protected override void Close()
{
base.Close();
_isInitialized = false;
}
private void Initialize()
{
_activeTab = Tab.Welcome;
LoadReleaseNotes();
}
private void DrawSidebar()
{
NavigationSidebar.BeginColumn("sidebar", 150);
if (NavigationSidebar.Item("Welcome", _activeTab == Tab.Welcome))
_activeTab = Tab.Welcome;
if (NavigationSidebar.Item("Getting Started", _activeTab == Tab.GettingStarted))
_activeTab = Tab.GettingStarted;
if (NavigationSidebar.Item("Release Notes", _activeTab == Tab.ReleaseNotes))
_activeTab = Tab.ReleaseNotes;
NavigationSidebar.EndColumn();
}
private void DrawContentPanel()
{
var title = _activeTab switch
{
Tab.Welcome => "Welcome",
Tab.GettingStarted => "Getting Started",
Tab.ReleaseNotes => "Release Notes",
_ => string.Empty,
};
NavigationSidebar.BeginContentPanel(title, this);
switch (_activeTab)
{
case Tab.Welcome:
DrawWelcomeTab();
break;
case Tab.GettingStarted:
DrawGettingStartedTab();
break;
case Tab.ReleaseNotes:
DrawReleaseNotes();
break;
}
NavigationSidebar.EndContentPanel();
}
private void DrawWelcomeTab()
{
DrawPreUpgradeBackupNotice();
// Rendered as markdown so the [text](url) links sit inline in the prose.
_welcomeMarkdown.Draw(WelcomeMarkdown,
onUrl: url => CoreUi.Instance.OpenWithDefaultApplication(url));
FormInputs.AddVerticalSpace(8);
ImGui.Separator();
//DrawReleaseNotes();
}
/// <summary>
/// One-time notice shown after a launch that snapshotted projects before a breaking file-format
/// change (see <see cref="PreUpgradeSnapshot"/>). Lists each backup's absolute path so the user
/// can revert to an earlier TiXL version without losing work.
/// </summary>
private static void DrawPreUpgradeBackupNotice()
{
var created = PreUpgradeSnapshot.Created;
if (created.Count == 0)
return;
CustomComponents.StylizedText($"{created.Count} project(s) were backed up before the format change",
Fonts.FontBold, UiColors.StatusAttention);
ImGui.TextWrapped($"TiXL v{FileLocations.TixlVersion} introduces a new project file format. A backup of each "
+ "project's source and symbol files was saved first, so you can return to an earlier "
+ "TiXL version without losing work.");
FormInputs.AddVerticalSpace(4);
foreach (var entry in created)
{
var backupFolder = Path.GetDirectoryName(entry.ZipPath) ?? entry.ZipPath;
ImGui.PushID(entry.ProjectName);
if (ImGui.SmallButton("Reveal"))
CoreUi.Instance.OpenWithDefaultApplication(backupFolder);
ImGui.SameLine();
ImGui.TextColored(UiColors.TextMuted, $"{entry.ProjectName} — {entry.ZipPath}");
ImGui.PopID();
}
FormInputs.AddVerticalSpace(8);
ImGui.Separator();
FormInputs.AddVerticalSpace(8);
}
private void DrawGettingStartedTab()
{
_gettingStartedMarkdown.Draw(GettingStartedMarkdown,
onUrl: url => CoreUi.Instance.OpenWithDefaultApplication(url));
}
private enum Tab
{
Welcome,
GettingStarted,
ReleaseNotes,
}
private const string WelcomeMarkdown =
"""
TiXL is a free, open-source editor for creating real-time motion graphics.
If you are new, the **Getting Started** page on the left collects the best tutorials and links. The **Projects** page lists your projects so you can jump right back in.
Questions, feedback, and show-and-tell are always welcome on our [Discord server](https://discord.gg/YmSyQdeH3S).
""";
private const string GettingStartedMarkdown =
"""
## Learn the basics
- [Getting Started video (15 min)](https://www.youtube.com/watch?v=_zvzX0fZ8sc)
- [Tutorials playlist](https://www.youtube.com/playlist?list=PLj-rnPROvbn3LigXGRSDvmLtgTwmNHcQs)
- [Written introduction](https://github.com/tixl3d/tixl/wiki/help.Introduction)
- [FAQ](https://github.com/tixl3d/tixl/wiki/help.FAQ)
Prefer learning inside the editor? Close this window and follow the **Skill Quest** shown while no project is open an interactive journey from playful basics to advanced real-time graphics.
## Community
- [Discord community](https://discord.com/invite/YmSyQdeH3S) — ask questions, learn from each other, share your work or just hang out
- [Made with TiXL](https://www.youtube.com/playlist?list=PLj-rnPROvbn3LNU34daaRk5EiaXlwo2E0) — a playlist of work made by the community
""";
private readonly MarkdownView _welcomeMarkdown = new(new MarkdownView.Options());
private readonly MarkdownView _gettingStartedMarkdown = new(new MarkdownView.Options());
private bool _isInitialized;
private Tab _activeTab = Tab.Welcome;
}