Skip to content

Commit 026ee5b

Browse files
Add checks to CSF file and update text
1 parent 23ed01d commit 026ee5b

File tree

7 files changed

+125
-66
lines changed

7 files changed

+125
-66
lines changed

src/GUI/GreetingWindow.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@ GreetingWindow::GreetingWindow(QWidget* parent) : QWidget(parent)
2323
QVBoxLayout* ltLanguages = nullptr;
2424

2525
// Add "New Project" and "Load Project" buttons to the window
26-
btnLoadFromGame = new QPushButton(tr("NEW") + '\n' + tr("PROJECT"));
26+
btnLoadFromGame = new QPushButton(tr("LOAD FROM") + '\n' + tr("THE GAME"));
2727
btnLoadFromGame->setFixedSize(PROGRAM_CONSTANTS->START_BUTTON_SIZE);
2828
btnLoadFromGame->setObjectName(nameof(btnLoadFromGame));
2929
connect(btnLoadFromGame, &QPushButton::clicked, this, &GreetingWindow::btnLoadFromGame_Clicked);
3030

31-
btnLoadFromFile = new QPushButton(tr("LOAD") + '\n' + tr("PROJECT"));
31+
btnLoadFromFile = new QPushButton(tr("LOAD FROM") + '\n' + tr("THE FILE"));
3232
btnLoadFromFile->setFixedSize(PROGRAM_CONSTANTS->START_BUTTON_SIZE);
3333
btnLoadFromFile->setObjectName(nameof(btnLoadFromFile));
3434
connect(btnLoadFromFile, &QPushButton::clicked, this, &GreetingWindow::btnLoadFromFile_Clicked);

src/GUI/Translations/ru.ts

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -111,21 +111,33 @@
111111
<context>
112112
<name>GreetingWindow</name>
113113
<message>
114-
<location filename="../GreetingWindow.cpp" line="26"/>
115114
<source>NEW</source>
116-
<translation>НОВЫЙ</translation>
115+
<translation type="vanished">НОВЫЙ</translation>
117116
</message>
118117
<message>
119-
<location filename="../GreetingWindow.cpp" line="26"/>
120-
<location filename="../GreetingWindow.cpp" line="31"/>
121118
<source>PROJECT</source>
122-
<translation>ПРОЕКТ</translation>
119+
<translation type="vanished">ПРОЕКТ</translation>
123120
</message>
124121
<message>
125-
<location filename="../GreetingWindow.cpp" line="31"/>
126122
<source>LOAD</source>
123+
<translation type="vanished">ЗАГРУЗИТЬ</translation>
124+
</message>
125+
<message>
126+
<location filename="../GreetingWindow.cpp" line="26"/>
127+
<location filename="../GreetingWindow.cpp" line="31"/>
128+
<source>LOAD FROM</source>
127129
<translation>ЗАГРУЗИТЬ</translation>
128130
</message>
131+
<message>
132+
<location filename="../GreetingWindow.cpp" line="26"/>
133+
<source>THE GAME</source>
134+
<translation>ИЗ ИГРЫ</translation>
135+
</message>
136+
<message>
137+
<location filename="../GreetingWindow.cpp" line="31"/>
138+
<source>THE FILE</source>
139+
<translation>ИЗ ФАЙЛА</translation>
140+
</message>
129141
<message>
130142
<location filename="../GreetingWindow.cpp" line="36"/>
131143
<source>LANGUAGE</source>
@@ -406,22 +418,22 @@
406418
<context>
407419
<name>QObject</name>
408420
<message>
409-
<location filename="../../ProgramConstants.hpp" line="105"/>
421+
<location filename="../../ProgramConstants.hpp" line="106"/>
410422
<source>Buildings</source>
411423
<translation>Здания</translation>
412424
</message>
413425
<message>
414-
<location filename="../../ProgramConstants.hpp" line="106"/>
426+
<location filename="../../ProgramConstants.hpp" line="107"/>
415427
<source>Infantry</source>
416428
<translation>Пехота</translation>
417429
</message>
418430
<message>
419-
<location filename="../../ProgramConstants.hpp" line="107"/>
431+
<location filename="../../ProgramConstants.hpp" line="108"/>
420432
<source>Vehicles</source>
421433
<translation>Техника</translation>
422434
</message>
423435
<message>
424-
<location filename="../../ProgramConstants.hpp" line="108"/>
436+
<location filename="../../ProgramConstants.hpp" line="109"/>
425437
<source>Aircrafts</source>
426438
<translation>Авиация</translation>
427439
</message>

