Marble

OsmRelationManagerWidget.cpp
1 // SPDX-License-Identifier: LGPL-2.1-or-later
2 //
3 // SPDX-FileCopyrightText: 2015 Stanciu Marius-Valeriu <[email protected]>
4 //
5 
6 // Self
7 #include "OsmRelationManagerWidget.h"
8 #include "OsmRelationManagerWidget_p.h"
9 #include "ui_OsmRelationManagerWidget.h"
10 
11 // Qt
12 #include <QTreeWidget>
13 #include <QMenu>
14 #include <QPointer>
15 #include <QDebug>
16 
17 // Marble
18 #include "GeoDataPlacemark.h"
19 #include "GeoDataGeometry.h"
20 #include "osm/OsmPlacemarkData.h"
21 #include "osm/OsmObjectManager.h"
22 #include "osm/OsmRelationEditorDialog.h"
23 
24 namespace Marble
25 {
26 
27 OsmRelationManagerWidget::OsmRelationManagerWidget( GeoDataPlacemark *placemark,
28  const QHash<qint64, OsmPlacemarkData> *relations,
29  QWidget *parent )
30  : QWidget( parent ),
31  d( new OsmRelationManagerWidgetPrivate )
32 {
33  d->m_placemark = placemark;
34  d->m_allRelations = relations;
35  d->setupUi( this );
36  d->populateRelationsList();
37  d->m_relationDropMenu = new QMenu( d->m_addRelation );
38  d->m_currentRelations->setRootIsDecorated( false );
39  d->m_currentRelations->setEditTriggers( QTreeWidget::DoubleClicked );
40  d->m_currentRelations->setContextMenuPolicy( Qt::CustomContextMenu );
41  d->m_currentRelations->setMinimumWidth( d->m_currentRelations->columnCount() * d->m_currentRelations->columnWidth( 0 ) + 10 );
42 
43  d->m_addRelation->setMenu( d->m_relationDropMenu );
44  d->populateDropMenu();
45 
46  QObject::connect( d->m_currentRelations, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),
47  this, SLOT(handleDoubleClick(QTreeWidgetItem*,int)) );
48  QObject::connect( d->m_currentRelations, SIGNAL(customContextMenuRequested(QPoint)),
49  this, SLOT(handleRelationContextMenuRequest(QPoint)) );
50  QObject::connect( d->m_relationDropMenu, SIGNAL(triggered(QAction*)),
51  this, SLOT(addRelation(QAction*)) );
52  QObject::connect( d->m_currentRelations, SIGNAL(itemChanged(QTreeWidgetItem*,int)),
53  this, SLOT(handleItemChange(QTreeWidgetItem*,int)) );
54 }
55 
56 OsmRelationManagerWidget::~OsmRelationManagerWidget()
57 {
58  delete d;
59 }
60 
62 {
63  // The QAction::text() adds a '&' for some reason
64  QString relationText = relationAction->text().remove(QLatin1Char('&'));
65 
66  if ( relationText == tr( "New Relation" ) ) {
67  OsmPlacemarkData relationData;
68  QPointer<OsmRelationEditorDialog> relationEditor = new OsmRelationEditorDialog( &relationData );
69  const int result = relationEditor->exec();
70  delete relationEditor;
71  if (result == QDialog::Rejected) {
72  return;
73  }
74 
75  QTreeWidgetItem *newRelationItem = new QTreeWidgetItem();
76  newRelationItem->setText(Column::Name, relationData.tagValue(QStringLiteral("name")));
77  newRelationItem->setText(Column::Type, relationData.tagValue(QStringLiteral("type")));
78  newRelationItem->setData( Column::Name, Qt::UserRole, relationData.id() );
79  d->m_currentRelations->addTopLevelItem( newRelationItem );
80 
81  // Make the user complete the role column
82  newRelationItem->setFlags( newRelationItem->flags() | Qt::ItemIsEditable );
83  d->m_currentRelations->editItem( newRelationItem, Column::Role );
84 
85  // This tells the annotate plugin to add the new relation to its list
86  emit relationCreated( relationData );
87  }
88  else {
89  qint64 id = relationAction->data().toLongLong();
90  OsmPlacemarkData relationData = d->m_allRelations->value( id );
91  QTreeWidgetItem *newRelationItem = new QTreeWidgetItem();
92  newRelationItem->setText(Column::Name, relationData.tagValue(QStringLiteral("name")));
93  newRelationItem->setText(Column::Type, relationData.tagValue(QStringLiteral("type")));
94  newRelationItem->setData( Column::Name, Qt::UserRole, relationData.id() );
95  d->m_currentRelations->addTopLevelItem( newRelationItem );
96 
97  // Make the user complete the role column
98  newRelationItem->setFlags( newRelationItem->flags() | Qt::ItemIsEditable );
99  d->m_currentRelations->editItem( newRelationItem, Column::Role );
100  }
101 }
102 
104 {
105  d->populateRelationsList();
106  d->populateDropMenu();
107 }
108 
109 void OsmRelationManagerWidget::handleDoubleClick( QTreeWidgetItem * item, int column )
110 {
111  Qt::ItemFlags flags = item->flags();
112 
113  // Only the "role" column should be editable
114  if ( column == Column::Role ) {
115  item->setFlags( flags | Qt::ItemIsEditable );
116  // If the double click didn't occur on the "role" column, and the item
117  // is editable make it uneditable
118  } else if ( flags & Qt::ItemIsEditable ) {
119  item->setFlags( flags ^ Qt::ItemIsEditable );
120  }
121 }
122 
123 void OsmRelationManagerWidget::handleItemChange( QTreeWidgetItem *item, int column )
124 {
125  // Only the role column should be editable
126  if ( column != Column::Role ) {
127  return;
128  }
129 
130  QString role = item->text( Column::Role );
131  qint64 id = item->data( Column::Name, Qt::UserRole ).toLongLong();
132 
133  d->m_placemark->osmData().addRelation( id, OsmType::Way, role );
134  update();
135 }
136 
137 void OsmRelationManagerWidget::handleRelationContextMenuRequest( const QPoint& point )
138 {
139  QMenu relationEditMenu;
140  relationEditMenu.addAction( tr( "Remove" ) );
141  relationEditMenu.addAction( tr( "Edit" ) );
142  QAction* selectedItem = relationEditMenu.exec( d->m_currentRelations->mapToGlobal( point ) );
143  if ( selectedItem ) {
144 
145  QTreeWidgetItem *requestedItem = d->m_currentRelations->itemAt( point );
146  qint64 id = requestedItem->data( Column::Name, Qt::UserRole ).toLongLong();
147 
148  if ( selectedItem->text() == tr( "Remove" ) ) {
149  d->m_placemark->osmData().removeRelation( id );
150  update();
151  }
152  else if ( selectedItem->text() == tr( "Edit" ) ) {
153  OsmPlacemarkData relationData = d->m_allRelations->value( id );
154  QPointer<OsmRelationEditorDialog> relationEditor = new OsmRelationEditorDialog( &relationData );
155  const int result = relationEditor->exec();
156  delete relationEditor;
157  if (result == QDialog::Rejected) {
158  return;
159  }
160 
161  emit relationCreated( relationData );
162  update();
163  }
164  }
165 }
166 
167 }
168 
169 #include "moc_OsmRelationManagerWidget.cpp"
void setFlags(Qt::ItemFlags flags)
UserRole
void update()
update updates the relations list and the suggested relations drop menu
void addRelation(QAction *action)
addRelation adds the placemark to the relation specified in the action->text(); If the text is "New R...
void customContextMenuRequested(const QPoint &pos)
CustomContextMenu
qlonglong toLongLong(bool *ok) const const
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QAction * addAction(const QString &text)
ItemIsEditable
virtual QVariant data(int column, int role) const const
QString tagValue(const QString &key) const
tagValue returns the value of the tag that has key as key or an empty qstring if there is no such tag
void setText(int column, const QString &text)
Binds a QML item to a specific geodetic location in screen coordinates.
This class is used to encapsulate the osm data fields kept within a placemark's extendedData.
QVariant data() const const
The OsmRelationEditorDialog class small dialog that is used to edit relations The dialog has a line e...
virtual void setData(int column, int role, const QVariant &value)
QString tr(const char *sourceText, const char *disambiguation, int n)
QString text(int column) const const
QAction * exec()
Qt::ItemFlags flags() const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Oct 2 2023 03:52:09 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.