Skip to content

Commit a7871c6

Browse files
committed
Merge branch 'meta-dev' into meta
2 parents e9178a1 + 0726361 commit a7871c6

23 files changed

+191
-27
lines changed

.github/workflows/main.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ jobs:
2323
uses: robinraju/[email protected]
2424
with:
2525
repository: 'MetaCubeX/mihomo'
26-
tag: "v1.18.10"
26+
tag: "v1.19.0"
2727
fileName: ".*darwin.*64-v.*.gz"
2828

2929
# releaseId: "62870807"

ClashX.xcodeproj/project.pbxproj

+11-11
Original file line numberDiff line numberDiff line change
@@ -443,36 +443,36 @@
443443
01BCDAC72C9ECD010028FA94 /* Config */ = {
444444
isa = PBXGroup;
445445
children = (
446-
01BCDAC52C9ECD010028FA94 /* ConfigItemView.swift */,
447446
01BCDAC62C9ECD010028FA94 /* ConfigView.swift */,
447+
01BCDAC52C9ECD010028FA94 /* ConfigItemView.swift */,
448448
);
449449
path = Config;
450450
sourceTree = "<group>";
451451
};
452452
01BCDACB2C9ECD010028FA94 /* Connections */ = {
453453
isa = PBXGroup;
454454
children = (
455-
01BCDAC82C9ECD010028FA94 /* Connections.swift */,
456-
01BCDAC92C9ECD010028FA94 /* ConnectionsTableView.swift */,
457455
01BCDACA2C9ECD010028FA94 /* ConnectionsView.swift */,
456+
01BCDAC92C9ECD010028FA94 /* ConnectionsTableView.swift */,
457+
01BCDAC82C9ECD010028FA94 /* Connections.swift */,
458458
);
459459
path = Connections;
460460
sourceTree = "<group>";
461461
};
462462
01BCDACE2C9ECD010028FA94 /* Logs */ = {
463463
isa = PBXGroup;
464464
children = (
465-
01BCDACC2C9ECD010028FA94 /* LogsTableView.swift */,
466465
01BCDACD2C9ECD010028FA94 /* LogsView.swift */,
466+
01BCDACC2C9ECD010028FA94 /* LogsTableView.swift */,
467467
);
468468
path = Logs;
469469
sourceTree = "<group>";
470470
};
471471
01BCDAD22C9ECD010028FA94 /* Overview */ = {
472472
isa = PBXGroup;
473473
children = (
474-
01BCDACF2C9ECD010028FA94 /* OverviewTopItemView.swift */,
475474
01BCDAD02C9ECD010028FA94 /* OverviewView.swift */,
475+
01BCDACF2C9ECD010028FA94 /* OverviewTopItemView.swift */,
476476
01BCDAD12C9ECD010028FA94 /* TrafficGraphView.swift */,
477477
);
478478
path = Overview;
@@ -481,8 +481,8 @@
481481
01BCDADA2C9ECD010028FA94 /* Providers */ = {
482482
isa = PBXGroup;
483483
children = (
484-
01BCDAD42C9ECD010028FA94 /* ProviderRowView.swift */,
485484
01BCDAD52C9ECD010028FA94 /* ProvidersView.swift */,
485+
01BCDAD42C9ECD010028FA94 /* ProviderRowView.swift */,
486486
01BCDAD62C9ECD010028FA94 /* ProxyProviderInfoView.swift */,
487487
01BCDAD72C9ECD010028FA94 /* ProxyProvidersRowView.swift */,
488488
01BCDAD82C9ECD010028FA94 /* RuleProvidersRowView.swift */,
@@ -506,22 +506,22 @@
506506
01BCDAE22C9ECD010028FA94 /* Rules */ = {
507507
isa = PBXGroup;
508508
children = (
509-
01BCDAE02C9ECD010028FA94 /* RuleItemView.swift */,
510509
01BCDAE12C9ECD010028FA94 /* RulesView.swift */,
510+
01BCDAE02C9ECD010028FA94 /* RuleItemView.swift */,
511511
);
512512
path = Rules;
513513
sourceTree = "<group>";
514514
};
515515
01BCDAE32C9ECD010028FA94 /* ContentTabs */ = {
516516
isa = PBXGroup;
517517
children = (
518-
01BCDAC72C9ECD010028FA94 /* Config */,
519-
01BCDACB2C9ECD010028FA94 /* Connections */,
520-
01BCDACE2C9ECD010028FA94 /* Logs */,
521518
01BCDAD22C9ECD010028FA94 /* Overview */,
522-
01BCDADA2C9ECD010028FA94 /* Providers */,
523519
01BCDADF2C9ECD010028FA94 /* Proxies */,
520+
01BCDADA2C9ECD010028FA94 /* Providers */,
524521
01BCDAE22C9ECD010028FA94 /* Rules */,
522+
01BCDACB2C9ECD010028FA94 /* Connections */,
523+
01BCDAC72C9ECD010028FA94 /* Config */,
524+
01BCDACE2C9ECD010028FA94 /* Logs */,
525525
01BCDAD32C9ECD010028FA94 /* ProviderProxiesView.swift */,
526526
);
527527
path = ContentTabs;

ClashX/Dashboard/DashboardViewContoller.swift

+41
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,13 @@ class DashboardViewContoller: NSViewController {
7272
.info,
7373
.debug
7474
]
75+
76+
enum LogFilter: String, CaseIterable {
77+
case all = "All"
78+
case rule = "Rule"
79+
case dns = "DNS"
80+
case others = "Others"
81+
}
7582

7683
private var sidebarItemObserver: NSObjectProtocol?
7784
private var searchStringObserver: NSObjectProtocol?
@@ -109,6 +116,7 @@ class DashboardViewContoller: NSViewController {
109116
items.append(.stopConnsItem)
110117
items.append(.searchItem)
111118
case .logs:
119+
items.append(.logFilterItem)
112120
items.append(.logLevelItem)
113121
items.append(.searchItem)
114122
}
@@ -187,6 +195,7 @@ extension NSToolbarItem.Identifier {
187195
static let hideNamesItem = NSToolbarItem.Identifier("HideNamesItem")
188196
static let stopConnsItem = NSToolbarItem.Identifier("StopConnsItem")
189197
static let logLevelItem = NSToolbarItem.Identifier("LogLevelItem")
198+
static let logFilterItem = NSToolbarItem.Identifier("logFilterItem")
190199
static let searchItem = NSToolbarItem.Identifier("SearchItem")
191200
}
192201

@@ -224,6 +233,14 @@ extension DashboardViewContoller: NSSearchFieldDelegate {
224233
NotificationCenter.default.post(name: .logLevelChanged, object: nil, userInfo: ["level": level])
225234
}
226235

236+
237+
@objc func setLogFilter(_ sender: NSToolbarItemGroup) {
238+
guard sender.selectedIndex < LogFilter.allCases.count, sender.selectedIndex >= 0 else { return }
239+
let filter = LogFilter.allCases[sender.selectedIndex]
240+
241+
NotificationCenter.default.post(name: .logFilterChanged, object: nil, userInfo: ["filter": filter])
242+
}
243+
227244
}
228245

229246
extension DashboardViewContoller: NSToolbarDelegate, NSToolbarItemValidation {
@@ -254,21 +271,43 @@ extension DashboardViewContoller: NSToolbarDelegate, NSToolbarItemValidation {
254271
group.controlRepresentation = .collapsed
255272
group.selectedIndex = levels.firstIndex(of: ConfigManager.selectLoggingApiLevel) ?? 0
256273

274+
group.label = "Log Level"
275+
257276
return group
277+
case .logFilterItem:
278+
let titles = LogFilter.allCases.map {
279+
$0.rawValue
280+
}
281+
282+
let group = NSToolbarItemGroup(itemIdentifier: .logFilterItem, titles: titles, selectionMode: .selectOne, labels: titles, target: nil, action: #selector(setLogFilter(_:)))
283+
284+
group.selectionMode = .selectOne
285+
group.controlRepresentation = .collapsed
286+
group.selectedIndex = 0
287+
288+
group.label = "Log Filter"
289+
290+
return group
258291
case .hideNamesItem:
259292
let item = NSToolbarItem(itemIdentifier: .hideNamesItem)
260293
item.target = self
261294
item.action = #selector(hideNames(_:))
262295
item.isBordered = true
263296
item.tag = 0
264297
item.image = NSImage(systemSymbolName: "wand.and.stars", accessibilityDescription: nil)
298+
299+
item.label = "Hide Names"
300+
265301
return item
266302
case .stopConnsItem:
267303
let item = NSToolbarItem(itemIdentifier: .stopConnsItem)
268304
item.target = self
269305
item.action = #selector(stopConns(_:))
270306
item.isBordered = true
271307
item.image = NSImage(systemSymbolName: "stop.circle.fill", accessibilityDescription: nil)
308+
309+
item.label = "Stop All"
310+
272311
return item
273312
default:
274313
break
@@ -284,6 +323,7 @@ extension DashboardViewContoller: NSToolbarDelegate, NSToolbarItemValidation {
284323
.stopConnsItem,
285324
.hideNamesItem,
286325
.logLevelItem,
326+
.logFilterItem,
287327
.searchItem
288328
]
289329
}
@@ -294,6 +334,7 @@ extension DashboardViewContoller: NSToolbarDelegate, NSToolbarItemValidation {
294334
.stopConnsItem,
295335
.hideNamesItem,
296336
.logLevelItem,
337+
.logFilterItem,
297338
.searchItem
298339
]
299340
}

ClashX/Dashboard/Extensions/NotificationNames.swift

+1
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,5 @@ extension NSNotification.Name {
1414
static let stopConns = NSNotification.Name("StopConns")
1515
static let hideNames = NSNotification.Name("HideNames")
1616
static let logLevelChanged = NSNotification.Name("LogLevelChanged")
17+
static let logFilterChanged = NSNotification.Name("LogFilterChanged")
1718
}

ClashX/Dashboard/Models/DBProxyStorage.swift

+17-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ class DBProxy: ObservableObject {
103103

104104
switch delay {
105105
case 0:
106-
return .gray
106+
return .red
107107
case ..<200 where !httpsTest:
108108
return .green
109109
case ..<800 where httpsTest:
@@ -118,3 +118,19 @@ class DBProxy: ObservableObject {
118118
}
119119
}
120120

121+
122+
extension String {
123+
var hiddenID: String {
124+
guard UUID(uuidString: self) != nil else { return "" }
125+
let components = split(separator: "-").map(String.init)
126+
guard components.count == 5 else { return "" }
127+
128+
let re = components[0].prefix(2)
129+
+ components[1].prefix(1)
130+
+ components[2].prefix(1)
131+
+ components[3].prefix(1)
132+
+ components[4].suffix(3)
133+
134+
return String(re)
135+
}
136+
}

ClashX/Dashboard/Views/ContentTabs/Config/ConfigItemView.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ struct ConfigItemView<Content: View>: View {
2222
HStack(content: content)
2323
}
2424
.padding(EdgeInsets(top: 10, leading: 13, bottom: 10, trailing: 13))
25-
.background(Color(compatible: .textBackgroundColor))
25+
.background(Color("SwiftUI Colors/ContentBackgroundColor"))
2626
.cornerRadius(10)
2727
}
2828
}

ClashX/Dashboard/Views/ContentTabs/Config/ConfigView.swift

+1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ struct ConfigView: View {
4646
content2
4747
.padding()
4848
}
49+
.background(Color("SwiftUI Colors/WindowBackgroundColor"))
4950
.disabled(!configInited)
5051
.onAppear {
5152
configInited = false

ClashX/Dashboard/Views/ContentTabs/Logs/LogsTableView.swift

+24
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ struct LogsTableView<Item: Hashable>: NSViewRepresentable {
1717

1818
var data: [Item]
1919
var filterString: String
20+
var logFilter: DashboardViewContoller.LogFilter
2021

2122
class NonRespondingScrollView: NSScrollView {
2223
override var acceptsFirstResponder: Bool { false }
@@ -84,6 +85,29 @@ struct LogsTableView<Item: Hashable>: NSViewRepresentable {
8485
"log",
8586
]
8687

88+
switch logFilter {
89+
case .all:
90+
break
91+
case .rule:
92+
re = re.filter {
93+
$0.log.starts(with: "[Rule")
94+
|| $0.log.starts(with: "[TCP")
95+
|| $0.log.starts(with: "[UDP")
96+
}
97+
case .dns:
98+
re = re.filter {
99+
$0.log.starts(with: "[DNS")
100+
}
101+
case .others:
102+
re = re.filter {
103+
!$0.log.starts(with: "[DNS")
104+
&& !$0.log.starts(with: "[Rule")
105+
&& !$0.log.starts(with: "[TCP")
106+
&& !$0.log.starts(with: "[UDP")
107+
}
108+
}
109+
110+
87111
re = re.filtered(filterString, for: filterKeys)
88112

89113
return re

ClashX/Dashboard/Views/ContentTabs/Logs/LogsView.swift

+15-1
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,17 @@ struct LogsView: View {
1111
@EnvironmentObject var logStorage: ClashLogStorage
1212

1313
@State var searchString: String = ""
14+
@State var logFilter = DashboardViewContoller.LogFilter.all
15+
1416
@State var logLevel = ConfigManager.selectLoggingApiLevel
1517

1618
var body: some View {
1719
Group {
18-
LogsTableView(data: logStorage.logs.reversed(), filterString: searchString)
20+
LogsTableView(
21+
data: logStorage.logs.reversed(),
22+
filterString: searchString,
23+
logFilter: logFilter
24+
)
1925
}
2026
.onAppear {
2127
guard let s = ToolbarStore.shared.searchStrings["logs"] else { return }
@@ -33,13 +39,21 @@ struct LogsView: View {
3339
guard let level = $0.userInfo?["level"] as? ClashLogLevel else { return }
3440
logLevelChanged(level)
3541
}
42+
.onReceive(NotificationCenter.default.publisher(for: .logFilterChanged)) {
43+
guard let level = $0.userInfo?["filter"] as? DashboardViewContoller.LogFilter else { return }
44+
logFilterChanged(level)
45+
}
3646
}
3747

3848
func logLevelChanged(_ level: ClashLogLevel) {
3949
logStorage.logs.removeAll()
4050
ConfigManager.selectLoggingApiLevel = level
4151
ApiRequest.shared.resetLogStreamApi()
4252
}
53+
54+
func logFilterChanged(_ filter: DashboardViewContoller.LogFilter) {
55+
logFilter = filter
56+
}
4357
}
4458

4559
struct LogsView_Previews: PreviewProvider {

ClashX/Dashboard/Views/ContentTabs/Overview/OverviewTopItemView.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ struct OverviewTopItemView: View {
2424
}
2525
.frame(width: 125)
2626
.padding(EdgeInsets(top: 10, leading: 13, bottom: 10, trailing: 13))
27-
.background(Color(compatible: .textBackgroundColor))
27+
.background(Color("SwiftUI Colors/ContentBackgroundColor"))
2828
.cornerRadius(10)
2929
}
3030
}

ClashX/Dashboard/Views/ContentTabs/Overview/OverviewView.swift

+1
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ struct OverviewView: View {
7272
self.version = $0?.version ?? ""
7373
}
7474
}
75+
.background(Color("SwiftUI Colors/WindowBackgroundColor"))
7576
}
7677

7778
func updateColumnCount(_ width: Double) {

ClashX/Dashboard/Views/ContentTabs/Providers/ProviderRowView.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ struct ProviderRowView: View {
2323
VStack(spacing: 2) {
2424
HStack(alignment: .center) {
2525
Text(hideProxyNames.hide
26-
? String(proxyProvider.id.prefix(8))
26+
? String(proxyProvider.id.hiddenID)
2727
: proxyProvider.name)
2828
.font(.system(size: 15))
2929
Spacer()

ClashX/Dashboard/Views/ContentTabs/Providers/ProvidersView.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ struct ProvidersView: View {
1515
@StateObject private var hideProxyNames = HideProxyNames()
1616

1717
var body: some View {
18-
1918
NavigationView {
2019
listView
2120
EmptyView()
2221
}
22+
.background(Color("SwiftUI Colors/WindowBackgroundColor"))
2323
.onReceive(NotificationCenter.default.publisher(for: .toolbarSearchString)) {
2424
guard let string = $0.userInfo?["String"] as? String else { return }
2525
searchString.string = string

ClashX/Dashboard/Views/ContentTabs/Providers/ProxyProviderInfoView.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ struct ProxyProviderInfoView: View {
3636
var header: some View {
3737
HStack() {
3838
Text(hideProxyNames.hide
39-
? String(provider.id.prefix(8))
39+
? String(provider.id.hiddenID)
4040
: provider.name)
4141
.font(.system(size: 17))
4242
Text(provider.vehicleType.rawValue)

ClashX/Dashboard/Views/ContentTabs/Providers/RuleProviderView.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ struct RuleProviderView: View {
1515
VStack(alignment: .leading) {
1616
HStack {
1717
Text(provider.name)
18-
.font(.title)
18+
.font(.title2)
1919
.fontWeight(.medium)
2020
Text(provider.type)
2121
Text(provider.behavior)

ClashX/Dashboard/Views/ContentTabs/Proxies/ProxiesView.swift

+1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ struct ProxiesView: View {
3333
.listStyle(.plain)
3434
EmptyView()
3535
}
36+
.background(Color("SwiftUI Colors/WindowBackgroundColor"))
3637
.onReceive(NotificationCenter.default.publisher(for: .toolbarSearchString)) {
3738
guard let string = $0.userInfo?["String"] as? String else { return }
3839
searchString.string = string

0 commit comments

Comments
 (0)