Experimental API for forgetting objects/sheet (#393)

This commit is contained in:
Aria 2023-03-08 13:08:55 +01:00 committed by GitHub
parent 583dd9d022
commit 7c410014e1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 71 additions and 2 deletions

View file

@ -19,6 +19,8 @@ import {
__experimental_disblePlayPauseKeyboardShortcut, __experimental_disblePlayPauseKeyboardShortcut,
__experimental_enablePlayPauseKeyboardShortcut, __experimental_enablePlayPauseKeyboardShortcut,
} from './UIRoot/useKeyboardShortcuts' } from './UIRoot/useKeyboardShortcuts'
import type TheatreSheetObject from '@theatre/core/sheetObjects/TheatreSheetObject'
import type TheatreSheet from '@theatre/core/sheets/TheatreSheet'
export interface ITransactionAPI { export interface ITransactionAPI {
/** /**
@ -60,6 +62,21 @@ export interface ITransactionAPI {
* @param pointer - A pointer, like object.props * @param pointer - A pointer, like object.props
*/ */
unset<V>(pointer: Pointer<V>): void unset<V>(pointer: Pointer<V>): void
/**
* EXPERIMENTAL API - this api may be removed without notice.
*
* Makes Theatre forget about this object. This means all the prop overrides and sequenced props
* will be reset, and the object won't show up in the exported state.
*/
__experimental_forgetObject(object: TheatreSheetObject): void
/**
* EXPERIMENTAL API - this api may be removed without notice.
*
* Makes Theatre forget about this sheet.
*/
__experimental_forgetSheet(sheet: TheatreSheet): void
} }
/** /**
* *
@ -474,8 +491,37 @@ export default class TheatreStudio implements IStudio {
} }
transaction(fn: (api: ITransactionAPI) => void): void { transaction(fn: (api: ITransactionAPI) => void): void {
return getStudio().transaction(({set, unset}) => { return getStudio().transaction(({set, unset, stateEditors}) => {
return fn({set, unset}) const __experimental_forgetObject = (object: TheatreSheetObject) => {
if (!isSheetObjectPublicAPI(object)) {
throw new Error(
`object in transactionApi.__experimental_forgetObject(object) must be the return type of sheet.object(...)`,
)
}
stateEditors.coreByProject.historic.sheetsById.forgetObject(
object.address,
)
}
const __experimental_forgetSheet = (sheet: TheatreSheet) => {
if (!isSheetPublicAPI(sheet)) {
throw new Error(
`sheet in transactionApi.__experimental_forgetSheet(sheet) must be the return type of project.sheet()`,
)
}
stateEditors.coreByProject.historic.sheetsById.forgetSheet(
sheet.address,
)
}
return fn({
set,
unset,
__experimental_forgetObject,
__experimental_forgetSheet,
})
}) })
} }

View file

@ -622,6 +622,29 @@ namespace stateEditors {
return sheetsById[p.sheetId]! return sheetsById[p.sheetId]!
} }
export function forgetObject(
p: WithoutSheetInstance<SheetObjectAddress>,
) {
const sheetState =
drafts().historic.coreByProject[p.projectId].sheetsById[p.sheetId]
if (!sheetState) return
delete sheetState.staticOverrides.byObject[p.objectKey]
const sequence = sheetState.sequence
if (!sequence) return
delete sequence.tracksByObject[p.objectKey]
}
export function forgetSheet(p: WithoutSheetInstance<SheetAddress>) {
const sheetState =
drafts().historic.coreByProject[p.projectId].sheetsById[p.sheetId]
if (sheetState) {
delete drafts().historic.coreByProject[p.projectId].sheetsById[
p.sheetId
]
}
}
export namespace sequence { export namespace sequence {
export function _ensure( export function _ensure(
p: WithoutSheetInstance<SheetAddress>, p: WithoutSheetInstance<SheetAddress>,