Skip to content

Commit 175e902

Browse files
optimize: 优化SearchBar的行为。
1 parent 99c634e commit 175e902

File tree

2 files changed

+58
-9
lines changed

2 files changed

+58
-9
lines changed

packages/gui/src/background.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ function createWindow (startHideWindow, autoQuitIfError = true) {
315315
} else if (input.key === 'Escape' && input.type === 'keyUp' && !input.control && !input.shift && !input.alt && !input.meta) {
316316
// 按 ESC,隐藏全文检索框(SearchBar)
317317
event.preventDefault()
318-
win.webContents.send('search-bar', { key: 'show-hide', hideSearchBar: true })
318+
win.webContents.send('search-bar', { key: 'hide' })
319319
} else if (input.key === 'F3' && input.type === 'keyDown' && !input.control && !input.shift && !input.alt && !input.meta) {
320320
// 按 F3,全文检索框(SearchBar)定位到下一个
321321
event.preventDefault()

packages/gui/src/view/App.vue

Lines changed: 57 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ export default {
1313
menus: undefined,
1414
config: undefined,
1515
hideSearchBar: true,
16+
searchBarIsFocused: false,
17+
searchBarInputKeyupTimeout: null,
1618
}
1719
},
1820
computed: {
@@ -45,23 +47,31 @@ export default {
4547
}
4648
4749
// 如果不是显示/隐藏操作,并且还未显示检索框,先按显示操作处理
48-
if (message.key !== 'show-hide' && this.hideSearchBar) {
50+
if (!message.key.includes('hide') && this.hideSearchBar) {
4951
message = { key: 'show-hide' }
5052
}
5153
5254
try {
5355
if (message.key === 'show-hide') { // 显示/隐藏
54-
this.hideSearchBar = message.hideSearchBar != null ? message.hideSearchBar : !this.hideSearchBar
56+
const hide = message.hideSearchBar != null ? message.hideSearchBar : !this.hideSearchBar
57+
58+
// 如果为隐藏操作,但SearchBar未隐藏且未获取焦点,则获取焦点
59+
if (hide && !this.hideSearchBar && !this.searchBarIsFocused) {
60+
this.doSearchBarInputFocus()
61+
return
62+
}
63+
64+
this.hideSearchBar = hide
5565
5666
// 显示后,获取输入框焦点
5767
if (!this.hideSearchBar) {
58-
setTimeout(() => {
59-
try {
60-
this.$refs.searchBar.$el.querySelector('input').focus()
61-
} catch {
62-
}
63-
}, 100)
68+
this.doSearchBarInputFocus()
69+
} else {
70+
this.searchBarIsFocused = false
6471
}
72+
} else if (message.key === 'hide') { // 隐藏
73+
this.hideSearchBar = true
74+
this.searchBarIsFocused = false
6575
} else if (message.key === 'next') { // 下一项
6676
this.$refs.searchBar.next()
6777
} else if (message.key === 'previous') { // 上一项
@@ -70,9 +80,48 @@ export default {
7080
} catch (e) {
7181
console.error('操作SearchBar出现异常:', e)
7282
}
83+
84+
const input = this.getSearchBarInput()
85+
if (input) {
86+
input.addEventListener('focus', this.onSearchBarInputFocus)
87+
input.addEventListener('blur', this.onSearchBarInputBlur)
88+
input.addEventListener('keydown', this.onSearchBarInputKeydown)
89+
input.addEventListener('keyup', this.onSearchBarInputKeyup)
90+
}
7391
})
7492
},
7593
methods: {
94+
getSearchBarInput () {
95+
return this.$refs.searchBar.$el.querySelector('input[type=text]')
96+
},
97+
onSearchBarInputFocus () {
98+
this.searchBarIsFocused = true
99+
},
100+
onSearchBarInputBlur () {
101+
this.searchBarIsFocused = false
102+
},
103+
onSearchBarInputKeydown () {
104+
clearTimeout(this.searchBarInputKeyupTimeout)
105+
},
106+
onSearchBarInputKeyup (e) {
107+
if (!this.$refs.searchBar || e.key === 'Enter' || e.key === 'F3') {
108+
return
109+
}
110+
clearTimeout(this.searchBarInputKeyupTimeout)
111+
this.searchBarInputKeyupTimeout = setTimeout(() => {
112+
// 连续调用以下两个方法,为了获取检索结果中的第一项
113+
this.$refs.searchBar.next()
114+
this.$refs.searchBar.previous()
115+
}, 150)
116+
},
117+
doSearchBarInputFocus () {
118+
setTimeout(() => {
119+
const input = this.getSearchBarInput()
120+
if (input) {
121+
input.focus()
122+
}
123+
}, 100)
124+
},
76125
titleClick (item) {
77126
console.log('title click:', item)
78127
},

0 commit comments

Comments
 (0)