Skip to content
Permalink
Browse files

[FEATURE] Port editor widgets to new API

Create a new widget for for attribute form

fix #10281
fix #7319
fix #7013
fix #9335
fix #4417
  • Loading branch information
m-kuhn committed May 22, 2014
1 parent 373ec56 commit ea91b6fe4a21ff741de918a11d0f2a26a291c1e2
Showing with 8,066 additions and 4,923 deletions.
  1. +5 −11 python/core/qgsvectorlayer.sip
  2. +0 −5 python/gui/attributetable/qgsdualview.sip
  3. +114 −4 python/gui/editorwidgets/core/qgseditorwidgetfactory.sip
  4. +2 −1 python/gui/editorwidgets/core/qgseditorwidgetwrapper.sip
  5. +2 −0 python/gui/gui.sip
  6. +0 −1 python/gui/qgsattributedialog.sip
  7. +0 −42 python/gui/qgsattributeeditor.sip
  8. +0 −5 python/gui/qgsattributeeditorcontext.sip
  9. +47 −0 python/gui/qgsattributeform.sip
  10. +33 −0 python/gui/qgsattributeforminterface.sip
  11. +0 −2 src/app/CMakeLists.txt
  12. +28 −1 src/app/qgisapp.cpp
  13. +1 −2 src/app/qgsattributetabledialog.cpp
  14. +46 −755 src/app/qgsattributetypedialog.cpp
  15. +13 −149 src/app/qgsattributetypedialog.h
  16. +15 −156 src/app/qgsfieldsproperties.cpp
  17. +4 −12 src/app/qgsfieldsproperties.h
  18. +44 −60 src/app/qgsidentifyresultsdialog.cpp
  19. +3 −0 src/app/qgsidentifyresultsdialog.h
  20. +4 −2 src/core/CMakeLists.txt
  21. +312 −0 src/core/qgslegacyhelpers.cpp
  22. +34 −0 src/core/qgslegacyhelpers.h
  23. +232 −369 src/core/qgsvectorlayer.cpp
  24. +88 −36 src/core/qgsvectorlayer.h
  25. +1 −1 src/core/symbology-ng/qgscategorizedsymbolrendererv2.h
  26. +126 −1 src/gui/CMakeLists.txt
  27. +31 −30 src/gui/attributetable/qgsattributetabledelegate.cpp
  28. +23 −118 src/gui/attributetable/qgsattributetablemodel.cpp
  29. +4 −3 src/gui/attributetable/qgsattributetablemodel.h
  30. +33 −241 src/gui/attributetable/qgsdualview.cpp
  31. +9 −37 src/gui/attributetable/qgsdualview.h
  32. +24 −5 src/gui/attributetable/qgsfeaturelistview.cpp
  33. +16 −0 src/gui/attributetable/qgsfeaturelistview.h
  34. +10 −3 src/gui/attributetable/qgsfeaturelistviewdelegate.cpp
  35. +4 −0 src/gui/attributetable/qgsfeaturelistviewdelegate.h
  36. +40 −5 src/gui/editorwidgets/core/qgseditorwidgetfactory.cpp
  37. +44 −44 src/gui/editorwidgets/core/qgseditorwidgetfactory.h
  38. +57 −50 src/gui/editorwidgets/core/qgseditorwidgetregistry.cpp
  39. +30 −9 src/gui/editorwidgets/core/qgseditorwidgetregistry.h
  40. +28 −46 src/gui/editorwidgets/core/qgseditorwidgetwrapper.cpp
  41. +61 −72 src/gui/editorwidgets/core/qgseditorwidgetwrapper.h
  42. +97 −0 src/gui/editorwidgets/core/qgswidgetwrapper.cpp
  43. +171 −0 src/gui/editorwidgets/core/qgswidgetwrapper.h
  44. +38 −0 src/gui/editorwidgets/qgscheckboxconfigdlg.cpp
  45. +36 −0 src/gui/editorwidgets/qgscheckboxconfigdlg.h
  46. +65 −0 src/gui/editorwidgets/qgscheckboxwidget.cpp
  47. +46 −0 src/gui/editorwidgets/qgscheckboxwidget.h
  48. +57 −0 src/gui/editorwidgets/qgscheckboxwidgetfactory.cpp
  49. +34 −0 src/gui/editorwidgets/qgscheckboxwidgetfactory.h
  50. +64 −0 src/gui/editorwidgets/qgsclassificationwidget.cpp
  51. +44 −0 src/gui/editorwidgets/qgsclassificationwidget.h
  52. +35 −0 src/gui/editorwidgets/qgsclassificationwidgetwrapperfactory.cpp
  53. +32 −0 src/gui/editorwidgets/qgsclassificationwidgetwrapperfactory.h
  54. +50 −0 src/gui/editorwidgets/qgscolorwidget.cpp
  55. +44 −0 src/gui/editorwidgets/qgscolorwidget.h
  56. +35 −0 src/gui/editorwidgets/qgscolorwidgetfactory.cpp
  57. +32 −0 src/gui/editorwidgets/qgscolorwidgetfactory.h
  58. +35 −0 src/gui/editorwidgets/qgsdummyconfigdlg.cpp
  59. +35 −0 src/gui/editorwidgets/qgsdummyconfigdlg.h
  60. +66 −0 src/gui/editorwidgets/qgsenumerationwidget.cpp
  61. +44 −0 src/gui/editorwidgets/qgsenumerationwidget.h
  62. +47 −0 src/gui/editorwidgets/qgsenumerationwidgetfactory.cpp
  63. +35 −0 src/gui/editorwidgets/qgsenumerationwidgetfactory.h
  64. +108 −0 src/gui/editorwidgets/qgsfilenamewidget.cpp
  65. +51 −0 src/gui/editorwidgets/qgsfilenamewidget.h
  66. +34 −0 src/gui/editorwidgets/qgsfilenamewidgetfactory.cpp
  67. +32 −0 src/gui/editorwidgets/qgsfilenamewidgetfactory.h
  68. +46 −0 src/gui/editorwidgets/qgshiddenwidget.cpp
  69. +42 −0 src/gui/editorwidgets/qgshiddenwidget.h
  70. +34 −0 src/gui/editorwidgets/qgshiddenwidgetfactory.cpp
  71. +32 −0 src/gui/editorwidgets/qgshiddenwidgetfactory.h
  72. +38 −0 src/gui/editorwidgets/qgsphotoconfigdlg.cpp
  73. +36 −0 src/gui/editorwidgets/qgsphotoconfigdlg.h
  74. +138 −0 src/gui/editorwidgets/qgsphotowidget.cpp
  75. +56 −0 src/gui/editorwidgets/qgsphotowidget.h
  76. +58 −0 src/gui/editorwidgets/qgsphotowidgetfactory.cpp
  77. +35 −0 src/gui/editorwidgets/qgsphotowidgetfactory.h
  78. +110 −0 src/gui/editorwidgets/qgsrangeconfigdlg.cpp
  79. +32 −0 src/gui/editorwidgets/qgsrangeconfigdlg.h
  80. +147 −0 src/gui/editorwidgets/qgsrangewidget.cpp
  81. +51 −0 src/gui/editorwidgets/qgsrangewidget.h
  82. +75 −0 src/gui/editorwidgets/qgsrangewidgetfactory.cpp
  83. +37 −0 src/gui/editorwidgets/qgsrangewidgetfactory.h
  84. +46 −0 src/gui/editorwidgets/qgsrelationwidgetwrapper.cpp
  85. +42 −0 src/gui/editorwidgets/qgsrelationwidgetwrapper.h
  86. +39 −0 src/gui/editorwidgets/qgstexteditconfigdlg.cpp
  87. +36 −0 src/gui/editorwidgets/qgstexteditconfigdlg.h
  88. +112 −0 src/gui/editorwidgets/qgstexteditwidget.cpp
  89. +48 −0 src/gui/editorwidgets/qgstexteditwidget.h
  90. +58 −0 src/gui/editorwidgets/qgstexteditwidgetfactory.cpp
  91. +39 −0 src/gui/editorwidgets/qgstexteditwidgetfactory.h
  92. +37 −0 src/gui/editorwidgets/qgsuniquevaluesconfigdlg.cpp
  93. +36 −0 src/gui/editorwidgets/qgsuniquevaluesconfigdlg.h
  94. +95 −0 src/gui/editorwidgets/qgsuniquevaluewidget.cpp
  95. +46 −0 src/gui/editorwidgets/qgsuniquevaluewidget.h
  96. +55 −0 src/gui/editorwidgets/qgsuniquevaluewidgetfactory.cpp
  97. +34 −0 src/gui/editorwidgets/qgsuniquevaluewidgetfactory.h
  98. +74 −0 src/gui/editorwidgets/qgsuuidwidget.cpp
  99. +47 −0 src/gui/editorwidgets/qgsuuidwidget.h
  100. +35 −0 src/gui/editorwidgets/qgsuuidwidgetfactory.cpp
  101. +32 −0 src/gui/editorwidgets/qgsuuidwidgetfactory.h
  102. +224 −0 src/gui/editorwidgets/qgsvaluemapconfigdlg.cpp
  103. +41 −0 src/gui/editorwidgets/qgsvaluemapconfigdlg.h
  104. +61 −0 src/gui/editorwidgets/qgsvaluemapwidget.cpp
  105. +44 −0 src/gui/editorwidgets/qgsvaluemapwidget.h
  106. +73 −0 src/gui/editorwidgets/qgsvaluemapwidgetfactory.cpp
  107. +34 −0 src/gui/editorwidgets/qgsvaluemapwidgetfactory.h
  108. +55 −0 src/gui/editorwidgets/qgsvaluerelationconfigdlg.cpp
  109. +36 −0 src/gui/editorwidgets/qgsvaluerelationconfigdlg.h
  110. +222 −0 src/gui/editorwidgets/qgsvaluerelationwidget.cpp
  111. +62 −0 src/gui/editorwidgets/qgsvaluerelationwidget.h
  112. +131 −0 src/gui/editorwidgets/qgsvaluerelationwidgetfactory.cpp
  113. +39 −0 src/gui/editorwidgets/qgsvaluerelationwidgetfactory.h
  114. +38 −0 src/gui/editorwidgets/qgswebviewconfigdlg.cpp
  115. +36 −0 src/gui/editorwidgets/qgswebviewconfigdlg.h
  116. +139 −0 src/gui/editorwidgets/qgswebviewwidget.cpp
  117. +57 −0 src/gui/editorwidgets/qgswebviewwidget.h
  118. +58 −0 src/gui/editorwidgets/qgswebviewwidgetfactory.cpp
  119. +34 −0 src/gui/editorwidgets/qgswebviewwidgetfactory.h
  120. +63 −197 src/gui/qgsattributedialog.cpp
  121. +12 −11 src/gui/qgsattributedialog.h
  122. +24 −1,456 src/gui/qgsattributeeditor.cpp
  123. +10 −67 src/gui/qgsattributeeditor.h
  124. +0 −16 src/gui/qgsattributeeditorcontext.cpp
  125. +595 −0 src/gui/qgsattributeform.cpp
  126. +128 −0 src/gui/qgsattributeform.h
  127. +48 −0 src/gui/qgsattributeforminterface.cpp
  128. +41 −0 src/gui/qgsattributeforminterface.h
  129. +72 −0 src/gui/qgsattributeformlegacyinterface.cpp
  130. +42 −0 src/gui/qgsattributeformlegacyinterface.h
  131. 0 src/{app → gui}/qgsattributetypeloaddialog.cpp
  132. 0 src/{app → gui}/qgsattributetypeloaddialog.h
  133. +1 −1 src/gui/qgsrelationeditor.cpp
  134. +10 −2 src/gui/qgsrelationeditor.h
  135. +48 −0 src/ui/editorwidgets/qgscalendarconfigdlgbase.ui
  136. +41 −0 src/ui/editorwidgets/qgscheckboxconfigdlgbase.ui
  137. +28 −0 src/ui/editorwidgets/qgsdummyconfigdlgbase.ui
  138. +87 −0 src/ui/editorwidgets/qgsphotoconfigdlgbase.ui
  139. +151 −0 src/ui/editorwidgets/qgsrangeconfigdlgbase.ui
  140. +40 −0 src/ui/editorwidgets/qgstexteditconfigdlg.ui
  141. +41 −0 src/ui/editorwidgets/qgsuniquevaluesconfigdlgbase.ui
  142. +92 −0 src/ui/editorwidgets/qgsvaluemapconfigdlgbase.ui
  143. +135 −0 src/ui/editorwidgets/qgsvaluerelationconfigdlgbase.ui
  144. +62 −0 src/ui/editorwidgets/qgswebviewconfigdlgbase.ui
  145. +17 −873 src/ui/qgsattributetypeedit.ui
  146. +75 −22 src/ui/qgsdualviewbase.ui
  147. +6 −0 src/ui/qgsrelationeditorwidgetbase.ui
