Fl_File_Chooser was slow with large directories (STR #654)

FL/Fl_File_Browser.H:
    - Don't reload the directory view unless asked to.

FL/Fl_File_Chooser.H:
    - Rebuilt using current FLUID.

src/Fl_File_Browser.cxx:
    - Don't reload the directory view unless asked to.

src/Fl_File_Chooser.cxx:
    - Fl_File_Chooser::show() calls rescan().

src/Fl_File_Chooser.fl:
    - Fl_File_Chooser::show() calls rescan().

src/Fl_File_Chooser2.cxx:
    - Only call rescan() when chooser is shown.

src/Fl_File_Icon.cxx:
    - Add optimization for Windows - filenames with trailing slash are
      directories.

test/file_chooser.cxx:
    - Only call show() once...



git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@4010 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Michael R Sweet 2005-02-05 18:26:21 +00:00
parent b601fdc3bc
commit 3124794f1f
9 changed files with 49 additions and 43 deletions

View File

@ -1,5 +1,7 @@
CHANGES IN FLTK 1.1.7
- Fl_File_Chooser was slow with large directories (STR
#654)
- FLUID didn't add xclass() calls to windows (STR #718)
- The X11 DND code did not correctly select a text
format for incoming data (STR #711)

View File

@ -1,5 +1,5 @@
//
// "$Id: Fl_File_Browser.H,v 1.1.2.7 2004/04/11 04:38:54 easysw Exp $"
// "$Id$"
//
// FileBrowser definitions.
//
@ -69,11 +69,11 @@ public:
void textsize(uchar s) { Fl_Browser::textsize(s); iconsize_ = (uchar)(3 * s / 2); };
int filetype() const { return (filetype_); };
void filetype(int t) { filetype_ = t; load(directory_); };
void filetype(int t) { filetype_ = t; };
};
#endif // !_Fl_File_Browser_H_
//
// End of "$Id: Fl_File_Browser.H,v 1.1.2.7 2004/04/11 04:38:54 easysw Exp $".
// End of "$Id$".
//

View File

@ -1,4 +1,4 @@
// generated by Fast Light User Interface Designer (fluid) version 1.0105
// generated by Fast Light User Interface Designer (fluid) version 1.0107
#ifndef Fl_File_Chooser_H
#define Fl_File_Chooser_H

View File

@ -1,5 +1,5 @@
//
// "$Id: Fl_File_Browser.cxx,v 1.1.2.28 2004/04/11 04:38:57 easysw Exp $"
// "$Id$"
//
// Fl_File_Browser routines.
//
@ -584,34 +584,31 @@ Fl_File_Browser::load(const char *directory,// I - Directory to load
if (num_files <= 0)
return (0);
for (i = 0, num_dirs = 0; i < num_files; i ++)
{
for (i = 0, num_dirs = 0; i < num_files; i ++) {
if (strcmp(files[i]->d_name, ".") &&
strcmp(files[i]->d_name, "./"))
{
strcmp(files[i]->d_name, "./")) {
snprintf(filename, sizeof(filename), "%s/%s", directory_,
files[i]->d_name);
#if defined(WIN32) && !defined(__CYGWIN__)
if (files[i]->d_name[strlen(files[i]->d_name) - 1] == '/')
{
icon = Fl_File_Icon::find(filename);
if (icon->type() == Fl_File_Icon::DIRECTORY) {
num_dirs ++;
insert(num_dirs, files[i]->d_name, Fl_File_Icon::find(filename));
}
#if defined(WIN32) && !defined(__CYGWIN__)
// WIN32 already has the trailing slash... :)
insert(num_dirs, files[i]->d_name, icon);
#else
if (fl_filename_isdir(filename))
{
// Add a trailing slash to directory names...
char name[1024]; // Temporary directory name
snprintf(name, sizeof(name), "%s/", files[i]->d_name);
num_dirs ++;
insert(num_dirs, name, Fl_File_Icon::find(filename));
}
insert(num_dirs, name, icon);
#endif // WIN32 && !__CYGWIN__
else if (filetype_ == FILES &&
fl_filename_match(files[i]->d_name, pattern_))
add(files[i]->d_name, Fl_File_Icon::find(filename));
} else if (filetype_ == FILES &&
fl_filename_match(files[i]->d_name, pattern_)) {
add(files[i]->d_name, icon);
}
}
free(files[i]);
@ -636,12 +633,9 @@ Fl_File_Browser::filter(const char *pattern) // I - Pattern string
pattern_ = pattern;
else
pattern_ = "*";
// Reload the current directory...
load(directory_);
}
//
// End of "$Id: Fl_File_Browser.cxx,v 1.1.2.28 2004/04/11 04:38:57 easysw Exp $".
// End of "$Id$".
//

View File

@ -1,4 +1,4 @@
// generated by Fast Light User Interface Designer (fluid) version 1.0105
// generated by Fast Light User Interface Designer (fluid) version 1.0107
#include "../FL/Fl_File_Chooser.H"
@ -317,6 +317,7 @@ const char * Fl_File_Chooser::label() {
void Fl_File_Chooser::show() {
window->hotspot(fileList);
window->show();
rescan();
fileName->take_focus();
}

View File

@ -1,5 +1,5 @@
# data file for the Fltk User Interface Designer (fluid)
version 1.0105
version 1.0107
header_name {../FL/Fl_File_Chooser.H}
code_name {.cxx}
class FL_EXPORT Fl_File_Chooser {open
@ -107,7 +107,7 @@ window->hide();} open
if (callback_)
(*callback_)(this, data_);
window->hide();} selected
window->hide();}
private xywh {300 345 85 25}
code0 {\#include <FL/fl_ask.H>}
code1 {okButton->label(fl_ok);}
@ -245,11 +245,13 @@ showChoiceCB();} {}
}
decl {void rescan();} {public
}
Function {show()} {return_type void
Function {show()} {open return_type void
} {
code {window->hotspot(fileList);
window->show();
fileName->take_focus();} {}
rescan();
fileName->take_focus();} {selected
}
}
Function {shown()} {return_type int
} {

View File

@ -1,5 +1,5 @@
//
// "$Id: Fl_File_Chooser2.cxx,v 1.1.2.38 2004/09/07 20:59:16 easysw Exp $"
// "$Id$"
//
// More Fl_File_Chooser routines.
//
@ -196,9 +196,11 @@ Fl_File_Chooser::directory(const char *d)// I - Directory to change to
else
directory_[0] = '\0';
if (shown()) {
// Rescan the directory...
rescan();
}
}
//
@ -834,8 +836,12 @@ Fl_File_Chooser::showChoiceCB()
}
fileList->filter(pattern_);
if (shown()) {
// Rescan the directory...
rescan();
}
}
//
@ -1160,5 +1166,5 @@ unquote_pathname(char *dst, // O - Destination string
//
// End of "$Id: Fl_File_Chooser2.cxx,v 1.1.2.38 2004/09/07 20:59:16 easysw Exp $".
// End of "$Id$".
//

View File

@ -1,5 +1,5 @@
//
// "$Id: Fl_File_Icon.cxx,v 1.1.2.17 2004/06/14 15:58:52 easysw Exp $"
// "$Id$"
//
// Fl_File_Icon routines.
//
@ -194,7 +194,9 @@ Fl_File_Icon::find(const char *filename,// I - Name of file */
if (filetype == ANY)
{
#ifdef WIN32
if (fl_filename_isdir(filename))
if (filename[strlen(filename) - 1] == '/')
filetype = DIRECTORY;
else if (fl_filename_isdir(filename))
filetype = DIRECTORY;
else
filetype = PLAIN;
@ -477,5 +479,5 @@ Fl_File_Icon::labeltype(const Fl_Label *o, // I - Label data
//
// End of "$Id: Fl_File_Icon.cxx,v 1.1.2.17 2004/06/14 15:58:52 easysw Exp $".
// End of "$Id$".
//

View File

@ -1,5 +1,5 @@
//
// "$Id: file_chooser.cxx,v 1.4.2.3.2.11 2004/04/11 04:39:01 easysw Exp $"
// "$Id$"
//
// File chooser test program.
//
@ -307,7 +307,6 @@ show_callback(void)
char relative[1024]; // Relative filename
fc->show();
if (filter->value()[0])
fc->filter(filter->value());
@ -338,5 +337,5 @@ show_callback(void)
//
// End of "$Id: file_chooser.cxx,v 1.4.2.3.2.11 2004/04/11 04:39:01 easysw Exp $".
// End of "$Id$".
//