Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 30 additions & 21 deletions app/fieldsmodel.cpp
Original file line number Diff line number Diff line change
@@ -1,13 +1,21 @@
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#include "fieldsmodel.h"
#include <QtDebug>

FieldsModel::FieldsModel( QObject *parent )
: QAbstractListModel( parent )
{
// fill the model with initial data
addField( "Date", "DateTime" );
addField( "Notes", "TextEdit" );
addField( "Photo", "ExternalResource" );
addField( tr( "Date" ), "DateTime" );
addField( tr( "Notes" ), "TextEdit" );
addField( tr( "Photo" ), "ExternalResource" );
}

bool FieldsModel::addField( const QString &name, const QString &widgetType )
Expand Down Expand Up @@ -36,13 +44,13 @@ bool FieldsModel::addField( const QString &name, const QString &widgetType )
return true;
}

bool FieldsModel::removeField( int row )
bool FieldsModel::removeField( const int rowIndex )
{
if ( row < 0 || row >= mFields.count() )
if ( rowIndex < 0 || rowIndex >= mFields.count() )
return false;

beginResetModel();
mFields.removeAt( row );
mFields.removeAt( rowIndex );
endResetModel();
return true;
}
Expand All @@ -55,8 +63,8 @@ QList<FieldConfiguration> FieldsModel::fields() const
QHash<int, QByteArray> FieldsModel::roleNames() const
{
QHash<int, QByteArray> roles = QAbstractListModel::roleNames();
roles[AttributeName] = QByteArrayLiteral( "AttributeName" );
roles[WidgetType] = QByteArrayLiteral( "WidgetType" );
roles[AttributeName] = QByteArrayLiteral( "attributeName" );
roles[WidgetType] = QByteArrayLiteral( "widgetType" );

return roles;
}
Expand All @@ -65,12 +73,12 @@ QHash<int, QByteArray> FieldsModel::roleNames() const
int FieldsModel::rowCount( const QModelIndex &parent ) const
{
Q_UNUSED( parent );
return mFields.count();
return static_cast<int>( mFields.count() );
}

QVariant FieldsModel::data( const QModelIndex &index, int role ) const
QVariant FieldsModel::data( const QModelIndex &index, const int role ) const
{
int row = index.row();
const int row = index.row();
if ( row < 0 || row >= mFields.count() )
return QVariant();

Expand All @@ -80,22 +88,21 @@ QVariant FieldsModel::data( const QModelIndex &index, int role ) const
{
case AttributeName:
return field.attributeName;
break;

case WidgetType:
return field.widgetType;
break;
}

return QVariant();
default:
return QVariant();
}
}

bool FieldsModel::setData( const QModelIndex &index, const QVariant &value, int role )
bool FieldsModel::setData( const QModelIndex &index, const QVariant &value, const int role )
{
if ( data( index, role ) == value )
return true;

int row = index.row();
const int row = index.row();
if ( row < 0 || row >= mFields.count() )
return false;

Expand All @@ -111,18 +118,20 @@ bool FieldsModel::setData( const QModelIndex &index, const QVariant &value, int
emit dataChanged( index, index, {AttributeName} );
return true;
}

case WidgetType:
{
mFields[row].widgetType = value.toString();
emit dataChanged( index, index, {WidgetType} );
return true;
}
}

return false;
default:
return false;
}
}

