Files
aliendefender/settreader.cpp
buull 5318650e91 Core is realy wait for work and test
Aliens create, wavetrace work, towers build, aliens move - thats all by
now.
I think it is time to write Graphic and Network modules.
2010-07-30 01:25:49 +04:00

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++;
}
}