void FeatureType::ReplaceBy(osm::EditableMapObject const & emo) { uint8_t geoType; if (emo.IsPointType()) { // We are here for existing point features and for newly created point features. m_center = emo.GetMercator(); m_limitRect.MakeEmpty(); m_limitRect.Add(m_center); m_bPointsParsed = m_bTrianglesParsed = true; geoType = feature::GEOM_POINT; } else { geoType = Header() & HEADER_GEOTYPE_MASK; } m_params.name = emo.GetName(); string const & house = emo.GetHouseNumber(); if (house.empty()) m_params.house.Clear(); else m_params.house.Set(house); m_bCommonParsed = true; m_metadata = emo.GetMetadata(); m_bMetadataParsed = true; uint32_t typesCount = 0; for (uint32_t const type : emo.GetTypes()) m_types[typesCount++] = type; m_bTypesParsed = true; m_header = CalculateHeader(typesCount, geoType, m_params); m_bHeader2Parsed = true; m_id = emo.GetID(); }
EditorDialog::EditorDialog(QWidget * parent, osm::EditableMapObject & emo) : QDialog(parent), m_feature(emo) { QGridLayout * grid = new QGridLayout(); int row = 0; { // Coordinates. ms::LatLon const ll = emo.GetLatLon(); grid->addWidget(new QLabel("Latitude/Longitude:"), row, 0); QHBoxLayout * coords = new QHBoxLayout(); coords->addWidget(new QLabel(QString::fromStdString(strings::to_string_dac(ll.lat, 7) + " " + strings::to_string_dac(ll.lon, 7)))); grid->addLayout(coords, row++, 1); } { // Feature types. grid->addWidget(new QLabel("Type:"), row, 0); string localized = m_feature.GetLocalizedType(); string const raw = DebugPrint(m_feature.GetTypes()); if (!strings::EqualNoCase(localized, raw)) localized += " (" + raw + ")"; QLabel * label = new QLabel(QString::fromStdString(localized)); label->setTextInteractionFlags(Qt::TextSelectableByMouse); grid->addWidget(label, row++, 1); } if (emo.IsNameEditable()) { // Names. char const * defaultLangStr = StringUtf8Multilang::GetLangByCode(StringUtf8Multilang::kDefaultCode); // Default name editor is always displayed, even if feature name is empty. grid->addWidget(new QLabel(QString("Name:")), row, 0); QLineEdit * defaultName = new QLineEdit(); defaultName->setObjectName(defaultLangStr); QGridLayout * namesGrid = new QGridLayout(); int namesRow = 0; namesGrid->addWidget(defaultName, namesRow++, 0, 1, 0); auto const namesDataSource = emo.GetNamesDataSource(); for (auto const & ln : namesDataSource.names) { if (ln.m_code == StringUtf8Multilang::kDefaultCode) { defaultName->setText(QString::fromStdString(ln.m_name)); } else { char const * langStr = StringUtf8Multilang::GetLangByCode(ln.m_code); namesGrid->addWidget(new QLabel(ln.m_lang), namesRow, 0); QLineEdit * lineEditName = new QLineEdit(QString::fromStdString(ln.m_name)); lineEditName->setReadOnly(!emo.IsNameEditable()); lineEditName->setObjectName(langStr); namesGrid->addWidget(lineEditName, namesRow++, 1); } } grid->addLayout(namesGrid, row++, 1); } if (emo.IsAddressEditable()) { // Address rows. auto nearbyStreets = emo.GetNearbyStreets(); grid->addWidget(new QLabel(kStreetObjectName), row, 0); QComboBox * cmb = new QComboBox(); cmb->setEditable(true); if (emo.GetStreet().m_defaultName.empty()) cmb->addItem(""); for (int i = 0; i < nearbyStreets.size(); ++i) { string street = nearbyStreets[i].m_defaultName; if (!nearbyStreets[i].m_localizedName.empty()) street += " / " + nearbyStreets[i].m_localizedName; cmb->addItem(street.c_str()); if (emo.GetStreet() == nearbyStreets[i]) cmb->setCurrentIndex(i); } cmb->setObjectName(kStreetObjectName); grid->addWidget(cmb, row++, 1); grid->addWidget(new QLabel(kHouseNumberObjectName), row, 0); QLineEdit * houseLineEdit = new QLineEdit(emo.GetHouseNumber().c_str()); houseLineEdit->setObjectName(kHouseNumberObjectName); grid->addWidget(houseLineEdit, row++, 1); grid->addWidget(new QLabel(kPostcodeObjectName), row, 0); QLineEdit * postcodeEdit = new QLineEdit(QString::fromStdString(emo.GetPostcode())); postcodeEdit->setObjectName(kPostcodeObjectName); grid->addWidget(postcodeEdit, row++, 1); } // Editable metadata rows. for (osm::Props const prop : emo.GetEditableProperties()) { string v; switch (prop) { case osm::Props::Phone: v = emo.GetPhone(); break; case osm::Props::Fax: v = emo.GetFax(); break; case osm::Props::Email: v = emo.GetEmail(); break; case osm::Props::Website: v = emo.GetWebsite(); break; case osm::Props::Internet: { grid->addWidget(new QLabel(kInternetObjectName), row, 0); QComboBox * cmb = new QComboBox(); string const values[] = {DebugPrint(osm::Internet::Unknown), DebugPrint(osm::Internet::Wlan), DebugPrint(osm::Internet::Wired), DebugPrint(osm::Internet::Yes), DebugPrint(osm::Internet::No)}; for (auto const & v : values) cmb->addItem(v.c_str()); cmb->setCurrentText(DebugPrint(emo.GetInternet()).c_str()); cmb->setObjectName(kInternetObjectName); grid->addWidget(cmb, row++, 1); } continue; case osm::Props::Cuisine: v = strings::JoinStrings(emo.GetLocalizedCuisines(), ", "); break; case osm::Props::OpeningHours: v = emo.GetOpeningHours(); break; case osm::Props::Stars: v = strings::to_string(emo.GetStars()); break; case osm::Props::Operator: v = emo.GetOperator(); break; case osm::Props::Elevation: { double ele; if (emo.GetElevation(ele)) v = strings::to_string_dac(ele, 2); } break; case osm::Props::Wikipedia: v = emo.GetWikipedia(); break; case osm::Props::Flats: v = emo.GetFlats(); break; case osm::Props::BuildingLevels: v = emo.GetBuildingLevels(); break; } QString const fieldName = QString::fromStdString(DebugPrint(prop)); grid->addWidget(new QLabel(fieldName), row, 0); QLineEdit * lineEdit = new QLineEdit(QString::fromStdString(v)); // Mark line editor to query it's text value when editing is finished. lineEdit->setObjectName(fieldName); grid->addWidget(lineEdit, row++, 1); } { // Dialog buttons. QDialogButtonBox * buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel | QDialogButtonBox::Save); connect(buttonBox, SIGNAL(accepted()), this, SLOT(OnSave())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); // Delete button should send custom int return value from dialog. QPushButton * deletePOIButton = new QPushButton("Delete POI"); QSignalMapper * signalMapper = new QSignalMapper(); connect(deletePOIButton, SIGNAL(clicked()), signalMapper, SLOT(map())); signalMapper->setMapping(deletePOIButton, QDialogButtonBox::DestructiveRole); connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(done(int))); buttonBox->addButton(deletePOIButton, QDialogButtonBox::DestructiveRole); grid->addWidget(buttonBox, row++, 1); } setLayout(grid); setWindowTitle("OSM Editor"); }