兼容url格式的主题背景图片
							parent
							
								
									07898cdfd6
								
							
						
					
					
						commit
						2003c5a0c9
					
				|  | @ -60,6 +60,8 @@ export const decodeName = (str: string | null = '') => { | |||
|   return str?.replace(/(?:&|<|>|"|'|'| )/gm, (s: string) => encodeNames[s as keyof typeof encodeNames]) ?? '' | ||||
| } | ||||
| 
 | ||||
| export const isUrl = (path: string) => /https?:\/\//.test(path) | ||||
| 
 | ||||
| // 解析URL参数为对象
 | ||||
| export const parseUrlParams = (str: string): Record<string, string> => { | ||||
|   const params: Record<string, string> = {} | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| import { throttle } from '@common/utils' | ||||
| import { isUrl, throttle } from '@common/utils' | ||||
| import migrateSetting from '@common/utils/migrateSetting' | ||||
| import getStore from '@main/utils/store' | ||||
| import { STORE_NAMES, URL_SCHEME_RXP } from '@common/constants' | ||||
|  | @ -247,7 +247,10 @@ export const getTheme = () => { | |||
|     if (theme) { | ||||
|       if (theme.config.extInfo['--background-image'] != 'none') { | ||||
|         theme = copyTheme(theme) | ||||
|         theme.config.extInfo['--background-image'] = `url(file:///${joinPath(global.lxDataPath, 'theme_images', theme.config.extInfo['--background-image']).replaceAll('\\', '/')})` | ||||
|         theme.config.extInfo['--background-image'] = | ||||
|           isUrl(theme.config.extInfo['--background-image']) | ||||
|             ? `url(${theme.config.extInfo['--background-image']})` | ||||
|             : `url(file:///${joinPath(global.lxDataPath, 'theme_images', theme.config.extInfo['--background-image']).replaceAll('\\', '/')})` | ||||
|       } | ||||
|     } else { | ||||
|       themeId = global.lx.appSetting['theme.id'] == 'auto' && shouldUseDarkColors ? 'black' : 'green' | ||||
|  |  | |||
|  | @ -6,6 +6,7 @@ | |||
| //   return listId == 'download' ? downloadList : getListFromState(listId)
 | ||||
| // }
 | ||||
| import { commonColorNames, commonDarkColorValues, commonLightColorValues } from '@common/config' | ||||
| import { isUrl } from '@common/utils/common' | ||||
| import { joinPath } from '@common/utils/nodejs' | ||||
| import { markRaw, shallowReactive } from '@common/utils/vueTools' | ||||
| import { getThemes as getTheme } from '@renderer/utils/ipc' | ||||
|  | @ -15,6 +16,12 @@ export const assertApiSupport = (source: LX.Source): boolean => { | |||
|   return source == 'local' || qualityList.value[source] != null | ||||
| } | ||||
| 
 | ||||
| export const buildBgUrl = (originUrl: string, dataPath: string): string => { | ||||
|   return isUrl(originUrl) | ||||
|     ? `url(${originUrl})` | ||||
|     : `url(file:///${joinPath(dataPath, originUrl).replaceAll('\\', '/')})` | ||||
| } | ||||
| 
 | ||||
| export const getThemes = (callback: (themeInfo: LX.ThemeInfo) => void) => { | ||||
|   if (themeInfo.themes.length) return callback(themeInfo) | ||||
|   void getTheme().then(info => { | ||||
|  | @ -27,7 +34,7 @@ export const getThemes = (callback: (themeInfo: LX.ThemeInfo) => void) => { | |||
| export const buildThemeColors = (theme: LX.Theme, dataPath: string) => { | ||||
|   if (theme.isCustom && theme.config.extInfo['--background-image'] != 'none') { | ||||
|     theme = copyTheme(theme) | ||||
|     theme.config.extInfo['--background-image'] = `url(file:///${joinPath(dataPath, theme.config.extInfo['--background-image']).replaceAll('\\', '/')})` | ||||
|     theme.config.extInfo['--background-image'] = buildBgUrl(theme.config.extInfo['--background-image'], dataPath) | ||||
|   } | ||||
|   const colors: Record<string, string> = { | ||||
|     ...theme.config.themeColors, | ||||
|  |  | |||
|  | @ -100,8 +100,7 @@ import ThemeEditModal from './ThemeEditModal' | |||
| import PlayTimeoutModal from './PlayTimeoutModal' | ||||
| import UserApiModal from './UserApiModal' | ||||
| import { appSetting, updateSetting } from '@renderer/store/setting' | ||||
| import { getThemes, applyTheme, findTheme } from '@renderer/store/utils' | ||||
| import { joinPath } from '@common/utils/nodejs' | ||||
| import { getThemes, applyTheme, findTheme, buildBgUrl } from '@renderer/store/utils' | ||||
| 
 | ||||
| export default { | ||||
|   name: 'SettingBasic', | ||||
|  | @ -126,13 +125,13 @@ export default { | |||
|       autoTheme['--background-image-theme-light'] = light.isCustom | ||||
|         ? light.config.extInfo['--background-image'] == 'none' | ||||
|           ? 'none' | ||||
|           : `url(file:///${joinPath(info.dataPath, light.config.extInfo['--background-image']).replaceAll('\\', '/')})` | ||||
|           : buildBgUrl(light.config.extInfo['--background-image'], info.dataPath) | ||||
|         : light.config.extInfo['--background-image'] | ||||
|       autoTheme['--color-primary-theme-dark'] = dark.config.themeColors['--color-theme'] | ||||
|       autoTheme['--background-image-theme-dark'] = dark.isCustom | ||||
|         ? dark.config.extInfo['--background-image'] == 'none' | ||||
|           ? 'none' | ||||
|           : `url(file:///${joinPath(info.dataPath, dark.config.extInfo['--background-image']).replaceAll('\\', '/')})` | ||||
|           : buildBgUrl(dark.config.extInfo['--background-image'], info.dataPath) | ||||
|         : dark.config.extInfo['--background-image'] | ||||
|     } | ||||
| 
 | ||||
|  | @ -158,7 +157,7 @@ export default { | |||
|               '--color-primary-theme': t.config.themeColors['--color-theme'], | ||||
|               '--background-image-theme': t.config.extInfo['--background-image'] == 'none' | ||||
|                 ? 'none' | ||||
|                 : `url(file:///${joinPath(info.dataPath, t.config.extInfo['--background-image']).replaceAll('\\', '/')})`, | ||||
|                 : buildBgUrl(t.config.extInfo['--background-image'], info.dataPath), | ||||
|             }, | ||||
|           } | ||||
|         })) | ||||
|  |  | |||
|  | @ -120,6 +120,7 @@ | |||
| import { joinPath, extname, copyFile, checkPath, createDir, removeFile, moveFile, basename } from '@common/utils/nodejs' | ||||
| import { nextTick, ref, watch } from '@common/utils/vueTools' | ||||
| import { applyTheme, buildThemeColors, getThemes, copyTheme } from '@renderer/store/utils' | ||||
| import { isUrl } from '@common/utils/common' | ||||
| // import { appSetting, updateSetting } from '@renderer/store/setting' | ||||
| // import { applyTheme, getThemes } from '@renderer/store/utils' | ||||
| import { createThemeColors } from '@common/theme/utils' | ||||
|  | @ -244,7 +245,9 @@ export default { | |||
|         bgImg.value = '' | ||||
|         originBgName = '' | ||||
|       } else { | ||||
|         bgImg.value = joinPath(themeInfo.dataPath, theme.config.extInfo['--background-image']) | ||||
|         bgImg.value = isUrl(theme.config.extInfo['--background-image']) | ||||
|           ? theme.config.extInfo['--background-image'] | ||||
|           : joinPath(themeInfo.dataPath, theme.config.extInfo['--background-image']) | ||||
|         originBgName = theme.config.extInfo['--background-image'] | ||||
|       } | ||||
|       appBgColorOrigin = theme.config.extInfo['--color-app-background'] | ||||
|  | @ -387,6 +390,10 @@ export default { | |||
|       theme.isDark = val | ||||
|       applyPrimaryColor(theme.config.themeColors['--color-primary'], theme.isDark) | ||||
|     } | ||||
|     /** | ||||
|      * 预览主题 | ||||
|      * @param {*} val 是否预览当前编辑的主题 | ||||
|      */ | ||||
|     const handlePreview = (val) => { | ||||
|       if (val) { | ||||
|         createPreview() | ||||
|  | @ -398,17 +405,20 @@ export default { | |||
|       handlePreview(false) | ||||
|       emit('update:modelValue', false) | ||||
|     } | ||||
|     // 保存 | ||||
|     const handleSubmit = async() => { | ||||
|       if (!themeName.value) return | ||||
|       theme.name = themeName.value.substring(0, 20) | ||||
|       // 保存新背景 | ||||
|       if (currentBgPath) { | ||||
|       if (currentBgPath && !isUrl(currentBgPath)) { | ||||
|         const name = basename(currentBgPath) | ||||
|         await moveFile(currentBgPath, joinPath(themeInfo.dataPath, name)) | ||||
|         theme.config.extInfo['--background-image'] = name | ||||
|       } | ||||
|       // 移除旧背景 | ||||
|       if (originBgName && theme.config.extInfo['--background-image'] != originBgName) removeFile(joinPath(themeInfo.dataPath, originBgName)) | ||||
|       if (originBgName && | ||||
|         theme.config.extInfo['--background-image'] != originBgName && | ||||
|         !isUrl(theme.config.extInfo['--background-image'])) removeFile(joinPath(themeInfo.dataPath, originBgName)) | ||||
|       if (props.themeId) { | ||||
|         const index = themeInfo.userThemes.findIndex(t => t.id == theme.id) | ||||
|         if (index > -1) themeInfo.userThemes.splice(index, 1, theme) | ||||
|  | @ -418,6 +428,7 @@ export default { | |||
|       emit('submit') | ||||
|       emit('update:modelValue', false) | ||||
|     } | ||||
|     // 删除 | ||||
|     const handleRemove = async() => { | ||||
|       const confirm = await dialog.confirm({ | ||||
|         message: window.i18n.t('theme_edit_modal__remove_tip'), | ||||
|  | @ -452,19 +463,22 @@ export default { | |||
|       emit('submit') | ||||
|       emit('update:modelValue', false) | ||||
|     } | ||||
|     // 另存为 | ||||
|     const handleSaveNew = async() => { | ||||
|       if (!themeName.value) return | ||||
|       theme.name = themeName.value.substring(0, 20) | ||||
|       theme.id = 'user_theme_' + Date.now() | ||||
|       // 保存新背景 | ||||
|       if (currentBgPath) { | ||||
|         const name = basename(currentBgPath) | ||||
|         await moveFile(currentBgPath, joinPath(themeInfo.dataPath, name)) | ||||
|         theme.config.extInfo['--background-image'] = name | ||||
|       } else if (bgImg.value) { | ||||
|         const fileName = `${theme.id}_${Date.now()}${extname(bgImg.value)}` | ||||
|         await copyFile(bgImg.value, joinPath(themeInfo.dataPath, fileName)) | ||||
|         theme.config.extInfo['--background-image'] = fileName | ||||
|       if (!isUrl(currentBgPath)) { | ||||
|         if (currentBgPath) { | ||||
|           const name = basename(currentBgPath) | ||||
|           await moveFile(currentBgPath, joinPath(themeInfo.dataPath, name)) | ||||
|           theme.config.extInfo['--background-image'] = name | ||||
|         } else if (bgImg.value) { | ||||
|           const fileName = `${theme.id}_${Date.now()}${extname(bgImg.value)}` | ||||
|           await copyFile(bgImg.value, joinPath(themeInfo.dataPath, fileName)) | ||||
|           theme.config.extInfo['--background-image'] = fileName | ||||
|         } | ||||
|       } | ||||
|       themeInfo.userThemes.push(theme) | ||||
|       handlePreview(false) | ||||
|  |  | |||
|  | @ -38,10 +38,9 @@ | |||
| </template> | ||||
| 
 | ||||
| <script> | ||||
| import { joinPath } from '@common/utils/nodejs' | ||||
| import { markRaw, reactive, watch } from '@common/utils/vueTools' | ||||
| import { appSetting, updateSetting } from '@renderer/store/setting' | ||||
| import { applyTheme, getThemes } from '@renderer/store/utils' | ||||
| import { applyTheme, getThemes, buildBgUrl } from '@renderer/store/utils' | ||||
| 
 | ||||
| export default { | ||||
|   name: 'ThemeSelectorModal', | ||||
|  | @ -81,7 +80,7 @@ export default { | |||
|               '--background-image-theme': t.isCustom | ||||
|                 ? t.config.extInfo['--background-image'] == 'none' | ||||
|                   ? 'none' | ||||
|                   : `url(file:///${joinPath(info.dataPath, t.config.extInfo['--background-image']).replaceAll('\\', '/')})` | ||||
|                   : buildBgUrl(t.config.extInfo['--background-image'], info.dataPath) | ||||
|                 : t.config.extInfo['--background-image'], | ||||
|             }, | ||||
|           } | ||||
|  | @ -96,7 +95,7 @@ export default { | |||
|               '--background-image-theme': t.isCustom | ||||
|                 ? t.config.extInfo['--background-image'] == 'none' | ||||
|                   ? 'none' | ||||
|                   : `url(file:///${joinPath(info.dataPath, t.config.extInfo['--background-image']).replaceAll('\\', '/')})` | ||||
|                   : buildBgUrl(t.config.extInfo['--background-image'], info.dataPath) | ||||
|                 : t.config.extInfo['--background-image'], | ||||
|             }, | ||||
|           } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 lyswhut
						lyswhut