Skip to content

Commit 8d895bb

Browse files
committed
Merge branch 'feature/search-provider' into develop
* feature/search-provider: Create 0.4.5 release Allow user to change search provider in settings
2 parents 292d215 + 8261020 commit 8d895bb

File tree

7 files changed

+70
-14
lines changed

7 files changed

+70
-14
lines changed

floaty.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
cask 'floaty' do
2-
version '0.4.4'
3-
sha256 '0c34cbf80873f923afcd1d2319f5b307b6390f06a4512f0f95d7362342d7dae6'
2+
version '0.4.5'
3+
sha256 '6f37b22518df5c43875bf813cac2c19e0f77c79f97226c4c7690004aa779104a'
44

55
url "https://github.com/jameszaghini/floaty/releases/download/#{version}/Floaty.app.zip"
66
appcast 'https://github.com/jameszaghini/floaty/releases.atom'

floaty/Base.lproj/Main.storyboard

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -846,26 +846,49 @@
846846
<action selector="sliderChanged:" target="dmE-PD-IGl" id="f0f-RP-SCr"/>
847847
</connections>
848848
</slider>
849+
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="79X-d9-c6E">
850+
<rect key="frame" x="18" y="124" width="444" height="17"/>
851+
<textFieldCell key="cell" lineBreakMode="clipping" title="Search provider" id="owf-Gv-5ZO">
852+
<font key="font" metaFont="system"/>
853+
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
854+
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
855+
</textFieldCell>
856+
</textField>
857+
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="oCn-Sh-FsZ">
858+
<rect key="frame" x="18" y="92" width="445" height="25"/>
859+
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="4UO-tS-TSw">
860+
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
861+
<font key="font" metaFont="menu"/>
862+
<menu key="menu" id="Dxa-0i-9xd"/>
863+
</popUpButtonCell>
864+
</popUpButton>
849865
</subviews>
850866
<constraints>
851867
<constraint firstItem="Hl7-6C-ECX" firstAttribute="top" secondItem="iwb-tU-Q5M" secondAttribute="bottom" constant="14" id="0Tl-zV-db4"/>
852868
<constraint firstItem="iwb-tU-Q5M" firstAttribute="leading" secondItem="1ff-id-YLM" secondAttribute="leading" id="3ss-oD-Xtr"/>
853869
<constraint firstItem="iwb-tU-Q5M" firstAttribute="top" secondItem="1ff-id-YLM" secondAttribute="bottom" constant="8" id="ARC-d7-CX4"/>
870+
<constraint firstItem="79X-d9-c6E" firstAttribute="trailing" secondItem="5uM-FD-SWL" secondAttribute="trailing" id="Hw2-5b-ing"/>
871+
<constraint firstItem="oCn-Sh-FsZ" firstAttribute="top" secondItem="79X-d9-c6E" secondAttribute="bottom" constant="8" id="Kb4-fp-SnA"/>
854872
<constraint firstItem="5uM-FD-SWL" firstAttribute="trailing" secondItem="Hl7-6C-ECX" secondAttribute="trailing" id="N4b-Fd-TUH"/>
873+
<constraint firstItem="oCn-Sh-FsZ" firstAttribute="leading" secondItem="79X-d9-c6E" secondAttribute="leading" id="QYE-5Z-Hhh"/>
855874
<constraint firstItem="Hl7-6C-ECX" firstAttribute="trailing" secondItem="iwb-tU-Q5M" secondAttribute="trailing" id="VrA-TJ-Fde"/>
856875
<constraint firstItem="Hl7-6C-ECX" firstAttribute="leading" secondItem="iwb-tU-Q5M" secondAttribute="leading" id="XMt-XA-d1j"/>
857876
<constraint firstItem="iwb-tU-Q5M" firstAttribute="trailing" secondItem="1ff-id-YLM" secondAttribute="trailing" id="YBn-3Y-YtK"/>
858877
<constraint firstItem="iwb-tU-Q5M" firstAttribute="top" secondItem="1ff-id-YLM" secondAttribute="bottom" constant="8" id="Zma-cr-f4L"/>
859878
<constraint firstItem="1ff-id-YLM" firstAttribute="leading" secondItem="Ktc-ZX-ubL" secondAttribute="leading" constant="20" id="caB-1f-W87"/>
879+
<constraint firstItem="79X-d9-c6E" firstAttribute="leading" secondItem="5uM-FD-SWL" secondAttribute="leading" id="d0J-S0-UW8"/>
880+
<constraint firstItem="79X-d9-c6E" firstAttribute="top" secondItem="5uM-FD-SWL" secondAttribute="bottom" constant="8" id="gs5-TU-d0a"/>
860881
<constraint firstItem="1ff-id-YLM" firstAttribute="top" secondItem="Ktc-ZX-ubL" secondAttribute="top" constant="20" id="hGA-Te-OcT"/>
861882
<constraint firstAttribute="trailing" secondItem="1ff-id-YLM" secondAttribute="trailing" constant="20" id="lat-bj-Fqp"/>
862883
<constraint firstItem="5uM-FD-SWL" firstAttribute="leading" secondItem="Hl7-6C-ECX" secondAttribute="leading" id="mHl-wH-ONy"/>
884+
<constraint firstItem="oCn-Sh-FsZ" firstAttribute="trailing" secondItem="79X-d9-c6E" secondAttribute="trailing" id="pYn-Sk-AaC"/>
863885
<constraint firstItem="5uM-FD-SWL" firstAttribute="top" secondItem="Hl7-6C-ECX" secondAttribute="bottom" constant="8" id="vJs-lO-LEg"/>
864886
</constraints>
865887
</view>
866888
<connections>
867889
<outlet property="homepageURLTextField" destination="iwb-tU-Q5M" id="dTg-gt-upc"/>
868890
<outlet property="opacitySlider" destination="5uM-FD-SWL" id="DRF-vK-yyx"/>
891+
<outlet property="searchProviderPopUpButton" destination="oCn-Sh-FsZ" id="CVF-wF-CjL"/>
869892
</connections>
870893
</viewController>
871894
<customObject id="krR-By-U9r" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>

