狀態管理
編輯器將其介面狀態儲存在一個 Redux store 中。本頁列出構成該 store 的實際 reducer,並解釋 action creator、選擇器和中介軟體如何圍繞它們組織。
Store 形狀
store 在 src/lib/components/app-state-hoc.jsx 中從三個頂層 reducer 建立:
scratchGui是編輯器狀態樹,在src/reducers/gui.js中建置。locales持有活動語言和 RTL 標誌(src/reducers/locales.js)。scratchPaint是造型編輯器自己的 store,從 scratch-paint 匯入。
編輯器觸及的幾乎所有內容都在 scratchGui 下。該切片本身在 src/reducers/gui.js 中用 combineReducers 組裝,src/reducers/ 中每個檔案對應一個子 reducer。
Reducers
下面的每個條目都是組合進 scratchGui 的真實切片,定義它的檔案在 src/reducers/。讀取狀態意味著 state.scratchGui.<slice>。
專案生命週期
projectState(project-state.js)跟蹤當前專案的載入、儲存和錯誤狀態,並匯出getIsError和getIsShowingProject等選擇器。projectTitle(project-title.js)是專案名稱。projectChanged(project-changed.js)跟蹤是否有未儲存的更改。autosave(autosave.js)持有自動儲存狀態。
執行時和 VM
vm(vm.js)持有唯一的 VM 實例(在這裡建立一次)和任何其他可序列化的東西。vmStatus(vm-status.js)映象執行、啟動和渦輪狀態。tw(tw.js)持有 TurboWarp 執行時選項:幀率、插值、編譯器選項、編譯錯誤、雲端變數存在性和平臺不匹配詳情。
目標和監視器
targets(targets.js)是角色和舞臺列表以及正在編輯的目標。hoveredTarget(hovered-target.js)跟蹤拖放的懸停角色。monitors(monitors.js)持有變數和列表監視器,monitorLayout(monitor-layout.js)跟蹤它們的位置。
編輯器佈局和標籤頁
mode(mode.js)是佈局的大切片:isPlayerOnly、isFullScreen、isEmbedded。它決定渲染完整編輯器還是隻渲染播放器。editorTab(editor-tab.js)是活動標籤頁(程式碼、造型、聲音)。stageSize(stage-size.js)和customStageSize(custom-stage-size.js)控制舞臺尺寸。workspaceMetrics(workspace-metrics.js)按目標記住積木工作區的滾動和縮放。toolbox(toolbox.js)持有積木區 XML 狀態。
模態視窗、選單和覆蓋層
modals(modals.js)是哪些模態視窗開啟的地圖(素材庫、設定、git、還原點、字型、資產、偵錯器等),由openModal/closeModalaction creator 切換。menus(menus.js)跟蹤哪些選單欄下拉框開啟。cards(cards.js)是教程卡片組,alerts(alerts.js)是警報佇列,toast(toast.js)是短暫的 toast 訊息。connectionModal(connection-modal.js)是周邊連線狀態。colorPicker(color-picker.js)支撐取色器。micIndicator(mic-indicator.js)是麥克風電平指示器。onboarding(onboarding.js)驅動首次執行的引導流程。
拖動、恢復和歷史
blockDrag(block-drag.js)和assetDrag(asset-drag.js)跟蹤進行中的拖動。restoreDeletion(restore-deletion.js)支撐"恢復最後刪除的"操作。timeTravel(time-travel.js)持有積木主題的"年份",用於重新鍵控積木工作區。
主題
theme(theme.js)持有當前Theme物件,並在它更改時應用其顏色。mwProjectTheme(mw-project-theme.js)支撐應用嵌入專案中的主題的提示。請參閱主題。
Bilup 新增和其他
rotur(rotur.js)持有社群整合使用的 Bilup Accounts 帳戶和會話狀態。collaboration(collaboration.js)持有即時協作狀態。shortcuts(shortcuts.js)持有鍵盤快速鍵配置。fontsLoaded(fonts-loaded.js)跟蹤字型載入,timeout(timeout.js)是一個小型共享超時切片。
Action creator 和選擇器
每個 reducer 檔案遵循相同的約定:它定義其 action 型別常量和 reducer,並預設匯出 reducer 加上它的 action creator(有時還有選擇器和它的 initialState)。例如 theme.js 匯出 setTheme,vm.js 匯出 setVM,project-state.js 在其 actions 旁邊匯出 getIsError 等選擇器。
容器直接匯入這些。mapStateToProps 讀取切片(或呼叫選擇器),mapDispatchToProps 包裹一個匯入的 action creator,使元件接收普通的回呼。模式請參閱容器。
初始狀態和渲染模式
gui.js 還匯出 guiInitialState 以及為受限檢視轉換它的輔助工具:initPlayer、initFullScreen 和 initEmbedded。AppStateHOC 在建立 store 之前應用這些,因此同樣的 reducer 可以支撐完整編輯器、播放器或嵌入,只在 mode 切片上有所不同。
中介軟體
scratchGui store 用一箇中間件 guiMiddleware 增強,定義在 gui.js 中。它是配置為合併快速重複 actions(leading 和 trailing,300 毫秒)的 redux-throttle,這防止來自 VM 的高頻更新壓垮 React。AppStateHOC 還包裹組合的 reducer 以在每個 action 後通知外掛系統(AddonHooks.appStateReducer),並在 window.ReduxStore 上暴露 store 供除錯和外掛使用。