src/GUI/WindowManager.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@ void WindowManager::LaunchWidget_AcceptConfiguration()
5151

5252
CSF_PARSER = std::make_unique<CSFParser>(strCSFFilePath);
5353

54+
if (!CSF_PARSER->ExistCategory(PROGRAM_CONSTANTS->HOTKEY_CSF_CATEGORY))
55+
{
56+
QMessageBox::critical(nullptr, "Error with CSF file", "Choosen CSF file doesn't have CONTROLBAR category.\nMake sure that you are load correct file.");
57+
return;
58+
}
59+
5460
LOGMSG("Loading editor window...");
5561
pHotkeysEditor = std::make_unique<HotkeysMainWindow>();
5662
pHotkeysEditor->setWindowTitle(strWindowName);

src/Parsers/CSFParser.cpp

Lines changed: 48 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -8,32 +8,34 @@ using namespace std;
88

99
#pragma region CTORs and DTORs
1010
CSFParser::CSFParser() {}
11-
CSFParser::CSFParser(const string& filePath) {Parse(filePath);}
12-
CSFParser::CSFParser(const char* filePath) {Parse(filePath);}
13-
CSFParser::CSFParser(const QString& filePath) {Parse(filePath);}
11+
CSFParser::CSFParser(const wstring& filePath) { Parse(filePath); }
12+
CSFParser::CSFParser(const string& filePath) { Parse(filePath); }
13+
CSFParser::CSFParser(const char* filePath) { Parse(filePath); }
14+
CSFParser::CSFParser(const QString& filePath) { Parse(filePath); }
1415
#pragma endregion
1516

1617
#pragma region Parsing
1718
void CSFParser::Parse(const char* strFilePath)
1819
{
19-
Path = QString{strFilePath}.toStdString();
20-
ifstream csfFile(Path, ios::binary | ios::in);
21-
LOGMSG("Attempt to read binary file \"" + Path + "\"...");
20+
Path = QString(strFilePath).toStdWString();
21+
ifstream csfFile(Path.c_str(), ios::binary | ios::in);
22+
LOGMSG("Attempt to read binary file \"" + Path.c_str() + "\"...");
2223

2324
if (csfFile.is_open())
2425
{
2526
ReadHeader(&csfFile);
2627
ReadBody(&csfFile);
2728

28-
LOGMSG("File \"" + Path + "\" has been parsed; strings count : " + Table.size());
29+
LOGMSG("File \"" + Path.c_str() + "\" has been parsed; strings count : " + Table.size());
2930
}
3031
else
3132
{
32-
throw Exception("Bad file name; unable to open file \"" + Path + "\"");
33+
throw Exception(QString("") + "Bad file name; unable to open file \"" + Path + "\"");
3334
}
3435
}
35-
void CSFParser::Parse(const std::string& strFilePath) {Parse(strFilePath.c_str());}
36-
void CSFParser::Parse(const QString& strFilePath) {Parse(strFilePath.toStdString().c_str());}
36+
void CSFParser::Parse(const wstring& filePath) { Parse(filePath.c_str()); }
37+
void CSFParser::Parse(const std::string& strFilePath) { Parse(strFilePath.c_str()); }
38+
void CSFParser::Parse(const QString& strFilePath) { Parse(strFilePath.toStdString().c_str()); }
3739

3840
void CSFParser::ReadHeader(ifstream* csfFile)
3941
{
@@ -132,42 +134,31 @@ using namespace std;
132134
}
133135
}
134136

