forked from organicmaps/organicmaps
[ios] implement the color selection by tapping on the circle color icon
Signed-off-by: Kiryl Kaveryn <kirylkaveryn@gmail.com>
This commit is contained in:
parent
aa74bd0e03
commit
598b4a70d9
12 changed files with 125 additions and 26 deletions
|
@ -102,6 +102,9 @@ NS_SWIFT_NAME(BookmarksManager)
|
|||
color:(MWMBookmarkColor)color
|
||||
description:(NSString *)description;
|
||||
|
||||
- (void)updateBookmark:(MWMMarkID)bookmarkId
|
||||
setColor:(MWMBookmarkColor)color;
|
||||
|
||||
- (void)moveBookmark:(MWMMarkID)bookmarkId
|
||||
toGroupId:(MWMMarkGroupID)groupId;
|
||||
|
||||
|
@ -110,6 +113,9 @@ NS_SWIFT_NAME(BookmarksManager)
|
|||
color:(UIColor *)color
|
||||
title:(NSString *)title;
|
||||
|
||||
- (void)updateTrack:(MWMTrackID)trackId
|
||||
setColor:(UIColor *)color;
|
||||
|
||||
- (void)moveTrack:(MWMTrackID)trackId
|
||||
toGroupId:(MWMMarkGroupID)groupId;
|
||||
|
||||
|
|
|
@ -680,6 +680,21 @@ static BookmarkManager::SortingType convertSortingTypeToCore(MWMBookmarksSorting
|
|||
bookmark->SetCustomName(title.UTF8String);
|
||||
}
|
||||
|
||||
- (void)updateBookmark:(MWMMarkID)bookmarkId
|
||||
setColor:(MWMBookmarkColor)color {
|
||||
auto editSession = self.bm.GetEditSession();
|
||||
|
||||
auto bookmark = editSession.GetBookmarkForEdit(bookmarkId);
|
||||
if (!bookmark)
|
||||
return;
|
||||
|
||||
auto kmlColor = convertBookmarkColor(color);
|
||||
if (kmlColor != bookmark->GetColor())
|
||||
self.bm.SetLastEditedBmColor(kmlColor);
|
||||
|
||||
bookmark->SetColor(kmlColor);
|
||||
}
|
||||
|
||||
- (void)moveBookmark:(MWMMarkID)bookmarkId
|
||||
toGroupId:(MWMMarkGroupID)groupId {
|
||||
auto const currentGroupId = self.bm.GetBookmark(bookmarkId)->GetGroupId();
|
||||
|
@ -710,6 +725,21 @@ static BookmarkManager::SortingType convertSortingTypeToCore(MWMBookmarksSorting
|
|||
track->SetName(title.UTF8String);
|
||||
}
|
||||
|
||||
- (void)updateTrack:(MWMTrackID)trackId
|
||||
setColor:(UIColor *)color {
|
||||
auto editSession = self.bm.GetEditSession();
|
||||
|
||||
auto track = editSession.GetTrackForEdit(trackId);
|
||||
if (!track)
|
||||
return;
|
||||
|
||||
auto const currentColor = track->GetColor(0);
|
||||
auto const newColor = [MWMBookmarksManager getColorFromUIColor:color];
|
||||
|
||||
if (newColor != currentColor)
|
||||
track->SetColor(newColor);
|
||||
}
|
||||
|
||||
- (void)moveTrack:(MWMTrackID)trackId
|
||||
toGroupId:(MWMMarkGroupID)groupId {
|
||||
auto const currentGroupId = self.bm.GetTrack(trackId)->GetGroupId();
|
||||
|
|
|
@ -30,12 +30,14 @@ protocol IBookmarkViewModel {
|
|||
var bookmarkName: String { get }
|
||||
var subtitle: String { get }
|
||||
var image: UIImage { get }
|
||||
var colorDidTapAction: (() -> Void)? { get }
|
||||
}
|
||||
|
||||
protocol ITrackViewModel {
|
||||
var trackName: String { get }
|
||||
var subtitle: String { get }
|
||||
var image: UIImage { get }
|
||||
var colorDidTapAction: (() -> Void)? { get }
|
||||
}
|
||||
|
||||
protocol ISubgroupViewModel {
|
||||
|
@ -57,6 +59,7 @@ protocol IBookmarksListView: AnyObject {
|
|||
func setSections(_ sections: [IBookmarksListSectionViewModel])
|
||||
func setMoreItemTitle(_ itemTitle: String)
|
||||
func showMenu(_ items: [IBookmarksListMenuItem])
|
||||
func showColorPicker(with pickerType: ColorPickerType, _ completion: ((UIColor) -> Void)?)
|
||||
func enableEditing(_ enable: Bool)
|
||||
func share(_ url: URL, completion: @escaping () -> Void)
|
||||
func showError(title: String, message: String)
|
||||
|
|
|
@ -45,7 +45,12 @@ final class BookmarksListPresenter {
|
|||
interactor.resetSort()
|
||||
var sections: [IBookmarksListSectionViewModel] = []
|
||||
let tracks = bookmarkGroup.tracks.map { track in
|
||||
TrackViewModel(track, formattedDistance: formatDistance(Double(track.trackLengthMeters)))
|
||||
TrackViewModel(track, formattedDistance: formatDistance(Double(track.trackLengthMeters)), colorDidTap: {
|
||||
self.view.showColorPicker(with: .defaultColorPicker(track.trackColor)) { color in
|
||||
BookmarksManager.shared().updateTrack(track.trackId, setColor: color)
|
||||
self.reload()
|
||||
}
|
||||
})
|
||||
}
|
||||
if !tracks.isEmpty {
|
||||
sections.append(TracksSectionViewModel(tracks: tracks))
|
||||
|
@ -70,16 +75,22 @@ final class BookmarksListPresenter {
|
|||
|
||||
private func mapBookmarks(_ bookmarks: [Bookmark]) -> [BookmarkViewModel] {
|
||||
let location = LocationManager.lastLocation()
|
||||
return bookmarks.map {
|
||||
return bookmarks.map { bookmark in
|
||||
let formattedDistance: String?
|
||||
if let location = location {
|
||||
let distance = location.distance(from: CLLocation(latitude: $0.locationCoordinate.latitude,
|
||||
longitude: $0.locationCoordinate.longitude))
|
||||
let distance = location.distance(from: CLLocation(latitude: bookmark.locationCoordinate.latitude,
|
||||
longitude: bookmark.locationCoordinate.longitude))
|
||||
formattedDistance = formatDistance(distance)
|
||||
} else {
|
||||
formattedDistance = nil
|
||||
}
|
||||
return BookmarkViewModel($0, formattedDistance: formattedDistance)
|
||||
return BookmarkViewModel(bookmark, formattedDistance: formattedDistance, colorDidTap: { [weak self] in
|
||||
self?.view.showColorPicker(with: .bookmarkColorPicker(bookmark.bookmarkColor)) { color in
|
||||
guard let bookmarkColor = BookmarkColor.bookmarkColor(from: color) else { return }
|
||||
BookmarksManager.shared().updateBookmark(bookmark.bookmarkId, setColor: bookmarkColor)
|
||||
self?.reload()
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -163,7 +174,12 @@ final class BookmarksListPresenter {
|
|||
}
|
||||
if let tracks = bookmarksSection.tracks, let self = self {
|
||||
return TracksSectionViewModel(tracks: tracks.map { track in
|
||||
TrackViewModel(track, formattedDistance: self.formatDistance(Double(track.trackLengthMeters)))
|
||||
TrackViewModel(track, formattedDistance: self.formatDistance(Double(track.trackLengthMeters)), colorDidTap: {
|
||||
self.view.showColorPicker(with: .defaultColorPicker(track.trackColor)) { color in
|
||||
BookmarksManager.shared().updateTrack(track.trackId, setColor: color)
|
||||
self.reload()
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
fatalError()
|
||||
|
@ -409,16 +425,18 @@ fileprivate struct BookmarkViewModel: IBookmarkViewModel {
|
|||
var image: UIImage {
|
||||
bookmarkColor.image(bookmarkIconName)
|
||||
}
|
||||
var colorDidTapAction: (() -> Void)?
|
||||
|
||||
private let bookmarkColor: BookmarkColor
|
||||
private let bookmarkIconName: String
|
||||
|
||||
init(_ bookmark: Bookmark, formattedDistance: String?) {
|
||||
init(_ bookmark: Bookmark, formattedDistance: String?, colorDidTap: (() -> Void)?) {
|
||||
bookmarkId = bookmark.bookmarkId
|
||||
bookmarkName = bookmark.bookmarkName
|
||||
bookmarkColor = bookmark.bookmarkColor
|
||||
bookmarkIconName = bookmark.bookmarkIconName
|
||||
subtitle = [formattedDistance, bookmark.bookmarkType].compactMap { $0 }.joined(separator: " • ")
|
||||
colorDidTapAction = colorDidTap
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -429,14 +447,16 @@ fileprivate struct TrackViewModel: ITrackViewModel {
|
|||
var image: UIImage {
|
||||
circleImageForColor(trackColor, frameSize: 22)
|
||||
}
|
||||
var colorDidTapAction: (() -> Void)?
|
||||
|
||||
private let trackColor: UIColor
|
||||
|
||||
init(_ track: Track, formattedDistance: String) {
|
||||
init(_ track: Track, formattedDistance: String, colorDidTap: (() -> Void)?) {
|
||||
trackId = track.trackId
|
||||
trackName = track.trackName
|
||||
subtitle = "\(L("length")) \(formattedDistance)"
|
||||
trackColor = track.trackColor
|
||||
colorDidTapAction = colorDidTap
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -223,6 +223,10 @@ extension BookmarksListViewController: IBookmarksListView {
|
|||
present(actionSheet, animated: true)
|
||||
}
|
||||
|
||||
func showColorPicker(with pickerType: ColorPickerType, _ completionHandler: ((UIColor) -> Void)?) {
|
||||
ColorPicker.shared.present(from: self, pickerType: pickerType, completionHandler: completionHandler)
|
||||
}
|
||||
|
||||
func enableEditing(_ enable: Bool) {
|
||||
canEdit = enable
|
||||
navigationItem.rightBarButtonItem = enable ? editButtonItem : nil
|
||||
|
|
|
@ -3,9 +3,22 @@ final class BookmarkCell: UITableViewCell {
|
|||
@IBOutlet private var bookmarkTitleLabel: UILabel!
|
||||
@IBOutlet private var bookmarkSubtitleLabel: UILabel!
|
||||
|
||||
private var bookmarkColorDidTapAction: (() -> Void)?
|
||||
|
||||
override func awakeFromNib() {
|
||||
super.awakeFromNib()
|
||||
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(colorDidTapAction(_:)))
|
||||
bookmarkImageView.addGestureRecognizer(tapGesture)
|
||||
}
|
||||
|
||||
func config(_ bookmark: IBookmarkViewModel) {
|
||||
bookmarkImageView.image = bookmark.image
|
||||
bookmarkTitleLabel.text = bookmark.bookmarkName
|
||||
bookmarkSubtitleLabel.text = bookmark.subtitle
|
||||
bookmarkColorDidTapAction = bookmark.colorDidTapAction
|
||||
}
|
||||
|
||||
@objc private func colorDidTapAction(_ sender: UITapGestureRecognizer) {
|
||||
bookmarkColorDidTapAction?()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,8 +17,9 @@
|
|||
<rect key="frame" x="0.0" y="0.0" width="320" height="64"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="center" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="J5x-wl-wyb">
|
||||
<imageView clipsSubviews="YES" contentMode="center" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="J5x-wl-wyb">
|
||||
<rect key="frame" x="0.0" y="0.0" width="56" height="64"/>
|
||||
<gestureRecognizers/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="56" id="cgW-tP-nDZ"/>
|
||||
</constraints>
|
||||
|
@ -56,6 +57,7 @@
|
|||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
<viewLayoutGuide key="safeArea" id="njF-e1-oar"/>
|
||||
<gestureRecognizers/>
|
||||
<connections>
|
||||
<outlet property="bookmarkImageView" destination="J5x-wl-wyb" id="JIb-pt-prZ"/>
|
||||
<outlet property="bookmarkSubtitleLabel" destination="CTi-lg-1FN" id="5IW-bp-l8N"/>
|
||||
|
|
|
@ -3,9 +3,22 @@ final class TrackCell: UITableViewCell {
|
|||
@IBOutlet private var trackTitleLabel: UILabel!
|
||||
@IBOutlet private var trackSubtitleLabel: UILabel!
|
||||
|
||||
private var trackColorDidTapAction: (() -> Void)?
|
||||
|
||||
override func awakeFromNib() {
|
||||
super.awakeFromNib()
|
||||
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(colorDidTapAction(_:)))
|
||||
trackImageView.addGestureRecognizer(tapGesture)
|
||||
}
|
||||
|
||||
func config(_ track: ITrackViewModel) {
|
||||
trackImageView.image = track.image
|
||||
trackTitleLabel.text = track.trackName
|
||||
trackSubtitleLabel.text = track.subtitle
|
||||
trackColorDidTapAction = track.colorDidTapAction
|
||||
}
|
||||
|
||||
@objc private func colorDidTapAction(_ sender: UITapGestureRecognizer) {
|
||||
trackColorDidTapAction?()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
<rect key="frame" x="0.0" y="0.0" width="320" height="64"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="center" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="4MZ-Tg-LGR">
|
||||
<imageView clipsSubviews="YES" contentMode="center" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="4MZ-Tg-LGR">
|
||||
<rect key="frame" x="0.0" y="0.0" width="56" height="64"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="56" id="DbI-Xy-IiN"/>
|
||||
|
|
|
@ -22,6 +22,11 @@ final class BookmarkColorViewController: MWMTableViewController {
|
|||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
title = L("change_color")
|
||||
navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(cancelButtonDidTap))
|
||||
}
|
||||
|
||||
@objc private func cancelButtonDidTap() {
|
||||
dismiss(animated: true, completion: nil)
|
||||
}
|
||||
|
||||
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
||||
|
|
|
@ -139,11 +139,10 @@ final class EditBookmarkViewController: MWMTableViewController {
|
|||
}
|
||||
|
||||
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
||||
tableView.deselectRow(at: indexPath, animated: true)
|
||||
switch InfoSectionRows(rawValue: indexPath.row) {
|
||||
case .color:
|
||||
let colorViewController = BookmarkColorViewController(bookmarkColor: bookmarkColor)
|
||||
colorViewController.delegate = self
|
||||
navigationController?.pushViewController(colorViewController, animated: true)
|
||||
openColorPicker()
|
||||
case .bookmarkGroup:
|
||||
let groupViewController = SelectBookmarkGroupViewController(groupName: bookmarkGroupTitle ?? "", groupId: bookmarkGroupId)
|
||||
groupViewController.delegate = self
|
||||
|
@ -170,6 +169,15 @@ final class EditBookmarkViewController: MWMTableViewController {
|
|||
editingCompleted?(true)
|
||||
goBack()
|
||||
}
|
||||
|
||||
@objc private func openColorPicker() {
|
||||
ColorPicker.shared.present(from: self, pickerType: .bookmarkColorPicker(bookmarkColor), completionHandler: { [weak self] color in
|
||||
self?.bookmarkColor = BookmarkColor.bookmarkColor(from: color)
|
||||
self?.tableView.reloadRows(at: [IndexPath(row: InfoSectionRows.color.rawValue, section: Sections.info.rawValue)],
|
||||
with: .none)
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extension EditBookmarkViewController: BookmarkTitleCellDelegate {
|
||||
|
|
|
@ -114,19 +114,7 @@ final class EditTrackViewController: MWMTableViewController {
|
|||
tableView.deselectRow(at: indexPath, animated: true)
|
||||
switch InfoSectionRows(rawValue: indexPath.row) {
|
||||
case .color:
|
||||
if #available(iOS 14.0, *) {
|
||||
let colorPickerController = UIColorPickerViewController()
|
||||
colorPickerController.supportsAlpha = false
|
||||
colorPickerController.delegate = self
|
||||
colorPickerController.selectedColor = trackColor
|
||||
present(colorPickerController, animated: true)
|
||||
} else {
|
||||
// For iOS < 14.0 when the color cannot be mapped to predefined it will not be selected in the table view.
|
||||
let trackColor = BookmarkColor.bookmarkColor(from: trackColor) ?? .none
|
||||
let colorViewController = BookmarkColorViewController(bookmarkColor: trackColor)
|
||||
colorViewController.delegate = self
|
||||
navigationController?.pushViewController(colorViewController, animated: true)
|
||||
}
|
||||
openColorPicker()
|
||||
case .bookmarkGroup:
|
||||
let groupViewController = SelectBookmarkGroupViewController(groupName: trackGroupTitle ?? "", groupId: trackGroupId)
|
||||
groupViewController.delegate = self
|
||||
|
@ -150,6 +138,13 @@ final class EditTrackViewController: MWMTableViewController {
|
|||
tableView.reloadRows(at: [IndexPath(row: InfoSectionRows.color.rawValue, section: Sections.info.rawValue)],
|
||||
with: .none)
|
||||
}
|
||||
|
||||
@objc private func openColorPicker() {
|
||||
ColorPicker.shared.present(from: self, pickerType: .defaultColorPicker(trackColor), completionHandler: { [weak self] color in
|
||||
self?.updateColor(color)
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extension EditTrackViewController: BookmarkTitleCellDelegate {
|
||||
|
|
Loading…
Add table
Reference in a new issue