@@ -860,12 +860,6 @@ class QgsVectorLayer : QgsMapLayer
/** set string representing 'true' for a checkbox (added in 1.4) */
void setCheckedState( int idx, QString checked, QString notChecked );

/** return string representing 'true' for a checkbox (added in 1.4)
* @note not available in python bindings
* FIXME: need SIP binding for QPair<QString, QString>
*/
// QPair<QString, QString> checkedState( int idx );

/** get edit form (added in 1.4) */
QString editForm();

@@ -893,15 +887,15 @@ class QgsVectorLayer : QgsMapLayer
void setEditFormInit( QString function );

/**access value map*/
QMap<QString, QVariant> &valueMap( int idx );
QMap<QString, QVariant> valueMap( int idx );

/**access range */
RangeData &range( int idx );
RangeData range( int idx ) /Deprecated/;

/**access relations
* @note added in 1.8
**/
ValueRelationData &valueRelation( int idx );
ValueRelationData valueRelation( int idx ) /Deprecated/;

/**
* Get relations, where the foreign key is on this layer
@@ -914,12 +908,12 @@ class QgsVectorLayer : QgsMapLayer
/**access date format
* @note added in 1.9
*/
QString &dateFormat( int idx );
QString dateFormat( int idx ) /Deprecated/;