135-
void CSFParser::Save(const string& strFileName)
137+
void CSFParser::Save(const char* strFileName) { wstring tmp = Path; Path = QString(strFileName).toStdWString(); Save(); Path = tmp; }
138+
void CSFParser::Save(const wstring& strFileName) { wstring tmp = Path; Path = strFileName; Save(); Path = tmp; }
139+
void CSFParser::Save(const string& strFileName) { wstring tmp = Path; Path = QString::fromStdString(strFileName).toStdWString(); Save(); Path = tmp; }
140+
void CSFParser::Save(const QString& strFileName) { wstring tmp = Path; Path = strFileName.toStdWString(); Save(); Path = tmp; }
141+
void CSFParser::Save()
136142
{
137-
ofstream csfFile{strFileName, ios::binary | ios::out};
143+
ofstream csfFile{Path.c_str(), ios::binary | ios::out};
138144

139145
if(csfFile.is_open())
140146
{
141-
LOGSTM << "Attempt to write binary file \"" << strFileName << "\"" << endl;
147+
LOGSTM << ("Attempt to write binary file \"" + Path + "\"").toStdString() << endl;
142148

143149
CSFParser::WriteHeader(&csfFile);
144150
CSFParser::WriteBody(&csfFile);
145151

146-
LOGSTM << "File saved as \"" << strFileName << "\"" << endl;
152+
LOGSTM << ("File saved as \"" + Path + "\"").toStdString() << endl;
147153
}
148154
else
149155
{
150-
LOGSTM << "Could not open file \"" << strFileName << "\" to save" << endl;
156+
LOGSTM << ("Could not open file \"" + Path + "\" to save").toStdString() << endl;
151157
}
152158

153159
csfFile.close();
154160
}
155161

156-
void CSFParser::Save(const char* strFileName)
157-
{
158-
Save(string{strFileName});
159-
}
160-
161-
void CSFParser::Save(const QString& strFileName)
162-
{
163-
Save(strFileName.toStdString());
164-
}
165-
166-
void CSFParser::Save()
167-
{
168-
Save(Path);
169-
}
170-
171162
void CSFParser::WriteHeader(ofstream* csfFile)
172163
{
173164
// Struct Header has the same length as the original file
@@ -454,7 +445,33 @@ using namespace std;
454445
}
455446
#pragma endregion
456447

