QGIS API Documentation  3.14.0-Pi (9f7028fd23)
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 
90 void QgsNewNameDialog::setHintString( const QString &hintString )
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 }
QgsNewNameDialog::exists
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.
Definition: qgsnewnamedialog.cpp:206
QgsDialog::buttonBox
QDialogButtonBox * buttonBox()
Returns the button box.
Definition: qgsdialog.h:61
QgsNewNameDialog::mErrorLabel
QLabel * mErrorLabel
Definition: qgsnewnamedialog.h:140
qgsnewnamedialog.h
QgsNewNameDialog::name
QString name() const
Name entered by user.
Definition: qgsnewnamedialog.cpp:165
QgsNewNameDialog::mOverwriteEnabled
bool mOverwriteEnabled
Definition: qgsnewnamedialog.h:143
QgsNewNameDialog::mNamesLabel
QLabel * mNamesLabel
List of names with extensions.
Definition: qgsnewnamedialog.h:139
QgsNewNameDialog::newNameChanged
void newNameChanged()
Emitted when the name is changed in the dialog.
QgsNewNameDialog::mRegexp
QRegExp mRegexp
Definition: qgsnewnamedialog.h:142
QgsNewNameDialog::mHintLabel
QLabel * mHintLabel
Definition: qgsnewnamedialog.h:136
QgsDialog::layout
QVBoxLayout * layout()
Returns the central layout. Widgets added to it must have this dialog as parent.
Definition: qgsdialog.h:59
QgsNewNameDialog::nameChanged
void nameChanged()
Definition: qgsnewnamedialog.cpp:117
QgsDialog
Definition: qgsdialog.h:33
QgsNewNameDialog::QgsNewNameDialog
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.
Definition: qgsnewnamedialog.cpp:26
QgsNewNameDialog::mOkString
QString mOkString
Definition: qgsnewnamedialog.h:141
QgsNewNameDialog::mExiting
QStringList mExiting
Definition: qgsnewnamedialog.h:133
QgsNewNameDialog::matching
static QStringList matching(const QStringList &newNames, const QStringList &existingNames, Qt::CaseSensitivity cs=Qt::CaseSensitive)
Definition: qgsnewnamedialog.cpp:186
QgsNewNameDialog::setConflictingNameWarning
void setConflictingNameWarning(const QString &string)
Sets the string used for warning users if a conflicting name exists.
Definition: qgsnewnamedialog.cpp:106
QgsNewNameDialog::fullNames
static QStringList fullNames(const QString &name, const QStringList &extensions)
Definition: qgsnewnamedialog.cpp:170
QgsNewNameDialog::mLineEdit
QLineEdit * mLineEdit
Definition: qgsnewnamedialog.h:137
QgsNewNameDialog::setOverwriteEnabled
void setOverwriteEnabled(bool enabled)
Sets whether users are permitted to overwrite existing names.
Definition: qgsnewnamedialog.cpp:100
QgsNewNameDialog::highlightText
QString highlightText(const QString &text)
Definition: qgsnewnamedialog.cpp:112
QgsNewNameDialog::hintString
QString hintString() const
Returns the hint string for the dialog (the text shown above the name input box).
Definition: qgsnewnamedialog.cpp:95
QgsNewNameDialog::mCaseSensitivity
Qt::CaseSensitivity mCaseSensitivity
Definition: qgsnewnamedialog.h:135
QgsNewNameDialog::mConflictingNameWarning
QString mConflictingNameWarning
Definition: qgsnewnamedialog.h:144
qgslogger.h
QgsNewNameDialog::setHintString
void setHintString(const QString &hintString)
Sets the hint string for the dialog (the text shown above the name input box).
Definition: qgsnewnamedialog.cpp:90
QgsNewNameDialog::mExtensions
QStringList mExtensions
Definition: qgsnewnamedialog.h:134