新增: Bing 壁纸多市场获取/2000张历史/第三方图源/dislike/重下/方向修复
This commit is contained in:
@@ -91,11 +91,25 @@
|
||||
<button class="btn-sm" @click="onBingPrev">◀</button>
|
||||
<button class="btn-sm" @click="onBingNext">▶</button>
|
||||
<button class="btn-sm" @click="onBingFav">{{ bing.fav ? '★' : '☆' }}</button>
|
||||
<button class="btn-sm" @click="onBingDislike">👎</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex justify-between items-center px-3.5 py-2 border-t border-[var(--card-divider)]">
|
||||
<div><div class="text-xs font-medium text-[var(--text-muted)]">定时切换</div><div class="text-[10px] text-[var(--text-weak)] mt-px">每小时自动切换壁纸</div></div>
|
||||
<ToggleSwitch v-model="s.bingAutoRefresh" />
|
||||
</div>
|
||||
<!-- 市场选择 -->
|
||||
<div class="px-3.5 py-2 border-t border-[var(--card-divider)]">
|
||||
<div class="flex justify-between items-center cursor-pointer select-none" @click="showMarkets = !showMarkets">
|
||||
<div class="text-xs font-medium text-[var(--text-muted)]">壁纸来源地区</div>
|
||||
<span class="text-[10px] text-[var(--text-weak)]">{{ showMarkets ? '收起' : '展开' }} {{ selectedMarkets.length }}/{{ allMarkets.length }}</span>
|
||||
</div>
|
||||
<div v-if="showMarkets" class="flex flex-wrap gap-2 mt-2">
|
||||
<label v-for="m in allMarkets" :key="m.code" class="flex items-center gap-1.5 text-xs text-[var(--text)] cursor-pointer">
|
||||
<input type="checkbox" :checked="selectedMarkets.includes(m.code)" @change="toggleMarket(m.code)" class="accent-[var(--accent)]">
|
||||
{{ m.label }}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 收藏列表 -->
|
||||
<div v-if="bingFavs.length" class="px-3.5 py-2 border-t border-[var(--card-divider)]">
|
||||
@@ -185,9 +199,12 @@ const audioColors = [
|
||||
]
|
||||
|
||||
// Bing
|
||||
const bing = ref<BingState>({ date: '', title: '', copyright: '', url: '', fav: false, idx: 0, total: 0 })
|
||||
const bing = ref<BingState>({ date: '', title: '', copyright: '', url: '', fav: false, idx: 0, total: 0, hidden: false, market: '' })
|
||||
const bingThumb = ref('')
|
||||
const bingFavs = ref<{ idx: number; thumb: string }[]>([])
|
||||
const showMarkets = ref(false)
|
||||
const allMarkets = ref<{ code: string; label: string }[]>([])
|
||||
const selectedMarkets = ref<string[]>([])
|
||||
|
||||
async function loadBingInfo() {
|
||||
const raw = await go.getBingInfo()
|
||||
@@ -199,23 +216,53 @@ async function loadBingInfo() {
|
||||
}
|
||||
}
|
||||
|
||||
async function onBingPrev() { bing.value = JSON.parse(await go.bingPrev()) }
|
||||
async function loadBingMarkets() {
|
||||
const raw = await go.getBingMarkets()
|
||||
const codes = JSON.parse(raw) as string[]
|
||||
selectedMarkets.value = codes
|
||||
allMarkets.value = [
|
||||
{ code: 'zh-CN', label: '中国' },
|
||||
{ code: 'en-US', label: '美国' },
|
||||
{ code: 'ja-JP', label: '日本' },
|
||||
{ code: 'de-DE', label: '德国' },
|
||||
{ code: 'fr-FR', label: '法国' },
|
||||
{ code: 'en-GB', label: '英国' },
|
||||
{ code: 'ko-KR', label: '韩国' },
|
||||
{ code: 'ru-RU', label: '俄罗斯' },
|
||||
{ code: 'pt-BR', label: '巴西' },
|
||||
{ code: 'es-ES', label: '西班牙' },
|
||||
]
|
||||
}
|
||||
|
||||
function toggleMarket(code: string) {
|
||||
const idx = selectedMarkets.value.indexOf(code)
|
||||
if (idx >= 0) {
|
||||
selectedMarkets.value.splice(idx, 1)
|
||||
} else {
|
||||
selectedMarkets.value.push(code)
|
||||
}
|
||||
go.saveBingMarkets(JSON.stringify(selectedMarkets.value))
|
||||
}
|
||||
|
||||
// 左 ◄ = 上一张(更旧), 右 ► = 下一张(更新)
|
||||
async function onBingNext() { bing.value = JSON.parse(await go.bingNext()) }
|
||||
async function onBingPrev() { bing.value = JSON.parse(await go.bingPrev()) }
|
||||
async function onBingFav() { bing.value = JSON.parse(await go.bingToggleFavorite()); await loadBingFavs() }
|
||||
async function onBingSetByIdx(idx: number) { bing.value = JSON.parse(await go.bingSetByIdx(idx)) }
|
||||
async function onBingDislike() { bing.value = JSON.parse(await go.bingToggleDislike()) }
|
||||
|
||||
async function loadBingFavs() {
|
||||
const raw = await go.getBingFavorites()
|
||||
const list = JSON.parse(raw) as string[]
|
||||
const list = JSON.parse(raw) as { date: string; copyright: string; filename: string; idx: number }[]
|
||||
bingFavs.value = await Promise.all(list.map(async f => ({
|
||||
idx: parseInt(f.match(/(\d+)/)?.[1] || '0', 10),
|
||||
thumb: await go.bingThumbDataURI(f)
|
||||
idx: f.idx,
|
||||
thumb: await go.bingThumbDataURI(f.filename)
|
||||
})))
|
||||
}
|
||||
|
||||
watch(() => props.s.bingAutoRefresh, v => go.saveBingAutoRefresh(v))
|
||||
watch(() => props.s.wallpaperType, t => {
|
||||
if (t === 'bing') { loadBingInfo(); loadBingFavs() }
|
||||
if (t === 'bing') { loadBingInfo(); loadBingFavs(); loadBingMarkets() }
|
||||
}, { immediate: true })
|
||||
|
||||
async function onPickImage() {
|
||||
|
||||
@@ -17,6 +17,9 @@ export const go = {
|
||||
getBingFavorites: (): Promise<string> => w.getBingFavorites(),
|
||||
bingSetByIdx: (idx: number): Promise<string> => w.bingSetByIdx(idx),
|
||||
bingThumbDataURI: (filename: string): Promise<string> => w.bingThumbDataURI(filename),
|
||||
bingToggleDislike: (): Promise<string> => w.bingToggleDislike(),
|
||||
getBingMarkets: (): Promise<string> => w.getBingMarkets(),
|
||||
saveBingMarkets: (markets: string) => w.saveBingMarkets(markets),
|
||||
pickSolidColor: (): Promise<string> => w.pickSolidColor(),
|
||||
pickGradientColor: (): Promise<string> => w.pickGradientColor(),
|
||||
addSavedColor: (c1: string, c2: string, gradient: boolean) => w.addSavedColor(c1, c2, gradient),
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
export interface WeatherData {
|
||||
current: string
|
||||
city: string
|
||||
hourly: HourlyItem[]
|
||||
daily: DailyItem[]
|
||||
}
|
||||
@@ -95,4 +96,6 @@ export interface BingState {
|
||||
fav: boolean
|
||||
idx: number
|
||||
total: number
|
||||
hidden: boolean
|
||||
market?: string
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user