half working user pattern management

This commit is contained in:
Felix Roos 2023-10-29 14:00:13 +01:00
parent a2077f7be1
commit 53160c638a
4 changed files with 115 additions and 12 deletions

View file

@ -1,6 +1,7 @@
import { persistentMap } from '@nanostores/persistent';
import { useStore } from '@nanostores/react';
import { register } from '@strudel.cycles/core';
import * as tunes from './repl/tunes.mjs';
export const defaultSettings = {
activeFooter: 'intro',
@ -16,6 +17,7 @@ export const defaultSettings = {
soundsFilter: 'all',
panelPosition: 'bottom',
userPatterns: '{}',
activePattern: '',
};
export const settingsMap = persistentMap('strudel-settings', defaultSettings);
@ -59,6 +61,10 @@ export const settingPatterns = { theme, fontFamily, fontSize };
function getUserPatterns() {
return JSON.parse(settingsMap.get().userPatterns);
}
function getSetting(key) {
return settingsMap.get()[key];
}
function setUserPatterns(obj) {
settingsMap.setKey('userPatterns', JSON.stringify(obj));
}
@ -80,9 +86,68 @@ export function newUserPattern() {
const todays = Object.entries(userPatterns).filter(([name]) => name.startsWith(date));
const num = String(todays.length + 1).padStart(3, '0');
const defaultNewPattern = 's("hh")';
addUserPattern(date + '_' + num, { code: defaultNewPattern });
const name = date + '_' + num;
addUserPattern(name, { code: defaultNewPattern });
setActivePattern(name);
return name;
}
export function clearUserPatterns() {
setUserPatterns({});
}
export function getNextCloneName(key) {
const userPatterns = getUserPatterns();
const clones = Object.entries(userPatterns).filter(([name]) => name.startsWith(key));
const num = String(clones.length + 1).padStart(3, '0');
return key + '_' + num;
}
export function getUserPattern(key) {
const userPatterns = getUserPatterns();
return userPatterns[key];
}
export function updateUserPattern(code) {
const userPatterns = getUserPatterns();
let activePattern = getSetting('activePattern');
console.log('update', activePattern, code);
if (!activePattern) {
activePattern = newUserPattern();
setUserPatterns({ ...userPatterns, [activePattern]: { code } });
setActivePattern(activePattern);
} else if (!!tunes[activePattern] && code !== tunes[activePattern]) {
// is example / system pattern
activePattern = getNextCloneName(activePattern);
setUserPatterns({ ...userPatterns, [activePattern]: { code } });
setActivePattern(activePattern);
}
}
export function deleteActivePattern() {
let activePattern = getSetting('activePattern');
if (!activePattern) {
console.warn('cannot delete: no pattern selected');
return;
}
const userPatterns = getUserPatterns();
setUserPatterns(Object.fromEntries(Object.entries(userPatterns).filter(([key]) => key !== activePattern)));
setActivePattern('');
}
export function duplicateActivePattern() {
let activePattern = getSetting('activePattern');
let latestCode = getSetting('latestCode');
if (!activePattern) {
console.warn('cannot duplicate: no pattern selected');
return;
}
const userPatterns = getUserPatterns();
activePattern = getNextCloneName(activePattern);
setUserPatterns({ ...userPatterns, [activePattern]: { latestCode } });
setActivePattern(activePattern);
}
export function setActivePattern(key) {
settingsMap.setKey('activePattern', key);
}