-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinputeditor.cpp
More file actions
107 lines (97 loc) · 3.73 KB
/
Copy pathinputeditor.cpp
File metadata and controls
107 lines (97 loc) · 3.73 KB
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include "inputeditor.h"
#include <QString>
InputEditor::InputEditor(QLineEdit *input) : input_(input), v_(new QList<QString>){}
InputEditor::~InputEditor(){
//delete v_; в соседнем классе чистится v_ (эх, костылики)
}
/*!
* \brief InputEditor::pushBack Добавляет определенные данные в конец внутреннего массива
* \param str данные
*/
void InputEditor::pushBack(const QString &str){
if(!isValidity())
parse(input_->text());
v_->push_back(str);
updateInput();
}
/*!
* \brief InputEditor::getVars Выдает указатель на внутренний массив данных
* \return Указатель на внутренний массив данных
*/
QList<QString> *InputEditor::getVars(){
//эх... исправить бы этот метод на более безопасный вариант
return v_;
}
/*!
* \brief InputEditor::updateInput Обновляет поле для ввода данных
*/
void InputEditor::updateInput(){
input_->setText(toString());
}
/*!
* \brief InputEditor::toString Преобразует внутренний массив в строку
* \return сгенерированная строка
*/
QString InputEditor::toString() const {
return v_->join(" ");
}
bool InputEditor::isValidity() const {
return input_->text() == toString();
}
/*!
* \brief InputEditor::parse Парсит введенную строку
* \param str строка для парсинга
* \return смогло ли произойти чтение
*/
bool InputEditor::parse(const QString &str){
QString prettyString = normalizeString(str); //приводим строку с виду пробел значение пробел значение
bool res = true;
QList<int> errors;
QStringList sl = prettyString.trimmed().split(" ");
for(int i = 0; i < sl.count(); i++)
if(AVIABLE_WORDS.indexOf(sl[i]) == -1)
{
errors.push_back(i);
}
if(errors.length() == 0){
delete v_;
v_ = new QList<QString>(sl);
}
else{
QString msg("Неправильный синтаксис: ");
for(const int &error : errors)
msg.append("\" ").append(sl[error]).append(" \", ");
QMessageBox::warning(nullptr, "Ошибка", msg);
res = false;
}
return res;
}
/*!
* \brief InputEditor::normalizeString приводит входную строку в вид значение пробел значение пробел
* \param input входная строка
* \return Отформатированная строка
*
* \example
* Вход: A*B+ C
* Выход: A * B + C
*/
QString InputEditor::normalizeString(const QString &input) const
{
QString res; //результирующая строка
QString inStr = input; //копируем входную строку
inStr.remove(" ");
for(int i = 0; i < inStr.size(); i++)
{
auto foundIterator = std::find_if(AVIABLE_WORDS.cbegin(), AVIABLE_WORDS.cend(), [&inStr, &i](const QString &value){ return inStr[i] == value.at(0); }); //ищем совпадение с допустимыми словами
if(foundIterator == AVIABLE_WORDS.cend())
{
//res.push_back(' '); //если ничего не нашли то добавляем пробел
}
else
{
res.push_back((*foundIterator) + ' '); //Добавляем доступное слово и пробел
i += (*foundIterator).size() - 1; //Добавляем к i сколько надо, если длина доступного слова больше 1
}
}
return res;
}