851 changes: 851 additions & 0 deletions src/core/qgsvectorfilewriter.cpp

Large diffs are not rendered by default.

96 changes: 95 additions & 1 deletion src/core/qgsvectorfilewriter.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,94 @@ class QTextCodec;
class CORE_EXPORT QgsVectorFileWriter
{
public:
enum OptionType
{
Set,
String,
Int
};

class Option
{
public:
Option( const QString& docString, OptionType type )
: docString( docString )
, type( type )
{}

virtual ~Option() {}

QString docString;
OptionType type;
};

class SetOption : public Option
{
public:
SetOption( const QString& docString, QStringList values, const QString& defaultValue, bool allowNone = false )
: Option( docString, Set )
, values( values.toSet() )
, defaultValue( defaultValue )
, allowNone( allowNone )
{}

QSet<QString> values;
QString defaultValue;
bool allowNone;
};

class StringOption: public Option
{
public:
StringOption( const QString& docString, const QString& defaultValue = QString() )
: Option( docString, String )
, defaultValue( defaultValue )
{}

QString defaultValue;
};

class IntOption: public Option
{
public:
IntOption( const QString& docString, int defaultValue )
: Option( docString, Int )
, defaultValue( defaultValue )
{}

int defaultValue;
};

class BoolOption : public SetOption
{
public:
BoolOption( const QString& docString, bool defaultValue )
: SetOption( docString, QStringList() << "YES" << "NO", defaultValue ? "YES" : "NO" )
{}
};


struct MetaData
{
MetaData()
{}

MetaData( QString longName, QString trLongName, QString glob, QString ext, QMap<QString, Option*> driverOptions, QMap<QString, Option*> layerOptions )
: longName( longName )
, trLongName( trLongName )
, glob( glob )
, ext( ext )
, driverOptions( driverOptions )
, layerOptions( layerOptions )
{}

QString longName;
QString trLongName;
QString glob;
QString ext;
QMap<QString, Option*> driverOptions;
QMap<QString, Option*> layerOptions;
};

enum WriterError
{
Expand Down Expand Up @@ -170,6 +258,8 @@ class CORE_EXPORT QgsVectorFileWriter
double symbologyScaleDenominator() const { return mSymbologyScaleDenominator; }
void setSymbologyScaleDenominator( double d ) { mSymbologyScaleDenominator = d; }

static bool driverMetadata( const QString& driverName, MetaData& driverMetadata );

protected:
//! @note not available in python bindings
OGRGeometryH createEmptyGeometry( QGis::WkbType wkbType );
Expand Down Expand Up @@ -202,6 +292,10 @@ class CORE_EXPORT QgsVectorFileWriter
double mSymbologyScaleDenominator;

private:
static QMap<QString, MetaData> initMetaData();
/**
* @deprecated
*/
static bool driverMetadata( QString driverName, QString &longName, QString &trLongName, QString &glob, QString &ext );
void createSymbolLayerTable( QgsVectorLayer* vl, const QgsCoordinateTransform* ct, OGRDataSourceH ds );
OGRFeatureH createFeature( QgsFeature& feature );
Expand All @@ -217,7 +311,7 @@ class CORE_EXPORT QgsVectorFileWriter
QgsFeatureRendererV2* symbologyRenderer( QgsVectorLayer* vl ) const;
/**Adds attributes needed for classification*/
void addRendererAttributes( QgsVectorLayer* vl, QgsAttributeList& attList );

static QMap<QString, MetaData> sDriverMetadata;
};

#endif
312 changes: 169 additions & 143 deletions src/ui/qgsvectorlayersaveasdialogbase.ui
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>383</width>
<height>444</height>
<width>574</width>
<height>652</height>
</rect>
</property>
<property name="sizePolicy">
Expand All @@ -23,86 +23,23 @@
<property name="sizeConstraint">
<enum>QLayout::SetMinAndMaxSize</enum>
</property>
<item row="1" column="1">
<widget class="QLineEdit" name="leFilename">
<property name="enabled">
<bool>false</bool>
</property>
</widget>
</item>
<item row="6" column="2">
<widget class="QPushButton" name="browseCRS">
<property name="text">
<string>Browse</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Encoding</string>
</property>
<property name="buddy">
<cstring>mEncodingComboBox</cstring>
</property>
</widget>
</item>
<item row="5" column="0" rowspan="2">
<widget class="QLabel" name="label_3">
<property name="text">
<string>CRS</string>
</property>
<property name="buddy">
<cstring>leCRS</cstring>
</property>
</widget>
</item>
<item row="4" column="1" colspan="2">
<widget class="QComboBox" name="mEncodingComboBox"/>
</item>
<item row="7" column="0">
<widget class="QLabel" name="mSymbologyExportLabel">
<property name="text">
<string>Symbology export</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Save as</string>
</property>
<property name="buddy">
<cstring>leFilename</cstring>
</property>
</widget>
</item>
<item row="7" column="1" colspan="2">
<widget class="QComboBox" name="mSymbologyExportComboBox"/>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="browseFilename">
<property name="enabled">
<bool>false</bool>
<item row="12" column="0">
<widget class="QCheckBox" name="mSkipAttributeCreation">
<property name="toolTip">
<string>This allows one to surpress attribute creation as some OGR drivers (eg. DGN, DXF) don't support it.</string>
</property>
<property name="text">
<string>Browse</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QLineEdit" name="leCRS">
<property name="enabled">
<bool>false</bool>
</property>
<property name="readOnly">
<bool>true</bool>
<string>Skip attribute creation</string>
</property>
</widget>
</item>
<item row="5" column="1" colspan="2">
<widget class="QComboBox" name="mCRSSelection"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
Expand All @@ -113,49 +50,32 @@
</property>
</widget>
</item>
<item row="12" column="0" colspan="3">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<item row="1" column="2">
<widget class="QPushButton" name="browseFilename">
<property name="enabled">
<bool>false</bool>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok</set>
<property name="text">
<string>Browse</string>
</property>
</widget>
</item>
<item row="0" column="1" colspan="2">
<widget class="QComboBox" name="mFormatComboBox"/>
</item>
<item row="9" column="0" colspan="3">
<widget class="QgsCollapsibleGroupBox" name="mOgrOptionsGroupBox" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
<item row="11" column="0" colspan="3">
<widget class="QgsCollapsibleGroupBox" name="mOgrOptionsGroupBox">
<property name="title">
<string>Custom Options</string>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="baseSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="title" stdset="0">
<string>OGR creation options</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Data source</string>
</property>
<property name="buddy">
<cstring>mOgrDatasourceOptions</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QTextEdit" name="mOgrDatasourceOptions">
<property name="sizePolicy">
Expand Down Expand Up @@ -184,6 +104,16 @@
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Layer</string>
</property>
<property name="buddy">
<cstring>mOgrLayerOptions</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QTextEdit" name="mOgrLayerOptions">
<property name="sizePolicy">
Expand Down Expand Up @@ -212,27 +142,81 @@
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Data source</string>
</property>
<property name="buddy">
<cstring>mOgrDatasourceOptions</cstring>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Layer</string>
</property>
<property name="buddy">
<cstring>mOgrLayerOptions</cstring>
</property>
</widget>
</item>
</layout>
<zorder>label_6</zorder>
<zorder>label_5</zorder>
<zorder>mOgrDatasourceOptions</zorder>
<zorder>mOgrLayerOptions</zorder>
</widget>
</item>
<item row="13" column="0">
<widget class="QCheckBox" name="mAddToCanvas">
<property name="text">
<string>Add saved file to map</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QLineEdit" name="leCRS">
<property name="enabled">
<bool>false</bool>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="5" column="0" rowspan="2">
<widget class="QLabel" name="label_3">
<property name="text">
<string>CRS</string>
</property>
<property name="buddy">
<cstring>leCRS</cstring>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Save as</string>
</property>
<property name="buddy">
<cstring>leFilename</cstring>
</property>
</widget>
</item>
<item row="14" column="0" colspan="3">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
<item row="4" column="1" colspan="2">
<widget class="QComboBox" name="mEncodingComboBox"/>
</item>
<item row="8" column="0">
<widget class="QLabel" name="mScaleLabel">
<property name="text">
<string>Scale</string>
</property>
</widget>
</item>
<item row="0" column="1" colspan="2">
<widget class="QComboBox" name="mFormatComboBox"/>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Encoding</string>
</property>
<property name="buddy">
<cstring>mEncodingComboBox</cstring>
</property>
</widget>
</item>
<item row="8" column="1" colspan="2">
Expand All @@ -248,37 +232,79 @@
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QLabel" name="mScaleLabel">
<property name="text">
<string>Scale</string>
<item row="1" column="1">
<widget class="QLineEdit" name="leFilename">
<property name="enabled">
<bool>false</bool>
</property>
</widget>
</item>
<item row="11" column="0">
<widget class="QCheckBox" name="mAddToCanvas">
<property name="text">
<string>Add saved file to map</string>
<item row="10" column="0" colspan="3">
<widget class="QgsCollapsibleGroupBox" name="mLayerOptionsGroupBox">
<property name="title">
<string>Layer Options</string>
</property>
<layout class="QFormLayout" name="formLayout_2">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
</property>
</layout>
</widget>
</item>
<item row="10" column="0">
<widget class="QCheckBox" name="mSkipAttributeCreation">
<property name="toolTip">
<string>This allows one to surpress attribute creation as some OGR drivers (eg. DGN, DXF) don't support it.</string>
</property>
<item row="6" column="2">
<widget class="QPushButton" name="browseCRS">
<property name="text">
<string>Skip attribute creation</string>
<string>Browse</string>
</property>
</widget>
</item>
<item row="5" column="1" colspan="2">
<widget class="QComboBox" name="mCRSSelection"/>
</item>
<item row="7" column="1" colspan="2">
<widget class="QComboBox" name="mSymbologyExportComboBox"/>
</item>
<item row="9" column="0" colspan="3">
<widget class="QgsCollapsibleGroupBox" name="mDatasourceOptionsGroupBox">
<property name="title">
<string>Datasource Options</string>
</property>
<layout class="QFormLayout" name="formLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
</property>
</layout>
</widget>
</item>
</layout>
<zorder>mDatasourceOptionsGroupBox</zorder>
<zorder>mLayerOptionsGroupBox</zorder>
<zorder>mFormatComboBox</zorder>
<zorder>mScaleSpinBox</zorder>
<zorder>mScaleLabel</zorder>
<zorder>mAddToCanvas</zorder>
<zorder>mSkipAttributeCreation</zorder>
<zorder>leFilename</zorder>
<zorder>browseCRS</zorder>
<zorder>label_4</zorder>
<zorder>label_3</zorder>
<zorder>mEncodingComboBox</zorder>
<zorder>mSymbologyExportLabel</zorder>
<zorder>label</zorder>
<zorder>mSymbologyExportComboBox</zorder>
<zorder>browseFilename</zorder>
<zorder>leCRS</zorder>
<zorder>mCRSSelection</zorder>
<zorder>label_2</zorder>
<zorder>buttonBox</zorder>
<zorder>mOgrOptionsGroupBox</zorder>
</widget>
<customwidgets>
<customwidget>
<class>QgsCollapsibleGroupBox</class>
<extends>QWidget</extends>
<extends>QGroupBox</extends>
<header>qgscollapsiblegroupbox.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<tabstops>
Expand Down