Skip to content

Commit eec0c1a

Browse files
authored
Merge pull request #263 from gitonthescene/feature/markup-keys
add inputAccessoryView to help add markup
2 parents 6019cf1 + 216ebba commit eec0c1a

1 file changed

Lines changed: 94 additions & 0 deletions

File tree

Classes/Capture/AddNoteViewController.swift

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,106 @@ final class AddNoteViewController: UIViewController {
5454
fatalError("init(coder:) has not been implemented")
5555
}
5656

57+
private var toolsBar: UIToolbar = {
58+
let bar = UIToolbar(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 45))
59+
bar.items = [
60+
UIBarButtonItem(title: "🔗", style: .plain, target: self, action: #selector(addLinkMarkup)),
61+
UIBarButtonItem(title: "📅", style: .plain, target: self, action: #selector(setDatePickerView)),
62+
]
63+
bar.sizeToFit()
64+
return bar
65+
}()
66+
67+
@objc func addLinkMarkup() {
68+
if let range = self.textView.selectedTextRange, !range.isEmpty {
69+
guard let selectedText = self.textView.text( in: range ) else { return }
70+
self.textView.replace( range, withText: "[[\(selectedText)][]]" )
71+
if let newCursor = self.textView.position(from: range.end, offset: 4) {
72+
self.textView.selectedTextRange = self.textView.textRange( from: newCursor, to: newCursor)
73+
}
74+
}
75+
}
76+
77+
let datePicker = UIDatePicker()
78+
79+
enum DateType: String {
80+
case schedule = "Schd"
81+
case deadline = "Dead"
82+
case agenda = "Agenda"
83+
case plain = "Plain"
84+
}
85+
86+
private var datePickBar: UIToolbar = {
87+
let bar = UIToolbar(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 45))
88+
let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(setDefaultInputView))
89+
let scheduleButton = UIBarButtonItem(title: DateType.schedule.rawValue, style: .plain, target: self, action: #selector(insertDate(_:)))
90+
let deadlineButton = UIBarButtonItem(title: DateType.deadline.rawValue, style: .plain, target: self, action: #selector(insertDate(_:)))
91+
let agendaButton = UIBarButtonItem(title: DateType.agenda.rawValue, style: .plain, target: self, action: #selector(insertDate(_:)))
92+
let plainButton = UIBarButtonItem(title: DateType.plain.rawValue, style: .plain, target: self, action: #selector(insertDate(_:)))
93+
let spacer = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
94+
bar.items = [ scheduleButton, deadlineButton, agendaButton, plainButton, spacer, cancelButton ]
95+
bar.sizeToFit()
96+
return bar
97+
}()
98+
99+
private func datePicked() -> String {
100+
let dateFormatter = DateFormatter()
101+
dateFormatter.dateFormat = "YYYY-MM-dd E hh:mm"
102+
return dateFormatter.string( from: self.datePicker.date )
103+
}
104+
105+
private func replaceSelected( with newString: String ) {
106+
guard let range = self.textView.selectedTextRange else { return }
107+
self.textView.replace( range, withText: newString )
108+
}
109+
110+
@objc private func insertDate(_ sender: UIBarButtonItem) {
111+
guard let title = sender.title else { return }
112+
let date = datePicked()
113+
switch DateType(rawValue: title) {
114+
case .agenda:
115+
replaceSelected( with: "<\(date)>" )
116+
case .deadline:
117+
replaceSelected( with: "DEADLINE: <\(date)>" )
118+
case .plain:
119+
replaceSelected( with: "[\(date)]" )
120+
case .schedule:
121+
replaceSelected( with: "SCHEDULED: <\(date)>" )
122+
case .none:
123+
break
124+
}
125+
self.setDefaultInputView()
126+
}
127+
128+
func updateConstraintsWhenCustomKeyboardIsShown(customInputView: UIView) {
129+
guard let superview = customInputView.superview else { return }
130+
for constraint in superview.constraints {
131+
if (constraint.secondItem === customInputView && constraint.secondAttribute == .top) {
132+
constraint.priority = UILayoutPriority(999)
133+
}
134+
}
135+
}
136+
137+
@objc func setDefaultInputView() {
138+
self.textView.inputAccessoryView = self.toolsBar
139+
self.textView.inputView = nil
140+
updateConstraintsWhenCustomKeyboardIsShown(customInputView: self.datePicker)
141+
self.textView.reloadInputViews()
142+
}
143+
144+
@objc func setDatePickerView() {
145+
self.textView.inputAccessoryView = self.datePickBar
146+
self.textView.inputView = self.datePicker
147+
self.textView.reloadInputViews()
148+
}
149+
57150
override func viewDidLoad() {
58151
super.viewDidLoad()
59152
self.textView.text = self.note.text
60153
self.view = self.textView
61154
if self.note.text?.isEmpty ?? true { self.textView.becomeFirstResponder() }
62155
self.navigationItem.rightBarButtonItem = self.addButton
156+
self.setDefaultInputView()
63157
}
64158

65159
override func viewWillAppear(_ animated: Bool) {

0 commit comments

Comments
 (0)