diff --git a/iphone/CoreApi/CoreApi/Bookmarks/MWMBookmarksManager.h b/iphone/CoreApi/CoreApi/Bookmarks/MWMBookmarksManager.h index 62120c882c..bd8ffa5632 100644 --- a/iphone/CoreApi/CoreApi/Bookmarks/MWMBookmarksManager.h +++ b/iphone/CoreApi/CoreApi/Bookmarks/MWMBookmarksManager.h @@ -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; diff --git a/iphone/CoreApi/CoreApi/Bookmarks/MWMBookmarksManager.mm b/iphone/CoreApi/CoreApi/Bookmarks/MWMBookmarksManager.mm index e1194dda6c..b5da7a2caa 100644 --- a/iphone/CoreApi/CoreApi/Bookmarks/MWMBookmarksManager.mm +++ b/iphone/CoreApi/CoreApi/Bookmarks/MWMBookmarksManager.mm @@ -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(); diff --git a/iphone/Maps/Bookmarks/BookmarksList/BookmarksListInterfaces.swift b/iphone/Maps/Bookmarks/BookmarksList/BookmarksListInterfaces.swift index 58fbed0172..981ff17b89 100644 --- a/iphone/Maps/Bookmarks/BookmarksList/BookmarksListInterfaces.swift +++ b/iphone/Maps/Bookmarks/BookmarksList/BookmarksListInterfaces.swift @@ -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) diff --git a/iphone/Maps/Bookmarks/BookmarksList/BookmarksListPresenter.swift b/iphone/Maps/Bookmarks/BookmarksList/BookmarksListPresenter.swift index 94ba759c9a..0f982513ad 100644 --- a/iphone/Maps/Bookmarks/BookmarksList/BookmarksListPresenter.swift +++ b/iphone/Maps/Bookmarks/BookmarksList/BookmarksListPresenter.swift @@ -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 } } diff --git a/iphone/Maps/Bookmarks/BookmarksList/BookmarksListViewController.swift b/iphone/Maps/Bookmarks/BookmarksList/BookmarksListViewController.swift index 3d857496f8..d59ab65f2c 100644 --- a/iphone/Maps/Bookmarks/BookmarksList/BookmarksListViewController.swift +++ b/iphone/Maps/Bookmarks/BookmarksList/BookmarksListViewController.swift @@ -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 diff --git a/iphone/Maps/Bookmarks/BookmarksList/Cells/BookmarkCell.swift b/iphone/Maps/Bookmarks/BookmarksList/Cells/BookmarkCell.swift index d8e3663c22..170f03d871 100644 --- a/iphone/Maps/Bookmarks/BookmarksList/Cells/BookmarkCell.swift +++ b/iphone/Maps/Bookmarks/BookmarksList/Cells/BookmarkCell.swift @@ -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?() } } diff --git a/iphone/Maps/Bookmarks/BookmarksList/Cells/BookmarkCell.xib b/iphone/Maps/Bookmarks/BookmarksList/Cells/BookmarkCell.xib index b68439e91b..98066cc6f9 100644 --- a/iphone/Maps/Bookmarks/BookmarksList/Cells/BookmarkCell.xib +++ b/iphone/Maps/Bookmarks/BookmarksList/Cells/BookmarkCell.xib @@ -17,8 +17,9 @@ - + + @@ -56,6 +57,7 @@ + diff --git a/iphone/Maps/Bookmarks/BookmarksList/Cells/TrackCell.swift b/iphone/Maps/Bookmarks/BookmarksList/Cells/TrackCell.swift index cd77c09d81..87684a2d08 100644 --- a/iphone/Maps/Bookmarks/BookmarksList/Cells/TrackCell.swift +++ b/iphone/Maps/Bookmarks/BookmarksList/Cells/TrackCell.swift @@ -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?() } } diff --git a/iphone/Maps/Bookmarks/BookmarksList/Cells/TrackCell.xib b/iphone/Maps/Bookmarks/BookmarksList/Cells/TrackCell.xib index 327917f703..763a4d2d7a 100644 --- a/iphone/Maps/Bookmarks/BookmarksList/Cells/TrackCell.xib +++ b/iphone/Maps/Bookmarks/BookmarksList/Cells/TrackCell.xib @@ -17,7 +17,7 @@ - + diff --git a/iphone/Maps/UI/EditBookmark/BookmarkColorViewController.swift b/iphone/Maps/UI/EditBookmark/BookmarkColorViewController.swift index e804098ca6..9520bc2efb 100644 --- a/iphone/Maps/UI/EditBookmark/BookmarkColorViewController.swift +++ b/iphone/Maps/UI/EditBookmark/BookmarkColorViewController.swift @@ -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 { diff --git a/iphone/Maps/UI/EditBookmark/EditBookmarkViewController.swift b/iphone/Maps/UI/EditBookmark/EditBookmarkViewController.swift index 82c6c1c11a..f95484b662 100644 --- a/iphone/Maps/UI/EditBookmark/EditBookmarkViewController.swift +++ b/iphone/Maps/UI/EditBookmark/EditBookmarkViewController.swift @@ -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 { diff --git a/iphone/Maps/UI/EditBookmark/EditTrackViewController.swift b/iphone/Maps/UI/EditBookmark/EditTrackViewController.swift index 2184c3b112..ea25306277 100644 --- a/iphone/Maps/UI/EditBookmark/EditTrackViewController.swift +++ b/iphone/Maps/UI/EditBookmark/EditTrackViewController.swift @@ -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 {