2 Copyright 2004-2005 Chris Tallon, Andreas Vogel
4 This file is part of VOMP.
6 VOMP is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 VOMP is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with VOMP. If not, see <https://www.gnu.org/licenses/>.
21 Hints for the directory playing:
22 depending on the configValue directoryMode: none|audio|picture|count
23 it will be decided what to do if a directory is selected with [PLAY]:
24 none: as currently - simply go into
25 audio: start picture viewer and audio, audio on top
26 picture: start picture viewer and audio, picture on top
27 count: count occurence of both types, decide for audio/picture
28 Synchronization is done via the "directoryDone" call,
29 this is issued if the Viewer top engine has finished it's list
31 We will the go back one level and continue
32 Currently we will traverse to new directories only at the beginning
33 or the real end of each dir.
34 This is handled only by playAll (never by getMedia).
35 As we sort always in a way that all directories come first this should be OK.
36 there are 2 situations where we give the user a chance to interrupt (this is handled
37 by starting a 10ms timer and afterwrads sending a PLAYER_EVENT with the timer ref as
39 empty directory found - timer 1 - call directoryDone
40 after changing to a new directory the first entry is again a directory - timer 2 - playAll
42 directoryPlaying: globally set as long as we play a dir, reset on any key press here
43 startLevel: in DirList - set to the level where we started playing, if we are
44 back to this playing is finished
45 configuredDirmode: configured mode
57 #include "vmedialist.h"
59 #include "vmediaview.h"
60 #include "vvideomedia.h"
68 #include "messagequeue.h"
71 #include "mediaplayer.h"
73 #include "localmediafile.h"
74 #include "mediaoptions.h"
77 class MediaListHolder {
79 MediaListHolder(MediaList *l) {
88 Log::getInstance()->log("##MLH",Log::DEBUG,"ref %p now %d",_list,_ref);
92 Log::getInstance()->log("##MLH",Log::DEBUG,"unref %p now %d",_list,_ref);
93 if (_ref == 0) delete this;
96 if (_list) delete _list;
103 class MediaDirectory {
109 MediaListHolder *holder;
111 void setMediaType(ULONG n) {mtype=n;}
112 void setSortorder(int s) {
115 void setSelection(int s) {
121 bool move(ULONG mv) {
122 if (! holder) return false;
124 case VMediaList::MV_NEXT:
125 if (selection < ((int)holder->list()->size() -1)) {
130 case VMediaList::MV_PREV:
140 ULONG getMediaType(){return mtype;}
144 const MediaURI * getURI() {
147 const char * getDisplayName() {
148 if (! uri || ! uri->getDisplayName()) return "/";
149 return uri->getDisplayName();
151 //get the holder (increment refcount)
152 MediaListHolder *getHolder() {
153 if ( !holder) return NULL;
157 //assign a holder to the directory (auto ref)
158 void assignHolder(MediaListHolder *h) {
159 if (holder) holder->unref();
165 //constructor with copy!
166 MediaDirectory(const MediaURI *u) : selection(0),
167 sortorder(0),mtype(MEDIA_TYPE_ALL),holder(NULL){
173 MediaDirectory(MediaDirectory &c) {
174 setSelection(c.getSelection());
175 setMediaType(c.getMediaType());
176 setSortorder(c.getSortorder());
177 uri=new MediaURI(c.getURI());
178 holder=c.getHolder();
182 if (holder) holder->unref();
186 typedef std::vector<MediaDirectory*> MDirList;
196 list.push_back(new MediaDirectory(NULL));
198 DirList(DirList *cp) {
200 for (MDirList::iterator it=cp->list.begin();it<cp->list.end();it++) {
201 list.push_back(new MediaDirectory(*(*it)));
205 list.push_back(new MediaDirectory(NULL));
208 startlevel=cp->startlevel;
209 if (startlevel > current) startlevel=current;
212 MDirList::iterator it;
213 for (it=list.begin();it<list.end();it++) {
217 MediaDirectory *getCurrent() {
218 return list[current];
220 const MediaURI * getURI() {
221 return getCurrent()->getURI();
231 int append(const MediaURI *uri) {
232 if (! uri) return current;
233 MediaDirectory* md=new MediaDirectory(uri);
242 void setStartLevel() {
245 bool isOnStartLevel() {
246 return (startlevel == current);
252 class MediaSorterName
255 bool operator() (const Media* a, const Media* b)
257 if (b->getMediaType() == MEDIA_TYPE_DIR &&
258 a->getMediaType() != MEDIA_TYPE_DIR)
260 if ( b->getMediaType() != MEDIA_TYPE_DIR &&
261 a->getMediaType() == MEDIA_TYPE_DIR)
263 int c = strcmp(b->getFileName(), a->getFileName());
264 if (c > 0) return true;
269 //a sorter with a randomly initialized order
270 class MediaSorterRandom
273 MediaSorterRandom(int start) {
276 bool operator() (const Media* a, const Media* b)
278 if (b->getMediaType() == MEDIA_TYPE_DIR &&
279 a->getMediaType() != MEDIA_TYPE_DIR)
281 if ( b->getMediaType() != MEDIA_TYPE_DIR &&
282 a->getMediaType() == MEDIA_TYPE_DIR)
284 unsigned char suma=sum(a->getFileName(),(unsigned char)mystart);
285 unsigned char sumb=sum(b->getFileName(),(unsigned char)mystart);
286 if (sumb > suma) return true;
290 unsigned char sum(const char *name,unsigned char start) {
291 for (;*name!=0;name++) start=start ^ (unsigned char)*name;
298 struct MediaSorterTime
300 bool operator() (const Media* a, const Media* b)
302 if (b->getMediaType() == MEDIA_TYPE_DIR &&
303 a->getMediaType() != MEDIA_TYPE_DIR)
305 if ( b->getMediaType() != MEDIA_TYPE_DIR &&
306 a->getMediaType() == MEDIA_TYPE_DIR)
308 if (b->getTime()>a->getTime()) return true;
314 VMediaList::VMediaList()
316 boxstack = BoxStack::getInstance();
318 Log::getInstance()->log("VMediaList::VMediaList", Log::DEBUG, "start");
319 dirlist=new DirList();
321 Log::getInstance()->log("VMediaList::VMediaList", Log::DEBUG, "dirlist=%p,curren=%p",dirlist,dirlist->getCurrent());
322 dirlist->getCurrent()->setSortorder(SORT_NAME);
325 if (Video::getInstance()->getFormat() == Video::PAL)
331 setTitleBarColour(DrawStyle::TITLEBARBACKGROUND);
333 sl.setPosition(10, 30 + 5);
334 sl.setSize(area.w - 20, area.h - 30 - 15 - 30);
343 const char *dmstring=MediaOptions::getInstance()->getStringOption("DirectoryPlayMode");
345 if (strcmp(dmstring,"count") == 0) dirmode=M_COUNT;
346 else if (strcmp(dmstring,"audio") == 0) dirmode=M_AUDIO;
347 else if (strcmp(dmstring,"picture") == 0) dirmode=M_PICTURE;
350 //init additional providers
352 LocalMediaFile::init();
357 VMediaList::~VMediaList()
359 Log::getInstance()->log("VMediaList::~VMediaList", Log::DEBUG, "start");
360 Timers::getInstance()->cancelTimer(this,1);
361 Timers::getInstance()->cancelTimer(this,2);
364 if (audiodirlist) delete audiodirlist;
365 Log::getInstance()->log("VMediaList::~VMediaList", Log::DEBUG, "finished");
368 void VMediaList::removeViewer() {
370 BoxStack::getInstance()->remove(viewer);
375 VMediaView * VMediaList::getViewer() {
377 viewer=VMediaView::createViewer(this);
383 void VMediaList::playAudio(bool all,bool activate, bool showInfo) {
384 MediaListHolder *h=dirlist->getCurrent()->getHolder();
386 VMediaView *player=getViewer();
387 //OK make a copy of the current active list for audio playing
388 if (audiodirlist) delete audiodirlist;
389 audiodirlist=new DirList(dirlist);
390 player->play(all,activate,MV_NONE,showInfo);
394 void VMediaList::updateAll() {
395 BoxStack::getInstance()->update(this);
396 if (viewer) BoxStack::getInstance()->update(viewer);
397 BoxStack::getInstance()->update(NULL);
403 int VMediaList::getNumEntries(ULONG mediaType,int lowerThen,bool noAudioList) {
404 MediaListHolder *h=dirlist->getCurrent()->getHolder();
405 Log::getInstance()->log("VMediaList",Log::DEBUG,"getNumEntries type=%lu,lt=%d,na=%d,h=%p,l=%p",
406 mediaType,lowerThen,(int)noAudioList,h,(h?h->list():0));
408 if (mediaType == MEDIA_TYPE_ALL && lowerThen < 0) {
410 return h->list()->size();
412 if (lowerThen < 0) lowerThen=h->list()->size();
414 MediaList *ml=h->list();
416 if (mediaType == MEDIA_TYPE_AUDIO) {
417 //OK we look into the separate audiolist (if we have it...)
418 if (audiodirlist && ! noAudioList) {
419 MediaListHolder *ah=audiodirlist->getCurrent()->getHolder();
426 for (int i=0;i<(int)(ml->size()) && i <= lowerThen;i++) {
427 if ((*ml)[i]->getMediaType() & mediaType) rt++;
432 void VMediaList::setList(MediaListHolder* tlist)
434 dirlist->getCurrent()->assignHolder(tlist);
436 sortList(dirlist->getCurrent()->getSortorder());
437 updateSelectList(dirlist->getCurrent()->getSelection());
441 void VMediaList::updateSelectList(){
442 updateSelectList(-1);
444 void VMediaList::updateSelectList(int currentNumber){
445 MediaListHolder *h=dirlist->getCurrent()->getHolder();
447 char tempA[Media::TIMEBUFLEN];
448 Log::getInstance()->log("VMediaList::updateSelectList", Log::DEBUG, "media=%p",h);
451 ULONG currentSelection=0;
452 if (sl.getNumOptions() >= 1 && currentNumber < 0) {
453 currentSelection=sl.getCurrentOptionData();
461 for (UINT i = 0; i < h->list()->size(); i++)
463 media = (*h->list())[i];
464 if (media->getMediaType() == MEDIA_TYPE_DIR) {
465 sprintf(str, "%04u %s [%s]", i,media->getTimeString(tempA), media->getDisplayName());
466 //Log::getInstance()->log("VMediaList", Log::DEBUG, "add to select list %s",str);
467 media->index = sl.addOption(str, (ULONG)media, first);
470 sprintf(str, "%04u %s %s", i,media->getTimeString(tempA), media->getDisplayName());
471 //Log::getInstance()->log("VMediaList", Log::DEBUG, "add to select list %s",str);
472 media->index = sl.addOption(str, (ULONG)media, first);
477 if (currentNumber >= 0) sl.hintSetCurrent(currentNumber);
478 else sl.hintSetCurrent(0);
479 if (currentSelection != 0) {
481 //position to the previous selection
482 for (int i=0;i<sl.getNumOptions();i++) {
483 sl.hintSetCurrent(i);
484 if (sl.getCurrentOptionData() == currentSelection) {
489 if (! found) sl.hintSetCurrent(0);
492 if (sl.getNumOptions() > 0)
499 void VMediaList::draw()
501 Log::getInstance()->log("VMediaList::draw", Log::DEBUG, "namestr=%s",dirlist->getCurrent()->getDisplayName());
503 SNPRINTF(title, 398, tr("Media - %s"), dirlist->getCurrent()->getDisplayName());
509 sl.setVisible(false);
511 drawText(tr("Loading..."), 240, 180, DrawStyle::LIGHTTEXT);
515 //if (sl.getNumOptions() > 0) sl.draw();
519 // Put the status stuff at the bottom
524 w.nextSymbol = WSymbol::UP;
525 w.setPosition(20, 385);
528 w.nextSymbol = WSymbol::DOWN;
529 w.setPosition(50, 385);
532 w.nextSymbol = WSymbol::SKIPBACK;
533 w.setPosition(85, 385);
536 w.nextSymbol = WSymbol::SKIPFORWARD;
537 w.setPosition(115, 385);
540 w.nextSymbol = WSymbol::PLAY;
541 w.setPosition(150, 385);
548 void VMediaList::doShowingBar()
550 int topOption = sl.getTopOption() + 1;
551 if (sl.getNumOptions() == 0) topOption = 0;
554 const char* strmode=NULL;
566 SNPRINTF(showing, 250,tr("%i to %i of %i"),
567 topOption, sl.getBottomOption(), sl.getNumOptions());
570 // b.setSurfaceOffset(220, 385);
571 // b.setDimensions(160, 25);
572 // b.fillColour(DrawStyle::VIEWBACKGROUND);
573 // b.drawText(showing, 0, 0, DrawStyle::LIGHTTEXT);
575 rectangle(200, 384, 18, 16, DrawStyle::VIDEOBLUE);
576 rectangle(220, 385, 220+160, 385+25, DrawStyle::VIEWBACKGROUND);
577 drawText(strmode, 220, 385, DrawStyle::LIGHTTEXT);
578 drawText(showing, 280, 385, DrawStyle::LIGHTTEXT);
579 if (sl.getCurrentOptionData() != 0) Log::getInstance()->log("VMediaList",Log::DEBUG,"selected %s",((Media *)sl.getCurrentOptionData())->getDisplayName());
582 //find the next entry in the media list
583 //return the index in the list (starting with 0)
584 //return -1 if none found
585 int VMediaList::findNextEntry(int current, MediaList *list,ULONG ltype, ULONG move,bool wrap) {
586 if (! list) return -1;
587 if (current < 0) current=0;
588 if (current >= (int)list->size()) current=list->size()-1;
612 if (next >= (int)list->size()) {
620 if (next == current && move != MV_NONE) {
623 if (((*list)[next])->getMediaType() != ltype) {
637 Media * VMediaList::getMedia(ULONG ltype,ULONG move) {
639 MediaList *list=NULL;
640 MediaListHolder *h=NULL;
641 Log::getInstance()->log("VMediaList",Log::DEBUG,"getMedia, t=%lu, mv=%lu",ltype,move);
643 //the currently active one (dirlist->getCurrent()->getHolder())
644 //and potentially a second one for audio (audiolist)
645 //currently (no recursive playing) we should always have an attached medialist in the audiolist
646 if (ltype == MEDIA_TYPE_AUDIO && audiodirlist != NULL ) {
647 h=audiodirlist->getCurrent()->getHolder();
649 Log::getInstance()->log("VMediaList",Log::ERR,"getMedia AUDIO empty medialist");
652 int nentry=findNextEntry(audiodirlist->getCurrent()->getSelection(),h->list(),ltype,move,false);
654 Log::getInstance()->log("VMediaList",Log::DEBUG,"getMedia AUDIO no next entry");
658 audiodirlist->getCurrent()->setSelection(nentry);
660 rt=new Media((*list)[nentry]);
662 Log::getInstance()->log("VMediaList",Log::DEBUG,"getMedia AUDIO next entry %d",nentry);
665 h=dirlist->getCurrent()->getHolder();
667 Log::getInstance()->log("VMediaList",Log::ERR,"getMedia PICTURE empty medialist");
670 int nentry=findNextEntry(dirlist->getCurrent()->getSelection(),h->list(),ltype,move,false);
672 Log::getInstance()->log("VMediaList",Log::DEBUG,"getMedia type=%lu no next entry",ltype);
676 Log::getInstance()->log("VMediaList",Log::DEBUG,"getMedia type=%lu next entry %d",ltype,nentry);
677 dirlist->getCurrent()->setSelection(nentry);
678 updateSelection(true);
681 rt=new Media((*list)[nentry]);
683 if (! rt->getURI()) {
684 MediaURI *uri=list->getURI(rt);
691 void VMediaList::updateSelection(bool toSelectList) {
693 dirlist->getCurrent()->setSelection(sl.getCurrentOption());
695 sl.hintSetCurrent(dirlist->getCurrent()->getSelection());
700 Media * VMediaList::getCurrentMedia(DirList *dl) {
701 if (! dl) return NULL;
702 MediaDirectory *d=dirlist->getCurrent();
703 if (! d) return NULL;
704 MediaListHolder *h=d->getHolder();
705 if (! h) return NULL;
706 if (d->getSelection() < 0 || d->getSelection() >= (int)h->list()->size()) return NULL;
707 Media *rt= (*h->list())[d->getSelection()];
713 int VMediaList::handleCommand(int command)
720 sl.hintSetCurrent(0);
724 boxstack->update(this);
734 boxstack->update(this);
744 boxstack->update(this);
747 case Input::SKIPBACK:
754 boxstack->update(this);
757 case Input::SKIPFORWARD:
764 boxstack->update(this);
772 boxstack->update(this);
775 sortList(SORT_RANDOM);
776 boxstack->update(this);
780 boxstack->update(this);
788 if (dirlist) media = getCurrentMedia(dirlist);
789 if (media == NULL) return 2;
790 Log::getInstance()->log("VMediaList", Log::DEBUG, "activated %lu", media->index);
791 switch(media->getMediaType())
796 Log::getInstance()->log("VMediaList", Log::DEBUG, "create child for %s",media->getFileName());
797 if (media->getFileName() == NULL ) return 2;
798 if (command == Input::PLAY) {
799 dirlist->setStartLevel();
802 bool rt=changeDirectory(media);
803 if (command == Input::PLAY && rt) {
811 case MEDIA_TYPE_AUDIO:
812 Log::getInstance()->log("VMediaList", Log::DEBUG, "play audio file %s",
813 media->getFileName());
814 if (dirmode != M_NONE && command == Input::PLAY)
817 playAudio(command==Input::PLAY,true,true);
819 case MEDIA_TYPE_VIDEO: {
820 #ifndef WIN32 //Only DVB style MPEG is supported by the Windows Part!
821 Log::getInstance()->log("VMediaList", Log::DEBUG, "play video file %s",
822 media->getFileName());
824 if (! media->getURI()) {
826 MediaListHolder *h=dirlist->getCurrent()->getHolder();
828 Log::getInstance()->log("VMediaList", Log::ERR, "no media List");
831 MediaURI *u=h->list()->getURI(media);
837 VVideoMedia *v=new VVideoMedia(media,this);
838 BoxStack::getInstance()->add(v);
839 BoxStack::getInstance()->update(v);
844 case MEDIA_TYPE_PICTURE:
845 Log::getInstance()->log("VMediaList", Log::DEBUG, "show picture file %s",
846 media->getFileName());
847 if (dirmode != M_NONE && command == Input::PLAY)
850 getViewer()->showPicture(MV_NONE,command==Input::PLAY,true);
853 Log::getInstance()->log("VMediaList", Log::DEBUG, "unknown media type %d file %s",
854 media->getMediaType(),media->getFileName());
858 VVideoLive* v = new VVideoLive(dirlist->getCurrent()->getHolder(), media->type, this);
864 v->medianelChange(VVideoLive::NUMBER, media->number);
871 if (dirlist->getLevel() < 1) return 4;
876 // stop command getting to any more views
880 //go to the next level dir
881 //if OK - delete current medialist
882 bool VMediaList::changeDirectory(Media *media) {
883 Log::getInstance()->log("VMediaList",Log::DEBUG,"cd to %s",media->getFileName());
885 dirlist->getCurrent()->setSortorder(sortOrder);
886 if (dirlist->getLevel() > 200) {
887 Log::getInstance()->log("VMediaList",Log::ERR,"above 300 levels, stop here...");
890 MediaListHolder *h=dirlist->getCurrent()->getHolder();
891 dirlist->getCurrent()->assignHolder(NULL); //prepare old holder for deletion
895 MediaURI *uri=h->list()->getURI(media);
896 dirlist->append(uri);
898 //same sort order for next level
899 dirlist->getCurrent()->setSortorder(sortOrder);
902 h->unref(); //this deletes now the old list
903 Log::getInstance()->log("VMediaList",Log::DEBUG,"cd OK");
906 //we were no able to load the new list - so go back to our current list
908 dirlist->getCurrent()->assignHolder(h); //OK so we saved our list...
910 Log::getInstance()->log("VMediaList",Log::DEBUG,"cd failed");
914 void VMediaList::directoryDone() {
915 if (! playingAll) return;
916 //go up until we are on the startlevel
917 Log::getInstance()->log("VMediaList", Log::DEBUG, "DirectoryDone ");
918 while ( ! dirlist->isOnStartLevel()) {
921 if (dirlist->isOnStartLevel()) break;
922 if (dirlist->getCurrent()->move(MV_NEXT))
925 if ( dirlist->isOnStartLevel()) {
928 Log::getInstance()->log("VMediaList", Log::DEBUG, "finished playing all l=%lu",dirlist->getLevel());
931 updateSelection(true);
935 bool VMediaList::playAll() {
936 if (dirmode == M_NONE) return false;
940 dirlist->setStartLevel();
944 Media *media=getCurrentMedia(dirlist);
947 Log::getInstance()->log("VMediaList", Log::DEBUG, "empty dir when calling playall");
949 Timers::getInstance()->setTimerD(this,1,0,10000000l); //10ms
952 Media *mcopy=new Media(media);
953 Log::getInstance()->log("VMediaList", Log::DEBUG, "playing all name=%s,t=%lu, started=%d",
954 mcopy->getDisplayName(),mcopy->getMediaType(),(int)started);
955 while (mcopy->getMediaType()==MEDIA_TYPE_DIR) {
956 //recurse to the next directory
957 bool rt=changeDirectory(mcopy);
959 //OK succesfully changed dir
960 int entries=getNumEntries(MEDIA_TYPE_AUDIO|MEDIA_TYPE_DIR|MEDIA_TYPE_PICTURE);
961 Log::getInstance()->log("VMediaList", Log::DEBUG, "cd OK, entries=%d",entries);
962 media=getCurrentMedia(dirlist);
963 if (entries==0 || media == NULL) {
964 Log::getInstance()->log("VMediaList", Log::DEBUG, "playing all name=%s empty",mcopy->getDisplayName());
966 //trigger directory end with the ability of user intervention
967 Timers::getInstance()->setTimerD(this,1,0,10000000l); //10ms
972 if (media->getMediaType()==MEDIA_TYPE_DIR) {
973 //send a defered event to give the user a chance to interrupt
974 //will again call playAll (but this does not chage the start level)
975 Timers::getInstance()->setTimerD(this,2,0,10000000l); //10ms
982 //unable to change to the directory
983 if (dirlist->getCurrent()->move(MV_NEXT)) {
984 //OK there is still a next medium here
985 updateSelection(true);
986 media=getCurrentMedia(dirlist);
988 Timers::getInstance()->setTimerD(this,1,0,10000000l); //10ms
992 mcopy=new Media(media);
995 //hmm - no entries here any more
1002 Log::getInstance()->log("VMediaList", Log::DEBUG, "playing all on level %d, sele=%d",
1003 dirlist->getLevel(),dirlist->getCurrent()->getSelection());
1005 enum Dirmode currentMode=dirmode;
1006 //OK now we handled all directories - now deal with the current one
1007 //1st determine the number of entries
1008 int aentries=getNumEntries(MEDIA_TYPE_AUDIO,-1,true);
1009 int pentries=getNumEntries(MEDIA_TYPE_PICTURE,-1,true);
1010 if (aentries == 0 && pentries == 0) {
1014 if (currentMode == M_COUNT) {
1015 if (aentries > pentries) currentMode=M_AUDIO;
1016 else currentMode=M_PICTURE;
1018 Log::getInstance()->log("VMediaList", Log::DEBUG, "mode=%d,ae=%d,pe=%d",currentMode,aentries,pentries);
1019 //now find the matching entries and start playing
1020 MediaListHolder *h=dirlist->getCurrent()->getHolder();
1022 Log::getInstance()->log("VMediaList", Log::ERR, "playing all empty medialist");
1027 Media *mpicture=NULL;
1028 int audioselection=-1;
1029 int pictureselection=-1;
1030 for (int i=dirlist->getCurrent()->getSelection();i<(int)h->list()->size();i++) {
1031 Media *m=(*h->list())[i];
1032 if (m->getMediaType() == MEDIA_TYPE_AUDIO && maudio == NULL) {
1036 if (m->getMediaType() == MEDIA_TYPE_PICTURE && mpicture == NULL) {
1040 if (maudio != NULL && mpicture != NULL) break;
1042 //OK now we found the first media for both - start players
1043 if (maudio != NULL) {
1044 dirlist->getCurrent()->setSelection(audioselection);
1045 playAudio(true,currentMode==M_AUDIO,mpicture==NULL); //this makes now a copy of dirlist...
1047 if (mpicture != NULL) {
1048 dirlist->getCurrent()->setSelection(pictureselection);
1049 getViewer()->showPicture(MV_NONE,true,currentMode==M_PICTURE);
1052 updateSelection(true);
1063 void VMediaList::processMessage(Message* m)
1065 if (m->message == Message::MOUSE_MOVE)
1067 if (sl.mouseMove(m->parameter - getScreenX(), m->tag - getScreenY()))
1071 boxstack->update(this);
1075 else if (m->message == Message::MOUSE_LBDOWN)
1077 if (sl.mouseLBDOWN(m->parameter - getScreenX(), m->tag - getScreenY()))
1080 boxstack->handleCommand(Input::OK); //simulate OK press
1082 else if (coordsOutsideBox(m))
1084 boxstack->handleCommand(Input::BACK); //simulate cancel press
1087 else if (m->message == Message::PLAYER_EVENT) {
1088 switch (m->parameter) {
1099 int VMediaList::createList() {
1100 Log::getInstance()->log("VMediaList::createList", Log::DEBUG, "");
1101 VMediaList *vmn=new VMediaList();
1102 //show the "loading" indicator
1103 BoxStack::getInstance()->add(vmn);
1106 BoxStack::getInstance()->remove(vmn);
1111 void VMediaList::sortList(int newSort) {
1112 MediaListHolder *h=dirlist->getCurrent()->getHolder();
1114 Log::getInstance()->log("VMediaList::sortList", Log::DEBUG, "p=%p,sort=%d,osort=%d, size=%d",this,newSort,sortOrder,h->list()->size());
1115 if (sortOrder == newSort) return;
1116 if (h->list()->begin() != h->list()->end()) {
1119 ::sort(h->list()->begin(),h->list()->end(),MediaSorterTime());
1122 ::sort(h->list()->begin(),h->list()->end(),MediaSorterName());
1125 ::sort(h->list()->begin(),h->list()->end(),MediaSorterRandom(time(NULL)));
1132 Log::getInstance()->log("VMediaList::sortList", Log::DEBUG, "done ");
1136 int VMediaList::load() {
1140 boxstack->update(this);
1141 MediaPlayer * mp=MediaPlayer::getInstance();
1142 Log::getInstance()->log("VMediaList::load", Log::DEBUG, "load list for %p",dirlist->getURI());
1143 MediaDirectory *md=dirlist->getCurrent();
1146 mn=mp->getMediaList(md->getURI());
1149 mn=mp->getRootList();
1152 MediaListHolder *h=new MediaListHolder(mn);
1157 boxstack->update(this);
1161 Log::getInstance()->log("VMediaList", Log::ERR, "unable to get MediaList for %p",dirlist->getURI());
1163 VInfo* vi = new VInfo();
1164 vi->setSize(400, 150);
1168 vi->setTitleBarOn(0);
1170 if (Video::getInstance()->getFormat() == Video::PAL)
1171 vi->setPosition(170, 200);
1173 vi->setPosition(160, 150);
1174 vi->setOneLiner(tr("unable to get media list"));
1177 Message* m = new Message();
1178 m->message = Message::ADD_VIEW;
1179 m->p_to = Message::BOXSTACK;
1180 m->data = reinterpret_cast<void*>(vi);
1181 MessageQueue::getInstance()->postMessage(m);
1186 const char * VMediaList::getDirname(ULONG mtype) const {
1187 if (mtype == MEDIA_TYPE_AUDIO && audiodirlist) {
1188 return audiodirlist->getCurrent()->getDisplayName();
1190 return dirlist->getCurrent()->getDisplayName();
1193 void VMediaList::timercall(int ref) {
1194 if (ref == 1 || ref == 2 ) {
1195 //send a directory done event
1196 Message* m = new Message();
1197 m->message = Message::PLAYER_EVENT;
1200 MessageQueue::getInstance()->postMessage(m);