[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:
Kiryl Kaveryn 2024-03-01 14:25:17 +04:00 committed by Alexander Borsuk
parent aa74bd0e03
commit 598b4a70d9
12 changed files with 125 additions and 26 deletions

View file

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

View file

@ -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();

View file

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

View file

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

View file

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

View file

@ -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?()
}
}

View file

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

View file

@ -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?()
}
}

View file

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

View file

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

View file

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

View file

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