QGIS API Documentation  3.13.0-Master (740be229cb)
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 
61 
62 #if QT_VERSION < QT_VERSION_CHECK(5, 11, 0)
63  mLineEdit->setMinimumWidth( mLineEdit->fontMetrics().width( QStringLiteral( "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ) ) );
64 #else
65  mLineEdit->setMinimumWidth( mLineEdit->fontMetrics().horizontalAdvance( 'x' ) * 44 );
66 #endif
67  connect( mLineEdit, &QLineEdit::textChanged, this, &QgsNewNameDialog::nameChanged );
68  connect( mLineEdit, &QLineEdit::textChanged, this, &QgsNewNameDialog::newNameChanged );
69  layout()->addWidget( mLineEdit );
70 
71  mNamesLabel = new QLabel( QStringLiteral( " " ), this );
72  mNamesLabel->setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum );
73  if ( !mExtensions.isEmpty() )
74  {
75  mNamesLabel->setWordWrap( true );
76  layout()->addWidget( mNamesLabel );
77  }
78 
79  mErrorLabel = new QLabel( QStringLiteral( " " ), this );
80  mErrorLabel->setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum );
81  mErrorLabel->setWordWrap( true );
82  layout()->addWidget( mErrorLabel );
83 
84  mLineEdit->setFocus();
85  mLineEdit->selectAll();
86 
87  nameChanged();
88 }
89 
91 {
92  mHintLabel->setText( hintString );
93 }
94 
96 {
97  return mHintLabel->text();
98 }
99 
101 {
102  mOverwriteEnabled = enabled;
103  nameChanged(); //update UI
104 }
105 
106 void QgsNewNameDialog::setConflictingNameWarning( const QString &string )
107 {
108  mConflictingNameWarning = string;
109  nameChanged(); //update UI
110 }
111 
112 QString QgsNewNameDialog::highlightText( const QString &text )
113 {
114  return "<b>" + text + "</b>";
115 }
116 
118 {
119 
120  QString namesString = tr( "Full names" ) + ": ";
121  if ( !mExtensions.isEmpty() )
122  {
123  mNamesLabel->setText( namesString );
124  }
125  mErrorLabel->setText( QStringLiteral( " " ) ); // space to keep vertical space
126  QPushButton *okButton = buttonBox()->button( QDialogButtonBox::Ok );
127  okButton->setText( mOkString );
128  okButton->setEnabled( true );
129 
130  QString newName = name();
131 
132  if ( newName.length() == 0 || ( !mRegexp.isEmpty() && !mRegexp.exactMatch( newName ) ) )
133  {
134  //mErrorLabel->setText( highlightText( tr( "Enter new name" ) );
135  okButton->setEnabled( false );
136  return;
137  }
138 
139  QStringList newNames = fullNames( newName, mExtensions );
140  if ( !mExtensions.isEmpty() )
141  {
142  namesString += ' ' + newNames.join( QStringLiteral( ", " ) );
143  mNamesLabel->setText( namesString );
144  }
145 
146  QStringList conflicts = matching( newNames, mExiting, mCaseSensitivity );
147 
148  if ( !conflicts.isEmpty() )
149  {
150  QString warning = !mConflictingNameWarning.isEmpty() ? mConflictingNameWarning
151  : tr( "%n Name(s) %1 exists", nullptr, conflicts.size() ).arg( conflicts.join( QStringLiteral( ", " ) ) );
152  mErrorLabel->setText( highlightText( warning ) );
153  if ( mOverwriteEnabled )
154  {
155  okButton->setText( tr( "Overwrite" ) );
156  }
157  else
158  {
159  okButton->setEnabled( false );
160  }
161  return;
162  }
163 }
164 
165 QString QgsNewNameDialog::name() const
166 {
167  return mLineEdit->text().trimmed();
168 }
169 
170 QStringList QgsNewNameDialog::fullNames( const QString &name, const QStringList &extensions )
171 {
172  QStringList list;
173  const auto constExtensions = extensions;
174  for ( const QString &ext : constExtensions )
175  {
176  list << name + ext;
177 
178  }
179  if ( list.isEmpty() )
180  {
181  list << name;
182  }
183  return list;
184 }
185 
186 QStringList QgsNewNameDialog::matching( const QStringList &newNames, const QStringList &existingNames,
187  Qt::CaseSensitivity cs )
188 {
189  QStringList list;
190 
191  const auto constNewNames = newNames;
192  for ( const QString &newName : constNewNames )
193  {
194  const auto constExistingNames = existingNames;
195  for ( const QString &existingName : constExistingNames )
196  {
197  if ( existingName.compare( newName, cs ) == 0 )
198  {
199  list << existingName;
200  }
201  }
202  }
203  return list;
204 }
205 
206 bool QgsNewNameDialog::exists( const QString &name, const QStringList &extensions,
207  const QStringList &existing, Qt::CaseSensitivity cs )
208 {
209  QStringList newNames = fullNames( name, extensions );
210  QStringList conflicts = matching( newNames, existing, cs );
211  return !conflicts.isEmpty();
212 }
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
void newNameChanged()
Emitted when the name is changed in the dialog.
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