Skip to content

Commit 150593e

Browse files
committed
Support multiple selection for semiCombo preset types.
1 parent a298518 commit 150593e

2 files changed

Lines changed: 56 additions & 5 deletions

File tree

src/iOS/POI/POICommonTagsViewController.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,7 @@ class POICommonTagsViewController: UITableViewController, UITextFieldDelegate, U
517517
{
518518
dest.key = presetKey.tagKey
519519
dest.presetValueList = presetKey.presetValues ?? []
520+
dest.isMultiSelect = presetKey.type == .semiCombo
520521
dest.onSetValue = { [weak self] value in
521522
self?.updateTagDict(withValue: value, forKey: presetKey.tagKey)
522523
}

src/iOS/POI/POIPresetValuePickerController.swift

Lines changed: 55 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,12 @@ class POIPresetValuePickerController: UITableViewController {
1212
var key = ""
1313
var presetValueList: [PresetDisplayValue] = []
1414
var onSetValue: ((String) -> Void)?
15+
var isMultiSelect = false
1516
var descriptions: [String: String] = [:]
1617
var images: [String: UIImage] = [:]
1718

19+
private var selectedValues: [String] = []
20+
1821
let placeholderImage = UIImage().scaledTo(width: ImageWidth, height: ImageWidth / 2)
1922

2023
func fetchWikiImagesAndDescriptions() {
@@ -63,6 +66,40 @@ class POIPresetValuePickerController: UITableViewController {
6366

6467
tableView.estimatedRowHeight = UITableView.automaticDimension
6568
tableView.rowHeight = UITableView.automaticDimension
69+
70+
if let value = (tabBarController as? POITabBarController)?.keyValueDict[key] {
71+
if isMultiSelect {
72+
// semicolon-separated tag value
73+
selectedValues = value.split(separator: ";")
74+
.map { $0.trimmingCharacters(in: .whitespaces) }
75+
.filter { !$0.isEmpty }
76+
} else {
77+
selectedValues = [value]
78+
}
79+
}
80+
81+
if isMultiSelect {
82+
navigationItem.leftBarButtonItem = UIBarButtonItem(
83+
barButtonSystemItem: .cancel,
84+
target: self,
85+
action: #selector(cancelTapped))
86+
87+
navigationItem.rightBarButtonItem = UIBarButtonItem(
88+
barButtonSystemItem: .done,
89+
target: self,
90+
action: #selector(doneTapped))
91+
}
92+
}
93+
94+
@objc private func cancelTapped() {
95+
navigationController?.popViewController(animated: true)
96+
}
97+
98+
@objc private func doneTapped() {
99+
// Preserve display order rather than Set's arbitrary order.
100+
let values = selectedValues.joined(separator: ";")
101+
onSetValue?(values)
102+
navigationController?.popViewController(animated: true)
66103
}
67104

68105
// MARK: - Table view data source
@@ -103,16 +140,29 @@ class POIPresetValuePickerController: UITableViewController {
103140
cell.imageView?.image = image2
104141
}
105142

106-
let tabController = tabBarController as? POITabBarController
107-
let selected = tabController?.keyValueDict[key] == preset.tagValue
108-
cell.accessoryType = selected ? .checkmark : .none
143+
if isMultiSelect {
144+
cell.accessoryType = selectedValues.contains(preset.tagValue) ? .checkmark : .none
145+
} else {
146+
let tabController = tabBarController as? POITabBarController
147+
let selected = tabController?.keyValueDict[key] == preset.tagValue
148+
cell.accessoryType = selected ? .checkmark : .none
149+
}
109150

110151
return cell
111152
}
112153

113154
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
114155
let preset = presetValueList[indexPath.row]
115-
onSetValue?(preset.tagValue)
116-
navigationController?.popViewController(animated: true)
156+
if isMultiSelect {
157+
if let i = selectedValues.firstIndex(of: preset.tagValue) {
158+
selectedValues.remove(at: i)
159+
} else {
160+
selectedValues.append(preset.tagValue)
161+
}
162+
tableView.reloadRows(at: [indexPath], with: .automatic)
163+
} else {
164+
onSetValue?(preset.tagValue)
165+
navigationController?.popViewController(animated: true)
166+
}
117167
}
118168
}

0 commit comments

Comments
 (0)