misc.cpp
author insilmaril
Mon, 12 Sep 2005 19:52:51 +0000
changeset 163 30b22f7bd009
parent 158 a33a2bdd8299
child 164 d442a66e9121
permissions -rw-r--r--
1.7.5 Multiple undos, LaTeX Export (experimental)
     1 #include <math.h>
     2 
     3 #include <qregexp.h>
     4 #include <qpoint.h>
     5 
     6 #include "misc.h"
     7 
     8 QString qpointToString (const QPoint &p)
     9 {
    10 	return "(" + QString("%1").arg(p.x()) +","+ QString ("%1").arg (p.y()) +")";
    11 }
    12 
    13 ostream &operator<< (ostream &stream, QPoint const &p)
    14 { 
    15     return (stream << qpointToString(p) );
    16 }
    17 
    18 float getAngle(const QPoint &p)
    19 {	
    20 	// Calculate angle of vector to y-axis
    21 	if (p.y()==0)
    22 	{
    23 		if (p.x()>=0)
    24 			return M_PI_2;
    25 		else
    26 			return 3* M_PI_2;
    27 	} else
    28 	{
    29 		if (p.y()>0) 
    30 			return (float)(M_PI  - atan ( (double)(p.x()) / (double)(p.y()) ) );
    31 		else	
    32 			if (p.x()<0)
    33 				return (float)( 2*M_PI - atan ( (double)(p.x()) / (double)(p.y()) ) );
    34 			else	
    35 				return (float)( - atan ( (double)(p.x()) / (double)(p.y()) ) );
    36 	}	
    37 }
    38 
    39 QPoint normalise(const QPoint &p)
    40 {	
    41 	// Calculate normalised position (fixed length) 
    42 
    43 	double px=p.x();
    44 	double py=p.y();
    45 	double x;
    46 	double y;
    47 	double r=150;
    48 
    49 	if (px==0)
    50 	{
    51 		x=0;
    52 		if (py>=0)
    53 			y=r;
    54 		else
    55 			y=-r;
    56 	} else
    57 	{
    58 		double sign;
    59 		double a;
    60 		if (px>0) 
    61 			sign=1; 
    62 		else 
    63 			sign=-1;
    64 		
    65 		a=atan (py / px);
    66 		x=cos (a) * r *sign;
    67 		y=sin (a) * r *sign;
    68 	}	
    69 	return QPoint ((int) (x),(int) (y));
    70 }
    71 
    72 QString maskPath(QString p)
    73 {
    74 	// Change " " to "\ " to enable blanks in filenames
    75 	p=p.replace(QChar('&'),"\\&");
    76 	return p.replace(QChar(' '),"\\ ");
    77 }
    78 
    79 QString convertToRel (const QString &src, const QString &dst)
    80 {
    81 	QString s=src;
    82 	QString d=dst;
    83 	int i;
    84 
    85 	if (s==d) 
    86 	{
    87 		// Special case, we just need the name of the file,
    88 		// not the complete path
    89 		i=d.findRev ("/");
    90 		d=d.right (d.length()-i-1);
    91 	} else
    92 	{
    93 		// Find relative path from src to dst
    94 
    95 		// Remove the first "/"
    96 		if (s.section ("/",0,0).isEmpty()) 
    97 		{
    98 			s=s.right (s.length()-1);
    99 			d=d.right (d.length()-1);
   100 		}
   101 		
   102 		// remove identical left parts
   103 		while (s.section("/",0,0) == d.section("/",0,0) ) 
   104 		{
   105 			i=s.find ("/");
   106 			s=s.right (s.length()-i-1);
   107 			d=d.right (d.length()-i-1);
   108 		}
   109 
   110 		int srcsep=s.contains("/");
   111 		int dstsep=d.contains("/");
   112 		if (srcsep >=  dstsep )
   113 		{
   114 			// find path to go up first and then back to dst
   115 			i=1;
   116 			while (i<=srcsep) 
   117 			{
   118 				d="../"+d;
   119 				i++;
   120 			}	
   121 		}
   122 	}	
   123 	return d;
   124 }
   125 
   126 void removeDir(QDir d)
   127 {
   128 	// Traverse directories
   129 	d.setFilter( QDir::Dirs| QDir::Hidden | QDir::NoSymLinks );
   130 	const QFileInfoList *dirlist = d.entryInfoList();
   131 	QFileInfoListIterator itdir( *dirlist );
   132 	QFileInfo *fi;
   133 
   134 	while ( (fi = itdir.current()) != 0 ) 
   135 	{
   136 		if (fi->fileName() != "." && fi->fileName() != ".." )
   137 		{
   138 			if ( !d.cd(fi->fileName()) ) 
   139 				qWarning ("removeDir() cannot find the directory "+fi->fileName());
   140 			else 
   141 			{
   142 				// Recursively remove subdirs
   143 				removeDir (d);
   144 				d.cdUp();
   145 			}
   146 		}	
   147 		++itdir;
   148 	}		
   149 	// Traverse files
   150 	d.setFilter( QDir::Files| QDir::Hidden | QDir::NoSymLinks );
   151 	const QFileInfoList *filelist = d.entryInfoList();
   152 	QFileInfoListIterator itfile( *filelist );
   153 
   154 	while ( (fi = itfile.current()) != 0 ) 
   155 	{
   156 		QFile (fi->filePath()).remove();
   157 		
   158 		++itfile;
   159 	}	
   160 
   161 	if (!d.rmdir(d.path()))
   162 		qWarning ("removeDir("+d.path()+") failed!");
   163 }		
   164 
   165 // returns masked "<" ">" "&"
   166 QString quotemeta(const QString &s)
   167 {
   168 	QString r=s;
   169     QRegExp  rx("&(?!amp;)");
   170     r.replace ( rx,"&amp;");
   171     rx.setPattern( ">");
   172     r.replace ( rx,"&gt;");
   173     rx.setPattern( "<");
   174     r.replace ( rx,"&lt;");
   175     rx.setPattern( "\"");
   176     r.replace ( rx,"&quot;");
   177     return r;
   178 }
   179 
   180 int max(int a, int b)
   181 {
   182 	if (a>b)
   183 		return a;
   184 	return b;
   185 }
   186 
   187 int xmlObj::actindent=0;		// make instance of actindent
   188 
   189 xmlObj::xmlObj()
   190 {
   191     indentwidth=4;
   192 }
   193 
   194 
   195 // returns <s at />
   196 QString xmlObj::singleElement(QString s, QString at)
   197 {
   198     return indent() + "<" + s +" " + at +" " + "/>\n";
   199 }
   200 
   201 // returns <s>
   202 QString xmlObj::beginElement(QString s)
   203 {
   204     return indent() + "<" + s + ">\n";
   205 }
   206 
   207 // returns <s at>
   208 QString xmlObj::beginElement(QString s, QString at)
   209 {
   210     return indent() + "<" + s + " " + at + ">\n";
   211 }
   212 
   213 // returns </s>
   214 QString xmlObj::endElement(QString s)
   215 {
   216     return indent() + "</" + s + ">\n";
   217 }
   218 
   219 // returns  at="val"
   220 QString xmlObj::attribut(QString at, QString val)
   221 {
   222     return " " + at + "=\"" + quotemeta (val) + "\""; 
   223 }
   224 
   225 // returns <s> val </s>
   226 QString xmlObj::valueElement(QString el, QString val)
   227 {
   228     return indent() + "<" + el + ">" + quotemeta(val) + "</" +el + ">\n";
   229 }
   230 
   231 // returns <s at> val </s>
   232 QString xmlObj::valueElement(QString el, QString val, QString at)
   233 {
   234     return indent() + "<" + el + " " + at + ">" + quotemeta(val) + "</" +el + ">\n";
   235 }
   236 
   237 void xmlObj::incIndent()
   238 {
   239     actindent++;
   240 }	
   241 
   242 void xmlObj::decIndent()
   243 {
   244     actindent--;
   245     if (actindent<0) actindent=0;
   246 }	
   247 
   248 QString xmlObj::indent()
   249 {
   250     QString s;
   251     int i;
   252     for (i=0; i<actindent*indentwidth; i++)
   253     {
   254 		s= s + " ";
   255     }
   256     return s;
   257 }	
   258 
   259 
   260 
   261 ImagePreview::ImagePreview (QWidget *parent=0): QLabel (parent)
   262 {
   263 }
   264 
   265 void ImagePreview::previewUrl( const QUrl &u )
   266 {
   267     QString path = u.path();
   268     QPixmap pix( path );
   269     if ( pix.isNull() )
   270         setText( QObject::tr("This is not an image.") );
   271     else
   272 	{
   273 		float max_w=300;
   274 		float max_h=300;
   275 		float r;
   276 		if (pix.width()>max_w)
   277 		{
   278 			r=max_w / pix.width();
   279 			pix.resize(qRound(pix.width()*r), qRound(pix.height()*r));
   280 			// TODO not a resize, but a shrink/enlarge is needed here...
   281 		}
   282 		if (pix.height()>max_h)
   283 		{
   284 			r=max_h / pix.height();
   285 			pix.resize(qRound(pix.width()*r), qRound(pix.height()*r));
   286 			// TODO not a resize, but a shrink/enlarge is needed here...
   287 		}
   288         setPixmap( pix );
   289 	}	
   290 }
   291