457-
#pragma region Support methods
448+
#pragma region Checkers
449+
450+
const bool CSFParser::ExistString(const std::string value) const
451+
{
452+
for (const auto& elem : Table)
453+
if (elem.Name == value)
454+
return true;
455+
456+
return false;
457+
}
458+
const bool CSFParser::ExistString(const QString& value) const { return ExistString(value.toStdString()); }
459+
const bool CSFParser::ExistString(const char* value) const { return ExistString(std::string(value)); }
460+
461+
const bool CSFParser::ExistCategory(const std::string value) const
462+
{
463+
for (const auto& elem : Table)
464+
if (elem.Name.substr(0, elem.Name.find_first_of(':', 0) ) == value)
465+
return true;;
466+
467+
return false;
468+
}
469+
const bool CSFParser::ExistCategory(const QString& value) const { return ExistCategory(value.toStdString()); }
470+
const bool CSFParser::ExistCategory(const char* value) const { return ExistCategory(QString(value)); }
471+
472+
#pragma endregion
473+
474+
#pragma region Internal methods
458475
string CSFParser::CharArrayToString(const size_t& arrayLength, const char* pArray) const
459476
{
460477
stringstream ss;

src/Parsers/CSFParser.hpp

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class CSFParser final
4040
const uint8_t WRTS[4] {'W', 'R', 'T', 'S'}; // Begining of any string with extra value
4141
const uint32_t CNC_CSF_VERSION = 3; // Standart file format. Legacy by WW
4242

43-
std::string Path;
43+
std::wstring Path;
4444
CSFHeader Header;
4545
std::list<CompiledString> Table;
4646

@@ -61,25 +61,30 @@ class CSFParser final
6161

6262
public:
6363
CSFParser();
64-
CSFParser(const std::string& strFilePath);
65-
CSFParser(const char* strFilePath);
66-
CSFParser(const QString& strFilePath);
64+
CSFParser(const std::wstring& strFilePath);
65+
CSFParser(const std::string& strFilePath);
66+
CSFParser(const char* strFilePath);
67+
CSFParser(const QString& strFilePath);
6768

6869
/// @brief Parse .csf file with direct path.
69-
void Parse(const std::string& strFilePath);
70+
void Parse(const std::wstring& strFilePath);
7071
/// @brief Parse .csf file with direct path.
71-
void Parse(const char* strFilePath);
72+
void Parse(const std::string& strFilePath);
7273
/// @brief Parse .csf file with direct path.
73-
void Parse(const QString& strFilePath);
74+
void Parse(const char* strFilePath);
75+
/// @brief Parse .csf file with direct path.
76+
void Parse(const QString& strFilePath);
7477

7578
/// @brief Save compiled sting table data to the parsed file before.
7679
void Save();
7780
/// @brief Save compiled string table data to the specific file.
78-
void Save(const std::string& strFileName);
81+
void Save(const std::wstring& strFileName);
82+
/// @brief Save compiled string table data to the specific file.
83+
void Save(const std::string& strFileName);
7984
/// @brief Save compiled string table data to the specific file.
80-
void Save(const char* strFileName);
85+
void Save(const char* strFileName);
8186
/// @brief Save compiled string table data to the specific file.
82-
void Save(const QString& strFileName);
87+
void Save(const QString& strFileName);
8388

8489
/// @brief Returns first string value by name match. The same string in uppercase and in lowercase aren't identical.
8590
std::wstring GetStringValue(const std::string& strName) const;
@@ -110,11 +115,11 @@ class CSFParser final
110115
QString GetClearName(const QString& strName) const;
111116

112117
/// @brief Returns wide character (letter after & sign) assinged to keyboard key.
113-
QChar GetHotkey(const std::string& strName) const;
118+
QChar GetHotkey(const std::string& strName) const;
114119
/// @brief Returns wide character (letter after & sign) assinged to keyboard key.
115-
QChar GetHotkey(const char* strName) const;
120+
QChar GetHotkey(const char* strName) const;
116121
/// @brief Returns wide character (letter after & sign) assinged to keyboard key.
117-
QChar GetHotkey(const QString& strName) const;
122+
QChar GetHotkey(const QString& strName) const;
118123
/// @brief Returns wide character (letter after & sign) assinged to keyboard key.
119124
wchar_t GetHotkeyWchar(const std::string& strName) const;
120125
/// @brief Returns wide character (letter after & sign) assinged to keyboard key.
@@ -136,4 +141,17 @@ class CSFParser final
136141
void SetStringValue(const CompiledString& stString);
137142
/// @brief Searchs any match for string names and rewriting its values.
138143
void SetStringsValue(const std::list<CompiledString>& lstChanges);
144+
145+
/// @brief Checks if string exist by name match.
146+
const bool ExistString(const QString& value) const;
147+
/// @brief Checks if string exist by name match.
148+
const bool ExistString(const char* value) const;
149+
/// @brief Checks if string exist by name match.
150+
const bool ExistString(const std::string value) const;
151+
/// @brief Checks if category exist by name match.
152+
const bool ExistCategory(const QString& value) const;
153+
/// @brief Checks if category exist by name match.
154+
const bool ExistCategory(const char* value) const;
155+
/// @brief Checks if category exist by name match.
156+
const bool ExistCategory(const std::string value) const;
139157
};

src/ProgramConstants.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ class ProgramConstants
7676
const char* UNKNOWN_ERROR = "Unknown error has been occured.";
7777

