mirror of
https://codeberg.org/comaps/comaps
synced 2025-12-19 13:03:36 +00:00
[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:
committed by
Yannik Bloscheck
parent
ec6a98a6fd
commit
49d5335e7e
@@ -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
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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 }
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
|
||||
80
iphone/Maps/UI/PlacePage/Views/InfoView.swift
Normal file
80
iphone/Maps/UI/PlacePage/Views/InfoView.swift
Normal 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()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user