Skip to content

Commit

Permalink
Merge branch 'feature/search-provider' into develop
Browse files Browse the repository at this point in the history
* feature/search-provider:
  Create 0.4.5 release
  Allow user to change search provider in settings
  • Loading branch information
jameszaghini committed Apr 14, 2019
2 parents 292d215 + 8261020 commit 8d895bb
Show file tree
Hide file tree
Showing 7 changed files with 70 additions and 14 deletions.
4 changes: 2 additions & 2 deletions floaty.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
cask 'floaty' do
version '0.4.4'
sha256 '0c34cbf80873f923afcd1d2319f5b307b6390f06a4512f0f95d7362342d7dae6'
version '0.4.5'
sha256 '6f37b22518df5c43875bf813cac2c19e0f77c79f97226c4c7690004aa779104a'

url "https://github.com/jameszaghini/floaty/releases/download/#{version}/Floaty.app.zip"
appcast 'https://github.com/jameszaghini/floaty/releases.atom'
Expand Down
23 changes: 23 additions & 0 deletions floaty/Base.lproj/Main.storyboard
Original file line number Diff line number Diff line change
Expand Up @@ -846,26 +846,49 @@
<action selector="sliderChanged:" target="dmE-PD-IGl" id="f0f-RP-SCr"/>
</connections>
</slider>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="79X-d9-c6E">
<rect key="frame" x="18" y="124" width="444" height="17"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Search provider" id="owf-Gv-5ZO">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="oCn-Sh-FsZ">
<rect key="frame" x="18" y="92" width="445" height="25"/>
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="4UO-tS-TSw">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="Dxa-0i-9xd"/>
</popUpButtonCell>
</popUpButton>
</subviews>
<constraints>
<constraint firstItem="Hl7-6C-ECX" firstAttribute="top" secondItem="iwb-tU-Q5M" secondAttribute="bottom" constant="14" id="0Tl-zV-db4"/>
<constraint firstItem="iwb-tU-Q5M" firstAttribute="leading" secondItem="1ff-id-YLM" secondAttribute="leading" id="3ss-oD-Xtr"/>
<constraint firstItem="iwb-tU-Q5M" firstAttribute="top" secondItem="1ff-id-YLM" secondAttribute="bottom" constant="8" id="ARC-d7-CX4"/>
<constraint firstItem="79X-d9-c6E" firstAttribute="trailing" secondItem="5uM-FD-SWL" secondAttribute="trailing" id="Hw2-5b-ing"/>
<constraint firstItem="oCn-Sh-FsZ" firstAttribute="top" secondItem="79X-d9-c6E" secondAttribute="bottom" constant="8" id="Kb4-fp-SnA"/>
<constraint firstItem="5uM-FD-SWL" firstAttribute="trailing" secondItem="Hl7-6C-ECX" secondAttribute="trailing" id="N4b-Fd-TUH"/>
<constraint firstItem="oCn-Sh-FsZ" firstAttribute="leading" secondItem="79X-d9-c6E" secondAttribute="leading" id="QYE-5Z-Hhh"/>
<constraint firstItem="Hl7-6C-ECX" firstAttribute="trailing" secondItem="iwb-tU-Q5M" secondAttribute="trailing" id="VrA-TJ-Fde"/>
<constraint firstItem="Hl7-6C-ECX" firstAttribute="leading" secondItem="iwb-tU-Q5M" secondAttribute="leading" id="XMt-XA-d1j"/>
<constraint firstItem="iwb-tU-Q5M" firstAttribute="trailing" secondItem="1ff-id-YLM" secondAttribute="trailing" id="YBn-3Y-YtK"/>
<constraint firstItem="iwb-tU-Q5M" firstAttribute="top" secondItem="1ff-id-YLM" secondAttribute="bottom" constant="8" id="Zma-cr-f4L"/>
<constraint firstItem="1ff-id-YLM" firstAttribute="leading" secondItem="Ktc-ZX-ubL" secondAttribute="leading" constant="20" id="caB-1f-W87"/>
<constraint firstItem="79X-d9-c6E" firstAttribute="leading" secondItem="5uM-FD-SWL" secondAttribute="leading" id="d0J-S0-UW8"/>
<constraint firstItem="79X-d9-c6E" firstAttribute="top" secondItem="5uM-FD-SWL" secondAttribute="bottom" constant="8" id="gs5-TU-d0a"/>
<constraint firstItem="1ff-id-YLM" firstAttribute="top" secondItem="Ktc-ZX-ubL" secondAttribute="top" constant="20" id="hGA-Te-OcT"/>
<constraint firstAttribute="trailing" secondItem="1ff-id-YLM" secondAttribute="trailing" constant="20" id="lat-bj-Fqp"/>
<constraint firstItem="5uM-FD-SWL" firstAttribute="leading" secondItem="Hl7-6C-ECX" secondAttribute="leading" id="mHl-wH-ONy"/>
<constraint firstItem="oCn-Sh-FsZ" firstAttribute="trailing" secondItem="79X-d9-c6E" secondAttribute="trailing" id="pYn-Sk-AaC"/>
<constraint firstItem="5uM-FD-SWL" firstAttribute="top" secondItem="Hl7-6C-ECX" secondAttribute="bottom" constant="8" id="vJs-lO-LEg"/>
</constraints>
</view>
<connections>
<outlet property="homepageURLTextField" destination="iwb-tU-Q5M" id="dTg-gt-upc"/>
<outlet property="opacitySlider" destination="5uM-FD-SWL" id="DRF-vK-yyx"/>
<outlet property="searchProviderPopUpButton" destination="oCn-Sh-FsZ" id="CVF-wF-CjL"/>
</connections>
</viewController>
<customObject id="krR-By-U9r" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
Expand Down
2 changes: 1 addition & 1 deletion floaty/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>0.4.4</string>
<string>0.4.5</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSApplicationCategoryType</key>
Expand Down
22 changes: 14 additions & 8 deletions floaty/SearchProvider.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,41 +9,47 @@
import Foundation

