update
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
import { inject, type InjectionKey, ref, getCurrentInstance, watch } from "vue";
|
import { inject, type InjectionKey, ref, getCurrentInstance, watch, computed } from "vue";
|
||||||
import { Bound } from "./utils";
|
import { Bound } from "./utils";
|
||||||
|
|
||||||
export type UITool =
|
export type UITool =
|
||||||
@@ -6,24 +6,49 @@ export type UITool =
|
|||||||
| "sticking";
|
| "sticking";
|
||||||
|
|
||||||
class AppStateStore extends Bound {
|
class AppStateStore extends Bound {
|
||||||
|
private osThemeIsDark = ref(false);
|
||||||
|
private isDarkUser = ref<boolean | null>(null);
|
||||||
selectedTool = ref<UITool>("track-unit-type");
|
selectedTool = ref<UITool>("track-unit-type");
|
||||||
activeTrackUnitType = ref<number | null>(0);
|
activeTrackUnitType = ref<number | null>(0);
|
||||||
activeStickingType = ref<number | null>(1);
|
activeStickingType = ref<number | null>(1);
|
||||||
unitMouseStart = ref<string | null>(null);
|
unitMouseStart = ref<string | null>(null);
|
||||||
selectingUnits = ref(false);
|
selectingUnits = ref(false);
|
||||||
deselectingUnits = ref(false);
|
deselectingUnits = ref(false);
|
||||||
isDark = ref(false);
|
isDark = computed<boolean>({
|
||||||
|
get: () => this.isDarkUser.value === null ? this.osThemeIsDark.value : this.isDarkUser.value,
|
||||||
|
set: (value) => {
|
||||||
|
this.isDarkUser.value = value;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
super();
|
super();
|
||||||
this.isDark.value = localStorage?.getItem("drum-slayer-theme") === "dark";
|
const isDarkUserInitial = localStorage?.getItem("drum-slayer-theme");
|
||||||
|
if (isDarkUserInitial === "dark") {
|
||||||
|
this.isDarkUser.value = true;
|
||||||
|
} else if (isDarkUserInitial === "light") {
|
||||||
|
this.isDarkUser.value = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const mediaQueryList = window.matchMedia("(prefers-color-scheme: dark)");
|
||||||
|
const onMediaChange = (event: MediaQueryListEvent | MediaQueryList) => {
|
||||||
|
this.osThemeIsDark.value = event.matches;
|
||||||
|
};
|
||||||
|
mediaQueryList.onchange = onMediaChange;
|
||||||
|
onMediaChange(mediaQueryList);
|
||||||
|
|
||||||
|
watch(this.isDarkUser, (newIsDarkUser) => {
|
||||||
|
if (typeof newIsDarkUser === "boolean") {
|
||||||
|
localStorage?.setItem("drum-slayer-theme", newIsDarkUser ? "dark" : "light");
|
||||||
|
}
|
||||||
|
}, { immediate: true });
|
||||||
|
|
||||||
watch(this.isDark, (newIsDark) => {
|
watch(this.isDark, (newIsDark) => {
|
||||||
if (newIsDark) {
|
if (newIsDark) {
|
||||||
document.body.classList.add("dark");
|
document.body.classList.add("dark");
|
||||||
} else {
|
} else {
|
||||||
document.body.classList.remove("dark");
|
document.body.classList.remove("dark");
|
||||||
}
|
}
|
||||||
localStorage?.setItem("drum-slayer-theme", newIsDark ? "dark" : "light");
|
|
||||||
}, { immediate: true });
|
}, { immediate: true });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,7 +38,9 @@
|
|||||||
<track-view :beat-index="beatIndex"
|
<track-view :beat-index="beatIndex"
|
||||||
:track-index="element.index" />
|
:track-index="element.index" />
|
||||||
</div>
|
</div>
|
||||||
<track-settings-view v-show="trackSettingsOpen === element.index" :beat-index="beatIndex" :track-index="element.index" />
|
<div class="track-settings-row" v-show="trackSettingsOpen === element.index">
|
||||||
|
<track-settings-view :beat-index="beatIndex" :track-index="element.index" />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</transition-group>
|
</transition-group>
|
||||||
@@ -209,6 +211,12 @@
|
|||||||
opacity: 0;
|
opacity: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.track-settings-row {
|
||||||
|
background-color: var(--color-bg-medium);
|
||||||
|
width: 100%;
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
.vertical-mode {
|
.vertical-mode {
|
||||||
.beat-title {
|
.beat-title {
|
||||||
color: var(--color-title-light);
|
color: var(--color-title-light);
|
||||||
|
|||||||
@@ -51,12 +51,6 @@
|
|||||||
@click="toggleOrientation">
|
@click="toggleOrientation">
|
||||||
<icon icon-name="arrowClockwise" color="var(--color-ui-neutral-dark)" />
|
<icon icon-name="arrowClockwise" color="var(--color-ui-neutral-dark)" />
|
||||||
</div>
|
</div>
|
||||||
<div
|
|
||||||
class="quick-access-button"
|
|
||||||
title="Bake all tracks"
|
|
||||||
@click="bakeAll">
|
|
||||||
<icon icon-name="snowflake" color="var(--color-ui-neutral-dark)" />
|
|
||||||
</div>
|
|
||||||
<div
|
<div
|
||||||
class="quick-access-button"
|
class="quick-access-button"
|
||||||
title="Reset all"
|
title="Reset all"
|
||||||
|
|||||||
@@ -1,13 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="track-settings" v-if="track && beat">
|
<div class="track-settings" v-if="track && beat">
|
||||||
<action-button icon-name="snowflake" type="secondary" alt="Bake Loops" :disabled="!track.looping.value" @click="track.bakeLoops()" />
|
|
||||||
<action-button icon-name="trash" type="secondary" alt="Delete Track" @click="beat.removeTrack(trackIndex)" />
|
|
||||||
<div class="loop-settings">
|
|
||||||
<bool-box label="Loop:" v-model="track.looping.value" />
|
<bool-box label="Loop:" v-model="track.looping.value" />
|
||||||
</div>
|
|
||||||
<div class="loop-settings-option" :class="{ hide: !track.looping.value }">
|
|
||||||
<number-input v-model="track.loopLength.value" />
|
<number-input v-model="track.loopLength.value" />
|
||||||
</div>
|
<action-button v-show="track.looping.value" icon-name="snowflake" type="secondary" alt="Bake Loops" @click="track.bakeLoops()" />
|
||||||
|
<bool-box label="Auto beat length:" v-model="beat.useAutoBeatLength.value" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -31,35 +27,18 @@
|
|||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
.track-settings {
|
.track-settings {
|
||||||
height: 3.5em;
|
height: 3.5em;
|
||||||
display: flex;
|
display: inline-flex;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-between;
|
|
||||||
margin-bottom: 0.5em;
|
|
||||||
background-color: var(--color-bg-medium);
|
|
||||||
|
|
||||||
.loop-settings {
|
.loop-settings {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
flex: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.loop-settings-option.hide {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.loop-settings-option {
|
|
||||||
flex: auto;
|
|
||||||
padding-right: 1em;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
> * {
|
> * {
|
||||||
margin-right: 0.2em;
|
margin-right: 0.2em;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
margin-right: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.visibility {
|
.visibility {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user