View Issue Details

IDProjectCategoryView StatusLast Update
0002214ScribusInternalpublic2005-08-25 20:08
Reporterjghali Assigned Toringerc 
PrioritynormalSeverityminorReproducibilityalways
Status closedResolutionfixed 
PlatformWindowsOSWindowsOS Version2000 SP4
Product Version1.3.0cvs 
Fixed in Version1.3.0cvs 
Summary0002214: Platform independent implementation of PicStatus
DescriptionThe proposed patch remove the need of piped (popen, pclose...) by implementing recursive file search using QDir.
 
For now, on win32, the SearchPic() function use "home" directory ( ex: C:\Documents and Settings\user_name ) for searching pictures. Use of MyDocuments folder would be certainly better, but in my opinion, on Windows, there's no real reason to use a particular directory for performing search as users tend to use quite often files completely outside "home" directory. So on Windows, just showing the file search dialog is maybe a better option ...
TagsNo tags attached.
Patch

Relationships

related to 0002046 closedringerc Scribus appears to lock up when using Manage Pictures "Search" function 
child of 0000015 closedjghali Windows Port 

Activities

2005-07-09 23:03

 

picstatus_platf_indep_13x.diff (2,492 bytes)   
Index: picstatus.cpp
===================================================================
RCS file: /cvs/Scribus/scribus/picstatus.cpp,v
retrieving revision 1.12.2.8
diff -u -r1.12.2.8 picstatus.cpp
--- picstatus.cpp	14 Jun 2005 12:35:53 -0000	1.12.2.8
+++ picstatus.cpp	10 Jul 2005 00:35:18 -0000
@@ -216,6 +216,7 @@
  \param None
  \retval None
  */
+
 void PicStatus::SearchPic()
 {
 	uint ZNr = QString(sender()->name()).toUInt();
@@ -227,13 +228,8 @@
 	qApp->setOverrideCursor(QCursor(waitCursor), true);
 	qApp->processEvents();
 	QString home = QDir::homeDirPath();
-	FILE *fp = popen("find "+home+" -name " + BildNam, "r");
 	qApp->setOverrideCursor(QCursor(arrowCursor), true);
-	if (fp == NULL)
-		return;
-	QTextStream ts(fp, IO_ReadOnly);
-	QString tmp = ts.read();
-	Pfade = QStringList::split("\n", tmp);
+	findFile( home, BildNam, Pfade);
 	if (Pfade.count() > 1)
 	{
 		PicSearch *dia = new PicSearch(this, BildNam, Pfade);
@@ -298,7 +294,42 @@
 			view->DrawNew();
 		}
 	}
-	pclose(fp);
+}
+
+void PicStatus::findFile( QString dirName, QString fileName, QStringList& fileList, bool init)
+{
+	if( init ) 
+		fileList.clear();
+
+	// Search file in specified dir;
+	QDir df( dirName, fileName, QDir::Name, QDir::Files | QDir::Readable | QDir::NoSymLinks );
+	if( df.exists() )
+	{
+		if( df.count() > 0 )
+		{
+			for( unsigned int i = 0; i < df.count(); i++ )
+			{
+				fileList.push_back( df[i] );
+			}
+		}
+	}
+
+	// Search file in sub-directories
+	QDir dd( dirName, "*", QDir::Name, QDir::Dirs | QDir::Readable | QDir::NoSymLinks );
+	if( dd.exists() )
+	{
+		if( dd.count() > 0 )
+		{
+			for( unsigned int j = 0; j < dd.count(); j++ )
+			{
+				QString subdir = dd[j];
+				if( subdir == "." || subdir == "..") 
+					continue; 
+				subdir = dirName + "/" + subdir;
+				findFile( subdir, fileName, fileList, false);
+			}
+		}
+	}
 }
 
 /*!
Index: picstatus.h
===================================================================
RCS file: /cvs/Scribus/scribus/picstatus.h,v
retrieving revision 1.2.2.3
diff -u -r1.2.2.3 picstatus.h
--- picstatus.h	4 May 2005 23:27:10 -0000	1.2.2.3
+++ picstatus.h	9 Jul 2005 23:52:07 -0000
@@ -40,6 +40,8 @@
     QVBoxLayout* PicStatusLayout;
     QHBoxLayout* Layout2;
 
+	void findFile( QString dirName, QString fileName, QStringList& fileList, bool init = true);
+
 signals:
 	void selectPage(int);
 	void selectMasterPage(QString);


picstatus_platf_indep_13x.diff (2,492 bytes)   

2005-07-09 23:09

 

picstatus_platf_indep_13x_v2.diff (2,442 bytes)   
Index: picstatus.cpp
===================================================================
RCS file: /cvs/Scribus/scribus/picstatus.cpp,v
retrieving revision 1.12.2.8
diff -u -r1.12.2.8 picstatus.cpp
--- picstatus.cpp	14 Jun 2005 12:35:53 -0000	1.12.2.8
+++ picstatus.cpp	10 Jul 2005 01:05:31 -0000
@@ -216,6 +216,7 @@
  \param None
  \retval None
  */
+
 void PicStatus::SearchPic()
 {
 	uint ZNr = QString(sender()->name()).toUInt();
@@ -227,13 +228,8 @@
 	qApp->setOverrideCursor(QCursor(waitCursor), true);
 	qApp->processEvents();
 	QString home = QDir::homeDirPath();
-	FILE *fp = popen("find "+home+" -name " + BildNam, "r");
 	qApp->setOverrideCursor(QCursor(arrowCursor), true);
-	if (fp == NULL)
-		return;
-	QTextStream ts(fp, IO_ReadOnly);
-	QString tmp = ts.read();
-	Pfade = QStringList::split("\n", tmp);
+	findFile( home, BildNam, Pfade);
 	if (Pfade.count() > 1)
 	{
 		PicSearch *dia = new PicSearch(this, BildNam, Pfade);
@@ -298,7 +294,38 @@
 			view->DrawNew();
 		}
 	}
