aboutsummaryrefslogtreecommitdiffstats
path: root/ui/qt
diff options
context:
space:
mode:
authorRoland Knall <rknall@gmail.com>2019-08-08 13:41:49 +0200
committerRoland Knall <rknall@gmail.com>2019-08-08 14:23:22 +0000
commit0dfb50ef82067406dc42fa7298302e5ea6cb7348 (patch)
tree817b98954c9d1ac58b3ea65f16f9b62fdac3016a /ui/qt
parentdc4084fb822e4669aac95a6dc8c0b6b36597e9bd (diff)
Qt: Restructure duplicateEntry to rectify copying issues
Various issues rose during restructuring which are now being fixed with the help of unittests. Mainly also renaming new profiles and createing copies from them, as well as deleting profiles and keeping copies names Change-Id: I39e1772c7be586fe07ea0613fa9e23d40d864012 Reviewed-on: https://code.wireshark.org/review/34214 Petri-Dish: Roland Knall <rknall@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Roland Knall <rknall@gmail.com>
Diffstat (limited to 'ui/qt')
-rw-r--r--ui/qt/models/profile_model.cpp72
1 files changed, 38 insertions, 34 deletions
diff --git a/ui/qt/models/profile_model.cpp b/ui/qt/models/profile_model.cpp
index a10c18b212..f166e8c417 100644
--- a/ui/qt/models/profile_model.cpp
+++ b/ui/qt/models/profile_model.cpp
@@ -584,9 +584,13 @@ QModelIndex ProfileModel::duplicateEntry(QModelIndex idx, int new_status)
if ( ! prof )
return QModelIndex();
- if ( new_status < 0 || new_status > PROF_STAT_COPY )
+ /* only new and copied stati can be set */
+ if ( new_status != PROF_STAT_NEW || new_status != PROF_STAT_COPY )
new_status = PROF_STAT_COPY;
+ /* this is a copy from a personal profile, check if the original has been a
+ * new profile or a preexisting one. In the case of a new profile, restart
+ * with the state PROF_STAT_NEW */
if ( prof->status == PROF_STAT_COPY && ! prof->from_global )
{
int row = findByNameAndVisibility(prof->reference, false);
@@ -595,63 +599,63 @@ QModelIndex ProfileModel::duplicateEntry(QModelIndex idx, int new_status)
return duplicateEntry(index(row, ProfileModel::COL_NAME), PROF_STAT_NEW);
}
+ /* Rules for figuring out the name to copy from:
+ *
+ * General, use copy name
+ * If status of copy is new or changed => use copy reference
+ * If copy is non global and status of copy is != changed, use original parent name
+ */
QString parent = prof->name;
- if ( prof->status == PROF_STAT_NEW )
- {
- if ( QString(prof->reference).length() > 0 )
- parent = QString(prof->reference);
- }
- else if ( ! prof->is_global && prof->status != PROF_STAT_CHANGED )
- parent = get_profile_parent (prof->name);
- else if ( prof->status == PROF_STAT_CHANGED )
+ if ( prof->status == PROF_STAT_CHANGED )
parent = prof->reference;
+ else if ( ! prof->is_global && prof->status != PROF_STAT_NEW && prof->status != PROF_STAT_CHANGED )
+ parent = get_profile_parent (prof->name);
+ if ( parent.length() == 0 )
+ return QModelIndex();
+
+ /* parent references the parent profile to be used, parentName is the base for the new name */
QString parentName = parent;
- if ( prof->status == PROF_STAT_COPY )
- {
- int row = findByNameAndVisibility(parentName, false, true);
- profile_def * par = guard(row);
- if ( par && par->status == PROF_STAT_CHANGED )
- parentName = par->name;
- }
- else if ( prof->status == PROF_STAT_CHANGED )
+ /* the user has changed the profile name, therefore this is also the name to be used */
+ if ( prof->status != PROF_STAT_EXISTS )
parentName = prof->name;
- if ( parent.length() == 0 )
- return QModelIndex();
+ /* check to ensure we do not end up with (copy) (copy) (copy) ... */
+ QRegExp rx("\\s+(\\(\\s*" + tr("copy", "noun") + "\\s*\\d*\\))");
+ if ( rx.indexIn(parentName) >= 0 )
+ parentName.replace(rx, "");
QString new_name;
- if (prof->is_global && ! profile_exists (parent.toUtf8().constData(), FALSE))
+ /* if copy is global and name has not been used before, use that, else create first copy */
+ if (prof->is_global && findByNameAndVisibility(parentName) < 0)
new_name = QString(prof->name);
else
new_name = QString("%1 (%2)").arg(parentName).arg(tr("copy", "noun"));
- if ( findByNameAndVisibility(new_name) >= 0 && new_name.length() > 0 )
+ /* check if copy already exists and iterate, until an unused version is found */
+ int cnt = 1;
+ while(findByNameAndVisibility(new_name) >= 0)
{
- int cnt = 1;
- QString copyName = new_name;
- while(findByNameAndVisibility(copyName) >= 0)
- {
- copyName = new_name;
- copyName = copyName.replace(tr("copy", "noun"), tr("copy", "noun").append(" %1").arg(QString::number(cnt)));
- cnt++;
- }
- new_name = copyName;
+ new_name = QString("%1 (%2 %3)").arg(parentName).arg(tr("copy", "noun")).arg(QString::number(cnt));
+ cnt++;
}
- if ( new_name.compare(QString(new_name.toUtf8().constData())) != 0 && !prof->is_global )
- return QModelIndex();
-
+ /* if this would be a copy, but the original is already a new one, this is a copy as well */
if ( new_status == PROF_STAT_COPY && prof->status == PROF_STAT_NEW )
new_status = PROF_STAT_NEW;
- add_to_profile_list(new_name.toUtf8().constData(), parent.toUtf8().constData(), new_status, FALSE, prof->from_global);
+ /* add element */
+ add_to_profile_list(new_name.toUtf8().constData(), parent.toUtf8().constData(), new_status, FALSE, prof->from_global ? prof->from_global : prof->is_global);
+
+ /* reload profile list in model */
loadProfiles();
int row = findByNameAndVisibility(new_name, false);
+ /* sanity check, if adding the profile went correctly */
if ( row < 0 || row == idx.row() )
return QModelIndex();
+ /* return the index of the profile */
return index(row, COL_NAME);
}