/**access widget size for photo and webview widget
* @note added in 1.9
*/
QSize &widgetSize( int idx );
QSize widgetSize( int idx ) /Deprecated/;

/**is edit widget editable
* @note added in 1.9
@@ -124,11 +124,6 @@ class QgsDualView : QStackedWidget
*/
bool saveEditChanges();

/**
* Update the shown feature if an attribute changed
*/
void reloadAttribute( const int& attribute );


signals:
/**
@@ -23,12 +23,122 @@ class QgsEditorWidgetFactory
%End

public:
/**
* Constructor
*
* @param name A human readable name for this widget type
*/
QgsEditorWidgetFactory( const QString& name );

virtual ~QgsEditorWidgetFactory();
virtual QgsEditorWidgetWrapper* create( QgsVectorLayer* vl, int fieldIdx, QWidget* editor, QWidget* parent ) const = 0 /Factory/;
virtual QgsEditorConfigWidget* configWidget( QgsVectorLayer* vl, int fieldIdx, QWidget* parent ) const = 0 /Factory/;

/**
* Override this in your implementation.
* Create a new editor widget wrapper. Call {@link QgsEditorWidgetRegistry::create()}
* instead of calling this method directly.
*
* @param vl The vector layer on which this widget will act
* @param fieldIdx The field index on which this widget will act
* @param editor An editor widget if already existent. If NULL is provided, a new widget will be created.
* @param parent The parent for the wrapper class and any created widget.
*
* @return A new widget wrapper
*/
virtual QgsEditorWidgetWrapper* create( QgsVectorLayer* vl, int fieldIdx, QWidget* editor, QWidget* parent ) const = 0;

