-
Notifications
You must be signed in to change notification settings - Fork 3k
/
Copy pathReaderModeBarView.swift
167 lines (139 loc) · 6.13 KB
/
ReaderModeBarView.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
import Foundation
import UIKit
import SnapKit
import Shared
import XCGLogger
private let log = Logger.browserLogger
enum ReaderModeBarButtonType {
case markAsRead, markAsUnread, settings, addToReadingList, removeFromReadingList
fileprivate var localizedDescription: String {
switch self {
case .markAsRead: return NSLocalizedString("Mark as Read", comment: "Name for Mark as read button in reader mode")
case .markAsUnread: return NSLocalizedString("Mark as Unread", comment: "Name for Mark as unread button in reader mode")
case .settings: return NSLocalizedString("Display Settings", comment: "Name for display settings button in reader mode. Display in the meaning of presentation, not monitor.")
case .addToReadingList: return NSLocalizedString("Add to Reading List", comment: "Name for button adding current article to reading list in reader mode")
case .removeFromReadingList: return NSLocalizedString("Remove from Reading List", comment: "Name for button removing current article from reading list in reader mode")
}
}
fileprivate var imageName: String {
switch self {
case .markAsRead: return "MarkAsRead"
case .markAsUnread: return "MarkAsUnread"
case .settings: return "SettingsSerif"
case .addToReadingList: return "addToReadingList"
case .removeFromReadingList: return "removeFromReadingList"
}
}
fileprivate var image: UIImage? {
let image = UIImage(named: imageName)
image?.accessibilityLabel = localizedDescription
return image
}
}
protocol ReaderModeBarViewDelegate {
func readerModeBar(_ readerModeBar: ReaderModeBarView, didSelectButton buttonType: ReaderModeBarButtonType)
}
struct ReaderModeBarViewUX {
static let Themes: [String: Theme] = {
var themes = [String: Theme]()
var theme = Theme()
theme.backgroundColor = UIConstants.PrivateModeAssistantToolbarBackgroundColor
theme.buttonTintColor = UIColor.white
themes[Theme.PrivateMode] = theme
theme = Theme()
theme.backgroundColor = UIColor.white
theme.buttonTintColor = UIColor.darkGray
themes[Theme.NormalMode] = theme
return themes
}()
}
class ReaderModeBarView: UIView {
var delegate: ReaderModeBarViewDelegate?
var readStatusButton: UIButton!
var settingsButton: UIButton!
var listStatusButton: UIButton!
dynamic var buttonTintColor: UIColor = UIColor.clear {
didSet {
readStatusButton.tintColor = self.buttonTintColor
settingsButton.tintColor = self.buttonTintColor
listStatusButton.tintColor = self.buttonTintColor
}
}
override init(frame: CGRect) {
super.init(frame: frame)
readStatusButton = createButton(.markAsRead, action: #selector(ReaderModeBarView.SELtappedReadStatusButton(_:)))
readStatusButton.snp.makeConstraints { (make) -> Void in
make.left.equalTo(self)
make.height.centerY.equalTo(self)
make.width.equalTo(80)
}
settingsButton = createButton(.settings, action: #selector(ReaderModeBarView.SELtappedSettingsButton(_:)))
settingsButton.snp.makeConstraints { (make) -> Void in
make.height.centerX.centerY.equalTo(self)
make.width.equalTo(80)
}
listStatusButton = createButton(.addToReadingList, action: #selector(ReaderModeBarView.SELtappedListStatusButton(_:)))
listStatusButton.snp.makeConstraints { (make) -> Void in
make.right.equalTo(self)
make.height.centerY.equalTo(self)
make.width.equalTo(80)
}
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func draw(_ rect: CGRect) {
super.draw(rect)
guard let context = UIGraphicsGetCurrentContext() else { return }
context.setLineWidth(0.5)
context.setStrokeColor(red: 0.1, green: 0.1, blue: 0.1, alpha: 1.0)
context.setStrokeColor(UIColor.gray.cgColor)
context.beginPath()
context.move(to: CGPoint(x: 0, y: frame.height))
context.addLine(to: CGPoint(x: frame.width, y: frame.height))
context.strokePath()
}
fileprivate func createButton(_ type: ReaderModeBarButtonType, action: Selector) -> UIButton {
let button = UIButton()
addSubview(button)
button.setImage(type.image, for: UIControlState())
button.addTarget(self, action: action, for: .touchUpInside)
return button
}
func SELtappedReadStatusButton(_ sender: UIButton!) {
delegate?.readerModeBar(self, didSelectButton: unread ? .markAsRead : .markAsUnread)
}
func SELtappedSettingsButton(_ sender: UIButton!) {
delegate?.readerModeBar(self, didSelectButton: .settings)
}
func SELtappedListStatusButton(_ sender: UIButton!) {
delegate?.readerModeBar(self, didSelectButton: added ? .removeFromReadingList : .addToReadingList)
}
var unread: Bool = true {
didSet {
let buttonType: ReaderModeBarButtonType = unread && added ? .markAsRead : .markAsUnread
readStatusButton.setImage(buttonType.image, for: UIControlState())
readStatusButton.isEnabled = added
readStatusButton.alpha = added ? 1.0 : 0.6
}
}
var added: Bool = false {
didSet {
let buttonType: ReaderModeBarButtonType = added ? .removeFromReadingList : .addToReadingList
listStatusButton.setImage(buttonType.image, for: UIControlState())
}
}
}
extension ReaderModeBarView: Themeable {
func applyTheme(_ themeName: String) {
guard let theme = ReaderModeBarViewUX.Themes[themeName] else {
log.error("Unable to apply unknown theme \(themeName)")
return
}
backgroundColor = theme.backgroundColor
buttonTintColor = theme.buttonTintColor!
}
}