Skip to content

Commit

Permalink
デフォルトプリセットを追加 (#1228)
Browse files Browse the repository at this point in the history
* voiceからuuidv5を生成する関数を追加

* 対応するデフォルトプリセットが一番上に来るように変更

* presetにisDefaultを追加

* 選択中のstyle以外のデフォルトプリセットを表示しない

* デフォルトプリセットは一覧に表示しない

* デフォルトプリセットのkeysが並び替え時に消えないように

* キャラ変更時にデフォルトプリセットを割り当てる

* voice切り替え時にデフォルトプリセットがなければ作成する

* 同名のプリセットがUI上からは作成できないことが分かったのでuuidをnameに振る

* プリセットをデフォルトプリセットのまま更新できるようにした

* 新規作成時の候補にデフォルトプリセットが出てこないようにする

* defaultPresetKeyMapの持ち方を変更、VoiceIdをBranded Typesに

* どうするか未定のところなのでコメント追加

* 立ち上げ時、新規プロジェクト作成時にも初期化を含める

さすがにもっと良いやり方がありそう

* enableDefaultPresetをUIで保存できるように

* enableDefaultPresetが有効なときのみ適用する

* 未使用importの削除

* mainの変更に追従

* StyleIdの対応

* getters.CHARACTER_NAMEを定義

* デフォルトプリセット名にキャラ名とスタイル名を含める

* コメント修正

* 名前を特別扱いしていた部分を元に戻す

* 逆

* もうデフォルトプリセットを上書きされても困らないので許容する

* 何に対してのdefaultPresetKeyか分かりにくい気がしたので明示する

* 空文字かもしれないので既存の処理に合わせておく

* コメント修正

* もう先にpresetKeyを確保しておく必要はないので元に戻す

* COMMAND_CHANGE_VOICEの時以外はundoさせない

* 未使用の型を削除

* 未使用の定義を削除

* action1つ叩くだけだったのでaudioQueryから初期値を取る

* 未使用なので削除

* uiLocked中にプリセット周りが操作可能だったのでできなくした

* 差分を減らす

* defaultPreset自体は問答無用で導入してしまい、自動で適用するか否かにする

* テスト追加

* デフォルトプリセットの名前を変更

* プリセット機能をOFF->ONにしたときに「自動でデフォルトプリセットを割り当てる」もONにする

* 他のキャラが前のキャラのデフォルトプリセットを引き継がないようにする

* デフォルトプリセットが起動時にすべて作られていることにして適用だけにする

* デフォルトプリセットを起動時に全部作る

* 起動時にデフォルトプリセットはすべて作られているのでここで作る必要なし

* プリセットを切り替えた際にapplyしてなかったのを修正

* 項目名と説明と挙動を合致させる

* パラメータ引継ぎがONのときはプリセットをapplyしない

* npm run fmt

* プリセット機能がOFFのときもデフォルトプリセットを割り当てる

* GENERATE_AUDIO_ITEMの中でやってしまった方が良い

* 未使用なので削除

* 説明の変更

* プリセットをapplyするか否かをgetterに定義して条件をそろえた

* 最初のAudioCellにデフォルトプリセットが割り当たっていないケースを修正

* voice変更の際も挙動を合わせる

* まだkeyが発行されていないaudioItemにpresetをapplyできるようにする

* 割り当てるpresetKeyを決定する関数を切り出し

* GENERATE_AUDIO_ITEM内でプリセットを適用してしまう

* プリセットはもはやパラメータの一部なので、baseAudioItemのpresetKeyを優先する

* もはや不要

* 差分減らす

* コメント修正

* もはや不要

* 差分を減らす

* preset引数は使ってないので削除

* PresetKey型に変更する

* baseAudioItemはとりあえず渡して、GENERATE_AUDIO_ITEMの中で無視するか決める

* 空のやつ作ったときにデフォルトプリセットが割り当たってないのを修正

* とりあえず設定名と変数名を変える

* 表に従って実装

* フローを見ないと分からん書き方はやめる

* 分岐をちょっと減らす

* 変数名変える

* 説明文変更

* defaultPresetKeyMap -> defaultPresetKeys

* VoiceIdが引数にVoiceを取るようにする

* VoiceIdのstringが変わってないテスト

* 初期値は直書きで良い

* CREATE_DEFAULT_PRESET_IF_NEEDEDはon demandに作っていた頃の名残なので消す

* 謎に読んでいるgetSettingsを削除

* RollbackStyleIdの方が適切らしい

* 外から与えない方が良いらしい

* COMMAND_REGISTER_AUDIO_ITEMでapplyPresetしようとするのをやめる

* ややこしいのでif文の条件にstate.inheritAudioInfoを足す

* Update src/store/audio.ts

Co-authored-by: Hiroshiba <hihokaruta@gmail.com>

* CHARACTER_NAME -> VOICE_NAME

* Update src/store/audio.ts

Co-authored-by: Hiroshiba <hihokaruta@gmail.com>

* isDefaultPresetでいい

* Update src/components/SettingDialog.vue

Co-authored-by: Hiroshiba <hihokaruta@gmail.com>

* Update src/store/audio.ts

Co-authored-by: Hiroshiba <hihokaruta@gmail.com>

* 移した

* Update tests/unit/lib/voice.spec.ts

Co-authored-by: Hiroshiba <hihokaruta@gmail.com>

* Update tests/unit/lib/voice.spec.ts

Co-authored-by: Hiroshiba <hihokaruta@gmail.com>

* hasBaseAudioItem -> shouldCopyBaseAudioItem

* テスト修正

---------

Co-authored-by: Hiroshiba <hihokaruta@gmail.com>
  • Loading branch information
k-chop and Hiroshiba authored Mar 19, 2023
1 parent 62c5864 commit c3e90fa
Show file tree
Hide file tree
Showing 14 changed files with 458 additions and 72 deletions.
32 changes: 27 additions & 5 deletions src/components/AudioInfo.vue
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<div v-if="enablePreset" class="q-px-md">
<div class="row items-center no-wrap q-mb-xs">
<div class="text-body1">プリセット</div>
<q-btn dense flat icon="more_vert">
<q-btn dense flat icon="more_vert" :disable="uiLocked">
<q-menu transition-duration="100">
<q-list>
<q-item
Expand Down Expand Up @@ -54,6 +54,7 @@
dense
transition-show="none"
transition-hide="none"
:disable="uiLocked"
>
<template v-slot:selected-item="scope">
<div class="preset-select-label">
Expand Down Expand Up @@ -498,6 +499,7 @@ import {
} from "@/type/preload";
import { previewSliderHelper } from "@/helpers/previewSliderHelper";
import { EngineManifest } from "@/openapi";
import { useDefaultPreset } from "@/composables/useDefaultPreset";
const props =
defineProps<{
Expand Down Expand Up @@ -789,6 +791,12 @@ const isRegisteredPreset = computed(
presetItems.value[audioPresetKey.value] != undefined
);
const { isDefaultPresetKey, getDefaultPresetKeyForVoice } = useDefaultPreset();
const currentDefaultPresetKey = computed(() =>
getDefaultPresetKeyForVoice(audioItem.value.voice)
);
// 入力パラメータがプリセットから変更されたか
const isChangedPreset = computed(() => {
if (!isRegisteredPreset.value) return false;
Expand Down Expand Up @@ -844,14 +852,27 @@ const presetList = computed<{ label: string; key: PresetKey }[]>(() =>
// セルへのプリセットの設定
const selectablePresetList = computed<PresetSelectModelType[]>(() => {
const restPresetList = [];
const topPresetList: { key: PresetKey | undefined; label: string }[] = [];
if (isRegisteredPreset.value) {
restPresetList.push({
topPresetList.push({
key: undefined,
label: "プリセット解除",
});
}
return [...restPresetList, ...presetList.value];
// 選択中のstyleのデフォルトプリセットは常に一番上
topPresetList.push(
...presetList.value.filter(
(preset) => preset.key === currentDefaultPresetKey.value
)
);
// 他のstyleのデフォルトプリセットを除外
const commonPresets = presetList.value.filter(
(preset) => !isDefaultPresetKey(preset.key)
);
return [...topPresetList, ...commonPresets];
});
const presetSelectModel = computed<PresetSelectModelType>({
Expand All @@ -861,9 +882,9 @@ const presetSelectModel = computed<PresetSelectModelType>({
label: "プリセット選択",
key: undefined,
};
if (audioPresetKey.value == undefined)
throw new Error("audioPresetKey is undefined"); // 次のコードが何故かコンパイルエラーになるチェック
return {
label: presetItems.value[audioPresetKey.value].name,
key: audioPresetKey.value,
Expand Down Expand Up @@ -933,6 +954,7 @@ const filterPresetOptionsList: QSelectProps["onFilter"] = (
doneFn
) => {
const presetNames = presetKeys.value
.filter((presetKey) => !isDefaultPresetKey(presetKey))
.map((presetKey) => presetItems.value[presetKey]?.name)
.filter((value) => value != undefined);
doneFn(() => {
Expand Down
12 changes: 10 additions & 2 deletions src/components/PresetManageDialog.vue
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,12 @@
</template>

<script setup lang="ts">
import { computed, ref } from "vue";
import { useQuasar } from "quasar";
import { computed, ref } from "vue";
import draggable from "vuedraggable";
import { useStore } from "@/store";
import { useDefaultPreset } from "@/composables/useDefaultPreset";
import { Preset, PresetKey } from "@/type/preload";
const props =
Expand All @@ -63,13 +64,15 @@ const updateOpenDialog = (isOpen: boolean) => emit("update:openDialog", isOpen);
const store = useStore();
const $q = useQuasar();
const { isDefaultPresetKey } = useDefaultPreset();
const presetItems = computed(() => store.state.presetItems);
const presetKeys = computed(() => store.state.presetKeys);
const presetList = computed(() =>
presetKeys.value
.filter((key) => presetItems.value[key] != undefined)
.filter((key) => !isDefaultPresetKey(key))
.map((key) => ({
key,
...presetItems.value[key],
Expand All @@ -83,6 +86,7 @@ const previewPresetList = computed(() =>
isPreview.value
? previewPresetKeys.value
.filter((key) => presetItems.value[key] != undefined)
.filter((key) => !isDefaultPresetKey(key))
.map((key) => ({
key,
...presetItems.value[key],
Expand All @@ -94,9 +98,13 @@ const reorderPreset = (featurePresetList: (Preset & { key: PresetKey })[]) => {
const newPresetKeys = featurePresetList.map((item) => item.key);
previewPresetKeys.value = newPresetKeys;
isPreview.value = true;
// デフォルトプリセットは表示するlistから除外しているので、末尾に追加しておかないと失われる
const defaultPresetKeys = presetKeys.value.filter(isDefaultPresetKey);
store
.dispatch("SAVE_PRESET_ORDER", {
presetKeys: newPresetKeys,
presetKeys: [...newPresetKeys, ...defaultPresetKeys],
})
.finally(() => (isPreview.value = false));
};
Expand Down
41 changes: 40 additions & 1 deletion src/components/SettingDialog.vue
Original file line number Diff line number Diff line change
Expand Up @@ -607,9 +607,37 @@
<q-space />
<q-toggle
:model-value="experimentalSetting.enablePreset"
@update:model-value="changeEnablePreset"
>
</q-toggle>
</q-card-actions>
<q-card-actions class="q-px-md q-py-none bg-surface">
<div>スタイル変更時にデフォルトプリセットを自動で適用</div>
<div>
<q-icon name="help_outline" size="sm" class="help-hover-icon">
<q-tooltip
:delay="500"
anchor="center left"
self="center right"
transition-show="jump-left"
transition-hide="jump-right"
>
キャラやスタイルの変更時にデフォルトプリセットを適用します
</q-tooltip>
</q-icon>
</div>
<q-space />
<q-toggle
:model-value="
experimentalSetting.shouldApplyDefaultPresetOnVoiceChanged
"
@update:model-value="
changeExperimentalSetting('enablePreset', $event)
changeExperimentalSetting(
'shouldApplyDefaultPresetOnVoiceChanged',
$event
)
"
:disable="!experimentalSetting.enablePreset"
>
</q-toggle>
</q-card-actions>
Expand Down Expand Up @@ -892,6 +920,17 @@ const changeinheritAudioInfo = async (inheritAudioInfo: boolean) => {
store.dispatch("SET_INHERIT_AUDIOINFO", { inheritAudioInfo });
};
const changeEnablePreset = (value: boolean) => {
if (value) {
// プリセット機能をONにしたときは「デフォルトプリセットを自動で適用」もONにする
changeExperimentalSetting("enablePreset", true);
changeExperimentalSetting("shouldApplyDefaultPresetOnVoiceChanged", true);
} else {
changeExperimentalSetting("enablePreset", false);
changeExperimentalSetting("shouldApplyDefaultPresetOnVoiceChanged", false);
}
};
const changeExperimentalSetting = async (
key: keyof ExperimentalSetting,
data: boolean
Expand Down
26 changes: 26 additions & 0 deletions src/composables/useDefaultPreset.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { computed } from "vue";
import { useStore } from "@/store";
import { PresetKey, Voice, VoiceId } from "@/type/preload";

export const useDefaultPreset = () => {
const store = useStore();

const defaultPresetKeys = computed(() => store.state.defaultPresetKeys);
const defaultPresetKeySets = computed(
() => new Set(Object.values(store.state.defaultPresetKeys))
);

const getDefaultPresetKeyForVoice = (voice: Voice): string => {
const voiceId = VoiceId(voice);
return defaultPresetKeys.value[voiceId];
};

const isDefaultPresetKey = (presetKey: PresetKey): boolean => {
return defaultPresetKeySets.value.has(presetKey);
};

return {
getDefaultPresetKeyForVoice,
isDefaultPresetKey,
};
};
Loading

0 comments on commit c3e90fa

Please sign in to comment.