floaty/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
<key>CFBundlePackageType</key>
1818
<string>APPL</string>
1919
<key>CFBundleShortVersionString</key>
20-
<string>0.4.4</string>
20+
<string>0.4.5</string>
2121
<key>CFBundleVersion</key>
2222
<string>1</string>
2323
<key>LSApplicationCategoryType</key>

floaty/SearchProvider.swift

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,41 +9,47 @@
99
import Foundation
1010

1111
typealias SearchProviderId = String
12+
typealias SearchProviderName = String
1213

1314
protocol SearchProvider: Codable {
14-
var providerId: SearchProviderId { get }
15+
var identifier: SearchProviderId { get }
16+
var name: SearchProviderName { get }
1517
var url: URL { get }
1618
var searchURLString: String { get }
1719
}
1820

1921
struct Search {
20-
2122
static let duckDuckGo = DuckDuckGo()
2223
static let google = Google()
2324
static let bing = Bing()
2425

2526
static let allProviders: [SearchProvider] = [duckDuckGo, google, bing]
2627
static let defaultProvider: SearchProvider = duckDuckGo
2728

28-
static func activeProvider(settings: Settings) -> SearchProvider {
29-
return defaultProvider
29+
static func activeProvider(withId identifier: SearchProviderId) -> SearchProvider {
30+
return Search.allProviders.first(where: {
31+
$0.identifier == identifier
32+
}) ?? Search.defaultProvider
3033
}
3134
}
3235

3336
struct Google: SearchProvider {
34-
let providerId = "google"
37+
let identifier = "google"
38+
let name = "Google"
3539
var url = URL(string: "https://www.google.com")!
3640
var searchURLString = "https://google.com/search?client=safari&q="
3741
}
3842

3943
struct DuckDuckGo: SearchProvider {
40-
let providerId = "duckduckgo"
44+
let identifier = "duckduckgo"
45+
let name = "DuckDuckGo"
4146
var url = URL(string: "https://www.duckduckgo.com?kae=d")!
42-
var searchURLString = "https://duckduckgo.com/?q="
47+
var searchURLString = "https://www.duckduckgo.com?kae=d&q="
4348
}
4449

4550
struct Bing: SearchProvider {
46-
let providerId = "bing"
51+
let identifier = "bing"
52+
let name = "Bing"
4753
var url = URL(string: "https://www.bing.com/")!
4854
var searchURLString = "https://www.bing.com/search?q="
4955
}

floaty/Settings.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ class Settings: Codable {
1616
didSet { save() }
1717
}
1818

19+
var activeSearchProviderId: SearchProviderId {
20+
didSet { save() }
21+
}
22+
1923
var windowOpacityObservable = Observable(CGFloat?(nil))
2024
var windowOpacity: CGFloat {
2125
didSet {
@@ -26,7 +30,7 @@ class Settings: Codable {
2630
}
2731

2832
private enum CodingKeys: String, CodingKey {
29-
case homepageURLString, windowOpacity
33+
case homepageURLString, windowOpacity, activeSearchProviderId
3034
}
3135

3236
static func load(storeFilename: String) -> Settings {
@@ -43,10 +47,12 @@ class Settings: Codable {
4347

4448
init(storeFilename: String,
4549
homepageURLString: String = "https://www.duckduckgo.com?kae=d",
46-
windowOpacity: CGFloat = 1) {
50+
windowOpacity: CGFloat = 1,
51+
activeSearchProviderId: SearchProviderId = Search.defaultProvider.identifier) {
4752
self.homepageURLString = homepageURLString
4853
self.windowOpacity = windowOpacity
4954
self.storeFilename = storeFilename
55+
self.activeSearchProviderId = activeSearchProviderId
5056
save()
5157
}
5258

floaty/SettingsWindowController.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ class SettingsViewController: NSViewController, NSTextFieldDelegate, Serviceable
1212

1313
@IBOutlet private(set) var homepageURLTextField: NSTextField!
1414
@IBOutlet private(set) var opacitySlider: NSSlider!
15+
@IBOutlet private(set) var searchProviderPopUpButton: NSPopUpButton!
1516

1617
var settings = Services.shared.settings
1718

1819
override func viewDidLoad() {
1920
homepageURLTextField.stringValue = settings.homepageURLString
2021
opacitySlider.floatValue = Float(settings.windowOpacity)
22+
setupSearchProviders()
2123
}
2224

2325
override func controlTextDidEndEditing(_ aNotification: Notification) {
@@ -31,4 +33,23 @@ class SettingsViewController: NSViewController, NSTextFieldDelegate, Serviceable
3133
let opacity = CGFloat(slider.floatValue)
3234
settings.windowOpacity = opacity
3335
}
36+
37+
@objc func searchProviderChanged(_ sender: NSMenuItem) {
38+
let provider = Search.allProviders.first(where: { $0.name == sender.title })?.identifier
39+
settings.activeSearchProviderId = provider ?? Search.defaultProvider.identifier
40+
}
41+
42+
// MARK: - Private
43+
44+
private func setupSearchProviders() {
45+
Search.allProviders.forEach {
46+
searchProviderPopUpButton.menu?.addItem(withTitle: $0.name,
47+
action: #selector(SettingsViewController.searchProviderChanged(_:)),
48+
keyEquivalent: "")
49+
50+
if settings.activeSearchProviderId == $0.identifier {
51+
searchProviderPopUpButton.selectItem(withTitle: $0.name)
52+
}
53+
}
54+
}
3455
}

floaty/WebViewController.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class WebViewController: NSViewController, ToolbarDelegate, WKUIDelegate, Javasc
4040
loadURL(url)
4141
case .search(let query):
4242
guard let encodedQuery = query.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) else { break }
43-
let searchProvider = Search.activeProvider(settings: Services.shared.settings)
43+
let searchProvider = Search.activeProvider(withId: Services.shared.settings.activeSearchProviderId)
4444
let url = URL(string: searchProvider.searchURLString + encodedQuery)
4545
loadURL(url)
4646
case .showError(let title, let message):

0 commit comments

Comments
 (0)