HumanBreak/src/core/main/init/settings.tsx
2024-12-09 23:33:25 +08:00

200 lines
5.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import type { SettingComponent, SettingComponentProps } from '../setting';
import { Button, InputNumber, Radio } from 'ant-design-vue';
import { mainUi } from './ui';
import { gameKey } from '../custom/hotkey';
interface Components {
Default: SettingComponent;
Boolean: SettingComponent;
Number: SettingComponent;
HotkeySetting: SettingComponent;
ToolbarEditor: SettingComponent;
Radio: (items: string[]) => SettingComponent;
Performance: SettingComponent;
}
export type { Components as SettingDisplayComponents };
export function createSettingComponents() {
const com: Components = {
Default: DefaultSetting,
Boolean: BooleanSetting,
Number: NumberSetting,
HotkeySetting,
ToolbarEditor,
Radio: RadioSetting,
Performance: PerformanceSetting
};
return com;
}
function DefaultSetting(props: SettingComponentProps) {
return (
<div>
<span> </span>
</div>
);
}
function BooleanSetting(props: SettingComponentProps) {
const { setting, displayer, item } = props;
const changeValue = () => {
setting.setValue(displayer.selectStack.join('.'), !item.value);
displayer.update();
};
return (
<div class="editor-boolean">
<span> {item.value ? '开启' : '关闭'}</span>
<Button
class="boolean-button"
type="primary"
size="large"
onClick={changeValue}
>
{item.value ? '关闭' : '开启'}
</Button>
</div>
);
}
function NumberSetting(props: SettingComponentProps) {
const { setting, displayer, item } = props;
const changeValue = (value: number) => {
if (typeof value !== 'number') return;
if (value < (item.step?.[0] ?? 0) || value > (item.step?.[1] ?? 100)) {
return;
}
setting.setValue(displayer.selectStack.join('.'), Math.round(value));
displayer.update();
};
return (
<div class="editor-number">
<div class="editor-number-input">
<span> </span>
<InputNumber
class="number-input"
size="large"
// keyboard={true}
min={item.step?.[0] ?? 0}
max={item.step?.[1] ?? 100}
step={item.step?.[2] ?? 1}
value={item.value as number}
onChange={value => changeValue(value as number)}
></InputNumber>
</div>
<div class="editor-number-button">
<Button
class="number-button"
type="primary"
onClick={() =>
changeValue(
(item.value as number) - (item.step?.[2] ?? 1)
)
}
>
</Button>
<Button
class="number-button"
type="primary"
onClick={() =>
changeValue(
(item.value as number) + (item.step?.[2] ?? 1)
)
}
>
</Button>
</div>
</div>
);
}
function RadioSetting(items: string[]) {
return (props: SettingComponentProps) => {
const { setting, displayer, item } = props;
const changeValue = (value: number) => {
if (isNaN(value)) return;
setting.setValue(displayer.selectStack.join('.'), value);
displayer.update();
};
return (
<div>
{items.map((v, i) => {
return (
<Radio
value={i}
checked={i === item.value}
onClick={() => changeValue(i)}
>
{v}
</Radio>
);
})}
</div>
);
};
}
function showSpecialSetting(id: string, vBind?: any) {
const ui = mainUi.get(id);
mainUi.showEnd();
ui.once('close', () => {
mainUi.showAll();
});
mainUi.open(id, vBind);
}
function HotkeySetting(props: SettingComponentProps) {
return (
<div style="display: flex; justify-content: center">
<Button
style="font-size: 75%"
type="primary"
size="large"
onClick={() =>
showSpecialSetting('hotkey', {
hotkey: gameKey
})
}
>
</Button>
</div>
);
}
function ToolbarEditor(props: SettingComponentProps) {
return (
<div style="display: flex; justify-content: center">
<Button
style="font-size: 75%"
type="primary"
size="large"
onClick={() => showSpecialSetting('toolEditor')}
>
</Button>
</div>
);
}
function PerformanceSetting(props: SettingComponentProps) {
return (
<div style="display: flex; justify-content: center">
<Button
style="font-size: 75%"
type="primary"
size="large"
onClick={() => showSpecialSetting('performance')}
>
</Button>
</div>
);
}