Aliens create, wavetrace work, towers build, aliens move - thats all by now. I think it is time to write Graphic and Network modules.
255 lines
5.9 KiB
C++
255 lines
5.9 KiB
C++
#include <settreader.h>
|
|
|
|
using namespace std;
|
|
|
|
|
|
SettingsReader::SettingsReader(const QString & fname) {
|
|
isFile = true;
|
|
file = new QFile(fname);
|
|
file->open(QIODevice::ReadWrite);
|
|
stream = new QTextStream(file);
|
|
parse();
|
|
}
|
|
|
|
|
|
SettingsReader::SettingsReader(QString * string) {
|
|
isFile = false;
|
|
str = string;
|
|
stream = new QTextStream(string);
|
|
parse();
|
|
}
|
|
|
|
|
|
SettingsReader::~SettingsReader() {
|
|
settname.clear();
|
|
settval.clear();
|
|
settcom.clear();
|
|
setttab.clear();
|
|
settlines.clear();
|
|
setttype.clear();
|
|
all.clear();
|
|
stream->setDevice(0);
|
|
delete stream;
|
|
if (isFile) {
|
|
file->close();
|
|
delete file;
|
|
}
|
|
}
|
|
|
|
|
|
QString SettingsReader::getValue(QString vname, QString def, bool * exist) {
|
|
for (int i = 0; i < settname.size(); i++) {
|
|
if (settname.at(i) == vname) {
|
|
if (exist != 0) *exist = true;
|
|
return settval.at(i);
|
|
}
|
|
}
|
|
if (exist != 0) *exist = false;
|
|
return def;
|
|
}
|
|
|
|
|
|
void SettingsReader::addLine(const QString & name, const QString & value, const QString & type) {
|
|
if (setttab.size() > 0 && all.size() > 0) *stream << setttab.at(setttab.size() - 1) << name << " = " << value << " #" << type << endl;
|
|
else *stream << name << " = " << value << " #" << type << endl;
|
|
settname.append(name);
|
|
settval.append(value);
|
|
settcom.append("");
|
|
setttype.append(type);
|
|
if (setttab.size() > 0) setttab.append(setttab.at(setttab.size() - 1));
|
|
else setttab.append(" ");
|
|
settlines.push_back(all.size());
|
|
all.append(name + " = " + value + " #" + type);
|
|
stream->flush();
|
|
if (isFile) file->flush();
|
|
}
|
|
|
|
|
|
void SettingsReader::insertLine(int number, const QString & name, const QString & value, const QString & type) {
|
|
if (number >= settname.size()) {
|
|
addLine(name, value, type);
|
|
return;
|
|
}
|
|
settname.insert(number, name);
|
|
settval.insert(number, value);
|
|
settcom.insert(number, "");
|
|
setttab.insert(number, setttab.at(number));
|
|
setttype.insert(number, type);
|
|
settlines.insert(number, settlines.at(number));
|
|
for (int i = number + 1; i < settlines.size(); i++) settlines[i]++;
|
|
all.insert(settlines.at(number), name + " = " + value + " #" + type);
|
|
stream->flush();
|
|
if (isFile) file->flush();
|
|
writeAll();
|
|
}
|
|
|
|
|
|
int SettingsReader::numValues() {
|
|
return settval.size();
|
|
}
|
|
|
|
|
|
QString SettingsReader::getValue(int number) {
|
|
return settval.at(number);
|
|
}
|
|
|
|
|
|
QString SettingsReader::getName(int number) {
|
|
return settname.at(number);
|
|
}
|
|
|
|
|
|
QString SettingsReader::getComment(int number) {
|
|
return settcom.at(number);
|
|
}
|
|
|
|
|
|
char SettingsReader::getType(int number) {
|
|
return setttype.at(number)[0].cell();
|
|
}
|
|
|
|
|
|
int SettingsReader::getNumber(const QString & name) {
|
|
for (int i = 0; i < settname.size(); i++) {
|
|
if (settname.at(i) == name) {
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
|
|
void SettingsReader::setValue(int number, const QString & value, bool write) {
|
|
QString tmp = settname.at(number) + " = " + value + " #" + setttype.at(number) + " " + settcom.at(number);
|
|
settval.replace(number, value);
|
|
all.replace(settlines[number], tmp);
|
|
if (write) writeAll();
|
|
}
|
|
|
|
|
|
void SettingsReader::setValue(const QString & name, const QString & value, bool write) {
|
|
int number = getNumber(name);
|
|
if (number == -1) return;
|
|
QString tmp = settname.at(number) + " = " + value + " #" + setttype.at(number) + " " + settcom.at(number);
|
|
settval.replace(number, value);
|
|
all.replace(settlines[number], tmp);
|
|
if (write) writeAll();
|
|
}
|
|
|
|
|
|
void SettingsReader::setName(int number, const QString & name) {
|
|
QString tmp = name + " = " + settval.at(number) + " #" + setttype.at(number) + " " + settcom.at(number);
|
|
settname.replace(number, name);
|
|
all.replace(settlines[number], tmp);
|
|
writeAll();
|
|
}
|
|
|
|
|
|
void SettingsReader::setType(int number, const QString & type) {
|
|
QString tmp = settname.at(number) + " = " + settval.at(number) + " #" + type + " " + settcom.at(number);
|
|
setttype.replace(number, type);
|
|
all.replace(settlines[number], tmp);
|
|
writeAll();
|
|
}
|
|
|
|
|
|
void SettingsReader::setComment(int number, const QString & comment) {
|
|
QString tmp = settname.at(number) + " = " + settval.at(number) + " #" + setttype.at(number) + " " + comment;
|
|
settcom.replace(number, comment);
|
|
all.replace(settlines[number], tmp);
|
|
writeAll();
|
|
}
|
|
|
|
|
|
void SettingsReader::deleteLine(const QString & name) {
|
|
bool exist = false;
|
|
int i;
|
|
for (i = 0; i < settname.size(); i++) {
|
|
if (settname.at(i) == name) {
|
|
exist = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!exist) return;
|
|
deleteLine(i);
|
|
}
|
|
|
|
|
|
void SettingsReader::deleteLine(int number) {
|
|
settname.remove(number);
|
|
settval.remove(number);
|
|
settcom.remove(number);
|
|
setttab.remove(number);
|
|
setttype.remove(number);
|
|
all.remove(settlines[number]);
|
|
for (int i = number; i < settlines.size(); i++) settlines[i]--;
|
|
settlines.remove(number);
|
|
writeAll();
|
|
}
|
|
|
|
|
|
void SettingsReader::writeAll() {
|
|
if (isFile) file->resize(0);
|
|
else *str = "";
|
|
stream->seek(0);
|
|
int c = 0;
|
|
for (int i = 0; i < all.size(); i++) {
|
|
if (c < settlines.size() && c < setttab.size()) {
|
|
if (settlines[c] == i) {
|
|
*stream << setttab.at(c);
|
|
c++;
|
|
}
|
|
}
|
|
*stream << all.at(i) << endl;
|
|
}
|
|
if (isFile) file->flush();
|
|
readAll();
|
|
}
|
|
|
|
|
|
void SettingsReader::readAll() {
|
|
settname.clear();
|
|
settval.clear();
|
|
settcom.clear();
|
|
setttab.clear();
|
|
settlines.clear();
|
|
setttype.clear();
|
|
all.clear();
|
|
if (isFile) file->flush();
|
|
parse();
|
|
}
|
|
|
|
|
|
void SettingsReader::parse() {
|
|
QString str, tab, comm;
|
|
int ind, sind;
|
|
stream->seek(0);
|
|
lines = 0;
|
|
if (isFile) if (!file->exists()) return;
|
|
while (!stream->atEnd()) {
|
|
str = stream->readLine();
|
|
tab = str.left(str.indexOf(str.trimmed().left(1)));
|
|
str = str.trimmed();
|
|
all.append(str);
|
|
ind = str.indexOf('=');
|
|
if ((ind > 0) && !(str.left(1) == "#")) {
|
|
sind = str.indexOf('#');
|
|
if (sind > 0) {
|
|
comm = str.right(str.length() - sind - 1).trimmed();
|
|
setttype.append(comm.left(1));
|
|
comm = comm.right(comm.length() - 1).trimmed();
|
|
settcom.append(comm);
|
|
str.truncate(sind);
|
|
} else {
|
|
setttype.append("s");
|
|
settcom.append("");
|
|
}
|
|
settname.append((str.left(ind)).trimmed());
|
|
settval.append((str.right(str.length() - ind - 1)).trimmed());
|
|
setttab.append(tab);
|
|
settlines.push_back(lines);
|
|
}
|
|
lines++;
|
|
}
|
|
}
|