Skip to content

Commit b239a46

Browse files
committed
feat: Add controller panel close mode option
1 parent c1ca5dd commit b239a46

File tree

10 files changed

+98
-35
lines changed

10 files changed

+98
-35
lines changed

frontend/src/constant/app.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Color, PluginTrigger, ScheduledTasksType, View } from '@/enums/app'
1+
import { Color, ControllerCloseMode, PluginTrigger, ScheduledTasksType, View } from '@/enums/app'
22

33
export const ProfilesFilePath = 'data/profiles.yaml'
44

@@ -51,6 +51,11 @@ export const ViewOptions = [
5151
{ label: 'common.list', value: View.List },
5252
]
5353

54+
export const ControllerCloseModeOptions = [
55+
{ label: 'home.controller.closeMode.all', value: ControllerCloseMode.All },
56+
{ label: 'home.controller.closeMode.button', value: ControllerCloseMode.Button },
57+
]
58+
5459
// vue-draggable-plus config
5560
export const DraggableOptions = {
5661
animation: 150,
@@ -74,3 +79,5 @@ export const ScheduledTaskOptions = [
7479
]
7580

7681
export const DefaultSubscribeScript = `const onSubscribe = async (proxies, subscription) => {\n return { proxies, subscription }\n}`
82+
83+
export const DefaultTestURL = 'https://www.gstatic.com/generate_204'

frontend/src/constant/profile.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import i18n from '@/lang'
12
import { sampleID } from '@/utils'
3+
import { DefaultTestURL } from './app'
24
import {
35
LogLevel,
46
Inbound,
@@ -12,7 +14,7 @@ import {
1214
Strategy,
1315
DnsServer,
1416
} from '@/enums/kernel'
15-
import i18n from '@/lang'
17+
1618
const { t } = i18n.global
1719

1820
const DefaultOutboundIds = {
@@ -140,7 +142,7 @@ export const DefaultOutbound = (): IOutbound => ({
140142
type: Outbound.Selector,
141143
outbounds: [],
142144
interrupt_exist_connections: true,
143-
url: 'https://www.gstatic.com/generate_204',
145+
url: DefaultTestURL,
144146
interval: '3m',
145147
tolerance: 150,
146148
include: '',
@@ -166,7 +168,7 @@ export const DefaultOutbounds = (): IOutbound[] => [
166168
type: Outbound.Urltest,
167169
outbounds: [],
168170
interrupt_exist_connections: true,
169-
url: 'https://www.gstatic.com/generate_204',
171+
url: DefaultTestURL,
170172
interval: '3m',
171173
tolerance: 150,
172174
include: '',

frontend/src/enums/app.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ export enum View {
2727
List = 'list',
2828
}
2929

30+
export enum ControllerCloseMode {
31+
All = 'all',
32+
Button = 'button',
33+
}
34+
3035
export enum Color {
3136
Default = 'default',
3237
Orange = 'orange',

frontend/src/lang/locale/en.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,11 @@ export default {
353353
sortBy: 'Sort By Delay',
354354
delay: 'Delay test URL',
355355
delayUrl: 'Please enter the delayed test URL',
356+
closeMode: {
357+
name: 'Controller Close Mode',
358+
all: 'Scroll or Button',
359+
button: 'Button Only',
360+
},
356361
},
357362
connections: {
358363
type: 'Type',

frontend/src/lang/locale/fa.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,11 @@ export default {
353353
sortBy: 'مرتب‌سازی بر اساس تأخیر',
354354
delay: 'آزمایش تأخیر URL',
355355
delayUrl: 'لطفاً URL آزمایش تأخیر را وارد کنید',
356+
closeMode: {
357+
name: 'حالت بستن کنترلر',
358+
all: 'اسکرول یا دکمه',
359+
button: 'فقط دکمه',
360+
},
356361
},
357362
connections: {
358363
type: 'نوع',

frontend/src/lang/locale/ru.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,11 @@ export default {
353353
sortBy: 'Сортировка по задержке',
354354
delay: 'URL-адрес для проверки задержки',
355355
delayUrl: 'Пожалуйста, введите URL-адрес для проверки задержки',
356+
closeMode: {
357+
name: 'Режим закрытия контроллера',
358+
all: 'Прокрутка или кнопка',
359+
button: 'Только кнопка',
360+
},
356361
},
357362
connections: {
358363
type: 'Тип',

frontend/src/lang/locale/zh.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,11 @@ export default {
352352
sortBy: '按延迟排序',
353353
delay: '延迟测试URL',
354354
delayUrl: '请输入延迟测试URL',
355+
closeMode: {
356+
name: '控制器关闭模式',
357+
all: '滚动和关闭按钮',
358+
button: '仅按钮',
359+
},
355360
},
356361
connections: {
357362
type: '类型',

frontend/src/stores/appSettings.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,16 @@ import { parse, stringify } from 'yaml'
44

55
import i18n from '@/lang'
66
import { debounce, updateTrayMenus, APP_TITLE, ignoredError, APP_VERSION } from '@/utils'
7-
import { Colors, DefaultFontFamily } from '@/constant/app'
8-
import { Theme, WindowStartState, Lang, View, Color, WebviewGpuPolicy } from '@/enums/app'
7+
import { Colors, DefaultFontFamily, DefaultTestURL } from '@/constant/app'
8+
import {
9+
Theme,
10+
WindowStartState,
11+
Lang,
12+
View,
13+
Color,
14+
WebviewGpuPolicy,
15+
ControllerCloseMode,
16+
} from '@/enums/app'
917
import {
1018
Readfile,
1119
Writefile,
@@ -48,6 +56,7 @@ type AppSettings = {
4856
cardMode: boolean
4957
sortByDelay: boolean
5058
testUrl: string
59+
controllerCloseMode: ControllerCloseMode
5160
}
5261
pluginSettings: Record<string, Record<string, any>>
5362
githubApiToken: string
@@ -126,7 +135,8 @@ export const useAppSettingsStore = defineStore('app-settings', () => {
126135
unAvailable: true,
127136
cardMode: true,
128137
sortByDelay: false,
129-
testUrl: 'https://www.gstatic.com/generate_204',
138+
testUrl: DefaultTestURL,
139+
controllerCloseMode: ControllerCloseMode.All,
130140
},
131141
pluginSettings: {},
132142
githubApiToken: '',
@@ -147,6 +157,9 @@ export const useAppSettingsStore = defineStore('app-settings', () => {
147157
if ((app.value.kernel.branch as any) === 'latest') {
148158
app.value.kernel.branch = 'alpha'
149159
}
160+
if (app.value.kernel.controllerCloseMode === undefined) {
161+
app.value.kernel.controllerCloseMode = ControllerCloseMode.All
162+
}
150163

151164
firstOpen = !!data
152165

frontend/src/views/HomeView/components/GroupsController.vue

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
import { useI18n } from 'vue-i18n'
33
import { ref, computed, onActivated } from 'vue'
44
5+
import { useBool } from '@/hooks'
6+
import { ControllerCloseModeOptions, DefaultTestURL } from '@/constant/app'
57
import { ignoredError, sleep, handleUseProxy, message, prompt, asyncPool } from '@/utils'
68
import { useAppSettingsStore, useKernelApiStore } from '@/stores'
79
import { getProxyDelay } from '@/api/kernel'
@@ -13,6 +15,7 @@ const filterKeywordsMap = ref<Record<string, string>>({})
1315
const loading = ref(false)
1416
1517
const { t } = useI18n()
18+
const [showMoreSettings, toggleMoreSettings] = useBool(false)
1619
const appSettings = useAppSettingsStore()
1720
const kernelApiStore = useKernelApiStore()
1821
@@ -108,7 +111,7 @@ const handleGroupDelay = async (group: string) => {
108111
loadingSet.value.add(proxy)
109112
const { delay } = await getProxyDelay(
110113
encodeURIComponent(proxy),
111-
appSettings.app.kernel.testUrl || 'https://www.gstatic.com/generate_204',
114+
appSettings.app.kernel.testUrl || DefaultTestURL,
112115
)
113116
success += 1
114117
const _proxy = kernelApiStore.proxies[proxy]
@@ -135,7 +138,7 @@ const handleProxyDelay = async (proxy: string) => {
135138
try {
136139
const { delay } = await getProxyDelay(
137140
encodeURIComponent(proxy),
138-
appSettings.app.kernel.testUrl || 'https://www.gstatic.com/generate_204',
141+
appSettings.app.kernel.testUrl || DefaultTestURL,
139142
)
140143
const _proxy = kernelApiStore.proxies[proxy]
141144
_proxy.history.push({ delay })
@@ -153,22 +156,6 @@ const handleRefresh = async () => {
153156
loading.value = false
154157
}
155158
156-
const handleChangeTestUrl = async () => {
157-
try {
158-
const url = await prompt<string>(
159-
'home.controller.delayUrl',
160-
appSettings.app.kernel.testUrl || 'https://www.gstatic.com/generate_204',
161-
{
162-
placeholder: 'https://www.gstatic.com/generate_204',
163-
},
164-
)
165-
appSettings.app.kernel.testUrl = url
166-
message.success('common.success')
167-
} catch (error: any) {
168-
message.info(error)
169-
}
170-
}
171-
172159
const locateGroup = (group: any, chain: string) => {
173160
collapseAll()
174161
if (kernelApiStore.proxies[chain].all) {
@@ -206,9 +193,7 @@ onActivated(() => {
206193
<Switch v-model="appSettings.app.kernel.sortByDelay" class="ml-8">
207194
{{ t('home.controller.sortBy') }}
208195
</Switch>
209-
<Button @click="handleChangeTestUrl" type="primary" size="small" class="ml-8">
210-
{{ t('home.controller.delay') }}
211-
</Button>
196+
<Button @click="toggleMoreSettings" type="primary" size="small" class="ml-8"> ... </Button>
212197
<Button @click="expandAll" v-tips="'home.overview.expandAll'" type="text" class="ml-auto">
213198
<Icon icon="expand" />
214199
</Button>
@@ -302,6 +287,32 @@ onActivated(() => {
302287
</div>
303288
</Transition>
304289
</div>
290+
291+
<Modal
292+
v-model:open="showMoreSettings"
293+
:submit="false"
294+
mask-closable
295+
cancel-text="common.close"
296+
title="common.more"
297+
>
298+
<div class="form-item">
299+
{{ t('home.controller.delay') }}
300+
<Input
301+
v-model="appSettings.app.kernel.testUrl"
302+
:placeholder="DefaultTestURL"
303+
editable
304+
clearable
305+
/>
306+
</div>
307+
308+
<div class="form-item">
309+
{{ t('home.controller.closeMode.name') }}
310+
<Radio
311+
v-model="appSettings.app.kernel.controllerCloseMode"
312+
:options="ControllerCloseModeOptions"
313+
/>
314+
</div>
315+
</Modal>
305316
</template>
306317

307318
<style lang="less" scoped>

frontend/src/views/HomeView/index.vue

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import { ref, watch, useTemplateRef, h } from 'vue'
33
import { useI18n } from 'vue-i18n'
44
5+
import { ControllerCloseMode } from '@/enums/app'
56
import { APP_TITLE, debounce, message } from '@/utils'
67
import { useAppSettingsStore, useProfilesStore, useKernelApiStore } from '@/stores'
78
@@ -60,15 +61,19 @@ const resetScrollEventCount = debounce(() => (scrollEventCount = 0), 100)
6061
const onMouseWheel = (e: WheelEvent) => {
6162
if (!appSettingsStore.app.kernel.running) return
6263
63-
const currentScrollTop = controllerRef.value?.scrollTop ?? 0
6464
const isScrollingDown = e.deltaY > 0
6565
66-
if (isScrollingDown || currentScrollTop === 0) {
67-
scrollEventCount += 1
68-
}
69-
70-
if (scrollEventCount >= 3) {
71-
showController.value = isScrollingDown || currentScrollTop !== 0
66+
if (
67+
isScrollingDown ||
68+
appSettingsStore.app.kernel.controllerCloseMode === ControllerCloseMode.All
69+
) {
70+
const currentScrollTop = controllerRef.value?.scrollTop ?? 0
71+
if (isScrollingDown || currentScrollTop === 0) {
72+
scrollEventCount += 1
73+
}
74+
if (scrollEventCount >= 2) {
75+
showController.value = isScrollingDown || currentScrollTop !== 0
76+
}
7277
}
7378
7479
resetScrollEventCount()

0 commit comments

Comments
 (0)