/**
* Return The human readable identifier name of this widget type
*
* @return a name
*/
QString name();

/**
* Override this in your implementation.
* Create a new configuration widget for this widget type.
*
* @param vl The layer for which the widget will be created
* @param fieldIdx The field index for which the widget will be created
* @param parent The parent widget of the created config widget
*
* @return A configuration widget
*/
virtual QgsEditorConfigWidget* configWidget( QgsVectorLayer* vl, int fieldIdx, QWidget* parent ) const = 0;

/**
* Read the config from an XML file and map it to a proper {@link QgsEditorWidgetConfig}.
*
* @param configElement The configuration element from the project file
* @param layer The layer for which this configuration applies
* @param fieldIdx The field on the layer for which this configuration applies
*
* @return A configuration object. This will be passed to your widget wrapper later on
*/
QgsEditorWidgetConfig readEditorConfig( const QDomElement& configElement, QgsVectorLayer* layer, int fieldIdx );

/**
* Serialize your configuration and save it in a xml doc.
*
* @param config The configuration to serialize
* @param configElement The element, where you can write your configuration into
* @param doc The document. You can use this to create new nodes
* @param layer The layer for which this configuration applies
* @param fieldIdx The field on the layer for which this configuration applies
*/
virtual void writeConfig( const QgsEditorWidgetConfig& config, QDomElement& configElement, QDomDocument& doc, const QgsVectorLayer* layer, int fieldIdx );

