diff --git a/src/components/DialogManager.vue b/src/components/DialogManager.vue index 93245ae..237aac1 100644 --- a/src/components/DialogManager.vue +++ b/src/components/DialogManager.vue @@ -28,7 +28,7 @@ :items="sortOrderOptions" > @@ -77,7 +77,14 @@ import { genModelKey } from 'utils/model' import { computed, ref } from 'vue' import { useI18n } from 'vue-i18n' -const { isMobile, gutter, cardSize } = useConfig() +const { + isMobile, + gutter, + cardSize, + cardSizeMap, + cardSizeFlag, + dialog: settings, +} = useConfig() const { data, folders } = useModels() const { t } = useI18n() @@ -198,48 +205,24 @@ const contentStyle = computed(() => ({ paddingRight: `1rem`, })) -const currentCardSize = computed({ - get: () => { - const options = cardSizeOptions.value.map((item) => item.value) - const current = [cardSize.value.width, cardSize.value.height].join('x') - if (options.includes(current)) { - return current - } - return 'custom' - }, - set: (val) => { - if (val === 'custom') { - app.ui?.settings.show(t('size.customTip')) - return - } - - const [width, height] = val.split('x') - app.ui?.settings.setSettingValue( - 'ModelManager.UI.CardWidth', - parseInt(width), - ) - app.ui?.settings.setSettingValue( - 'ModelManager.UI.CardHeight', - parseInt(height), - ) - }, -}) - const cardSizeOptions = computed(() => { - const defineOptions = { - extraLarge: '240x320', - large: '180x240', - medium: '120x160', - small: '80x120', - custom: 'custom', + const customSize = 'size.custom' + + const customOptionMap = { + ...cardSizeMap.value, + [customSize]: 'custom', } - return Object.entries(defineOptions).map(([key, value]) => { + return Object.keys(customOptionMap).map((key) => { return { - label: t(`size.${key}`), - value, - command() { - currentCardSize.value = value + label: t(key), + value: key, + command: () => { + if (key === customSize) { + settings.showCardSizeSetting() + } else { + cardSizeFlag.value = key + } }, } }) diff --git a/src/components/SettingCardSize.vue b/src/components/SettingCardSize.vue new file mode 100644 index 0000000..de09a5a --- /dev/null +++ b/src/components/SettingCardSize.vue @@ -0,0 +1,110 @@ + + + + + + + {{ $t(data[field]) }} + + + + + + + {{ data[field] }} + + + + + + + + {{ data[field] }} + + + + + + + + + + + + + + + + + diff --git a/src/hooks/config.ts b/src/hooks/config.ts index 8602bc8..7f9afd9 100644 --- a/src/hooks/config.ts +++ b/src/hooks/config.ts @@ -1,11 +1,14 @@ +import SettingCardSize from 'components/SettingCardSize.vue' import { request } from 'hooks/request' import { defineStore } from 'hooks/store' import { $el, app, ComfyDialog } from 'scripts/comfyAPI' -import { onMounted, onUnmounted, ref } from 'vue' +import { computed, onMounted, onUnmounted, readonly, ref } from 'vue' import { useI18n } from 'vue-i18n' import { useToast } from './toast' export const useConfig = defineStore('config', (store) => { + const { t } = useI18n() + const mobileDeviceBreakPoint = 759 const isMobile = ref(window.innerWidth < mobileDeviceBreakPoint) @@ -21,21 +24,46 @@ export const useConfig = defineStore('config', (store) => { window.removeEventListener('resize', checkDeviceType) }) - const cardSize = ref({ - width: - app.ui?.settings.getSettingValue('ModelManager.UI.CardWidth') ?? - 240, - height: - app.ui?.settings.getSettingValue('ModelManager.UI.CardHeight') ?? - 310, + const defaultCardSizeMap = readonly({ + 'size.extraLarge': '240x320', + 'size.large': '180x240', + 'size.medium': '120x160', + 'size.small': '80x120', + }) + + const cardSizeMap = ref>({ ...defaultCardSizeMap }) + const cardSizeFlag = ref('size.extraLarge') + const cardSize = computed(() => { + const size = cardSizeMap.value[cardSizeFlag.value] + const [width = '120', height = '240'] = size.split('x') + return { + width: parseInt(width), + height: parseInt(height), + } }) const config = { isMobile, gutter: 16, - cardSize, + defaultCardSizeMap: defaultCardSizeMap, + cardSizeMap: cardSizeMap, + cardSizeFlag: cardSizeFlag, + cardSize: cardSize, cardWidth: 240, aspect: 7 / 9, + dialog: { + showCardSizeSetting: () => { + store.dialog.open({ + key: 'setting.cardSize', + title: t('setting.cardSize'), + content: SettingCardSize, + defaultSize: { + width: 500, + height: 390, + }, + }) + }, + }, } useAddConfigSettings(store) @@ -109,36 +137,27 @@ function useAddConfigSettings(store: import('hooks/store').StoreProvider) { defaultValue: undefined, }) - // UI settings + const defaultCardSize = store.config.defaultCardSizeMap + app.ui?.settings.addSetting({ - id: 'ModelManager.UI.CardWidth', - category: [t('modelManager'), t('setting.ui'), 'CardWidth'], - name: t('setting.cardWidth'), - type: 'slider', - defaultValue: 240, - attrs: { - min: 80, - max: 320, - step: 10, - }, - onChange(value) { - store.config.cardSize.value.width = value + id: 'ModelManager.UI.CardSize', + category: [t('modelManager'), t('setting.ui'), 'CardSize'], + name: t('setting.cardSize'), + defaultValue: 'size.extraLarge', + type: 'hidden', + onChange: (val) => { + store.config.cardSizeFlag.value = val }, }) app.ui?.settings.addSetting({ - id: 'ModelManager.UI.CardHeight', - category: [t('modelManager'), t('setting.ui'), 'CardHeight'], - name: t('setting.cardHeight'), - type: 'slider', - defaultValue: 320, - attrs: { - min: 80, - max: 320, - step: 10, - }, + id: 'ModelManager.UI.CardSizeMap', + category: [t('modelManager'), t('setting.ui'), 'CardSizeMap'], + name: t('setting.cardSize'), + defaultValue: JSON.stringify(defaultCardSize), + type: 'hidden', onChange(value) { - store.config.cardSize.value.height = value + store.config.cardSizeMap.value = JSON.parse(value) }, }) diff --git a/src/i18n.ts b/src/i18n.ts index aa09a1c..da8f332 100644 --- a/src/i18n.ts +++ b/src/i18n.ts @@ -25,6 +25,10 @@ const messages = { none: 'None', uploadFile: 'Upload File', tapToChange: 'Tap description to change content', + name: 'Name', + width: 'Width', + height: 'Height', + reset: 'Reset', sort: { name: 'Name', size: 'Largest', @@ -57,6 +61,7 @@ const messages = { includeHiddenFiles: 'Include hidden files(start with .)', excludeScanTypes: 'Exclude scan types (separate with commas)', ui: 'UI', + cardSize: 'Card Size', }, }, zh: { @@ -82,6 +87,10 @@ const messages = { none: '无', uploadFile: '上传文件', tapToChange: '点击描述可更改内容', + name: '名称', + width: '宽度', + height: '高度', + reset: '重置', sort: { name: '名称', size: '最大', @@ -114,6 +123,7 @@ const messages = { includeHiddenFiles: '包含隐藏文件(以 . 开头的文件或文件夹)', excludeScanTypes: '排除扫描类型(使用英文逗号隔开)', ui: '外观', + cardSize: '卡片尺寸', }, }, }