mirror of
https://github.com/unanmed/HumanBreak.git
synced 2025-04-19 17:16:08 +08:00
200 lines
5.7 KiB
TypeScript
200 lines
5.7 KiB
TypeScript
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>
|
||
);
|
||
}
|