mirror of
https://github.com/Macrame-App/Macrame
synced 2025-12-29 07:19:26 +00:00
WIP: Pinia Macro Recorder Store. Used for main Macro recording functionality.
This commit is contained in:
parent
6b2402a7d7
commit
e2df20819f
1 changed files with 141 additions and 0 deletions
141
fe/src/stores/macrorecorder.js
Normal file
141
fe/src/stores/macrorecorder.js
Normal file
|
|
@ -0,0 +1,141 @@
|
||||||
|
import { ref } from 'vue'
|
||||||
|
import { defineStore } from 'pinia'
|
||||||
|
|
||||||
|
import { filterKey, isRepeat } from '../services/MacroRecordService'
|
||||||
|
|
||||||
|
export const useMacroRecorderStore = defineStore('macrorecorder', () => {
|
||||||
|
// Properties - State values
|
||||||
|
const state = ref({
|
||||||
|
record: false,
|
||||||
|
edit: false,
|
||||||
|
editKey: false,
|
||||||
|
editDelay: false,
|
||||||
|
})
|
||||||
|
|
||||||
|
const steps = ref([])
|
||||||
|
|
||||||
|
const delay = ref({
|
||||||
|
start: 0,
|
||||||
|
fixed: false,
|
||||||
|
})
|
||||||
|
|
||||||
|
// Getters - Computed values
|
||||||
|
const getEditKey = () => steps.value[state.value.editKey]
|
||||||
|
const getAdjacentKey = (pos, includeDelay = false) => {
|
||||||
|
let returnVal = false
|
||||||
|
|
||||||
|
const mod = pos == 'before' ? -1 : 1
|
||||||
|
const keyIndex = state.value.editKey + 2 * mod
|
||||||
|
const delayIndex = includeDelay ? state.value.editKey + 1 * mod : false
|
||||||
|
|
||||||
|
if (steps.value[keyIndex]) returnVal = steps.value[keyIndex]
|
||||||
|
if (delayIndex && steps.value[delayIndex])
|
||||||
|
returnVal = { delay: steps.value[delayIndex], key: steps.value[keyIndex] }
|
||||||
|
|
||||||
|
return returnVal
|
||||||
|
}
|
||||||
|
|
||||||
|
const getEditDelay = () => steps.value[state.value.editDelay]
|
||||||
|
|
||||||
|
// Setters - Actions
|
||||||
|
const recordStep = (e, direction = false, key = false) => {
|
||||||
|
const lastStep = steps.value[steps.value.length - 1]
|
||||||
|
|
||||||
|
let stepVal = {}
|
||||||
|
|
||||||
|
if (typeof e === 'object' && !isRepeat(lastStep, e, direction)) {
|
||||||
|
if (key === false) recordDelay()
|
||||||
|
|
||||||
|
stepVal = {
|
||||||
|
type: 'key',
|
||||||
|
key: e.key,
|
||||||
|
code: e.code,
|
||||||
|
location: e.location,
|
||||||
|
direction: direction,
|
||||||
|
keyObj: filterKey(e),
|
||||||
|
}
|
||||||
|
} else if (direction && key !== false) {
|
||||||
|
stepVal = steps.value[key]
|
||||||
|
stepVal.direction = direction
|
||||||
|
} else if (typeof e === 'number') {
|
||||||
|
stepVal = { type: 'delay', value: parseFloat(e.toFixed()) }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key !== false) steps.value[key] = stepVal
|
||||||
|
else steps.value.push(stepVal)
|
||||||
|
}
|
||||||
|
|
||||||
|
const recordDelay = () => {
|
||||||
|
if (delay.value.fixed !== false)
|
||||||
|
recordStep(delay.value.fixed) // Record fixed delay
|
||||||
|
else if (delay.value.start == 0)
|
||||||
|
delay.value.start = performance.now() // Record start of delay
|
||||||
|
else {
|
||||||
|
recordStep(performance.now() - delay.value.start) // Record end of delay
|
||||||
|
delay.value.start = performance.now() // Reset start
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const deleteEditKey = () => {
|
||||||
|
steps.value.splice(state.value.editKey, 2)
|
||||||
|
state.value.editKey = false
|
||||||
|
}
|
||||||
|
|
||||||
|
const restartDelay = () => {
|
||||||
|
delay.value.start = performance.now()
|
||||||
|
}
|
||||||
|
|
||||||
|
const changeDelay = (fixed) => {
|
||||||
|
delay.value.fixed = fixed
|
||||||
|
|
||||||
|
formatDelays()
|
||||||
|
}
|
||||||
|
|
||||||
|
const formatDelays = () => {
|
||||||
|
steps.value = steps.value.map((step) => {
|
||||||
|
if (step.type === 'delay' && delay.value.fixed !== false) step.value = delay.value.fixed
|
||||||
|
return step
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const toggleEdit = (type, key) => {
|
||||||
|
if (type === 'key') {
|
||||||
|
state.value.editKey = key
|
||||||
|
state.value.editDelay = false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (type === 'delay') {
|
||||||
|
state.value.editKey = false
|
||||||
|
state.value.editDelay = key
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const resetEdit = () => {
|
||||||
|
state.value.edit = false
|
||||||
|
state.value.editKey = false
|
||||||
|
state.value.editDelay = false
|
||||||
|
}
|
||||||
|
|
||||||
|
const reset = () => {
|
||||||
|
state.value.record = false
|
||||||
|
steps.value = []
|
||||||
|
|
||||||
|
if (state.value.edit) resetEdit()
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
state,
|
||||||
|
steps,
|
||||||
|
delay,
|
||||||
|
getEditKey,
|
||||||
|
getAdjacentKey,
|
||||||
|
getEditDelay,
|
||||||
|
recordStep,
|
||||||
|
deleteEditKey,
|
||||||
|
restartDelay,
|
||||||
|
changeDelay,
|
||||||
|
toggleEdit,
|
||||||
|
resetEdit,
|
||||||
|
reset,
|
||||||
|
}
|
||||||
|
})
|
||||||
Loading…
Add table
Add a link
Reference in a new issue