QGIS API Documentation  2.9.0-Master
qgsphotowidgetwrapper.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsphotowidgetwrapper.cpp
3  --------------------------------------
4  Date : 5.1.2014
5  Copyright : (C) 2014 Matthias Kuhn
6  Email : matthias dot kuhn at gmx dot ch
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
16 #include "qgsphotowidgetwrapper.h"
17 
18 #include <QGridLayout>
19 #include <QFileDialog>
20 #include <QSettings>
21 
22 #include "qgsfilterlineedit.h"
23 
24 QgsPhotoWidgetWrapper::QgsPhotoWidgetWrapper( QgsVectorLayer* vl, int fieldIdx, QWidget* editor, QWidget* parent )
25  : QgsEditorWidgetWrapper( vl, fieldIdx, editor, parent )
26  , mPhotoLabel( 0 )
27  , mLineEdit( 0 )
28  , mButton( 0 )
29 {
30 #ifdef WITH_QTWEBKIT
31  mWebView = 0;
32 #endif
33 }
34 
35 void QgsPhotoWidgetWrapper::selectFileName()
36 {
37  if ( mLineEdit )
38  {
39  QString fileName = QFileDialog::getOpenFileName( 0, tr( "Select a picture" ), QFileInfo( mLineEdit->text() ).absolutePath() );
40  if ( !fileName.isNull() )
41  mLineEdit->setText( QDir::toNativeSeparators( fileName ) );
42  }
43 }
44 
45 void QgsPhotoWidgetWrapper::loadPixmap( const QString &fileName )
46 {
47 #ifdef WITH_QTWEBKIT
48  if ( mWebView )
49  {
50  mWebView->setUrl( fileName );
51  }
52 #endif
53 
54  QPixmap pm( fileName );
55  if ( !pm.isNull() && mPhotoLabel )
56  {
57  QSize size( config( "Width" ).toInt(), config( "Height" ).toInt() );
58  if ( size.width() == 0 && size.height() > 0 )
59  {
60  size.setWidth( size.height() * pm.size().width() / pm.size().height() );
61  }
62  else if ( size.width() > 0 && size.height() == 0 )
63  {
64  size.setHeight( size.width() * pm.size().height() / pm.size().width() );
65  }
66 
67  pm = pm.scaled( size, Qt::KeepAspectRatio, Qt::SmoothTransformation );
68 
69  mPhotoLabel->setPixmap( pm );
70  mPhotoLabel->setMinimumSize( size );
71  }
72 }
73 
75 {
76  QVariant v;
77 
78  if ( mLineEdit )
79  {
80  if ( mLineEdit->text() == QSettings().value( "qgis/nullValue", "NULL" ).toString() )
81  v = QVariant( QVariant::String );
82  else
83  v = mLineEdit->text();
84  }
85 
86  return v;
87 }
88 
89 QWidget* QgsPhotoWidgetWrapper::createWidget( QWidget* parent )
90 {
91  QWidget* container = new QWidget( parent );
92  QGridLayout* layout = new QGridLayout( container );
93  QgsFilterLineEdit* le = new QgsFilterLineEdit( container );
94  QLabel* label = new QLabel( parent );
95  label->setObjectName( "PhotoLabel" );
96  QPushButton* pb = new QPushButton( tr( "..." ), container );
97  pb->setObjectName( "FileChooserButton" );
98 
99  layout->addWidget( label, 0, 0, 1, 2 );
100  layout->addWidget( le, 1, 0 );
101  layout->addWidget( pb, 1, 1 );
102 
103  container->setLayout( layout );
104 
105  return container;
106 }
107 
108 void QgsPhotoWidgetWrapper::initWidget( QWidget* editor )
109 {
110  QWidget* container;
111 
112  mLineEdit = qobject_cast<QLineEdit*>( editor );
113 #ifdef WITH_QTWEBKIT
114  mWebView = qobject_cast<QWebView*>( editor );
115 #endif
116 
117  if ( mLineEdit )
118  {
119  container = mLineEdit->parentWidget();
120  }
121 #ifdef WITH_QTWEBKIT
122  else if ( mWebView )
123  {
124  container = mWebView->parentWidget();
125  mLineEdit = container->findChild<QLineEdit*>();
126  }
127 #endif
128  else
129  {
130  container = editor;
131  mLineEdit = container->findChild<QLineEdit*>();
132  }
133 
134  mButton = container->findChild<QPushButton*>( "FileChooserButton" );
135  if ( !mButton )
136  mButton = container->findChild<QPushButton*>();
137 
138  mPhotoLabel = container->findChild<QLabel*>( "PhotoLabel" );
139  if ( !mPhotoLabel )
140  mPhotoLabel = container->findChild<QLabel*>();
141 
142  if ( mButton )
143  connect( mButton, SIGNAL( clicked() ), this, SLOT( selectFileName() ) );
144 
145  if ( mLineEdit )
146  {
147 
148  QgsFilterLineEdit *fle = qobject_cast<QgsFilterLineEdit*>( mLineEdit );
149  if ( fle )
150  {
151  fle->setNullValue( QSettings().value( "qgis/nullValue", "NULL" ).toString() );
152  }
153 
154  connect( mLineEdit, SIGNAL( textChanged( QString ) ), this, SLOT( valueChanged( QString ) ) );
155  connect( mLineEdit, SIGNAL( textChanged( QString ) ), this, SLOT( loadPixmap( QString ) ) );
156  }
157 }
158 
159 void QgsPhotoWidgetWrapper::setValue( const QVariant& value )
160 {
161  if ( mLineEdit )
162  {
163  if ( value.isNull() )
164  mLineEdit->setText( QSettings().value( "qgis/nullValue", "NULL" ).toString() );
165  else
166  mLineEdit->setText( value.toString() );
167  }
168  else
169  {
170  loadPixmap( value.toString() );
171  }
172 }
173 
175 {
176  if ( mLineEdit )
177  mLineEdit->setEnabled( enabled );
178 
179  if ( mButton )
180  mButton->setEnabled( enabled );
181 }
void valueChanged()
Will call the value() method to determine the emitted value.
Manages an editor widget Widget and wrapper share the same parent.
QWidget * createWidget(QWidget *parent) override
This method should create a new widget with the provided parent.
const QgsEditorWidgetConfig config()
Returns the whole config.
Lineedit with builtin clear button.
void setNullValue(QString nullValue)
void setEnabled(bool enabled) override
QVariant value() override
Will be used to access the widget's value.
QgsPhotoWidgetWrapper(QgsVectorLayer *vl, int fieldIdx, QWidget *editor=0, QWidget *parent=0)
void setValue(const QVariant &value) override
Represents a vector layer which manages a vector based data sets.
double size
Definition: qgssvgcache.cpp:77
void initWidget(QWidget *editor) override
This method should initialize the editor widget with runtime data.
#define tr(sourceText)