1// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd.
2//
3// SPDX-License-Identifier: GPL-3.0-or-later
4
5#include "jsondispalysfmodel.h"
6
7#include <QRegularExpression>
8
9class JsonDispalySFModelPrivate
10{
11 friend class JsonDispalySFModel;
12 QStringList regExpStrs
13 {
14 {"(?<float>[0-9]+.[0-9]+)%$"},
15 {"(?<llong>[0-9]+)"},
16 {"(?<path>[/\\S]+)"}
17 };
18
19 void getPathName(const QString &path, QString &perfix, QString &name)
20 {
21 QString temp = path;
22 int endIdx = temp.size() - 1;
23 while (endIdx >= 0) {
24 if (temp[endIdx] == "/")
25 break;
26 endIdx --;
27 }
28 if (endIdx >= 0) {
29 name = temp.mid(endIdx + 1, temp.size());
30 perfix = temp.mid(0, endIdx);
31 }
32 }
33};
34
35JsonDispalySFModel::JsonDispalySFModel(QObject *parent)
36 : QSortFilterProxyModel (parent)
37 , d (new JsonDispalySFModelPrivate)
38{
39
40}
41
42JsonDispalySFModel::~JsonDispalySFModel()
43{
44 if (d)
45 delete d;
46}
47
48bool JsonDispalySFModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const
49{
50 QString leftStr = source_left.data(Qt::DisplayRole).toString();
51 QString rightStr = source_right.data(Qt::DisplayRole).toString();
52 for (auto regExpStr : d->regExpStrs) {
53 QRegularExpression regExp(regExpStr);
54 auto leftMatchs = regExp.match(leftStr);
55 auto rightMatchs = regExp.match(rightStr);
56 if (leftMatchs.isValid() && rightMatchs.isValid()) {
57 QString left_fMatch = leftMatchs.captured("float");
58 QString right_fMatch = rightMatchs.captured("float");
59 if (!left_fMatch.isEmpty() && !right_fMatch.isEmpty()) {
60 return left_fMatch.toFloat() > right_fMatch.toFloat();
61 }
62 QString left_llMatch = leftMatchs.captured("llong");
63 QString right_llMatch = rightMatchs.captured("llong");
64 if (!left_llMatch.isEmpty() && !right_llMatch.isEmpty()) {
65 return left_llMatch.toLongLong() > right_llMatch.toLongLong();
66 }
67 QString left_pMatch = leftMatchs.captured("path").toLower();
68 QString right_pMatch = rightMatchs.captured("path").toLower();
69 if (!left_pMatch.isEmpty() && !right_pMatch.isEmpty()) {
70 return left_pMatch > right_pMatch;
71 }
72 }
73 }
74 return QSortFilterProxyModel::lessThan(source_left, source_right);
75}
76