eOSState cPictureControl::ProcessKey(eKeys Key) { switch (Key) { case kUp: case kPlay: slideShowDelay.Set(); slideShow = true; break; case kDown: case kPause: slideShow = false; break; case kLeft|k_Repeat: case kLeft: NextPicture(-1); slideShow = false; break; case kRight|k_Repeat: case kRight: NextPicture(+1); slideShow = false; break; case kOk: if (osd && !alwaysDisplayCaption) DELETENULL(osd); else { alwaysDisplayCaption = !alwaysDisplayCaption; DisplayCaption(); } break; case kGreen: case kPrev: NextDirectory(-1); slideShow = false; break; case kYellow: case kNext: NextDirectory(+1); slideShow = false; break; case kBlue: case kStop: return osEnd; case kBack: slideShow = false; cRemote::CallPlugin(PLUGIN_NAME_I18N); break; default: break; } if (slideShow && slideShowDelay.TimedOut()) { NextPicture(+1); slideShowDelay.Set(SlideShowDelay * 1000); } return osContinue; }
cPictureControl::cPictureControl(cPictureEntry *Pictures, const cPictureEntry *PictureEntry, bool SlideShow) :cControl(player = new cPicturePlayer) { pictures = Pictures; pictureEntry = PictureEntry; osd = NULL; lastPath = "/"; slideShowDelay.Set(SlideShowDelay * 1000); slideShow = SlideShow; alwaysDisplayCaption = false; NextPicture(slideShow && pictureEntry->IsDirectory() ? 1 : 0); active++; }
const cPictureEntry *cPictureEntry::NextPicture(const cPictureEntry *This) const { if (This) { cPictureEntry *pe = (cPictureEntry *)entries->Next(This); if (pe) { if (pe->IsDirectory()) { const cPictureEntry *p = pe->FirstPicture(); if (p) return p; return NextPicture(pe); } return pe; } } else if (IsDirectory()) { const cPictureEntry *p = FirstPicture(); if (p) return p; } if (parent) return parent->NextPicture(this); return NULL; }