diff --git a/indexer/osm_editor.cpp b/indexer/osm_editor.cpp index 562e619693..4c8b1ebbbe 100644 --- a/indexer/osm_editor.cpp +++ b/indexer/osm_editor.cpp @@ -193,7 +193,7 @@ void Editor::LoadMapEdits() if (section.first == FeatureStatus::Created) { - // TODO(mgsergio): Create features which are not present in mwm. + fti.m_feature.FromXML(xml); } else { @@ -342,31 +342,37 @@ void Editor::DeleteFeature(FeatureType const & feature) Invalidate(); } -Editor::SaveResult Editor::SaveEditedFeature(FeatureType & editedFeature, string const & editedStreet, - string const & editedHouseNumber) +namespace { - // Check house number for validity. - if (editedHouseNumber.empty() || feature::IsHouseNumber(editedHouseNumber)) - editedFeature.SetHouseNumber(editedHouseNumber); - // TODO(AlexZ): Store edited house number as house name if feature::IsHouseNumber() returned false. - - FeatureID const fid = editedFeature.GetID(); - if (AreFeaturesEqualButStreet(editedFeature, *m_getOriginalFeatureFn(fid)) && - m_getOriginalFeatureStreetFn(editedFeature) == editedStreet) - { - RemoveFeatureFromStorageIfExists(fid.m_mwmId, fid.m_index); - // TODO(AlexZ): Synchronize Save call/make it on a separate thread. - Save(GetEditorFilePath()); - Invalidate(); - return NothingWasChanged; - } +constexpr uint32_t kStartIndexForCreatedFeatures = numeric_limits::max() - 0xffff; +bool IsCreatedFeature(FeatureID const & fid) { return fid.m_index >= kStartIndexForCreatedFeatures; } +} // namespace +Editor::SaveResult Editor::SaveEditedFeature(EditableMapObject const & emo) +{ + FeatureID const & fid = emo.GetID(); FeatureTypeInfo fti; - fti.m_status = FeatureStatus::Modified; - fti.m_feature = editedFeature; + fti.m_feature.ReplaceBy(emo); + if (IsCreatedFeature(fid)) + { + fti.m_status = FeatureStatus::Created; + } + else + { + if (AreFeaturesEqualButStreet(fti.m_feature, *m_getOriginalFeatureFn(fid)) && + m_getOriginalFeatureStreetFn(fti.m_feature) == emo.GetStreet()) + { + RemoveFeatureFromStorageIfExists(fid.m_mwmId, fid.m_index); + // TODO(AlexZ): Synchronize Save call/make it on a separate thread. + Save(GetEditorFilePath()); + Invalidate(); + return NothingWasChanged; + } + fti.m_status = FeatureStatus::Modified; + } // TODO: What if local client time is absolutely wrong? fti.m_modificationTimestamp = time(nullptr); - fti.m_street = editedStreet; + fti.m_street = emo.GetStreet(); m_features[fid.m_mwmId][fid.m_index] = move(fti); // TODO(AlexZ): Synchronize Save call/make it on a separate thread. @@ -702,8 +708,12 @@ FeatureID Editor::GenerateNewFeatureId(MwmSet::MwmId const & id) bool Editor::CreatePoint(uint32_t type, m2::PointD const & mercator, MwmSet::MwmId const & id, EditableMapObject & outFeature) { - // TODO(AlexZ): Finish impl. - return false; + ASSERT(id.IsAlive(), ("Please check that feature is created in valid MWM file before calling this method.")); + outFeature.SetMercator(mercator); + outFeature.SetID(GenerateNewFeatureId(id)); + outFeature.SetType(type); + outFeature.SetEditableProperties(GetEditablePropertiesForTypes(outFeature.GetTypes())); + return true; } string DebugPrint(Editor::FeatureStatus fs) @@ -716,5 +726,4 @@ string DebugPrint(Editor::FeatureStatus fs) case Editor::FeatureStatus::Created: return "Created"; }; } - } // namespace osm diff --git a/indexer/osm_editor.hpp b/indexer/osm_editor.hpp index 87520b0013..012606e847 100644 --- a/indexer/osm_editor.hpp +++ b/indexer/osm_editor.hpp @@ -97,9 +97,7 @@ public: NoFreeSpaceError }; /// Editor checks internally if any feature params were actually edited. - /// House number is correctly updated for editedFeature (if it's valid). - SaveResult SaveEditedFeature(FeatureType & editedFeature, string const & editedStreet = "", - string const & editedHouseNumber = ""); + SaveResult SaveEditedFeature(EditableMapObject const & emo); EditableProperties GetEditableProperties(FeatureType const & feature) const; diff --git a/map/framework.cpp b/map/framework.cpp index 4d1c7fe734..a14250a287 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -2398,13 +2398,14 @@ bool Framework::GetEditableMapObject(FeatureID const & fid, osm::EditableMapObje return true; } -osm::Editor::SaveResult Framework::SaveEditedMapObject(osm::EditableMapObject const & emo) const +osm::Editor::SaveResult Framework::SaveEditedMapObject(osm::EditableMapObject const & emo) { - // TODO(AlexZ): Move this code to the Editor. - auto feature = GetFeatureByID(emo.GetID()); - FeatureType & ft = *feature; - ft.ApplyPatch(emo); - return osm::Editor::Instance().SaveEditedFeature(ft, emo.GetStreet(), emo.GetHouseNumber()); + if (!m_lastTapEvent) + { + // Automatically select newly created objects. + m_lastTapEvent.reset(new df::TapInfo { m_currentModelView.GtoP(emo.GetMercator()), false, false, emo.GetID() }); + } + return osm::Editor::Instance().SaveEditedFeature(emo); } void Framework::DeleteFeature(FeatureID const & fid) const diff --git a/map/framework.hpp b/map/framework.hpp index ff30300a05..1c25cd9679 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -614,7 +614,7 @@ public: bool CreateMapObject(m2::PointD const & mercator, uint32_t const featureType, osm::EditableMapObject & emo) const; /// @returns false if feature is invalid or can't be edited. bool GetEditableMapObject(FeatureID const & fid, osm:: EditableMapObject & emo) const; - osm::Editor::SaveResult SaveEditedMapObject(osm:: EditableMapObject const & emo) const; + osm::Editor::SaveResult SaveEditedMapObject(osm:: EditableMapObject const & emo); void DeleteFeature(FeatureID const & fid) const; osm::NewFeatureCategories GetEditorCategories() const; //@}