QGIS API Documentation  3.0.2-Girona (307d082)
qgsnewnamedialog.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsnewnamedialog.cpp
3  -------------------
4  begin : May, 2015
5  copyright : (C) 2015 Radim Blazek
6  email : [email protected]
7  ***************************************************************************/
8 /***************************************************************************
9  * *
10  * This program is free software; you can redistribute it and/or modify *
11  * it under the terms of the GNU General Public License as published by *
12  * the Free Software Foundation; either version 2 of the License, or *
13  * (at your option) any later version. *
14  * *
15  ***************************************************************************/
16 
17 #include <QLabel>
18 #include <QLineEdit>
19 #include <QPushButton>
20 #include <QRegExpValidator>
21 #include <QSizePolicy>
22 
23 #include "qgslogger.h"
24 #include "qgsnewnamedialog.h"
25 
26 QgsNewNameDialog::QgsNewNameDialog( const QString &source, const QString &initial,
27  const QStringList &extensions, const QStringList &existing,
28  const QRegExp &regexp, Qt::CaseSensitivity cs,
29  QWidget *parent, Qt::WindowFlags flags )
30  : QgsDialog( parent, flags, QDialogButtonBox::Ok | QDialogButtonBox::Cancel )
31  , mExiting( existing )
32  , mExtensions( extensions )
33  , mCaseSensitivity( cs )
34  , mRegexp( regexp )
35 {
36  setWindowTitle( tr( "New Name" ) );
37  QgsDialog::layout()->setSizeConstraint( QLayout::SetMinimumSize );
38  layout()->setSizeConstraint( QLayout::SetMinimumSize );
39  layout()->setSpacing( 6 );
40  mOkString = buttonBox()->button( QDialogButtonBox::Ok )->text();
41  QString hintString;
42  QString nameDesc = mExtensions.isEmpty() ? tr( "name" ) : tr( "base name" );
43  if ( source.isEmpty() )
44  {
45  hintString = tr( "Enter new %1" ).arg( nameDesc );
46  }
47  else
48  {
49  hintString = tr( "Enter new %1 for %2" ).arg( nameDesc, source );
50  }
51  mHintLabel = new QLabel( hintString, this );
52  layout()->addWidget( mHintLabel );
53 
54  mLineEdit = new QLineEdit( initial, this );
55  if ( !regexp.isEmpty() )
56  {
57  QRegExpValidator *validator = new QRegExpValidator( regexp, this );
58  mLineEdit->setValidator( validator );
59  }
60  mLineEdit->setMinimumWidth( mLineEdit->fontMetrics().width( QStringLiteral( "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ) ) );
61  connect( mLineEdit, &QLineEdit::textChanged, this, &QgsNewNameDialog::nameChanged );
62  layout()->addWidget( mLineEdit );
63 
64  mNamesLabel = new QLabel( QStringLiteral( " " ), this );
65  mNamesLabel->setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum );
66  if ( !mExtensions.isEmpty() )
67  {
68  mNamesLabel->setWordWrap( true );
69  layout()->addWidget( mNamesLabel );
70  }
71 
72  mErrorLabel = new QLabel( QStringLiteral( " " ), this );
73  mErrorLabel->setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum );
74  mErrorLabel->setWordWrap( true );
75  layout()->addWidget( mErrorLabel );
76 
77  mLineEdit->setFocus();
78  mLineEdit->selectAll();
79 
80  nameChanged();
81 }
82 
84 {
85  mHintLabel->setText( hintString );
86 }
87 
89 {
90  return mHintLabel->text();
91 }
92 
94 {
95  mOverwriteEnabled = enabled;
96  nameChanged(); //update UI
97 }
98 
99 void QgsNewNameDialog::setConflictingNameWarning( const QString &string )
100 {
101  mConflictingNameWarning = string;
102  nameChanged(); //update UI
103 }
104 
105 QString QgsNewNameDialog::highlightText( const QString &text )
106 {
107  return "<b>" + text + "</b>";
108 }
109 
111 {
112 
113  QString namesString = tr( "Full names" ) + ": ";
114  if ( !mExtensions.isEmpty() )
115  {
116  mNamesLabel->setText( namesString );
117  }
118  mErrorLabel->setText( QStringLiteral( " " ) ); // space to keep vertical space
119  QPushButton *okButton = buttonBox()->button( QDialogButtonBox::Ok );
120  okButton->setText( mOkString );
121  okButton->setEnabled( true );
122 
123  QString newName = name();
124 
125  if ( newName.length() == 0 || ( !mRegexp.isEmpty() && !mRegexp.exactMatch( newName ) ) )
126  {
127  //mErrorLabel->setText( highlightText( tr( "Enter new name" ) );
128  okButton->setEnabled( false );
129  return;
130  }
131 
132  QStringList newNames = fullNames( newName, mExtensions );
133  if ( !mExtensions.isEmpty() )
134  {
135  namesString += ' ' + newNames.join( QStringLiteral( ", " ) );
136  mNamesLabel->setText( namesString );
137  }
138 
139  QStringList conflicts = matching( newNames, mExiting, mCaseSensitivity );
140 
141  if ( !conflicts.isEmpty() )
142  {
143  QString warning = !mConflictingNameWarning.isEmpty() ? mConflictingNameWarning
144  : tr( "%n Name(s) %1 exists", nullptr, conflicts.size() ).arg( conflicts.join( QStringLiteral( ", " ) ) );
145  mErrorLabel->setText( highlightText( warning ) );
146  if ( mOverwriteEnabled )
147  {
148  okButton->setText( tr( "Overwrite" ) );
149  }
150  else
151  {
152  okButton->setEnabled( false );
153  }
154  return;
155  }
156 }
157 
158 QString QgsNewNameDialog::name() const
159 {
160  return mLineEdit->text().trimmed();
161 }
162 
163 QStringList QgsNewNameDialog::fullNames( const QString &name, const QStringList &extensions )
164 {
165  QStringList list;
166  Q_FOREACH ( const QString &ext, extensions )
167  {
168  list << name + ext;
169 
170  }
171  if ( list.isEmpty() )
172  {
173  list << name;
174  }
175  return list;
176 }
177 
178 QStringList QgsNewNameDialog::matching( const QStringList &newNames, const QStringList &existingNames,
179  Qt::CaseSensitivity cs )
180 {
181  QStringList list;
182 
183  Q_FOREACH ( const QString &newName, newNames )
184  {
185  Q_FOREACH ( const QString &existingName, existingNames )
186  {
187  if ( existingName.compare( newName, cs ) == 0 )
188  {
189  list << existingName;
190  }
191  }
192  }
193  return list;
194 }
195 
196 bool QgsNewNameDialog::exists( const QString &name, const QStringList &extensions,
197  const QStringList &existing, Qt::CaseSensitivity cs )
198 {
199  QStringList newNames = fullNames( name, extensions );
200  QStringList conflicts = matching( newNames, existing, cs );
201  return !conflicts.isEmpty();
202 }
void setOverwriteEnabled(bool enabled)
Sets whether users are permitted to overwrite existing names.
Qt::CaseSensitivity mCaseSensitivity
QStringList mExiting
A generic dialog with layout and button box.
Definition: qgsdialog.h:33
QStringList mExtensions
static QStringList matching(const QStringList &newNames, const QStringList &existingNames, Qt::CaseSensitivity cs=Qt::CaseSensitive)
static QStringList fullNames(const QString &name, const QStringList &extensions)
static bool exists(const QString &name, const QStringList &extensions, const QStringList &existing, Qt::CaseSensitivity cs=Qt::CaseSensitive)
Test if name or name with at least one extension exists.
QString hintString() const
Returns the hint string for the dialog (the text shown above the name input box). ...
QDialogButtonBox * buttonBox()
Returns the button box.
Definition: qgsdialog.h:48
QString mConflictingNameWarning
QString name() const
Name entered by user.
void setHintString(const QString &hintString)
Sets the hint string for the dialog (the text shown above the name input box).
QgsNewNameDialog(const QString &source=QString(), const QString &initial=QString(), const QStringList &extensions=QStringList(), const QStringList &existing=QStringList(), const QRegExp &regexp=QRegExp(), Qt::CaseSensitivity cs=Qt::CaseSensitive, QWidget *parent=nullptr, Qt::WindowFlags flags=QgsGuiUtils::ModalDialogFlags)
New dialog constructor.
QVBoxLayout * layout()
Returns the central layout. Widgets added to it must have this dialog as parent.
Definition: qgsdialog.h:46
QLabel * mNamesLabel
List of names with extensions.
QString highlightText(const QString &text)
void setConflictingNameWarning(const QString &string)
Sets the string used for warning users if a conflicting name exists.
QLineEdit * mLineEdit