3 class PictureFile : struct
5 PictureFile prev, next;
6 char name[MAX_LOCATION];
11 class SlideShow : Window
17 this, delay = Seconds { 2 };
31 anchor = Anchor { 0, 0, 0, 0 };
33 void NextImage(int direction)
37 if(!fileName) fileName = fileNames.first;
40 PictureFile oldFileName = fileName;
41 int oldDirID = fileName.dirID;
42 while(fileName.dirID == oldDirID ||
44 (fileName.prev ? fileName.prev : (PictureFile)fileNames.last).dirID == fileName.dirID))
46 if(Sgn(direction) == 1)
48 fileName = fileName.next;
49 if(!fileName) fileName = fileNames.first;
51 else if(Sgn(direction) == -1)
53 fileName = fileName.prev;
54 if(!fileName) fileName = fileNames.last;
56 if(Abs(direction) == 1) break;
58 if(fileName == oldFileName) break;
63 bitmap.Load(fileName.name, null, displaySystem);
69 int ::Compare(PictureFile a, PictureFile b, void * data)
73 else if(b.dir && !a.dir)
76 return strcmp(a.name, b.name);
79 void AddDirectory(OldList files, char * directory)
81 FileListing listing { directory, "pcx, jpg, bmp, png" };
85 int thisDirID = dirID++;
89 fileName = PictureFile {};
90 strcpy(fileName.name, listing.path);
92 fileName.dir = listing.stats.attribs.isDirectory;
95 list.Sort(Compare, null);
97 for(;(fileName = list.first);)
99 list.Remove(fileName);
103 AddDirectory(files, fileName.name);
109 fileName.dirID = thisDirID;
116 AddDirectory(fileNames, "");
121 void OnRedraw(Surface surface)
123 if(bitmap && bitmap.width)
125 float scale = Min((float)clientSize.w / (float)bitmap.width, (float)clientSize.h / (float)bitmap.height);
126 int w = (int)(bitmap.width * scale);
127 int h = (int)(bitmap.height * scale);
129 surface.Filter(bitmap, (clientSize.w - w) / 2,(clientSize.h - h) / 2, 0,0, w, h, bitmap.width, bitmap.height);
131 // Until Filter / Stretch works with X
132 surface.Blit(bitmap, (clientSize.w - bitmap.width) / 2,(clientSize.h - bitmap.height) / 2, 0,0, bitmap.width, bitmap.height);
137 bool OnKeyHit(Key key, unichar ch)
141 case left: NextImage(-2); break;
142 case right: NextImage(2); break;
143 case pageDown: case down: NextImage(1); break;
144 case pageUp: case up: NextImage(-1); break;
149 bool OnKeyDown(Key key, unichar ch)
153 case escape: Destroy(0); break;
154 case space: direction ^=1; if(direction) timer.Start(); else timer.Stop(); break;
155 case home: fileName = fileNames.first; NextImage(0); break;
156 case end: fileName = fileNames.last; NextImage(0); break;
162 class eShow : GuiApplication
165 SlideShow slideShow {};