/**
* Check if this editor widget type supports a certain field.
*
* @param vl The layer
* @param fieldIdx The field index
* @return True if the type is supported for this field
*/
bool supportsField( QgsVectorLayer* vl, int fieldIdx );

/**
* Create a pretty String representation of the value.
*
* @param vl The vector layer.
* @param fieldIdx The index of the field.
* @param config The editor widget config.
* @param value The value to represent.
*
* @return By default the string representation of the provided value.
*/
virtual QString representValue( QgsVectorLayer* vl, int fieldIdx, const QgsEditorWidgetConfig& config, const QVariant& cache, const QVariant& value ) const;

/**
* Create a cache for a given field.
*
* @param vl The vector layer.
* @param fieldIdx The index of the field.
* @param config The editor widget config.
*
* @return The default implementation returns an invalid QVariant
*/
virtual QVariant createCache( QgsVectorLayer* vl, int fieldIdx, const QgsEditorWidgetConfig& config );

private:
/**
* Read the config from an XML file and map it to a proper {@link QgsEditorWidgetConfig}.
*
* @param configElement The configuration element from the project file
* @param layer The layer for which this configuration applies
* @param fieldIdx The field on the layer for which this configuration applies
*
* @return A configuration object. This will be passed to your widget wrapper later on
*/
virtual QgsEditorWidgetConfig readConfig( const QDomElement& configElement, QgsVectorLayer* layer, int fieldIdx );
virtual void writeConfig( const QgsEditorWidgetConfig& config, QDomElement& configElement, const QDomDocument& doc, const QgsVectorLayer* layer, int fieldIdx );

virtual QString name();
/**
* This method allows to disable this editor widget type for a certain field.
* By default, it returns true for all fields.
* Reimplement this if you only support certain fields.
*
* @param vl
* @param fieldIdx
* @return True if the field is supported.
*/
virtual bool isFieldSupported( QgsVectorLayer* vl, int fieldIdx );
};
@@ -27,7 +27,8 @@ class QgsEditorWidgetWrapper : QObject
QVariant config( QString key );

QgsVectorLayer* layer();
int field();
QgsField field();
int fieldIdx();

protected:
virtual QWidget* createWidget( QWidget* parent ) = 0 /Factory/;
@@ -15,6 +15,8 @@
%Include qgsattributeeditor.sip
%Include qgsattributeeditorcontext.sip
%Include qgsattributedialog.sip
%Include qgsattributeform.sip
%Include qgsattributeforminterface.sip
%Include qgsbusyindicatordialog.sip
%Include qgscollapsiblegroupbox.sip
%Include qgscolorbutton.sip
@@ -61,5 +61,4 @@ class QgsAttributeDialog : QObject
int exec();
void show();

void dialogDestroyed();
};
@@ -31,48 +31,6 @@ class QgsAttributeEditor : QObject
*/
static QWidget* createAttributeEditor( QWidget* parent, QWidget* editor, QgsVectorLayer* vl, int idx, const QVariant& value, QgsAttributeEditorContext& context ) /Factory/;

/**
* Creates a widget form a QgsAttributeEditorElement definition. Will recursively generate containers and widgets.
* @param widgetDef The definition for the widget
* @param parent The parent object
* @param vl The vector layer to use as data source
* @param feat The feature to create the widget for
* @param context the context used for the created attribute editor
* @param [out] labelText An optional label text will be written into the referenced QString. It will be set to
* a QString::null value if no label should be shown
* @param [out] labelOnTop Will be set to true if the label should be placed on top of the field.
* If set to false, the label should be shown left or right of the field
*
*/
static QWidget *createWidgetFromDef( const QgsAttributeEditorElement* widgetDef, QWidget* parent, QgsVectorLayer* vl, const QgsFeature &feat, QgsAttributeEditorContext& context, QString& labelText, bool& labelOnTop ) /Factory/;

