[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 <kirylkaveryn@gmail.com>
This commit is contained in:
Kiryl Kaveryn
2025-06-27 14:45:13 +04:00
committed by Yannik Bloscheck
parent ec6a98a6fd
commit 49d5335e7e
14 changed files with 340 additions and 104 deletions

View File

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

View File

@@ -1,4 +1,5 @@
#import <Foundation/Foundation.h>
#import <UIKit/UIColor.h>
#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;

View File

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

View File

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

View File

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

View File

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

View File

@@ -1126,21 +1126,33 @@
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="iB6-kj-Bi1">
<rect key="frame" x="16" y="16" width="343" height="184"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="200"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="wB7-XJ-Nck" userLabel="Edit View" customClass="InfoItemView" customModule="CoMaps" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="343" height="44"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="height" constant="44" id="Dh1-Jl-owY"/>
</constraints>
</view>
<view contentMode="scaleToFill" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="5nz-eA-gNS" customClass="ExpandableLabel" customModule="CoMaps" customModuleProvider="target">
<rect key="frame" x="0.0" y="44" width="343" height="140"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="styleName" value="Background"/>
</userDefinedRuntimeAttributes>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="6GV-eD-5Hj" userLabel="Expandable Label Container">
<rect key="frame" x="0.0" y="44" width="375" height="156"/>
<subviews>
<view contentMode="scaleToFill" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="5nz-eA-gNS" customClass="ExpandableLabel" customModule="CoMaps" customModuleProvider="target">
<rect key="frame" x="16" y="8" width="343" height="140"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="styleName" value="Background"/>
</userDefinedRuntimeAttributes>
</view>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="bottom" secondItem="5nz-eA-gNS" secondAttribute="bottom" constant="8" id="7cq-aw-oEp"/>
<constraint firstAttribute="trailing" secondItem="5nz-eA-gNS" secondAttribute="trailing" constant="16" id="8bV-Qg-RLL"/>
<constraint firstItem="5nz-eA-gNS" firstAttribute="top" secondItem="6GV-eD-5Hj" secondAttribute="top" constant="8" id="beB-db-IK0"/>
<constraint firstItem="5nz-eA-gNS" firstAttribute="leading" secondItem="6GV-eD-5Hj" secondAttribute="leading" constant="16" id="vKl-QO-4lm"/>
</constraints>
</view>
</subviews>
</stackView>
@@ -1148,10 +1160,10 @@
<viewLayoutGuide key="safeArea" id="mWF-en-dQX"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints>
<constraint firstItem="iB6-kj-Bi1" firstAttribute="top" secondItem="bRD-Uv-Uak" secondAttribute="top" constant="16" id="Afw-Mq-NV9"/>
<constraint firstItem="iB6-kj-Bi1" firstAttribute="top" secondItem="bRD-Uv-Uak" secondAttribute="top" id="Afw-Mq-NV9"/>
<constraint firstAttribute="bottom" secondItem="iB6-kj-Bi1" secondAttribute="bottom" id="QQY-yn-M6D"/>
<constraint firstItem="iB6-kj-Bi1" firstAttribute="leading" secondItem="bRD-Uv-Uak" secondAttribute="leading" constant="16" id="tLm-VN-6Uh"/>
<constraint firstAttribute="trailing" secondItem="iB6-kj-Bi1" secondAttribute="trailing" constant="16" id="wOt-k9-l2q"/>
<constraint firstItem="iB6-kj-Bi1" firstAttribute="leading" secondItem="bRD-Uv-Uak" secondAttribute="leading" id="tLm-VN-6Uh"/>
<constraint firstAttribute="trailing" secondItem="iB6-kj-Bi1" secondAttribute="trailing" id="wOt-k9-l2q"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="styleName" value="Background"/>
@@ -1161,8 +1173,8 @@
<connections>
<outlet property="editView" destination="wB7-XJ-Nck" id="iPO-d0-Pw4"/>
<outlet property="expandableLabel" destination="5nz-eA-gNS" id="iui-Iu-EiB"/>
<outlet property="expandableLabelContainer" destination="6GV-eD-5Hj" id="JFo-mK-5MC"/>
<outlet property="stackView" destination="iB6-kj-Bi1" id="CSH-xH-X4b"/>
<outlet property="topConstraint" destination="Afw-Mq-NV9" id="Oth-ao-05T"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="fcE-Xu-odc" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
@@ -1393,13 +1405,13 @@
<image name="ic_arrow_gray_down" width="28" height="28"/>
<image name="ic_placepage_open_hours" width="28" height="28"/>
<systemColor name="separatorColor">
<color red="0.23529411764705882" green="0.23529411764705882" blue="0.2627450980392157" alpha="0.28999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
<color red="0.23529411759999999" green="0.23529411759999999" blue="0.26274509800000001" alpha="0.28999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
</systemColor>
<systemColor name="systemBackgroundColor">
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</systemColor>
<systemColor name="systemRedColor">
<color red="1" green="0.23137254901960785" blue="0.18823529411764706" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color red="1" green="0.23137254900000001" blue="0.18823529410000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</systemColor>
</resources>
</document>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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