@@ -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