7878
// Other constants
79+
const QString HOTKEY_CSF_CATEGORY = "CONTROLBAR";
7980
const QVector<QString> GLA_SHORT_NAMES = {"GLA", "TOX", "STL", "DML"};
8081
const QVector<QString> USA_SHORT_NAMES = {"USA", "SWG", "AIR", "LSR"};
8182
const QVector<QString> PRC_SHORT_NAMES = {"PRC", "TNK", "INF", "NUK"};

src/StringExt.hpp

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,21 @@ concept IsSymbol = std::same_as<T, char> || std::same_as<T, wchar_t> || std::sam
99
template<class T>
1010
concept IsCString = std::same_as<T, const char*> || std::same_as<T, const wchar_t*>;
1111

12+
template<class T>
13+
concept IsSTDString = std::same_as<T, std::string> || std::same_as<T, std::wstring>;
14+
1215
template<class T>
1316
concept IsNumber = std::same_as<T, int> || std::same_as<T, size_t> || std::same_as<T, std::size_t> || std::same_as<T, ushort>;
1417

15-
template<IsNumber N> inline QString operator+ (const QString& str, const N& num) { return QString(str).append(QString::number(num)); }
16-
template<IsNumber N> inline QString operator+ (const N& num, const QString& str) { return QString::number(num).append(str); }
17-
template<IsNumber N> inline QString operator+ (const N& num, const std::string& str) { return QString::number(num).append(QString::fromStdString(str)); }
18-
template<IsNumber N> inline QString operator+ (const std::string& str, const N& num) { return QString::fromStdString(str).append(QString::number(num)); }
19-
template<IsSymbol C> inline QString operator+ (const C& char1, const C& char2) { return QString(char1).append(char2); }
20-
template<IsSymbol C> inline QString operator+ (const QString& str, const C& ch) { return QString(str).append(ch); }
21-
template<IsSymbol C> inline QString operator+ (const C& ch, const QString& str) { return QString(ch).append(str); }
22-
inline QString operator+ (const QString& qstr, const wchar_t* wstr) { return QString(qstr).append(QString::fromStdWString(std::wstring(wstr))); }
23-
inline QString operator+ (const QString& qstr, const std::string& stdstr) { return QString(qstr).append(QString::fromStdString(stdstr)); }
24-
inline QString operator+ (const std::string& stdstr, const QString& qstr) { return QString::fromStdString(stdstr).append(qstr); }
18+
template<IsNumber N> inline QString operator+ (const QString& str, const N& num) { return QString(str).append(QString::number(num)); }
19+
template<IsNumber N> inline QString operator+ (const N& num, const QString& str) { return QString::number(num).append(str); }
20+
template<IsNumber N> inline QString operator+ (const N& num, const std::string& str) { return QString::number(num).append(QString::fromStdString(str)); }
21+
template<IsNumber N> inline QString operator+ (const std::string& str, const N& num) { return QString::fromStdString(str).append(QString::number(num)); }
22+
template<IsSymbol C> inline QString operator+ (const C& char1, const C& char2) { return QString(char1).append(char2); }
23+
template<IsSymbol C> inline QString operator+ (const QString& str, const C& ch) { return QString(str).append(ch); }
24+
template<IsSymbol C> inline QString operator+ (const C& ch, const QString& str) { return QString(ch).append(str); }
25+
inline QString operator+ (const QString& qstr, const wchar_t* wstr) { return QString(qstr).append(QString::fromStdWString(std::wstring(wstr))); }
26+
inline QString operator+ (const QString& qstr, const std::wstring& stdwstr) { return QString(qstr).append(QString::fromStdWString(stdwstr)); }
27+
inline QString operator+ (const std::wstring& stdwstr, const QString& qstr) { return QString::fromStdWString(stdwstr).append(qstr); }
28+
inline QString operator+ (const QString& qstr, const std::string& stdstr) { return QString(qstr).append(QString::fromStdString(stdstr)); }
29+
inline QString operator+ (const std::string& stdstr, const QString& qstr) { return QString::fromStdString(stdstr).append(qstr); }

0 commit comments

Comments
 (0)