Skip to content

Commit 2957413

Browse files
committed
style: revamp KeyringView toolbar with macOS native search field and button style
Replace the default SwiftUI `.searchable` modifier with a custom `searchField` view in the Keyring toolbar. This provides a consistent macOS aesthetic using `TextField` with plain styling, rounded background, and border. Restructure the toolbar layout to use a two-row HStack/VStack configuration, separating the search controls from the filter and sort pickers. Update the `ContentView` placeholder text localization keys to align with the new `content` namespace. Add Xcode scheme management files and resolve workspace state conflicts.
1 parent 49ab5b6 commit 2957413

5 files changed

Lines changed: 105 additions & 24 deletions

File tree

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>SchemeUserState</key>
6+
<dict>
7+
<key>FinderSyncExtension.xcscheme_^#shared#^_</key>
8+
<dict>
9+
<key>orderHint</key>
10+
<integer>0</integer>
11+
</dict>
12+
<key>MacPGP.xcscheme_^#shared#^_</key>
13+
<dict>
14+
<key>orderHint</key>
15+
<integer>1</integer>
16+
</dict>
17+
<key>QuickLookExtension.xcscheme_^#shared#^_</key>
18+
<dict>
19+
<key>orderHint</key>
20+
<integer>2</integer>
21+
</dict>
22+
<key>ShareExtension.xcscheme_^#shared#^_</key>
23+
<dict>
24+
<key>orderHint</key>
25+
<integer>3</integer>
26+
</dict>
27+
<key>ThumbnailExtension.xcscheme_^#shared#^_</key>
28+
<dict>
29+
<key>orderHint</key>
30+
<integer>4</integer>
31+
</dict>
32+
</dict>
33+
</dict>
34+
</plist>

MacPGP/MacPGP/Features/Keyring/KeyringView.swift

Lines changed: 54 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ struct KeyringView: View {
4646
keyList(viewModel: viewModel)
4747
}
4848
}
49-
.searchable(text: $vm.searchText, prompt: "Search keys...")
5049
.confirmationDialog(
5150
"Delete Key",
5251
isPresented: $vm.showingDeleteConfirmation,
@@ -104,34 +103,68 @@ struct KeyringView: View {
104103
private func toolbar(viewModel: KeyringViewModel) -> some View {
105104
@Bindable var vm = viewModel
106105

107-
HStack {
108-
Picker(String(localized: "keyring.toolbar.filter", defaultValue: "Filter", comment: "Filter picker label"), selection: $vm.filterType) {
109-
ForEach(KeyFilterType.allCases) { filter in
110-
Text(filter.displayName).tag(filter)
106+
VStack(spacing: 8) {
107+
HStack(spacing: 8) {
108+
searchField(text: $vm.searchText)
109+
110+
Button(action: { showingKeyserverSearch = true }) {
111+
Image(systemName: "globe")
111112
}
113+
.buttonStyle(.bordered)
114+
.controlSize(.small)
115+
.frame(width: 28)
116+
.help(String(localized: "keyring.search_keyserver", defaultValue: "Search Keyserver", comment: "Tooltip for keyserver search button"))
117+
.accessibilityLabel(String(localized: "keyring.search_keyserver", defaultValue: "Search Keyserver", comment: "Accessibility label for keyserver search button"))
112118
}
113-
.pickerStyle(.menu)
114-
.labelsHidden()
115-
.frame(width: 130)
116119

117-
Button(action: { showingKeyserverSearch = true }) {
118-
Label(String(localized: "keyring.toolbar.search_keyserver", defaultValue: "Search Keyserver", comment: "Button to search key server"), systemImage: "magnifyingglass")
119-
}
120-
.buttonStyle(.borderless)
120+
HStack(spacing: 8) {
121+
Picker(String(localized: "keyring.toolbar.filter", defaultValue: "Filter", comment: "Filter picker label"), selection: $vm.filterType) {
122+
ForEach(KeyFilterType.allCases) { filter in
123+
Text(filter.displayName).tag(filter)
124+
}
125+
}
126+
.pickerStyle(.menu)
127+
.labelsHidden()
128+
.controlSize(.small)
129+
.frame(width: 130)
121130

122-
Spacer()
131+
Spacer(minLength: 0)
123132

124-
Picker(String(localized: "keyring.toolbar.sort", defaultValue: "Sort", comment: "Sort picker label"), selection: $vm.sortOrder) {
125-
ForEach(KeySortOrder.allCases) { order in
126-
Text(order.displayName).tag(order)
133+
Picker(String(localized: "keyring.toolbar.sort", defaultValue: "Sort", comment: "Sort picker label"), selection: $vm.sortOrder) {
134+
ForEach(KeySortOrder.allCases) { order in
135+
Text(order.displayName).tag(order)
136+
}
127137
}
138+
.pickerStyle(.menu)
139+
.labelsHidden()
140+
.controlSize(.small)
141+
.frame(width: 90)
128142
}
129-
.pickerStyle(.menu)
130-
.labelsHidden()
131-
.frame(width: 90)
132143
}
133-
.padding(.horizontal)
134-
.padding(.vertical, 8)
144+
.padding(.horizontal, 12)
145+
.padding(.top, 8)
146+
.padding(.bottom, 6)
147+
}
148+
149+
@ViewBuilder
150+
private func searchField(text: Binding<String>) -> some View {
151+
HStack(spacing: 6) {
152+
Image(systemName: "magnifyingglass")
153+
.foregroundStyle(.secondary)
154+
155+
TextField(String(localized: "keyring.search_placeholder", defaultValue: "Search keys...", comment: "Search field placeholder in keyring"), text: text)
156+
.textFieldStyle(.plain)
157+
}
158+
.padding(.horizontal, 8)
159+
.frame(height: 28)
160+
.background {
161+
RoundedRectangle(cornerRadius: 6, style: .continuous)
162+
.fill(Color(nsColor: .controlBackgroundColor))
163+
}
164+
.overlay {
165+
RoundedRectangle(cornerRadius: 6, style: .continuous)
166+
.stroke(Color(nsColor: .separatorColor), lineWidth: 0.5)
167+
}
135168
}
136169

137170
@ViewBuilder

MacPGP/MacPGP/Navigation/ContentView.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ struct ContentView: View {
7878
case .verify:
7979
VerifyView()
8080
case .keyring, nil:
81-
Text(String(localized: "contentview.select_item", comment: "Placeholder text when no sidebar item is selected"))
81+
Text(String(localized: "content.select_item", comment: "Placeholder text when no sidebar item is selected"))
8282
.foregroundStyle(.secondary)
8383
}
8484
}
@@ -91,9 +91,9 @@ struct ContentView: View {
9191
}
9292
} else {
9393
ContentUnavailableView(
94-
String(localized: "contentview.no_key_selected", comment: "Title shown when no PGP key is selected"),
94+
String(localized: "content.no_key_selected", comment: "Title shown when no PGP key is selected"),
9595
systemImage: "key",
96-
description: Text(String(localized: "contentview.select_key_description", comment: "Description prompting user to select a key"))
96+
description: Text(String(localized: "content.select_key_details", comment: "Description prompting user to select a key"))
9797
)
9898
}
9999
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>SchemeUserState</key>
6+
<dict>
7+
<key>RNPKit.xcscheme_^#shared#^_</key>
8+
<dict>
9+
<key>orderHint</key>
10+
<integer>5</integer>
11+
</dict>
12+
</dict>
13+
</dict>
14+
</plist>

0 commit comments

Comments
 (0)