機(jī)制與 WelcomeWindow 側(cè)邊欄結(jié)構(gòu)實(shí)現(xiàn))
TiXL 歡迎窗口解析VersionMarker 版本觸發(fā)機(jī)制與 WelcomeWindow 側(cè)邊欄結(jié)構(gòu)實(shí)現(xiàn)【免費(fèi)下載鏈接】t3TiXL is an open source software to create realtime motion graphics.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/t3/t3本文以 TiXL 編輯器內(nèi)置的啟動(dòng)歡迎窗口Welcome Window為主題講清它的定位與觸發(fā)規(guī)則首次啟動(dòng)自動(dòng)彈出、Help 菜單可隨時(shí)重新打開、“Show on startup” 開關(guān)控制每次啟動(dòng)是否問候、穩(wěn)定版與 Alpha 預(yù)覽版各自顯示哪個(gè)窗口。結(jié)合 WelcomeWindow.cs、VersionMarker.cs、T3Ui.Update.cs 等源碼你將掌握這套“版本標(biāo)記 → 啟動(dòng)判定 → 窗口裝配”的完整調(diào)用鏈以及窗口內(nèi)三個(gè)標(biāo)簽頁(yè)Welcome / Getting Started / Release Notes的實(shí)現(xiàn)方式甚至了解 Alpha 窗口如何承擔(dān)設(shè)置與項(xiàng)目遷移的職責(zé)。歡迎窗口是什么、何時(shí)出現(xiàn)TiXL 的啟動(dòng)對(duì)話框在啟動(dòng)時(shí)顯示介紹當(dāng)前版本并引導(dǎo)用戶進(jìn)入上手流程。根據(jù) WelcomeWindow.md 的官方描述它的行為契約是首次啟動(dòng)自動(dòng)彈出針對(duì)“用戶在此設(shè)置文件夾中從未運(yùn)行過(guò)該版本”的情形自動(dòng)顯示可隨時(shí)重開通過(guò)Help → Welcome菜單項(xiàng)重新打開內(nèi)容組成歡迎頁(yè)介紹 發(fā)布說(shuō)明、Getting Started 頁(yè)教程與社區(qū)鏈接、Projects 頁(yè)跳回某個(gè)項(xiàng)目“show on startup” 開關(guān)控制是否每次啟動(dòng)都彈出該窗口預(yù)覽構(gòu)建走獨(dú)立窗口Alpha 預(yù)覽版顯示的是另一個(gè) Welcome alpha window它額外幫助遷移設(shè)置與項(xiàng)目并鏈接引導(dǎo)式功能測(cè)試。在源碼中這套契約由 WelcomeWindow.cs 類注釋完整對(duì)應(yīng)“Floating, non-modal welcome window for stable builds, shown the first time a user runs a version they havent run in this folder before”并標(biāo)注了[HelpUiID(WelcomeWindow)]特性——該特性是幫助文檔體系與 UI 窗口之間的注冊(cè)紐帶參見 HelpUiIDAttribute.cs 的說(shuō)明[HelpUiID(Timeline)]對(duì)應(yīng)幫助主題ui:Timeline同理[HelpUiID(WelcomeWindow)]對(duì)應(yīng)ui:WelcomeWindow。觸發(fā)機(jī)制VersionMarker 如何判定“新版本”歡迎窗口“只在首次遇到某版本時(shí)彈出”的核心依據(jù)是 VersionMarker.cs 中的靜態(tài)類。它在設(shè)置目錄下維護(hù)一個(gè)versionMarker.json標(biāo)記文件private static string FilePath Path.Combine(FileLocations.SettingsDirectory, versionMarker.json); private static void LoadLastRunVersion() { var data JsonUtils.TryLoadingJsonMarkerData(FilePath); ... return Version.TryParse(data.LastRunVersion, out var version) ? version : null; }VersionMarker.Classify()將每次啟動(dòng)歸類為三種狀態(tài)LaunchKind枚舉枚舉值含義判定條件Silent與上次運(yùn)行同版本不彈窗標(biāo)記版本 當(dāng)前構(gòu)建版本NewToUser還沒有標(biāo)記或標(biāo)記比當(dāng)前構(gòu)建舊彈歡迎窗口無(wú)標(biāo)記 或 當(dāng)前版本 標(biāo)記版本Downgrade標(biāo)記記錄了比當(dāng)前構(gòu)建更新的版本用戶降版本保持安靜并保留標(biāo)記當(dāng)前版本 標(biāo)記版本值得注意的設(shè)計(jì)細(xì)節(jié)在MarkCurrentVersionSeen()它拒絕把記錄的版本往下降——public static void MarkCurrentVersionSeen() { var previous LastRunVersion; if (previous ! null RuntimeAssemblies.Version.CompareTo(previous) 0) return; ... }也就是說(shuō)如果用戶從高版本臨時(shí)切回低版本運(yùn)行標(biāo)記不會(huì)被回退從而不會(huì)壓制掉“用戶真正在用的那個(gè)新版”下次啟動(dòng)時(shí)的歡迎彈窗。這是從源碼結(jié)構(gòu)中可以直接讀到的容錯(cuò)設(shè)計(jì)。啟動(dòng)流程中的實(shí)際調(diào)用鏈判定邏輯在編輯器主更新循環(huán)中被消費(fèi)。T3Ui.Update.cs 的CheckForVersionWelcome()完整呈現(xiàn)了觸發(fā)時(shí)序private static void CheckForVersionWelcome() { if (_versionWelcomeChecked || !IsWindowLayoutComplete() || IsAnyPopupOpen) return; _versionWelcomeChecked true; var isNewVersion VersionMarker.Classify() VersionMarker.LaunchKind.NewToUser; // Snapshot existing projects before the first save can upgrade them to the new file format. // Runs before the marker is written (on welcome-window close) so a crash mid-pass retries. if (isNewVersion) AutoBackup.PreUpgradeSnapshot.CreateForExistingProjects(); if (UserSettings.Config.ShowWelcomeOnStartup || isNewVersion) WindowManager.WelcomeWindow.Open(); else VersionMarker.MarkCurrentVersionSeen(); }從源碼結(jié)構(gòu)看這里有三層值得展開的細(xì)節(jié)“Show on startup” 開關(guān)的語(yǔ)義彈窗條件是ShowWelcomeOnStartup || isNewVersion。即開關(guān)只決定“同版本再啟動(dòng)是否問候”遇到新版本則無(wú)論開關(guān)如何都會(huì)彈出——與文檔中“a show on startup toggle controls whether it greets you each time”的表述完全吻合。該開關(guān)字段定義在 UserSettings.cs 中public bool ShowWelcomeOnStartup true;默認(rèn)開啟前置升級(jí)快照PreUpgradeSnapshot在新版本首次啟動(dòng)時(shí)系統(tǒng)會(huì)先把既有項(xiàng)目做快照備份且刻意安排在“標(biāo)記寫入”發(fā)生在歡迎窗口關(guān)閉時(shí)之前執(zhí)行——源碼注釋明確寫道“so a crash mid-pass retries”即如果快照過(guò)程中崩潰下次啟動(dòng)仍會(huì)重試窗口關(guān)閉時(shí)落盤標(biāo)記WelcomeWindowBase.cs 的Close()統(tǒng)一調(diào)用VersionMarker.MarkCurrentVersionSeen()保證“標(biāo)記版本已見過(guò)”只發(fā)生在用戶實(shí)際看到歡迎窗口之后。另外幫助入口由 WindowManager.cs 與 AppMenuBar.cs 中的 Help → Welcome 菜單項(xiàng)負(fù)責(zé)重開窗口對(duì)應(yīng)WindowManager.WelcomeWindow.Open()基類中即Config.Visible true。共享外殼WelcomeWindowBase 的窗口形態(tài)穩(wěn)定版WelcomeWindow與 Alpha 版WelcomeAlphaWindow共享 WelcomeWindowBase.cs 提供的“chrome”公共骨架構(gòu)造函數(shù)中確定了窗口形態(tài)private protected WelcomeWindowBase() { WindowPaddingOverride Vector2.Zero; WindowSizeOverride new Vector2(680, 480); WindowFlags ImGuiWindowFlags.NoDocking; CenterOnAppearing true; }即680×480 的浮動(dòng)非模態(tài)窗口、不可停靠、出現(xiàn)時(shí)居中零窗口內(nèi)邊距使側(cè)邊欄像 Settings 窗口一樣貼邊?;愡€提供了三塊公共能力頭部橫幅DrawHeaderBand(heading)大號(hào)版本標(biāo)題如 “Welcome to TiXL v4.3” 右對(duì)齊的 “Show on startup” 復(fù)選框。該復(fù)選框直接讀寫UserSettings.Config.ShowWelcomeOnStartup并立即UserSettings.Save()持久化與 UserSettings.cs 中的字段對(duì)應(yīng)發(fā)布說(shuō)明LoadReleaseNotes()/DrawReleaseNotes()調(diào)用 ReleaseNotesLoader.cs 加載.help/release-notes/vmajor.minor.md每個(gè)小版本一個(gè)文件Alpha 與穩(wěn)定版共用由編輯器的 Markdown 視圖渲染支持text超鏈接和[OperatorName]算子引用點(diǎn)擊可直接打開 Symbol Library關(guān)閉鉤子Close()寫入版本標(biāo)記見上文。倉(cāng)庫(kù)中實(shí)際存在 v4.2.md 與 v4.3.md 兩個(gè)發(fā)布說(shuō)明文件可佐證“按小版本組織”的加載約定ReleaseNotesLoader在找不到匹配文件或讀取失敗時(shí)返回 null窗口則顯示 “No release notes for this version yet.”。穩(wěn)定版窗口三個(gè)標(biāo)簽頁(yè)的內(nèi)容裝配WelcomeWindow標(biāo)題 “Welcome to TiXL”按 Settings 風(fēng)格的側(cè)邊欄分為三個(gè)標(biāo)簽頁(yè)全部由 WelcomeWindow.cs 中的DrawSidebar()與DrawContentPanel()驅(qū)動(dòng)1. Welcome 頁(yè)——先用DrawPreUpgradeBackupNotice()檢查 PreUpgradeSnapshot.Created若存在升級(jí)前備份會(huì)以醒目樣式列出每條備份的項(xiàng)目名與 zip 絕對(duì)路徑并提供 “Reveal” 按鈕通過(guò)CoreUi.Instance.OpenWithDefaultApplication在系統(tǒng)資源管理器中定位提醒用戶可回退到舊版本而不會(huì)丟失工作成果。正文是一段內(nèi)嵌的 Markdown 常量WelcomeMarkdown說(shuō)明 TiXL 是免費(fèi)的開源實(shí)時(shí)運(yùn)動(dòng)圖形編輯器并給出 Discord 社區(qū)鏈接鏈接經(jīng)onUrl回調(diào)用默認(rèn)應(yīng)用打開。2. Getting Started 頁(yè)——渲染GettingStartedMarkdown常量?jī)?nèi)容包括15 分鐘入門視頻、教程播放列表、書面介紹與 FAQ 的 Wiki 鏈接以及一條特別提示如果偏好“在編輯器內(nèi)學(xué)習(xí)”可以關(guān)閉本窗口、跟隨未打開任何項(xiàng)目時(shí)顯示的Skill Quest從基礎(chǔ)到進(jìn)階實(shí)時(shí)圖形的交互式旅程。社區(qū)區(qū)列出 Discord 邀請(qǐng)與社區(qū)作品播放列表。從源碼結(jié)構(gòu)看頁(yè)面鏈接直接硬編碼在 Markdown 常量里社區(qū)入口Discord在 Welcome 頁(yè)與 Getting Started 頁(yè)均有出現(xiàn)。3. Release Notes 頁(yè)——由基類DrawReleaseNotes()渲染當(dāng)前小版本的發(fā)布說(shuō)明見上節(jié)。需要說(shuō)明的一處差異當(dāng)前源碼的側(cè)邊欄只有 Welcome / Getting Started / Release Notes 三項(xiàng)enum Tab定義于 WelcomeWindow.cs。幫助文檔中提到的 “Projects 頁(yè)”跳回項(xiàng)目在當(dāng)前實(shí)現(xiàn)中已由未打開項(xiàng)目時(shí)的項(xiàng)目主界面承擔(dān)——ProjectHub.cs 將ProjectsPanel.Draw與SkillQuestPanel.Draw組合繪制其中 ProjectsPanel.cs 攜帶[HelpUiID(ProjectPanel)]??梢酝茢辔臋n描述的是窗口整體的能力版圖而“項(xiàng)目列表”的具體展示位置隨 UI 演進(jìn)收斂到了 Hub 面板。Alpha 預(yù)覽窗口遷移設(shè)置與項(xiàng)目、鏈接功能測(cè)試文檔最后一條指向獨(dú)立主題 Welcome alpha window對(duì)應(yīng) WelcomeAlphaWindow.cs標(biāo)題 “Welcome to the TiXL Alpha”特性[HelpUiID(WelcomeAlphaWindow)]。它與穩(wěn)定版的分叉點(diǎn)是Alpha 版獨(dú)立目錄策略其 Welcome 頁(yè) Markdown 明確說(shuō)明為避免影響已安裝版本和項(xiàng)目Alpha 版總會(huì)為 Settings 和 Projects 創(chuàng)建自己的文件夾并提供導(dǎo)入選項(xiàng)復(fù)制數(shù)據(jù)過(guò)來(lái)同時(shí)聲明該版本處于活躍開發(fā)中、不建議用于生產(chǎn)工作Import Settings 頁(yè)通過(guò)PreviousVersionImport.TryFindBest定位上一個(gè) TiXL 安裝然后按類別勾選導(dǎo)入 Editor Settings / Themes / Keyboard Maps / Layouts各項(xiàng)可用性分別探測(cè)對(duì)應(yīng)子文件夾是否存在導(dǎo)入后提示 “Restart TiXL to apply” 并提供重啟按鈕EditorRestart.TryRestart()Import Projects 頁(yè)枚舉上一版本的全部項(xiàng)目、勾選復(fù)制已存在的跳過(guò)、已導(dǎo)入的禁用勾選復(fù)制在Task.Run后臺(tái)線程執(zhí)行以免卡死編輯器UI 線程輪詢?nèi)蝿?wù)完成后刷新列表Test new Features 頁(yè)從TestSetParser.LoadAll(TestSetParser.ResolveTestsDirectory())加載引導(dǎo)式功能測(cè)試集選中后WindowManager.GuidedFeatureTestsWindow.StartSet(id)啟動(dòng)——這就是文檔所說(shuō)“l(fā)inks the guided feature tests”的實(shí)現(xiàn)落點(diǎn)。PreviousVersionImport的定位邏輯同樣依賴版本體系PreviousVersionImport.cs 中通過(guò)VersionMarker.LastRunVersion ! null判斷是否存在上一版本的運(yùn)行痕跡與歡迎窗口的觸發(fā)機(jī)制共用同一套版本數(shù)據(jù)源。小結(jié)圍繞這個(gè)看似簡(jiǎn)單的啟動(dòng)對(duì)話框TiXL 實(shí)現(xiàn)了一條職責(zé)清晰的鏈條VersionMarker版本標(biāo)記的讀取、比較、防回退寫入→CheckForVersionWelcome啟動(dòng)時(shí)機(jī)判定 前置升級(jí)快照 “show on startup” 開關(guān)→WelcomeWindowBase浮動(dòng)窗口形態(tài)、頭部橫幅、發(fā)布說(shuō)明渲染、關(guān)閉落盤標(biāo)記→WelcomeWindow/WelcomeAlphaWindow各自的標(biāo)簽頁(yè)內(nèi)容含 Markdown 教程頁(yè)、社區(qū)鏈接、遷移導(dǎo)入與功能測(cè)試入口。相關(guān)源碼集中在 Editor/Gui/Dialog 目錄行為描述以 WelcomeWindow.md 與 WelcomeAlphaWindow.md 兩個(gè)幫助主題為準(zhǔn)。【免費(fèi)下載鏈接】t3TiXL is an open source software to create realtime motion graphics.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/t3/t3創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考