static bool retrieveValue( QWidget *widget, QgsVectorLayer *vl, int idx, QVariant &value );
static bool setValue( QWidget *widget, QgsVectorLayer *vl, int idx, const QVariant &value );

public slots:
void selectFileName();
void selectDate();
void loadUrl( const QString & );
void loadPixmap( const QString & );
void updateUrl();
void openUrl();
void updateColor();
};

class QgsStringRelay : QObject
{
%TypeHeaderCode
#include "qgsattributeeditor.h"
%End
public:
QgsStringRelay( QObject* parent = 0 );

void appendProxy( QWidget* proxy );

public slots:
void changeText();
void changeText( QString str );

signals:
void textChanged( QString );
};
@@ -12,11 +12,6 @@ class QgsAttributeEditorContext
public:
QgsAttributeEditorContext();

QWidget* proxyWidget( QgsVectorLayer* vl, int fieldIdx );
//! @note not available in python bindings
// void addProxyWidgets( QgsVectorLayer* vl, QMap<int, QWidget*> proxyWidgets );
void addProxyWidget( QgsVectorLayer* vl, int idx, QWidget* widget );

void setDistanceArea( const QgsDistanceArea& distanceArea );
const QgsDistanceArea& distanceArea();

@@ -0,0 +1,47 @@
/***************************************************************************
qgsattributeform.h
--------------------------------------
Date : 3.5.2014
Copyright : (C) 2014 Matthias Kuhn
Email : matthias dot kuhn at gmx dot ch
***************************************************************************
* *
* 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. *
* *
***************************************************************************/

class QgsAttributeForm : QWidget
{
%TypeHeaderCode
#include <qgsattributeform.h>
%End

public:
explicit QgsAttributeForm( QgsVectorLayer* vl, const QgsFeature feature = QgsFeature(), QgsAttributeEditorContext context = QgsAttributeEditorContext(), QWidget *parent = 0 );
~QgsAttributeForm();

const QgsFeature& feature();

void hideButtonBox();

void showButtonBox();

signals:
/**
* Notifies about changes of attributes
*
* @param attribute The name of the attribute that changed.
* @param value The new value of the attribute.
*/
void attributeChanged( QString attribute, const QVariant& value );

public slots:
void changeAttribute( const QString& field, const QVariant& value );
void setFeature( const QgsFeature& feature );
bool save();
void accept();
void resetValues();
};
@@ -0,0 +1,33 @@
/***************************************************************************
qgsattributeforminterface.sip
--------------------------------------
Date : 12.5.2014
Copyright : (C) 2014 Matthias Kuhn
Email : matthias dot kuhn at gmx dot ch
***************************************************************************
* *
* 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. *
* *
***************************************************************************/

class QgsAttributeFormInterface
{
%TypeHeaderCode
#include <qgsattributeforminterface.h>
%End
public:
explicit QgsAttributeFormInterface( QgsAttributeForm* form );

virtual bool acceptChanges( const QgsFeature& feat );

virtual void initForm();

virtual void featureChanged();

QgsAttributeForm* form();

const QgsFeature& feature();
};
@@ -11,7 +11,6 @@ SET(QGIS_APP_SRCS
qgsannotationwidget.cpp
qgsattributeactiondialog.cpp
qgsattributetypedialog.cpp
qgsattributetypeloaddialog.cpp
qgsattributetabledialog.cpp
qgsbookmarks.cpp
qgsbrowserdockwidget.cpp
@@ -164,7 +163,6 @@ SET (QGIS_APP_MOC_HDRS
qgsannotationwidget.h
qgsattributeactiondialog.h
qgsattributetypedialog.h
qgsattributetypeloaddialog.h
qgsattributetabledialog.h
qgsbookmarks.h
qgsbrowserdockwidget.h

3 comments on commit ea91b6f

@nirvn

This comment has been minimized.

Copy link
Contributor

@nirvn nirvn replied May 25, 2014

@m-kuhn could this have caused the following regression: http://hub.qgis.org/issues/10337 ?

@m-kuhn

This comment has been minimized.

Copy link
Member Author

@m-kuhn m-kuhn replied May 25, 2014

@NathanW2

This comment has been minimized.

Copy link
Member

@NathanW2 NathanW2 replied May 25, 2014

Please sign in to comment.
You can’t perform that action at this time.