bool FieldsModel::contains( const QString &name )
bool FieldsModel::contains( const QString &name ) const
{
for ( int i = 0; i < mFields.count(); ++i )
{
Expand Down
15 changes: 6 additions & 9 deletions app/fieldsmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,10 @@
#ifndef FIELDSMODEL_H
#define FIELDSMODEL_H

#include <QObject>
#include <QAbstractListModel>
#include <QVector>
#include <QMap>
#include <QtQml/qqmlregistration.h>

#include "qgsfield.h"
#include "qgsfields.h"
#include <qgsfield.h>

struct FieldConfiguration
{
Expand All @@ -28,18 +25,18 @@ struct FieldConfiguration
class FieldsModel: public QAbstractListModel
{
Q_OBJECT
QML_ELEMENT

public:
/**
* Feature roles enum.
*/
Q_ENUMS( FeatureRoles )

//! Feature roles
enum FeatureRoles
{
AttributeName = Qt::UserRole + 1, //!< Attribute's display name (the original field name)
WidgetType, //!< Widget type name. Should match QT/QML editor widgets names.
};
Q_ENUM( FeatureRoles )

//! Creates a new fields model
explicit FieldsModel( QObject *parent = nullptr );
Expand All @@ -62,7 +59,7 @@ class FieldsModel: public QAbstractListModel
QList<FieldConfiguration> mFields;


bool contains( const QString &name );
bool contains( const QString &name ) const;
};

#endif // FIELDSMODEL_H
2 changes: 0 additions & 2 deletions app/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@
#include "variablesmanager.h"
#include "inputhelp.h"
#include "inputprojutils.h"
#include "fieldsmodel.h"
#include "projectwizard.h"
#include "qrcodedecoder.h"
#include "inputexpressionfunctions.h"
Expand Down Expand Up @@ -270,7 +269,6 @@ void initDeclarative()
qmlRegisterUncreatableType<RegistrationError>( "mm", 1, 0, "RegistrationError", "RegistrationError Enum" );
qmlRegisterType<PositionDirection>( "mm", 1, 0, "PositionDirection" );
qmlRegisterType<Compass>( "mm", 1, 0, "Compass" );
qmlRegisterType<FieldsModel>( "mm", 1, 0, "FieldsModel" );
qmlRegisterType<QrCodeDecoder>( "mm", 1, 0, "QrCodeDecoder" );
qmlRegisterType<ProjectsModel>( "mm", 1, 0, "ProjectsModel" );
qmlRegisterType<ProjectsProxyModel>( "mm", 1, 0, "ProjectsProxyModel" );
Expand Down
102 changes: 53 additions & 49 deletions app/projectwizard.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,13 @@
#include "qgsvectortilelayer.h"
#include "qgsvectorlayer.h"
#include "qgsvectorfilewriter.h"
#include "qgsdatetimefieldformatter.h"
#include "qgsmarkersymbollayer.h"
#include "qgis.h"
#include "qgslinesymbol.h"
#include "qgssymbollayer.h"
#include "qgssymbollayerutils.h"
#include "qgssymbol.h"
#include "qgsmarkersymbol.h"
#include "qgssinglesymbolrenderer.h"
#include "inpututils.h"
#include "coreutils.h"

const QString TILES_URL = QStringLiteral( "https://tiles.merginmaps.com" );

Expand All @@ -39,17 +35,17 @@ ProjectWizard::ProjectWizard( const QString &dataDir, QObject *parent )

QgsVectorLayer *ProjectWizard::createGpkgLayer( QString const &projectDir, QList<FieldConfiguration> const &fieldsConfig )
{
QString gpkgName( QStringLiteral( "data" ) );
QString projectGpkgPath( QString( "%1/%2.%3" ).arg( projectDir ).arg( gpkgName ).arg( "gpkg" ) );
QString layerName( QStringLiteral( "Survey" ) );
QgsCoordinateReferenceSystem layerCrs( LAYER_CRS_ID );
const QString gpkgName( QStringLiteral( "data" ) );
const QString projectGpkgPath( QString( "%1/%2.%3" ).arg( projectDir ).arg( gpkgName ).arg( "gpkg" ) );
const QString layerName( QStringLiteral( "Survey" ) );
const QgsCoordinateReferenceSystem layerCrs( LAYER_CRS_ID );
QgsFields predefinedFields = createFields( fieldsConfig );

// Write layer as gpkg
QgsVectorLayer *layer = new QgsVectorLayer( QStringLiteral( "PointZ?crs=%1" ).arg( LAYER_CRS_ID ), layerName, "memory" );
layer->startEditing();
layer->setCrs( layerCrs );
for ( QgsField f : predefinedFields )
for ( const QgsField &f : predefinedFields )
{
layer->addAttribute( f );
}
Expand Down Expand Up @@ -103,19 +99,19 @@ QgsVectorLayer *ProjectWizard::createTrackingLayer( const QString &trackingGpkgP
options.driverName = "GPKG";
options.layerName = "tracking_layer";

QgsVectorFileWriter *writer = QgsVectorFileWriter::create(
trackingGpkgPath,
fields,
Qgis::WkbType::LineStringZM,
QgsCoordinateReferenceSystem( "EPSG:4326" ),
mSettings->transformContext(),
options );
const QgsVectorFileWriter *writer = QgsVectorFileWriter::create(
trackingGpkgPath,
fields,
Qgis::WkbType::LineStringZM,
QgsCoordinateReferenceSystem( "EPSG:4326" ),
mSettings->transformContext(),
options );
delete writer;

QgsVectorLayer *layer = new QgsVectorLayer( trackingGpkgPath, "tracking_layer", "ogr" );

int idx = layer->fields().indexFromName( "fid" );
QgsEditorWidgetSetup cfg( "Hidden", QVariantMap() );
const QgsEditorWidgetSetup cfg( "Hidden", QVariantMap() );
layer->setEditorWidgetSetup( idx, cfg );

idx = layer->fields().indexFromName( "tracking_start_time" );
Expand Down Expand Up @@ -154,7 +150,7 @@ QgsVectorLayer *ProjectWizard::createTrackingLayer( const QString &trackingGpkgP
return layer;
}

void ProjectWizard::createProject( QString const &projectNameRaw, FieldsModel *fieldsModel )
void ProjectWizard::createProject( QString const &projectNameRaw, const FieldsModel *fieldsModel )
{
if ( !CoreUtils::isValidName( projectNameRaw ) )
{
Expand All @@ -165,10 +161,10 @@ void ProjectWizard::createProject( QString const &projectNameRaw, FieldsModel *f
QString projectName( projectNameRaw );
projectName = InputUtils::sanitizeNode( projectName );

QString projectDir = CoreUtils::createUniqueProjectDirectory( mDataDir, projectName );
QString projectFilepath( QString( "%1/%2.qgz" ).arg( projectDir ).arg( projectName ) );
QString projectGpkgPath( QString( "%1/data.gpkg" ).arg( projectDir ) );
QString trackingGpkgPath( QString( "%1/tracking_layer.gpkg" ).arg( projectDir ) );
const QString projectDir = CoreUtils::createUniqueProjectDirectory( mDataDir, projectName );
const QString projectFilepath( QString( "%1/%2.qgz" ).arg( projectDir ).arg( projectName ) );
const QString projectGpkgPath( QString( "%1/data.gpkg" ).arg( projectDir ) );
const QString trackingGpkgPath( QString( "%1/tracking_layer.gpkg" ).arg( projectDir ) );

QgsProject project;

Expand Down Expand Up @@ -197,7 +193,7 @@ void ProjectWizard::createProject( QString const &projectNameRaw, FieldsModel *f
project.addMapLayers( layers );

// Configurate mapSettings
QgsCoordinateReferenceSystem projectCrs( PROJECT_CRS_ID );
const QgsCoordinateReferenceSystem projectCrs( PROJECT_CRS_ID );
mSettings->setExtent( bgLayer->extent() );
mSettings->setEllipsoid( "WGS84" );
mSettings->setDestinationCrs( projectCrs );
Expand All @@ -218,7 +214,7 @@ void ProjectWizard::createProject( QString const &projectNameRaw, FieldsModel *f

void ProjectWizard::writeMapCanvasSetting( QDomDocument &doc )
{
QDomNodeList nl = doc.elementsByTagName( QStringLiteral( "qgis" ) );
const QDomNodeList nl = doc.elementsByTagName( QStringLiteral( "qgis" ) );
if ( !nl.count() )
{
QgsDebugError( QStringLiteral( "Unable to find qgis element in project file" ) );
Expand All @@ -232,14 +228,14 @@ void ProjectWizard::writeMapCanvasSetting( QDomDocument &doc )
mSettings->writeXml( mapcanvasNode, doc );
}

QgsFields ProjectWizard::createFields( const QList<FieldConfiguration> fieldsConfig ) const
QgsFields ProjectWizard::createFields( const QList<FieldConfiguration> &fieldsConfig ) const
{

QgsFields fields;
for ( const FieldConfiguration &fc : fieldsConfig )
{
QString type = widgetToType( fc.widgetType );
QVariant::Type qtype = parseType( type );
const QMetaType::Type qtype = parseType( type );
QgsField field( fc.attributeName, qtype, type );
fields.append( field );
}
Expand All @@ -257,45 +253,53 @@ QgsSingleSymbolRenderer *ProjectWizard::surveyLayerRenderer()
return new QgsSingleSymbolRenderer( symbol );
}

QVariant::Type ProjectWizard::parseType( const QString &type ) const
QMetaType::Type ProjectWizard::parseType( const QString &type ) const
{
if ( type == QLatin1String( "text" ) )
return QVariant::String;
else if ( type == QLatin1String( "integer" ) )
return QVariant::Int;
else if ( type == QLatin1String( "integer64" ) )
return QVariant::Int;
else if ( type == QLatin1String( "real" ) )
return QVariant::Double;
else if ( type == QLatin1String( "date" ) )
return QVariant::Date;
else if ( type == QLatin1String( "datetime" ) )
return QVariant::DateTime;
else if ( type == QLatin1String( "bool" ) )
return QVariant::Bool;
else if ( type == QLatin1String( "binary" ) )
return QVariant::ByteArray;

return QVariant::Invalid;
return QMetaType::QString;

if ( type == QLatin1String( "integer" ) || type == QLatin1String( "integer64" ) )
return QMetaType::Int;

if ( type == QLatin1String( "real" ) )
return QMetaType::Double;

if ( type == QLatin1String( "date" ) )
return QMetaType::QDate;

if ( type == QLatin1String( "datetime" ) )
return QMetaType::QDateTime;

if ( type == QLatin1String( "bool" ) )
return QMetaType::Bool;

if ( type == QLatin1String( "binary" ) )
return QMetaType::QByteArray;

return QMetaType::UnknownType;
}

QString ProjectWizard::widgetToType( const QString &widgetType ) const
{
if ( widgetType == QStringLiteral( "TextEdit" ) )
return QStringLiteral( "text" );
else if ( widgetType == QStringLiteral( "Range" ) )

if ( widgetType == QStringLiteral( "Range" ) )
return QStringLiteral( "integer" );
else if ( widgetType == QStringLiteral( "DateTime" ) )

if ( widgetType == QStringLiteral( "DateTime" ) )
return QStringLiteral( "datetime" );
else if ( widgetType == QStringLiteral( "CheckBox" ) )

if ( widgetType == QStringLiteral( "CheckBox" ) )
return QStringLiteral( "bool" );
else if ( widgetType == QStringLiteral( "ExternalResource" ) )

if ( widgetType == QStringLiteral( "ExternalResource" ) )
return QStringLiteral( "text" );

return QStringLiteral( "text" );
}

QString ProjectWizard::findWidgetTypeByFieldName( const QString name, const QList<FieldConfiguration> fieldsConfig ) const
QString ProjectWizard::findWidgetTypeByFieldName( const QString &name, const QList<FieldConfiguration> &fieldsConfig ) const
{

for ( int i = 0; i < fieldsConfig.count(); ++i )
Expand Down
Loading
Loading