typealias SearchProviderId = String
typealias SearchProviderName = String

protocol SearchProvider: Codable {
var providerId: SearchProviderId { get }
var identifier: SearchProviderId { get }
var name: SearchProviderName { get }
var url: URL { get }
var searchURLString: String { get }
}

struct Search {

static let duckDuckGo = DuckDuckGo()
static let google = Google()
static let bing = Bing()

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

static func activeProvider(settings: Settings) -> SearchProvider {
return defaultProvider
static func activeProvider(withId identifier: SearchProviderId) -> SearchProvider {
return Search.allProviders.first(where: {
$0.identifier == identifier
}) ?? Search.defaultProvider
}
}

struct Google: SearchProvider {
let providerId = "google"
let identifier = "google"
let name = "Google"
var url = URL(string: "https://www.google.com")!
var searchURLString = "https://google.com/search?client=safari&q="
}

struct DuckDuckGo: SearchProvider {
let providerId = "duckduckgo"
let identifier = "duckduckgo"
let name = "DuckDuckGo"
var url = URL(string: "https://www.duckduckgo.com?kae=d")!
var searchURLString = "https://duckduckgo.com/?q="
var searchURLString = "https://www.duckduckgo.com?kae=d&q="
}

struct Bing: SearchProvider {
let providerId = "bing"
let identifier = "bing"
let name = "Bing"
var url = URL(string: "https://www.bing.com/")!
var searchURLString = "https://www.bing.com/search?q="
}
10 changes: 8 additions & 2 deletions floaty/Settings.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ class Settings: Codable {
didSet { save() }
}

var activeSearchProviderId: SearchProviderId {
didSet { save() }
}

var windowOpacityObservable = Observable(CGFloat?(nil))
var windowOpacity: CGFloat {
didSet {
Expand All @@ -26,7 +30,7 @@ class Settings: Codable {
}

private enum CodingKeys: String, CodingKey {
case homepageURLString, windowOpacity
case homepageURLString, windowOpacity, activeSearchProviderId
}

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

init(storeFilename: String,
homepageURLString: String = "https://www.duckduckgo.com?kae=d",
windowOpacity: CGFloat = 1) {
windowOpacity: CGFloat = 1,
activeSearchProviderId: SearchProviderId = Search.defaultProvider.identifier) {
self.homepageURLString = homepageURLString
self.windowOpacity = windowOpacity
self.storeFilename = storeFilename
self.activeSearchProviderId = activeSearchProviderId
save()
}

Expand Down
21 changes: 21 additions & 0 deletions floaty/SettingsWindowController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,14 @@ class SettingsViewController: NSViewController, NSTextFieldDelegate, Serviceable

@IBOutlet private(set) var homepageURLTextField: NSTextField!
@IBOutlet private(set) var opacitySlider: NSSlider!
@IBOutlet private(set) var searchProviderPopUpButton: NSPopUpButton!

var settings = Services.shared.settings

override func viewDidLoad() {
homepageURLTextField.stringValue = settings.homepageURLString
opacitySlider.floatValue = Float(settings.windowOpacity)
setupSearchProviders()
}

override func controlTextDidEndEditing(_ aNotification: Notification) {
Expand All @@ -31,4 +33,23 @@ class SettingsViewController: NSViewController, NSTextFieldDelegate, Serviceable
let opacity = CGFloat(slider.floatValue)
settings.windowOpacity = opacity
}

@objc func searchProviderChanged(_ sender: NSMenuItem) {
let provider = Search.allProviders.first(where: { $0.name == sender.title })?.identifier
settings.activeSearchProviderId = provider ?? Search.defaultProvider.identifier
}

// MARK: - Private

private func setupSearchProviders() {
Search.allProviders.forEach {
searchProviderPopUpButton.menu?.addItem(withTitle: $0.name,
action: #selector(SettingsViewController.searchProviderChanged(_:)),
keyEquivalent: "")

if settings.activeSearchProviderId == $0.identifier {
searchProviderPopUpButton.selectItem(withTitle: $0.name)
}
}
}
}
2 changes: 1 addition & 1 deletion floaty/WebViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ class WebViewController: NSViewController, ToolbarDelegate, WKUIDelegate, Javasc
loadURL(url)
case .search(let query):
guard let encodedQuery = query.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) else { break }
let searchProvider = Search.activeProvider(settings: Services.shared.settings)
let searchProvider = Search.activeProvider(withId: Services.shared.settings.activeSearchProviderId)
let url = URL(string: searchProvider.searchURLString + encodedQuery)
loadURL(url)
case .showError(let title, let message):
Expand Down

0 comments on commit 8d895bb

Please sign in to comment.