insilmaril@139: #include insilmaril@139: insilmaril@0: #include insilmaril@0: #include insilmaril@164: #include insilmaril@0: insilmaril@0: #include "misc.h" insilmaril@0: insilmaril@129: QString qpointToString (const QPoint &p) insilmaril@129: { insilmaril@129: return "(" + QString("%1").arg(p.x()) +","+ QString ("%1").arg (p.y()) +")"; insilmaril@129: } insilmaril@0: insilmaril@0: ostream &operator<< (ostream &stream, QPoint const &p) insilmaril@0: { insilmaril@129: return (stream << qpointToString(p) ); insilmaril@0: } insilmaril@0: insilmaril@0: float getAngle(const QPoint &p) insilmaril@0: { insilmaril@0: // Calculate angle of vector to y-axis insilmaril@0: if (p.y()==0) insilmaril@0: { insilmaril@0: if (p.x()>=0) insilmaril@0: return M_PI_2; insilmaril@0: else insilmaril@0: return 3* M_PI_2; insilmaril@0: } else insilmaril@0: { insilmaril@0: if (p.y()>0) insilmaril@0: return (float)(M_PI - atan ( (double)(p.x()) / (double)(p.y()) ) ); insilmaril@0: else insilmaril@0: if (p.x()<0) insilmaril@0: return (float)( 2*M_PI - atan ( (double)(p.x()) / (double)(p.y()) ) ); insilmaril@0: else insilmaril@0: return (float)( - atan ( (double)(p.x()) / (double)(p.y()) ) ); insilmaril@0: } insilmaril@0: } insilmaril@0: insilmaril@0: QPoint normalise(const QPoint &p) insilmaril@0: { insilmaril@0: // Calculate normalised position (fixed length) insilmaril@0: insilmaril@0: double px=p.x(); insilmaril@0: double py=p.y(); insilmaril@0: double x; insilmaril@0: double y; insilmaril@0: double r=150; insilmaril@0: insilmaril@0: if (px==0) insilmaril@0: { insilmaril@0: x=0; insilmaril@0: if (py>=0) insilmaril@0: y=r; insilmaril@0: else insilmaril@0: y=-r; insilmaril@0: } else insilmaril@0: { insilmaril@0: double sign; insilmaril@0: double a; insilmaril@0: if (px>0) insilmaril@0: sign=1; insilmaril@0: else insilmaril@0: sign=-1; insilmaril@0: insilmaril@0: a=atan (py / px); insilmaril@0: x=cos (a) * r *sign; insilmaril@0: y=sin (a) * r *sign; insilmaril@0: } insilmaril@0: return QPoint ((int) (x),(int) (y)); insilmaril@0: } insilmaril@0: insilmaril@0: QString maskPath(QString p) insilmaril@0: { insilmaril@0: // Change " " to "\ " to enable blanks in filenames insilmaril@0: p=p.replace(QChar('&'),"\\&"); insilmaril@0: return p.replace(QChar(' '),"\\ "); insilmaril@0: } insilmaril@0: insilmaril@0: QString convertToRel (const QString &src, const QString &dst) insilmaril@0: { insilmaril@0: QString s=src; insilmaril@0: QString d=dst; insilmaril@0: int i; insilmaril@0: insilmaril@158: if (s==d) insilmaril@0: { insilmaril@158: // Special case, we just need the name of the file, insilmaril@158: // not the complete path insilmaril@158: i=d.findRev ("/"); insilmaril@158: d=d.right (d.length()-i-1); insilmaril@158: } else insilmaril@0: { insilmaril@158: // Find relative path from src to dst insilmaril@0: insilmaril@158: // Remove the first "/" insilmaril@158: if (s.section ("/",0,0).isEmpty()) insilmaril@0: { insilmaril@158: s=s.right (s.length()-1); insilmaril@158: d=d.right (d.length()-1); insilmaril@158: } insilmaril@158: insilmaril@158: // remove identical left parts insilmaril@158: while (s.section("/",0,0) == d.section("/",0,0) ) insilmaril@158: { insilmaril@158: i=s.find ("/"); insilmaril@158: s=s.right (s.length()-i-1); insilmaril@158: d=d.right (d.length()-i-1); insilmaril@158: } insilmaril@158: insilmaril@158: int srcsep=s.contains("/"); insilmaril@158: int dstsep=d.contains("/"); insilmaril@158: if (srcsep >= dstsep ) insilmaril@158: { insilmaril@158: // find path to go up first and then back to dst insilmaril@158: i=1; insilmaril@158: while (i<=srcsep) insilmaril@158: { insilmaril@158: d="../"+d; insilmaril@158: i++; insilmaril@158: } insilmaril@158: } insilmaril@158: } insilmaril@0: return d; insilmaril@0: } insilmaril@0: insilmaril@164: QString makeUniqueDir (QString s) insilmaril@164: { insilmaril@164: char *p; insilmaril@164: int bytes=s.length(); insilmaril@164: p=(char*) malloc (bytes+1); insilmaril@164: int i; insilmaril@164: for (i=0;ifileName() != "." && fi->fileName() != ".." ) insilmaril@163: { insilmaril@163: if ( !d.cd(fi->fileName()) ) insilmaril@163: qWarning ("removeDir() cannot find the directory "+fi->fileName()); insilmaril@163: else insilmaril@163: { insilmaril@163: // Recursively remove subdirs insilmaril@163: removeDir (d); insilmaril@163: d.cdUp(); insilmaril@163: } insilmaril@163: } insilmaril@163: ++itdir; insilmaril@163: } insilmaril@163: // Traverse files insilmaril@163: d.setFilter( QDir::Files| QDir::Hidden | QDir::NoSymLinks ); insilmaril@163: const QFileInfoList *filelist = d.entryInfoList(); insilmaril@163: QFileInfoListIterator itfile( *filelist ); insilmaril@163: insilmaril@163: while ( (fi = itfile.current()) != 0 ) insilmaril@163: { insilmaril@163: QFile (fi->filePath()).remove(); insilmaril@163: insilmaril@163: ++itfile; insilmaril@163: } insilmaril@163: insilmaril@163: if (!d.rmdir(d.path())) insilmaril@163: qWarning ("removeDir("+d.path()+") failed!"); insilmaril@163: } insilmaril@163: insilmaril@166: void makeSubDirs (const QString &s) insilmaril@166: { insilmaril@166: QDir d(s); insilmaril@166: d.mkdir(s); insilmaril@166: d.mkdir ("images"); insilmaril@166: d.mkdir ("flags"); insilmaril@166: } insilmaril@166: insilmaril@0: // returns masked "<" ">" "&" insilmaril@0: QString quotemeta(const QString &s) insilmaril@0: { insilmaril@0: QString r=s; insilmaril@0: QRegExp rx("&(?!amp;)"); insilmaril@0: r.replace ( rx,"&"); insilmaril@0: rx.setPattern( ">"); insilmaril@0: r.replace ( rx,">"); insilmaril@0: rx.setPattern( "<"); insilmaril@0: r.replace ( rx,"<"); insilmaril@0: rx.setPattern( "\""); insilmaril@0: r.replace ( rx,"""); insilmaril@0: return r; insilmaril@0: } insilmaril@0: insilmaril@0: int max(int a, int b) insilmaril@0: { insilmaril@0: if (a>b) insilmaril@0: return a; insilmaril@0: return b; insilmaril@0: } insilmaril@0: insilmaril@0: int xmlObj::actindent=0; // make instance of actindent insilmaril@0: insilmaril@0: xmlObj::xmlObj() insilmaril@0: { insilmaril@0: indentwidth=4; insilmaril@0: } insilmaril@0: insilmaril@0: insilmaril@0: // returns insilmaril@0: QString xmlObj::singleElement(QString s, QString at) insilmaril@0: { insilmaril@0: return indent() + "<" + s +" " + at +" " + "/>\n"; insilmaril@0: } insilmaril@0: insilmaril@0: // returns insilmaril@0: QString xmlObj::beginElement(QString s) insilmaril@0: { insilmaril@0: return indent() + "<" + s + ">\n"; insilmaril@0: } insilmaril@0: insilmaril@0: // returns insilmaril@0: QString xmlObj::beginElement(QString s, QString at) insilmaril@0: { insilmaril@0: return indent() + "<" + s + " " + at + ">\n"; insilmaril@0: } insilmaril@0: insilmaril@0: // returns insilmaril@0: QString xmlObj::endElement(QString s) insilmaril@0: { insilmaril@0: return indent() + "\n"; insilmaril@0: } insilmaril@0: insilmaril@0: // returns at="val" insilmaril@0: QString xmlObj::attribut(QString at, QString val) insilmaril@0: { insilmaril@0: return " " + at + "=\"" + quotemeta (val) + "\""; insilmaril@0: } insilmaril@0: insilmaril@0: // returns val insilmaril@0: QString xmlObj::valueElement(QString el, QString val) insilmaril@0: { insilmaril@0: return indent() + "<" + el + ">" + quotemeta(val) + "\n"; insilmaril@0: } insilmaril@0: insilmaril@0: // returns val insilmaril@0: QString xmlObj::valueElement(QString el, QString val, QString at) insilmaril@0: { insilmaril@0: return indent() + "<" + el + " " + at + ">" + quotemeta(val) + "\n"; insilmaril@0: } insilmaril@0: insilmaril@0: void xmlObj::incIndent() insilmaril@0: { insilmaril@0: actindent++; insilmaril@0: } insilmaril@0: insilmaril@0: void xmlObj::decIndent() insilmaril@0: { insilmaril@0: actindent--; insilmaril@0: if (actindent<0) actindent=0; insilmaril@0: } insilmaril@0: insilmaril@0: QString xmlObj::indent() insilmaril@0: { insilmaril@0: QString s; insilmaril@0: int i; insilmaril@0: for (i=0; imax_w) insilmaril@0: { insilmaril@0: r=max_w / pix.width(); insilmaril@104: pix.resize(qRound(pix.width()*r), qRound(pix.height()*r)); insilmaril@0: // TODO not a resize, but a shrink/enlarge is needed here... insilmaril@0: } insilmaril@0: if (pix.height()>max_h) insilmaril@0: { insilmaril@0: r=max_h / pix.height(); insilmaril@104: pix.resize(qRound(pix.width()*r), qRound(pix.height()*r)); insilmaril@0: // TODO not a resize, but a shrink/enlarge is needed here... insilmaril@0: } insilmaril@0: setPixmap( pix ); insilmaril@0: } insilmaril@0: } insilmaril@0: