File: NamedItem.cpp

package info (click to toggle)
bornagain 23.0-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 103,936 kB
  • sloc: cpp: 423,131; python: 40,997; javascript: 11,167; awk: 630; sh: 318; ruby: 173; xml: 130; makefile: 51; ansic: 24
file content (60 lines) | stat: -rw-r--r-- 1,851 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
//  ************************************************************************************************
//
//  BornAgain: simulate and fit reflection and scattering
//
//! @file      GUI/Model/Type/NamedItem.cpp
//! @brief     Implements class NamedItem.
//!
//! @homepage  http://www.bornagainproject.org
//! @license   GNU General Public License v3 or higher (see COPYING)
//! @copyright Forschungszentrum Jülich GmbH 2021
//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
//
//  ************************************************************************************************

#include "GUI/Model/Type/NamedItem.h"
#include "Base/Util/Assert.h"
#include <QRegularExpression>
#include <QRegularExpressionMatch>

namespace {

QStringList splitName(const QString& s)
{
    QRegularExpression pattern("(.*)_(\\d+)$");
    QRegularExpressionMatch match = pattern.match(s);
    if (match.hasMatch()) {
        ASSERT(match.lastCapturedIndex() == 2);
        return {match.captured(1), match.captured(2)};
    }
    return {}; // s does not contain '_\d+'
}

} // namespace


void NamedItem::renumber(const QStringList& extant_names)
{
    // Item name consists of a stem and an optional number
    QStringList ns = ::splitName(name());
    QString stem = ns.isEmpty() ? name() : ns[0];

    // Determine highest number for given stem in extant_items
    int imax = 0;
    for (const QString& tname : extant_names) {
        QStringList ts = ::splitName(tname);
        if (ts.isEmpty()) {
            if (tname == stem)
                imax = std::max(imax, 1);
        } else {
            if (ts[0] == stem)
                imax = std::max(imax, ts[1].toInt());
        }
    }

    if (imax != 0)
        setName(stem + "_" + QString::number(imax + 1));

    if (name().contains(' '))
        setName(name().replace(' ', '_'));
}