-	pclose(fp);
+}
+
+void PicStatus::findFile( QString dirName, QString fileName, QStringList& fileList, bool init)
+{
+	if( init ) 
+		fileList.clear();
+
+	// Search file in specified dir;
+	QDir df( dirName, fileName, QDir::Name, QDir::Files | QDir::Readable | QDir::NoSymLinks );
+	if( !df.exists() ) return;
+	
+	if( df.count() > 0 )
+	{
+		for( unsigned int i = 0; i < df.count(); i++ )
+		{
+			fileList.push_back( df[i] );
+		}
+	}
+
+	// Search file in sub-directories
+	QDir dd( dirName, "*", QDir::Name, QDir::Dirs | QDir::Readable | QDir::NoSymLinks );
+	if( dd.count() > 0 )
+	{
+		for( unsigned int j = 0; j < dd.count(); j++ )
+		{
+			QString subdir = dd[j];
+			if( subdir == "." || subdir == "..") 
+				continue; 
+			subdir = dirName + "/" + subdir;
+			findFile( subdir, fileName, fileList, false);
+		}
+	}
 }
 
 /*!
Index: picstatus.h
===================================================================
RCS file: /cvs/Scribus/scribus/picstatus.h,v
retrieving revision 1.2.2.3
diff -u -r1.2.2.3 picstatus.h
--- picstatus.h	4 May 2005 23:27:10 -0000	1.2.2.3
+++ picstatus.h	9 Jul 2005 23:52:07 -0000
@@ -40,6 +40,8 @@
     QVBoxLayout* PicStatusLayout;
     QHBoxLayout* Layout2;
 
+	void findFile( QString dirName, QString fileName, QStringList& fileList, bool init = true);
+
 signals:
 	void selectPage(int);
 	void selectMasterPage(QString);

jghali

2005-07-09 23:10

administrator   ~0005473

Use picstatus_platf_indep_13x_v2.diff please...

ringerc

2005-07-11 12:39

reporter   ~0005515

That's a recursive implementation. Any idea what the stack limit is or if there's any chance we'll hit it (eg searching eight-bajillion-deep dir trees in the user's Application Data, or dotfiles on UNIX) ?

I might put one together that isn't recursive and is resumable, so it can be done without entirely blocking events.

jghali

2005-07-11 12:48

administrator   ~0005516

Yep, it's a recursive implementation and there is a chance we hit stack limit although I never did. So if you have a non recursive one, it would be a better solution. Anyway I'd like to see it, 'cause I don't have any idea how you can do it the non recursive way...

ringerc

2005-07-11 13:06

reporter   ~0005517

Well, it's a tree search. As far as I know, the three traditional approaches to searching a tree are:

- recurse down the tree depth first
- non-recursive depth-first search
- non-recursive breadth first search

That's pretty much in order of difficulty too, I think. (as for breadth first recursive searching, even thinking about it hurts my poor little brain).

I actually prefer the recursive approach, but in this case there are two issues:

 - C somewhat sucks at recursion, mostly due to the stack limit
 - it's hard to make a recursive search work in small, resumable chunks.

I'd prefer to avoid a hack like using a QTimer to call processEvents(...) while doing the search. With this approach, that'd be necessary just to keep the GUI updating.

Instead, I'd prefer bundling the search into a class that can do the search under the control of the Qt event loop. That way, it's possible to provide a progress dialog and make sure the GUI redraws, so it doesn't look like Scribus has gone into an infinite loop or otherwise become unusable.

I'm going to have a bash at this one. I'll let you know how I go.

By the way, I don't suppose there's any chance of catching you on IRC at some point? Peter Linnell and Craig Bradney have both asked if you use IRC recently.

jghali

2005-07-11 13:09

administrator   ~0005518

>> Peter Linnell and Craig Bradney have both asked if you use IRC recently.

Almost never. I should...

ringerc

2005-07-13 13:10

reporter   ~0005558

An alternate implementation is now in CVS. PicStatus still needs a bunch of work to be nice, but now doesn't block the GUI and is portable.

Issue History

Date Modified Username Field Change
2005-07-09 23:03 jghali New Issue
2005-07-09 23:03 jghali File Added: picstatus_platf_indep_13x.diff
2005-07-09 23:09 jghali File Added: picstatus_platf_indep_13x_v2.diff
2005-07-09 23:10 jghali Note Added: 0005473
2005-07-10 02:50 ringerc Relationship added related to 0002046
2005-07-11 11:57 ringerc Status new => assigned
2005-07-11 11:57 ringerc Assigned To => ringerc
2005-07-11 12:39 ringerc Note Added: 0005515
2005-07-11 12:48 jghali Note Added: 0005516
2005-07-11 13:06 ringerc Note Added: 0005517
2005-07-11 13:09 jghali Note Added: 0005518
2005-07-13 13:10 ringerc Status assigned => resolved
2005-07-13 13:10 ringerc Resolution open => fixed
2005-07-13 13:10 ringerc Note Added: 0005558
2005-07-13 13:12 ringerc Fixed in Version => 1.3.0cvs
2005-07-15 07:38 ringerc Relationship added related to 0000015
2005-07-15 07:41 ringerc Relationship replaced child of 0000015
2005-08-25 20:08 jghali Status resolved => closed