Refactor findPinCodeNodes in ScreenXmlParser for improved PIN handling and grid detection
Optimized PIN processing by trimming spaces from input to support flexible PIN formats. Enhanced grid detection logic by introducing distinct handling for full and short rows, refining the "0" digit node assignment. Updated size thresholds for better fallback support and added debug outputs for enhanced troubleshooting.
This commit is contained in:
parent
cefad834c7
commit
01f8801a73
@ -397,6 +397,7 @@ QString ScreenXmlParser::parseProfilePhone() {
|
||||
}
|
||||
|
||||
QList<Node> ScreenXmlParser::findPinCodeNodes(const QString &pinCode) {
|
||||
const QString cleanPin = QString(pinCode).remove(' ');
|
||||
// Способ 1: ищем кликабельные ноды с текстом-цифрой (0-9)
|
||||
// Поддерживаем форматы: "1", "key 1", и т.п.
|
||||
QMap<QString, Node> digitMap;
|
||||
@ -409,9 +410,11 @@ QList<Node> ScreenXmlParser::findPinCodeNodes(const QString &pinCode) {
|
||||
}
|
||||
}
|
||||
|
||||
qDebug() << "[findPinCodeNodes] digitMap size:" << digitMap.size()
|
||||
<< "keys:" << digitMap.keys();
|
||||
if (digitMap.size() >= 10) {
|
||||
QList<Node> result;
|
||||
for (const QChar &c : pinCode) {
|
||||
for (const QChar &c : cleanPin) {
|
||||
const QString d = QString(c);
|
||||
if (digitMap.contains(d)) {
|
||||
result.append(digitMap[d]);
|
||||
@ -459,7 +462,7 @@ QList<Node> ScreenXmlParser::findPinCodeNodes(const QString &pinCode) {
|
||||
|
||||
QList<Node> best;
|
||||
for (const auto &grp : groups) {
|
||||
if (grp.size() >= 12 && (best.size() < 12 || grp.size() < best.size()))
|
||||
if (grp.size() >= 10 && (best.size() < 10 || grp.size() < best.size()))
|
||||
best = grp;
|
||||
}
|
||||
return best;
|
||||
@ -467,10 +470,10 @@ QList<Node> ScreenXmlParser::findPinCodeNodes(const QString &pinCode) {
|
||||
|
||||
// Сначала квадратные, потом любые
|
||||
QList<Node> candidates = fuzzyGroup(true);
|
||||
if (candidates.size() < 12)
|
||||
if (candidates.size() < 10)
|
||||
candidates = fuzzyGroup(false);
|
||||
|
||||
if (candidates.size() < 12) {
|
||||
if (candidates.size() < 10) {
|
||||
// Дебаг: выводим все clickable ноды и их размеры
|
||||
qWarning() << "[findPinCodeNodes] grid not found. Total clickable nodes:" << allClickable.size();
|
||||
for (const Node &n : allClickable) {
|
||||
@ -506,30 +509,41 @@ QList<Node> ScreenXmlParser::findPinCodeNodes(const QString &pinCode) {
|
||||
});
|
||||
}
|
||||
|
||||
QList<QList<Node>> gridRows;
|
||||
// Строки по 3 — основные ряды (1-9), строки по 1-3 в конце — ряд с "0"
|
||||
QList<QList<Node>> fullRows; // строки по 3 кнопки
|
||||
QList<QList<Node>> shortRows; // строки с 1-2 кнопками (последний ряд)
|
||||
for (const QList<Node> &row : rows) {
|
||||
if (row.size() == 3) gridRows.append(row);
|
||||
if (row.size() == 3) fullRows.append(row);
|
||||
else if (row.size() >= 1 && row.size() <= 2) shortRows.append(row);
|
||||
}
|
||||
|
||||
if (gridRows.size() < 4) {
|
||||
qWarning() << "[findPinCodeNodes] grid not found: gridRows=" << gridRows.size()
|
||||
if (fullRows.size() < 3) {
|
||||
qWarning() << "[findPinCodeNodes] grid not found: fullRows=" << fullRows.size()
|
||||
<< "candidates=" << candidates.size();
|
||||
return {};
|
||||
}
|
||||
|
||||
const QStringList digits19 = {"1", "2", "3", "4", "5", "6", "7", "8", "9"};
|
||||
int idx = 0;
|
||||
for (int r = 0; r < gridRows.size() - 1 && idx < digits19.size(); ++r) {
|
||||
for (const Node &n : gridRows[r]) {
|
||||
for (int r = 0; r < fullRows.size() && idx < digits19.size(); ++r) {
|
||||
for (const Node &n : fullRows[r]) {
|
||||
if (idx < digits19.size()) digitMap[digits19[idx++]] = n;
|
||||
}
|
||||
}
|
||||
if (gridRows.last().size() >= 2) {
|
||||
digitMap["0"] = gridRows.last()[1];
|
||||
// "0" — в последнем ряду: если 3 кнопки — средняя, если 1 — единственная
|
||||
if (!shortRows.isEmpty()) {
|
||||
const auto &lastRow = shortRows.last();
|
||||
if (lastRow.size() >= 2)
|
||||
digitMap["0"] = lastRow[1]; // средняя кнопка
|
||||
else
|
||||
digitMap["0"] = lastRow[0]; // единственная кнопка
|
||||
} else if (fullRows.size() >= 4) {
|
||||
// fallback: "0" — средняя кнопка последнего полного ряда
|
||||
digitMap["0"] = fullRows.last()[1];
|
||||
}
|
||||
|
||||
QList<Node> result;
|
||||
for (const QChar &c : pinCode) {
|
||||
for (const QChar &c : cleanPin) {
|
||||
if (const QString d = QString(c); digitMap.contains(d)) {
|
||||
result.append(digitMap[d]);
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user