From 49d5335e7e49117a60344f2b4a067a8f70bfb848 Mon Sep 17 00:00:00 2001 From: Kiryl Kaveryn Date: Fri, 27 Jun 2025 14:45:13 +0400 Subject: [PATCH] [ios] Implement New Edit view on the PlacePage screen To allow change the color and group from directly from the then PP Signed-off-by: Kiryl Kaveryn --- .../Common/PlacePageTrackData+Core.h | 4 +- .../PlacePageData/Common/PlacePageTrackData.h | 4 + .../Common/PlacePageTrackData.mm | 23 ++- .../CoreApi/PlacePageData/PlacePageData.mm | 9 +- ...ageEditBookmarkOrTrackViewController.swift | 145 +++++++++++++----- .../PlacePageInfoViewController.swift | 86 +++++++---- iphone/Maps/UI/PlacePage/PlacePage.storyboard | 42 +++-- .../UI/PlacePage/PlacePageInteractor.swift | 10 ++ .../Layouts/PlacePageTrackLayout.swift | 6 +- .../PlacePageTrackRecordingLayout.swift | 7 - .../PlacePageManager/MWMPlacePageManager.mm | 16 ++ .../MWMPlacePageManagerHelper.h | 2 + .../MWMPlacePageManagerHelper.mm | 10 ++ iphone/Maps/UI/PlacePage/Views/InfoView.swift | 80 ++++++++++ 14 files changed, 340 insertions(+), 104 deletions(-) create mode 100644 iphone/Maps/UI/PlacePage/Views/InfoView.swift diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageTrackData+Core.h b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageTrackData+Core.h index 894e6582c..5819c9316 100644 --- a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageTrackData+Core.h +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageTrackData+Core.h @@ -6,8 +6,8 @@ NS_ASSUME_NONNULL_BEGIN @interface PlacePageTrackData (Core) -- (instancetype)initWithTrack:(Track const &)track - onActivePointChanged:(MWMVoidBlock)onActivePointChangedHandler; +- (instancetype)initWithRawData:(place_page::Info const &)rawData + onActivePointChanged:(MWMVoidBlock)onActivePointChangedHandler; @end diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageTrackData.h b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageTrackData.h index d4c5a8280..55755fcfa 100644 --- a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageTrackData.h +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageTrackData.h @@ -1,4 +1,5 @@ #import +#import #import "MWMTypes.h" @class TrackInfo; @@ -10,6 +11,9 @@ NS_ASSUME_NONNULL_BEGIN @property(nonatomic, readonly) MWMTrackID trackId; @property(nonatomic, readonly) MWMMarkGroupID groupId; +@property(nonatomic, readonly, nullable) NSString * trackCategory; +@property(nonatomic, readonly, nullable) NSString * trackDescription; +@property(nonatomic, readonly, nullable) UIColor * color; @property(nonatomic, readwrite, nonnull) TrackInfo * trackInfo; @property(nonatomic, readwrite, nullable) ElevationProfileData * elevationProfileData; @property(nonatomic, readonly) double activePointDistance; diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageTrackData.mm b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageTrackData.mm index 18493ecbf..b33a30d92 100644 --- a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageTrackData.mm +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageTrackData.mm @@ -32,14 +32,27 @@ @implementation PlacePageTrackData (Core) -- (instancetype)initWithTrack:(Track const &)track - onActivePointChanged:(MWMVoidBlock)onActivePointChangedHandler { +- (instancetype)initWithRawData:(place_page::Info const &)rawData + onActivePointChanged:(MWMVoidBlock)onActivePointChangedHandler { self = [super init]; if (self) { - _trackId = track.GetData().m_id; - _trackInfo = [[TrackInfo alloc] initWithTrackStatistics:track.GetStatistics()]; - + auto const trackPtr = GetFramework().GetBookmarkManager().GetTrack(rawData.GetTrackId()); + auto const & track = *trackPtr; auto const & bm = GetFramework().GetBookmarkManager(); + + _trackId = track.GetData().m_id; + + auto const & groupId = track.GetGroupId(); + if (groupId && bm.HasBmCategory(groupId)) { + _groupId = groupId; + _trackCategory = [NSString stringWithCString:bm.GetCategoryName(groupId).c_str() encoding:NSUTF8StringEncoding]; + } + + auto const color = track.GetColor(0); + _color = [UIColor colorWithRed:color.GetRedF() green:color.GetGreenF() blue:color.GetBlueF() alpha:1.f]; + + _trackDescription = [NSString stringWithCString:track.GetDescription().c_str() encoding:NSUTF8StringEncoding]; + _trackInfo = [[TrackInfo alloc] initWithTrackStatistics:track.GetStatistics()]; _activePointDistance = bm.GetElevationActivePoint(_trackId); _myPositionDistance = bm.GetElevationMyPosition(_trackId); _onActivePointChangedHandler = onActivePointChangedHandler; diff --git a/iphone/CoreApi/CoreApi/PlacePageData/PlacePageData.mm b/iphone/CoreApi/CoreApi/PlacePageData/PlacePageData.mm index b034b1fac..1bd9e79ba 100644 --- a/iphone/CoreApi/CoreApi/PlacePageData/PlacePageData.mm +++ b/iphone/CoreApi/CoreApi/PlacePageData/PlacePageData.mm @@ -69,12 +69,10 @@ static PlacePageRoadType convertRoadType(RoadWarningMarkType roadType) { } if (rawData().IsTrack()) { - auto const & track = GetFramework().GetBookmarkManager().GetTrack(rawData().GetTrackId()); __weak auto weakSelf = self; - _trackData = [[PlacePageTrackData alloc] initWithTrack:*track onActivePointChanged:^(void) { + _trackData = [[PlacePageTrackData alloc] initWithRawData:rawData() onActivePointChanged:^(void) { [weakSelf handleActiveTrackSelectionPointChanged]; }]; - _isPreviewPlus = track->HasAltitudes(); } _previewData = [[PlacePagePreviewData alloc] initWithRawData:rawData()]; @@ -144,6 +142,11 @@ static PlacePageRoadType convertRoadType(RoadWarningMarkType roadType) { } if (rawData().IsBookmark()) { _bookmarkData = [[PlacePageBookmarkData alloc] initWithRawData:rawData()]; + } else if (rawData().IsTrack()) { + __weak auto weakSelf = self; + _trackData = [[PlacePageTrackData alloc] initWithRawData:rawData() onActivePointChanged:^(void) { + [weakSelf handleActiveTrackSelectionPointChanged]; + }]; } else { _bookmarkData = nil; } diff --git a/iphone/Maps/UI/PlacePage/Components/PlacePageEditBookmarkOrTrackViewController.swift b/iphone/Maps/UI/PlacePage/Components/PlacePageEditBookmarkOrTrackViewController.swift index cd121edc7..07005f20a 100644 --- a/iphone/Maps/UI/PlacePage/Components/PlacePageEditBookmarkOrTrackViewController.swift +++ b/iphone/Maps/UI/PlacePage/Components/PlacePageEditBookmarkOrTrackViewController.swift @@ -1,4 +1,5 @@ protocol PlacePageEditBookmarkOrTrackViewControllerDelegate: AnyObject { + func didUpdate(color: UIColor, category: MWMMarkGroupID, for data: PlacePageEditData) func didPressEdit(_ data: PlacePageEditData) } @@ -11,14 +12,10 @@ final class PlacePageEditBookmarkOrTrackViewController: UIViewController { @IBOutlet var stackView: UIStackView! @IBOutlet var editView: InfoItemView! - @IBOutlet var topConstraint: NSLayoutConstraint! + @IBOutlet var expandableLabelContainer: UIView! @IBOutlet var expandableLabel: ExpandableLabel! { didSet { - expandableLabel.font = UIFont.regular14() - expandableLabel.textColor = UIColor.blackPrimaryText() - expandableLabel.numberOfLines = 5 - expandableLabel.expandColor = UIColor.linkBlue() - expandableLabel.expandText = L("placepage_more_button") + updateExpandableLabelStyle() } } @@ -27,6 +24,7 @@ final class PlacePageEditBookmarkOrTrackViewController: UIViewController { updateViews() } } + weak var delegate: PlacePageEditBookmarkOrTrackViewControllerDelegate? override func viewDidLoad() { @@ -39,42 +37,114 @@ final class PlacePageEditBookmarkOrTrackViewController: UIViewController { updateViews() } + override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { + super.traitCollectionDidChange(previousTraitCollection) + if #available(iOS 13.0, *), traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) { + applyTheme() + } + } + // MARK: - Private methods private func updateViews() { guard let data else { return } + + let iconColor: UIColor + let category: String? + let description: String? + let isHtmlDescription: Bool + switch data { - case .bookmark(let bookmark): + case .bookmark(let bookmarkData): + iconColor = bookmarkData.color.color + category = bookmarkData.bookmarkCategory + description = bookmarkData.bookmarkDescription + isHtmlDescription = bookmarkData.isHtmlDescription + case .track(let trackData): + iconColor = trackData.color ?? UIColor.buttonRed() + category = trackData.trackCategory + description = trackData.trackDescription + isHtmlDescription = false + } - editView.isHidden = false - editView.imageView.image = UIImage(resource: .icFolder) - editView.infoLabel.text = bookmark.bookmarkCategory - editView.setStyle(.link) - editView.tapHandler = { - print("Edit bookmark tapped") - } - let accessoryImage = circleImageForColor(bookmark.color.color, frameSize: 28, diameter: 22, iconName: "ic_bm_none") - editView.setAccessory(image: accessoryImage, tapHandler: { - print("Accessory tapped") - }) + let editColorImage = circleImageForColor(iconColor, frameSize: 28, diameter: 22, iconName: "ic_bm_none") + editView.iconButton.setImage(editColorImage, for: .normal) + editView.infoLabel.text = category + editView.setStyle(.link) - if let description = bookmark.bookmarkDescription { - if bookmark.isHtmlDescription { - setHtmlDescription(description) - topConstraint.constant = 16 - } else { - expandableLabel.text = description - topConstraint.constant = description.count > 0 ? 16 : 0 - } + editView.iconButtonTapHandler = { [weak self] in + guard let self else { return } + self.showColorPicker() + } + editView.infoLabelTapHandler = { [weak self] in + guard let self else { return } + self.showGroupPicker() + } + editView.setAccessory(image: UIImage(resource: .ic24PxEdit), tapHandler: { [weak self] in + guard let self, let data = self.data else { return } + self.delegate?.didPressEdit(data) + }) + + if let description, !description.isEmpty { + expandableLabelContainer.isHidden = false + if isHtmlDescription { + setHtmlDescription(description) } else { - topConstraint.constant = 0 + expandableLabel.text = description } - case .track: + updateExpandableLabelStyle() + } else { + expandableLabelContainer.isHidden = true + } + } - // TODO: implement track editing + private func updateExpandableLabelStyle() { + expandableLabel.font = UIFont.regular14() + expandableLabel.textColor = UIColor.blackPrimaryText() + expandableLabel.numberOfLines = 5 + expandableLabel.expandColor = UIColor.linkBlue() + expandableLabel.expandText = L("placepage_more_button") + } - expandableLabel.isHidden = true - topConstraint.constant = 0 + private func showColorPicker() { + guard let data else { return } + switch data { + case .bookmark(let bookmarkData): + ColorPicker.shared.present(from: self, pickerType: .bookmarkColorPicker(bookmarkData.color)) { [weak self] color in + self?.update(color: color) + } + case .track(let trackData): + ColorPicker.shared.present(from: self, pickerType: .defaultColorPicker(trackData.color ?? .buttonRed())) { [weak self] color in + self?.update(color: color) + } + } + } + + private func showGroupPicker() { + guard let data else { return } + let groupId: MWMMarkGroupID + let groupName: String? + switch data { + case .bookmark(let bookmarkData): + groupId = bookmarkData.bookmarkGroupId + groupName = bookmarkData.bookmarkCategory + case .track(let trackData): + groupId = trackData.groupId + groupName = trackData.trackCategory + } + let groupViewController = SelectBookmarkGroupViewController(groupName: groupName ?? "", groupId: groupId) + let navigationController = UINavigationController(rootViewController: groupViewController) + groupViewController.delegate = self + present(navigationController, animated: true, completion: nil) + } + + private func update(color: UIColor? = nil, category: MWMMarkGroupID? = nil) { + guard let data else { return } + switch data { + case .bookmark(let bookmarkData): + delegate?.didUpdate(color: color ?? bookmarkData.color.color, category: category ?? bookmarkData.bookmarkGroupId, for: data) + case .track(let trackData): + delegate?.didUpdate(color: color ?? trackData.color!, category: category ?? trackData.groupId, for: data) } } @@ -103,11 +173,14 @@ final class PlacePageEditBookmarkOrTrackViewController: UIViewController { } } } +} - // MARK: - Actions - - @IBAction func onEdit(_ sender: UIButton) { - guard let data else { return } - delegate?.didPressEdit(data) +// MARK: - SelectBookmarkGroupViewControllerDelegate +extension PlacePageEditBookmarkOrTrackViewController: SelectBookmarkGroupViewControllerDelegate { + func bookmarkGroupViewController(_ viewController: SelectBookmarkGroupViewController, + didSelect groupTitle: String, + groupId: MWMMarkGroupID) { + viewController.dismiss(animated: true) + update(category: groupId) } } diff --git a/iphone/Maps/UI/PlacePage/Components/PlacePageInfoViewController.swift b/iphone/Maps/UI/PlacePage/Components/PlacePageInfoViewController.swift index 87c623ac2..b04e0938b 100644 --- a/iphone/Maps/UI/PlacePage/Components/PlacePageInfoViewController.swift +++ b/iphone/Maps/UI/PlacePage/Components/PlacePageInfoViewController.swift @@ -1,12 +1,12 @@ final class InfoItemView: UIView { private enum Constants { - static let imageViewWidth: CGFloat = 56 - static let imageViewHeight: CGFloat = 28 - static let accessoryButtonSize: CGFloat = 44 + static let viewHeight: CGFloat = 44 + static let stackViewSpacing: CGFloat = 0 + static let iconButtonSize: CGFloat = 56 + static let iconButtonEdgeInsets = UIEdgeInsets(top: 8, left: 0, bottom: 8, right: 0) static let infoLabelFontSize: CGFloat = 16 static let infoLabelTopBottomSpacing: CGFloat = 10 - static let stackViewSpacing: CGFloat = 0 - static let viewHeight: CGFloat = 44 + static let accessoryButtonSize: CGFloat = 44 } enum Style { @@ -16,15 +16,13 @@ final class InfoItemView: UIView { typealias TapHandler = () -> Void - let imageView = UIImageView() + let iconButton = UIButton() let infoLabel = UILabel() let accessoryButton = UIButton() - private var tapGestureRecognizer: UITapGestureRecognizer! - private var longPressGestureRecognizer: UILongPressGestureRecognizer! - - var tapHandler: TapHandler? - var longPressHandler: TapHandler? + var infoLabelTapHandler: TapHandler? + var infoLabelLongPressHandler: TapHandler? + var iconButtonTapHandler: TapHandler? var accessoryImageTapHandler: TapHandler? private var style: Style = .regular @@ -32,59 +30,77 @@ final class InfoItemView: UIView { override init(frame: CGRect) { super.init(frame: frame) setupView() + layout() } required init?(coder: NSCoder) { super.init(coder: coder) setupView() + layout() } private func setupView() { - tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(onTap)) - longPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(onLongPress(_:))) - addGestureRecognizer(tapGestureRecognizer) - addGestureRecognizer(longPressGestureRecognizer) + addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(onInfoLabelTap))) + addGestureRecognizer(UILongPressGestureRecognizer(target: self, action: #selector(onInfoLabelLongPress(_:)))) + + infoLabel.lineBreakMode = .byTruncatingTail + infoLabel.numberOfLines = 1 + infoLabel.allowsDefaultTighteningForTruncation = true + infoLabel.isUserInteractionEnabled = false + + iconButton.imageView?.contentMode = .scaleAspectFit + iconButton.addTarget(self, action: #selector(onIconButtonTap), for: .touchUpInside) + iconButton.contentEdgeInsets = Constants.iconButtonEdgeInsets - imageView.contentMode = .scaleAspectFit accessoryButton.addTarget(self, action: #selector(onAccessoryButtonTap), for: .touchUpInside) + } - addSubview(imageView) + private func layout() { + addSubview(iconButton) addSubview(infoLabel) addSubview(accessoryButton) translatesAutoresizingMaskIntoConstraints = false - imageView.translatesAutoresizingMaskIntoConstraints = false + iconButton.translatesAutoresizingMaskIntoConstraints = false infoLabel.translatesAutoresizingMaskIntoConstraints = false accessoryButton.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ heightAnchor.constraint(equalToConstant: Constants.viewHeight), - imageView.leadingAnchor.constraint(equalTo: leadingAnchor), - imageView.centerYAnchor.constraint(equalTo: centerYAnchor), - imageView.widthAnchor.constraint(equalToConstant: Constants.imageViewWidth), - imageView.heightAnchor.constraint(equalToConstant: Constants.imageViewHeight), + iconButton.leadingAnchor.constraint(equalTo: leadingAnchor), + iconButton.centerYAnchor.constraint(equalTo: centerYAnchor), + iconButton.widthAnchor.constraint(equalToConstant: Constants.iconButtonSize), + iconButton.topAnchor.constraint(equalTo: topAnchor), + iconButton.bottomAnchor.constraint(equalTo: bottomAnchor), - infoLabel.leadingAnchor.constraint(equalTo: imageView.trailingAnchor), - infoLabel.centerYAnchor.constraint(equalTo: centerYAnchor), + infoLabel.leadingAnchor.constraint(equalTo: iconButton.trailingAnchor), + infoLabel.topAnchor.constraint(equalTo: topAnchor), + infoLabel.bottomAnchor.constraint(equalTo: bottomAnchor), infoLabel.trailingAnchor.constraint(equalTo: accessoryButton.leadingAnchor), accessoryButton.trailingAnchor.constraint(equalTo: trailingAnchor), accessoryButton.centerYAnchor.constraint(equalTo: centerYAnchor), accessoryButton.widthAnchor.constraint(equalToConstant: Constants.accessoryButtonSize), - accessoryButton.heightAnchor.constraint(equalToConstant: Constants.accessoryButtonSize) + accessoryButton.topAnchor.constraint(equalTo: topAnchor), + accessoryButton.bottomAnchor.constraint(equalTo: bottomAnchor) ]) } @objc - private func onTap() { - tapHandler?() + private func onInfoLabelTap() { + infoLabelTapHandler?() } @objc - private func onLongPress(_ sender: UILongPressGestureRecognizer) { + private func onInfoLabelLongPress(_ sender: UILongPressGestureRecognizer) { guard sender.state == .began else { return } - longPressHandler?() + infoLabelLongPressHandler?() + } + + @objc + private func onIconButtonTap() { + iconButtonTapHandler?() } @objc @@ -95,10 +111,10 @@ final class InfoItemView: UIView { func setStyle(_ style: Style) { switch style { case .regular: - imageView.setStyleAndApply(.black) + iconButton.setStyleAndApply(.black) infoLabel.setFontStyleAndApply(.regular16, color: .blackPrimary) case .link: - imageView.setStyleAndApply(.blue) + iconButton.setStyleAndApply(.blue) infoLabel.setFontStyleAndApply(.regular16, color: .linkBlue) } accessoryButton.setStyleAndApply(.black) @@ -499,6 +515,7 @@ class PlacePageInfoViewController: UIViewController { private func createInfoItem(_ info: String, icon: UIImage?, + tapIconHandler: TapHandler? = nil, style: Style = .regular, accessoryImage: UIImage? = nil, tapHandler: TapHandler? = nil, @@ -506,11 +523,12 @@ class PlacePageInfoViewController: UIViewController { accessoryImageTapHandler: TapHandler? = nil) -> InfoItemView { let view = InfoItemView() addToStack(view) - view.imageView.image = icon?.withRenderingMode(.alwaysTemplate) + view.iconButton.setImage(icon?.withRenderingMode(.alwaysTemplate), for: .normal) + view.iconButtonTapHandler = tapIconHandler view.infoLabel.text = info view.setStyle(style) - view.tapHandler = tapHandler - view.longPressHandler = longPressHandler + view.infoLabelTapHandler = tapHandler + view.infoLabelLongPressHandler = longPressHandler view.setAccessory(image: accessoryImage, tapHandler: accessoryImageTapHandler) return view } diff --git a/iphone/Maps/UI/PlacePage/PlacePage.storyboard b/iphone/Maps/UI/PlacePage/PlacePage.storyboard index 3bde486f9..d82778b6e 100644 --- a/iphone/Maps/UI/PlacePage/PlacePage.storyboard +++ b/iphone/Maps/UI/PlacePage/PlacePage.storyboard @@ -1126,21 +1126,33 @@ - + - - + + - - - - - - + + + + + + + + + + + + + + + + + + @@ -1148,10 +1160,10 @@ - + - - + + @@ -1161,8 +1173,8 @@ + - @@ -1393,13 +1405,13 @@ - + - + diff --git a/iphone/Maps/UI/PlacePage/PlacePageInteractor.swift b/iphone/Maps/UI/PlacePage/PlacePageInteractor.swift index 18bfecd35..b55aca4ae 100644 --- a/iphone/Maps/UI/PlacePage/PlacePageInteractor.swift +++ b/iphone/Maps/UI/PlacePage/PlacePageInteractor.swift @@ -210,6 +210,16 @@ extension PlacePageInteractor: PlacePageButtonsViewControllerDelegate { // MARK: - PlacePageEditBookmarkOrTrackViewControllerDelegate extension PlacePageInteractor: PlacePageEditBookmarkOrTrackViewControllerDelegate { + func didUpdate(color: UIColor, category: MWMMarkGroupID, for data: PlacePageEditData) { + switch data { + case .bookmark(let bookmarkData): + let bookmarkColor = BookmarkColor.bookmarkColor(from: color) ?? bookmarkData.color + MWMPlacePageManagerHelper.updateBookmark(placePageData, color: bookmarkColor, category: category) + case .track(let trackData): + MWMPlacePageManagerHelper.updateTrack(placePageData, color: color, category: category) + } + } + func didPressEdit(_ data: PlacePageEditData) { switch data { case .bookmark: diff --git a/iphone/Maps/UI/PlacePage/PlacePageLayout/Layouts/PlacePageTrackLayout.swift b/iphone/Maps/UI/PlacePage/PlacePageLayout/Layouts/PlacePageTrackLayout.swift index 3de16f824..10f4a9b1a 100644 --- a/iphone/Maps/UI/PlacePage/PlacePageLayout/Layouts/PlacePageTrackLayout.swift +++ b/iphone/Maps/UI/PlacePage/PlacePageLayout/Layouts/PlacePageTrackLayout.swift @@ -72,8 +72,10 @@ class PlacePageTrackLayout: IPlacePageLayout { var viewControllers = [UIViewController]() viewControllers.append(editTrackViewController) - editTrackViewController.view.isHidden = false - editTrackViewController.data = .track(trackData) + if let trackData = placePageData.trackData { + editTrackViewController.view.isHidden = false + editTrackViewController.data = .track(trackData) + } placePageData.onBookmarkStatusUpdate = { [weak self] in guard let self = self else { return } diff --git a/iphone/Maps/UI/PlacePage/PlacePageLayout/Layouts/PlacePageTrackRecordingLayout.swift b/iphone/Maps/UI/PlacePage/PlacePageLayout/Layouts/PlacePageTrackRecordingLayout.swift index 57bd63620..3dc4c6d5f 100644 --- a/iphone/Maps/UI/PlacePage/PlacePageLayout/Layouts/PlacePageTrackRecordingLayout.swift +++ b/iphone/Maps/UI/PlacePage/PlacePageLayout/Layouts/PlacePageTrackRecordingLayout.swift @@ -28,13 +28,6 @@ final class PlacePageTrackRecordingLayout: IPlacePageLayout { return PlacePageHeaderBuilder.build(data: placePageData, delegate: interactor, headerType: .fixed) }() - lazy var editTrackViewController: PlacePageEditBookmarkOrTrackViewController = { - let vc = storyboard.instantiateViewController(ofType: PlacePageEditBookmarkOrTrackViewController.self) - vc.view.isHidden = true - vc.delegate = interactor - return vc - }() - lazy var elevationProfileViewController: ElevationProfileViewController? = { guard let trackData = placePageData.trackData else { return nil diff --git a/iphone/Maps/UI/PlacePage/PlacePageManager/MWMPlacePageManager.mm b/iphone/Maps/UI/PlacePage/PlacePageManager/MWMPlacePageManager.mm index 0dc10fd63..7aed08c0b 100644 --- a/iphone/Maps/UI/PlacePage/PlacePageManager/MWMPlacePageManager.mm +++ b/iphone/Maps/UI/PlacePage/PlacePageManager/MWMPlacePageManager.mm @@ -180,6 +180,14 @@ using namespace storage; [data updateBookmarkStatus]; } +- (void)updateBookmark:(PlacePageData *)data color:(MWMBookmarkColor)color category:(MWMMarkGroupID)category { + MWMBookmarksManager * bookmarksManager = [MWMBookmarksManager sharedManager]; + auto const & markId = data.bookmarkData.bookmarkId; + [bookmarksManager updateBookmark:markId setGroupId:category title:data.previewData.title color:color description:data.bookmarkData.bookmarkDescription]; + [MWMFrameworkHelper updatePlacePageData]; + [data updateBookmarkStatus]; +} + - (void)removeBookmark:(PlacePageData *)data { auto &f = GetFramework(); @@ -188,6 +196,14 @@ using namespace storage; [data updateBookmarkStatus]; } +- (void)updateTrack:(PlacePageData *)data color:(UIColor *)color category:(MWMMarkGroupID)category { + MWMBookmarksManager * bookmarksManager = [MWMBookmarksManager sharedManager]; + auto const & trackId = data.trackData.trackId; + [bookmarksManager updateTrack:trackId setGroupId:category color:color title:data.previewData.title]; + [MWMFrameworkHelper updatePlacePageData]; + [data updateBookmarkStatus]; +} + - (void)removeTrack:(PlacePageData *)data { auto &f = GetFramework(); diff --git a/iphone/Maps/UI/PlacePage/PlacePageManager/MWMPlacePageManagerHelper.h b/iphone/Maps/UI/PlacePage/PlacePageManager/MWMPlacePageManagerHelper.h index 357354d67..d7d8fbe17 100644 --- a/iphone/Maps/UI/PlacePage/PlacePageManager/MWMPlacePageManagerHelper.h +++ b/iphone/Maps/UI/PlacePage/PlacePageManager/MWMPlacePageManagerHelper.h @@ -30,7 +30,9 @@ + (void)openCatalogSingleItem:(PlacePageData *)data atIndex:(NSInteger)index; + (void)openCatalogMoreItems:(PlacePageData *)data; + (void)addBookmark:(PlacePageData *)data; ++ (void)updateBookmark:(PlacePageData *)data color:(MWMBookmarkColor)color category:(MWMMarkGroupID)category; + (void)removeBookmark:(PlacePageData *)data; ++ (void)updateTrack:(PlacePageData *)data color:(UIColor *)color category:(MWMMarkGroupID)category; + (void)removeTrack:(PlacePageData *)data; + (void)editBookmark:(PlacePageData *)data; + (void)editTrack:(PlacePageData *)data; diff --git a/iphone/Maps/UI/PlacePage/PlacePageManager/MWMPlacePageManagerHelper.mm b/iphone/Maps/UI/PlacePage/PlacePageManager/MWMPlacePageManagerHelper.mm index 8678816ff..babb11dae 100644 --- a/iphone/Maps/UI/PlacePage/PlacePageManager/MWMPlacePageManagerHelper.mm +++ b/iphone/Maps/UI/PlacePage/PlacePageManager/MWMPlacePageManagerHelper.mm @@ -36,7 +36,9 @@ - (void)openCatalogSingleItem:(PlacePageData *)data atIndex:(NSInteger)index; - (void)openCatalogMoreItems:(PlacePageData *)data; - (void)addBookmark:(PlacePageData *)data; +- (void)updateBookmark:(PlacePageData *)data color:(MWMBookmarkColor)color category:(MWMMarkGroupID)category; - (void)removeBookmark:(PlacePageData *)data; +- (void)updateTrack:(PlacePageData *)data color:(UIColor *)color category:(MWMMarkGroupID)category; - (void)removeTrack:(PlacePageData *)data; - (void)editBookmark:(PlacePageData *)data; - (void)editTrack:(PlacePageData *)data; @@ -160,10 +162,18 @@ [[MWMMapViewControlsManager manager].placePageManager addBookmark:data]; } ++ (void)updateBookmark:(PlacePageData *)data color:(MWMBookmarkColor)color category:(MWMMarkGroupID)category { + [[MWMMapViewControlsManager manager].placePageManager updateBookmark:data color:color category:category]; +} + + (void)removeBookmark:(PlacePageData *)data { [[MWMMapViewControlsManager manager].placePageManager removeBookmark:data]; } ++ (void)updateTrack:(PlacePageData *)data color:(UIColor *)color category:(MWMMarkGroupID)category { + [[MWMMapViewControlsManager manager].placePageManager updateTrack:data color:color category:category]; +} + + (void)removeTrack:(PlacePageData *)data { [[MWMMapViewControlsManager manager].placePageManager removeTrack:data]; } diff --git a/iphone/Maps/UI/PlacePage/Views/InfoView.swift b/iphone/Maps/UI/PlacePage/Views/InfoView.swift new file mode 100644 index 000000000..0cfb9660f --- /dev/null +++ b/iphone/Maps/UI/PlacePage/Views/InfoView.swift @@ -0,0 +1,80 @@ +final class InfoView: UIView { + + private let stackView = UIStackView() + private let imageView = UIImageView() + private let titleLabel = UILabel() + private lazy var imageViewWidthConstrain = imageView.widthAnchor.constraint(equalToConstant: 0) + + init() { + super.init(frame: .zero) + self.setupView() + self.layoutViews() + } + + convenience init(image: UIImage?, title: String) { + self.init() + self.set(image: image, title: title) + } + + override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { + super.traitCollectionDidChange(previousTraitCollection) + if #available(iOS 13.0, *), traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) { + imageView.applyTheme() + } + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setupView() { + setStyle(.background) + + stackView.axis = .horizontal + stackView.distribution = .fill + stackView.alignment = .center + stackView.spacing = 16 + + titleLabel.setFontStyle(.regular16, color: .blackPrimary) + titleLabel.lineBreakMode = .byWordWrapping + titleLabel.numberOfLines = .zero + + imageView.setStyle(.black) + imageView.contentMode = .scaleAspectFit + } + + private func layoutViews() { + addSubview(stackView) + stackView.addArrangedSubview(imageView) + stackView.addArrangedSubview(titleLabel) + + stackView.translatesAutoresizingMaskIntoConstraints = false + imageView.translatesAutoresizingMaskIntoConstraints = false + titleLabel.translatesAutoresizingMaskIntoConstraints = false + imageView.setContentHuggingPriority(.defaultHigh, for: .vertical) + imageView.setContentHuggingPriority(.defaultHigh, for: .horizontal) + titleLabel.setContentHuggingPriority(.defaultLow, for: .horizontal) + NSLayoutConstraint.activate([ + stackView.leadingAnchor.constraint(equalTo: leadingAnchor), + stackView.trailingAnchor.constraint(equalTo: trailingAnchor), + stackView.topAnchor.constraint(equalTo: topAnchor), + stackView.bottomAnchor.constraint(equalTo: bottomAnchor), + imageView.heightAnchor.constraint(equalToConstant: 24), + imageViewWidthConstrain + ]) + updateImageWidth() + } + + private func updateImageWidth() { + imageViewWidthConstrain.constant = imageView.image == nil ? 0 : 24 + imageView.isHidden = imageView.image == nil + } + + // MARK: - Public + func set(image: UIImage?, title: String) { + imageView.image = image + titleLabel.text = title + updateImageWidth() + } +}