Files
risuai/src/lib/SideBars/Sidebar.svelte
2023-05-07 12:41:45 +09:00

190 lines
6.6 KiB
Svelte

<script lang="ts">
import { CharEmotion, SizeStore, selectedCharID, settingsOpen, sideBarStore } from "../../ts/stores";
import { DataBase } from "../../ts/database";
import BarIcon from "./BarIcon.svelte";
import { Plus, User, X, Settings, Users, Edit3Icon, ArrowUp, ArrowDown, ListIcon, LayoutGridIcon, PlusIcon} from 'lucide-svelte'
import { characterFormatUpdate, createNewCharacter, createNewGroup, getCharImage, importCharacter } from "../../ts/characters";
import SettingsDom from './Settings.svelte'
import CharConfig from "./CharConfig.svelte";
import { language } from "../../lang";
import Botpreset from "../Others/botpreset.svelte";
import { onDestroy } from "svelte";
import {isEqual} from 'lodash'
let openPresetList =false
let sideBarMode = 0
let editMode = false
let menuMode = 0
export let openGrid = () => {}
function createScratch(){
reseter();
const cid = createNewCharacter()
selectedCharID.set(cid)
}
function createGroup(){
reseter();
const cid = createNewGroup()
selectedCharID.set(cid)
}
async function createImport(){
reseter();
const cid = await importCharacter()
if(cid){
selectedCharID.set(cid)
}
}
function changeChar(index:number){
reseter();
characterFormatUpdate(index)
selectedCharID.set(index)
}
function reseter(){
menuMode = 0;
sideBarMode = 0;
editMode = false
settingsOpen.set(false)
CharEmotion.set({})
}
let charImages:string[] = []
const unsub = DataBase.subscribe((db) => {
let newCharImages:string[] = []
for(const cha of db.characters){
newCharImages.push(cha.image ?? '')
}
if(!isEqual(charImages, newCharImages)){
charImages = newCharImages
}
})
onDestroy(unsub)
</script>
<div class="w-20 flex flex-col bg-bgcolor text-white items-center overflow-y-scroll h-full shadow-lg min-w-20 overflow-x-hidden"
class:editMode={editMode}>
<button class="bg-gray-500 w-14 min-w-14 flex justify-center h-8 items-center rounded-b-md cursor-pointer hover:bg-green-500 transition-colors absolute top-0" on:click={() => {
menuMode = 1 - menuMode
}}><ListIcon/></button>
<div class="w-14 min-w-14 h-8 min-h-8 bg-transparent"></div>
{#if menuMode === 0}
{#each charImages as charimg, i}
<div class="flex items-center">
{#if charimg !== ''}
<BarIcon onClick={() => {changeChar(i)}} additionalStyle={getCharImage($DataBase.characters[i].image, 'css')}>
</BarIcon>
{:else}
<BarIcon onClick={() => {changeChar(i)}} additionalStyle={i === $selectedCharID ? 'background:#44475a' : ''}>
</BarIcon>
{/if}
{#if editMode}
<div class="flex flex-col mt-2">
<button on:click={() => {
let chars = $DataBase.characters
if(chars[i-1]){
const currentchar = chars[i]
chars[i] = chars[i-1]
chars[i-1] = currentchar
$DataBase.characters = chars
}
}}>
<ArrowUp size={20}/>
</button>
<button on:click={() => {
let chars = $DataBase.characters
if(chars[i+1]){
const currentchar = chars[i]
chars[i] = chars[i+1]
chars[i+1] = currentchar
$DataBase.characters = chars
}
}}>
<ArrowDown size={22}/>
</button>
</div>
{/if}
</div>
{/each}
<BarIcon onClick={() => {
if(sideBarMode === 1){
reseter();
sideBarMode = 0
}
else{
reseter();
sideBarMode = 1
}
}}><PlusIcon/></BarIcon>
{:else}
<BarIcon onClick={() => {
if($settingsOpen){
reseter();
settingsOpen.set(false)
}
else{
reseter();
settingsOpen.set(true)
}
}}><Settings/></BarIcon>
<BarIcon onClick={() => {
reseter();
openGrid()
}}><LayoutGridIcon/></BarIcon>
{/if}
</div>
<div class="w-96 p-6 flex flex-col bg-darkbg text-gray-200 overflow-y-auto overflow-x-hidden setting-area" class:flex-grow={($SizeStore.w <= 1000)} class:minw96={($SizeStore.w > 1000)}>
<button class="flex w-full justify-end text-gray-200" on:click={() => {sideBarStore.set(false)}}>
<button class="p-0 bg-transparent border-none text-gray-200"><X/></button>
</button>
{#if sideBarMode === 0}
{#if $selectedCharID < 0 || $settingsOpen}
<SettingsDom bind:openPresetList/>
{:else}
<CharConfig />
{/if}
{:else if sideBarMode === 1}
<h2 class="title font-bold text-xl mt-2">Create</h2>
<button
on:click={createScratch}
class="drop-shadow-lg p-5 border-borderc border-solid mt-2 flex justify-center items-center ml-2 mr-2 border-1 hover:bg-selected text-lg">
{language.createfromScratch}
</button>
<button
on:click={createImport}
class="drop-shadow-lg p-5 border-borderc border-solid mt-2 flex justify-center items-center ml-2 mr-2 border-1 hover:bg-selected text-lg">
{language.importCharacter}
</button>
<button
on:click={createGroup}
class="drop-shadow-lg p-3 border-borderc border-solid mt-2 flex justify-center items-center ml-2 mr-2 border-1 hover:bg-selected">
{language.createGroup}
</button>
<h2 class="title font-bold text-xl mt-4">Edit</h2>
<button
on:click={() => {editMode = !editMode;$selectedCharID = -1}}
class="drop-shadow-lg p-3 border-borderc border-solid mt-2 flex justify-center items-center ml-2 mr-2 border-1 hover:bg-selected">
{language.editOrder}
</button>
{/if}
</div>
<style>
.minw96 {
min-width: 24rem; /* 384px */
}
.title{
margin-bottom: 0.5rem;
}
.editMode{
min-width: 6rem;
}
</style>
{#if openPresetList}
<Botpreset close={() => {openPresetList = false}}/>
{/if}