added: container.seasonthumb info label
[xbmc:xbmc-antiquated.git] / xbmc / GUIWindowVideoNav.cpp
1 /*\r
2  *      Copyright (C) 2005-2007 Team XboxMediaCenter\r
3  *      http://www.xboxmediacenter.com\r
4  *\r
5  *  This Program is free software; you can redistribute it and/or modify\r
6  *  it under the terms of the GNU General Public License as published by\r
7  *  the Free Software Foundation; either version 2, or (at your option)\r
8  *  any later version.\r
9  *\r
10  *  This Program is distributed in the hope that it will be useful,\r
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
13  *  GNU General Public License for more details.\r
14  *\r
15  *  You should have received a copy of the GNU General Public License\r
16  *  along with GNU Make; see the file COPYING.  If not, write to\r
17  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.\r
18  *  http://www.gnu.org/copyleft/gpl.html\r
19  *\r
20  */\r
21 \r
22 #include "stdafx.h"\r
23 #include "GUIWindowVideoNav.h"\r
24 #include "GUIWindowVideoFiles.h"\r
25 #include "utils/GUIInfoManager.h"\r
26 #include "Util.h"\r
27 #include "utils/RegExp.h"\r
28 #include "PlayListM3U.h"\r
29 #include "Application.h"\r
30 #include "PlayListPlayer.h"\r
31 #include "GUIPassword.h"\r
32 #include "GUILabelControl.h"\r
33 #include "GUIDialogFileBrowser.h"\r
34 #include "Picture.h"\r
35 #include "FileSystem/VideoDatabaseDirectory.h"\r
36 #include "PlayListFactory.h"\r
37 #include "GUIFontManager.h"\r
38 #include "GUIDialogVideoScan.h"\r
39 #include "PartyModeManager.h"\r
40 #include "MusicDatabase.h"\r
41 \r
42 using namespace XFILE;\r
43 using namespace DIRECTORY;\r
44 using namespace VIDEODATABASEDIRECTORY;\r
45 \r
46 #define CONTROL_BTNVIEWASICONS     2\r
47 #define CONTROL_BTNSORTBY          3\r
48 #define CONTROL_BTNSORTASC         4\r
49 #define CONTROL_BTNTYPE            5\r
50 #define CONTROL_BTNSEARCH          8\r
51 #define CONTROL_LIST              50\r
52 #define CONTROL_THUMBS            51\r
53 #define CONTROL_BIGLIST           52\r
54 #define CONTROL_LABELFILES        12\r
55 \r
56 #define CONTROL_BTN_FILTER        19\r
57 #define CONTROL_BTNSHOWMODE       10\r
58 #define CONTROL_BTNSHOWALL        14\r
59 #define CONTROL_UNLOCK            11\r
60 \r
61 #define CONTROL_FILTER            15\r
62 #define CONTROL_BTNPARTYMODE      16\r
63 #define CONTROL_BTNFLATTEN        17\r
64 #define CONTROL_LABELEMPTY        18\r
65 \r
66 CGUIWindowVideoNav::CGUIWindowVideoNav(void)\r
67     : CGUIWindowVideoBase(WINDOW_VIDEO_NAV, "MyVideoNav.xml")\r
68 {\r
69   m_vecItems.m_strPath = "?";\r
70   m_bDisplayEmptyDatabaseMessage = false;\r
71   m_thumbLoader.SetObserver(this);\r
72 }\r
73 \r
74 CGUIWindowVideoNav::~CGUIWindowVideoNav(void)\r
75 {\r
76 }\r
77 \r
78 bool CGUIWindowVideoNav::OnMessage(CGUIMessage& message)\r
79 {\r
80   switch (message.GetMessage())\r
81   {\r
82   case GUI_MSG_WINDOW_RESET:\r
83     m_vecItems.m_strPath = "?";\r
84     break;\r
85   case GUI_MSG_WINDOW_DEINIT:\r
86     if (m_thumbLoader.IsLoading())\r
87       m_thumbLoader.StopThread();\r
88     break;\r
89   case GUI_MSG_WINDOW_INIT:\r
90     {\r
91       // check for valid quickpath parameter\r
92       CStdString strDestination = message.GetStringParam();\r
93       if (!strDestination.IsEmpty())\r
94       {\r
95         message.SetStringParam("");\r
96         CLog::Log(LOGINFO, "Attempting to quickpath to: %s", strDestination.c_str());\r
97       }\r
98 \r
99       // is this the first time the window is opened?\r
100       if (m_vecItems.m_strPath == "?" && strDestination.IsEmpty())\r
101       {\r
102         strDestination = g_settings.m_defaultVideoLibSource;\r
103         m_vecItems.m_strPath = strDestination;\r
104         CLog::Log(LOGINFO, "Attempting to default to: %s", strDestination.c_str());\r
105       }\r
106 \r
107       if (!strDestination.IsEmpty())\r
108       {\r
109         if (strDestination.Equals("$ROOT") || strDestination.Equals("Root"))\r
110           m_vecItems.m_strPath = "";\r
111         else if (strDestination.Equals("MovieGenres"))\r
112           m_vecItems.m_strPath = "videodb://1/1/";\r
113         else if (strDestination.Equals("MovieTitles"))\r
114           m_vecItems.m_strPath = "videodb://1/2/";\r
115         else if (strDestination.Equals("MovieYears"))\r
116           m_vecItems.m_strPath = "videodb://1/3/";\r
117         else if (strDestination.Equals("MovieActors"))\r
118           m_vecItems.m_strPath = "videodb://1/4/";\r
119         else if (strDestination.Equals("MovieDirectors"))\r
120           m_vecItems.m_strPath = "videodb://1/5/";\r
121         else if (strDestination.Equals("MovieStudios"))\r
122           m_vecItems.m_strPath = "videodb://1/6/";\r
123         else if (strDestination.Equals("Movies"))\r
124           m_vecItems.m_strPath = "videodb://1/";\r
125         else if (strDestination.Equals("TvShowGenres"))\r
126           m_vecItems.m_strPath = "videodb://2/1/";\r
127         else if (strDestination.Equals("TvShowTitles"))\r
128           m_vecItems.m_strPath = "videodb://2/2/";\r
129         else if (strDestination.Equals("TvShowYears"))\r
130           m_vecItems.m_strPath = "videodb://2/3/";\r
131         else if (strDestination.Equals("TvShowActors"))\r
132           m_vecItems.m_strPath = "videodb://2/4/";\r
133         else if (strDestination.Equals("TvShows"))\r
134           m_vecItems.m_strPath = "videodb://2/";\r
135         else if (strDestination.Equals("MusicVideoGenres"))\r
136           m_vecItems.m_strPath = "videodb://3/1/";\r
137         else if (strDestination.Equals("MusicVideoTitles"))\r
138           m_vecItems.m_strPath = "videodb://3/2/";\r
139         else if (strDestination.Equals("MusicVideoYears"))\r
140           m_vecItems.m_strPath = "videodb://3/3/";\r
141         else if (strDestination.Equals("MusicVideoArtists"))\r
142           m_vecItems.m_strPath = "videodb://3/4/";\r
143         else if (strDestination.Equals("MusicVideoDirectors"))\r
144           m_vecItems.m_strPath = "videodb://3/5/";\r
145         else if (strDestination.Equals("MusicVideoStudios"))\r
146           m_vecItems.m_strPath = "videodb://3/6/";\r
147         else if (strDestination.Equals("MusicVideos"))\r
148           m_vecItems.m_strPath = "videodb://3/";\r
149         else if (strDestination.Equals("RecentlyAddedMovies"))\r
150           m_vecItems.m_strPath = "videodb://4/";\r
151         else if (strDestination.Equals("RecentlyAddedEpisodes"))\r
152           m_vecItems.m_strPath = "videodb://5/";\r
153         else if (strDestination.Equals("RecentlyAddedMusicVideos"))\r
154           m_vecItems.m_strPath = "videodb://6/";\r
155         else if (strDestination.Equals("Playlists"))\r
156           m_vecItems.m_strPath = "special://videoplaylists/";\r
157         else\r
158         {\r
159           CLog::Log(LOGWARNING, "Warning, destination parameter (%s) may not be valid", strDestination.c_str());\r
160           m_vecItems.m_strPath = strDestination;\r
161         }\r
162         SetHistoryForPath(m_vecItems.m_strPath);\r
163       }\r
164       \r
165       DisplayEmptyDatabaseMessage(false); // reset message state\r
166 \r
167       if (!CGUIWindowVideoBase::OnMessage(message))\r
168         return false;\r
169 \r
170       //  base class has opened the database, do our check\r
171       m_database.Open();\r
172       DisplayEmptyDatabaseMessage(m_database.GetItemCount() <= 0);\r
173 \r
174       if (m_bDisplayEmptyDatabaseMessage)\r
175       {\r
176         SET_CONTROL_FOCUS(CONTROL_BTNTYPE, 0);\r
177         Update(m_vecItems.m_strPath);  // Will remove content from the list/thumb control\r
178       }\r
179 \r
180       m_database.Close();\r
181       return true;\r
182     }\r
183     break;\r
184 \r
185   case GUI_MSG_CLICKED:\r
186     {\r
187       int iControl = message.GetSenderId();\r
188       if (iControl == CONTROL_BTNPARTYMODE)\r
189       {\r
190         if (g_partyModeManager.IsEnabled())\r
191           g_partyModeManager.Disable();\r
192         else\r
193         {\r
194           if (!g_partyModeManager.Enable(PARTYMODECONTEXT_VIDEO))\r
195           {\r
196             SET_CONTROL_SELECTED(GetID(),CONTROL_BTNPARTYMODE,false);\r
197             return false;\r
198           }\r
199 \r
200           // Playlist directory is the root of the playlist window\r
201           if (m_guiState.get()) m_guiState->SetPlaylistDirectory("playlistvideo://");\r
202 \r
203           return true;\r
204         }\r
205         UpdateButtons();\r
206       }\r
207 \r
208       if (iControl == CONTROL_BTNSEARCH)\r
209       {\r
210         OnSearch();\r
211       }\r
212       else if (iControl == CONTROL_BTN_FILTER)\r
213       {\r
214         CGUIDialogKeyboard::ShowAndGetFilter(m_filter, false);\r
215         return true;\r
216       }\r
217       else if (iControl == CONTROL_BTNSHOWMODE)\r
218       {\r
219         g_stSettings.m_iMyVideoWatchMode++;\r
220         if (g_stSettings.m_iMyVideoWatchMode > VIDEO_SHOW_WATCHED)\r
221           g_stSettings.m_iMyVideoWatchMode = VIDEO_SHOW_ALL;\r
222         g_settings.Save();\r
223         // TODO: Can we perhaps filter this directly?  Probably not for some of the more complicated views,\r
224         //       but for those perhaps we can just display them all, and only filter when we get a list\r
225         //       of actual videos?\r
226         Update(m_vecItems.m_strPath);\r
227         return true;\r
228       }\r
229       else if (iControl == CONTROL_BTNFLATTEN)\r
230       {\r
231         g_stSettings.m_bMyVideoNavFlatten = !g_stSettings.m_bMyVideoNavFlatten;\r
232         g_settings.Save();\r
233         CUtil::DeleteVideoDatabaseDirectoryCache();\r
234         SetupShares();\r
235         Update("");\r
236         return true;\r
237       }\r
238       else if (iControl == CONTROL_BTNSHOWALL)\r
239       {\r
240         if (g_stSettings.m_iMyVideoWatchMode == VIDEO_SHOW_ALL)\r
241           g_stSettings.m_iMyVideoWatchMode = VIDEO_SHOW_UNWATCHED;\r
242         else\r
243           g_stSettings.m_iMyVideoWatchMode = VIDEO_SHOW_ALL;\r
244         g_settings.Save();\r
245         // TODO: Can we perhaps filter this directly?  Probably not for some of the more complicated views,\r
246         //       but for those perhaps we can just display them all, and only filter when we get a list\r
247         //       of actual videos?\r
248         Update(m_vecItems.m_strPath);\r
249         return true;\r
250       }\r
251     }\r
252     break;\r
253     // update the display\r
254     case GUI_MSG_SCAN_FINISHED:\r
255     case GUI_MSG_REFRESH_THUMBS:\r
256     {\r
257       Update(m_vecItems.m_strPath);\r
258     }\r
259     break;\r
260 \r
261   case GUI_MSG_NOTIFY_ALL:\r
262     {\r
263       if (message.GetParam1() == GUI_MSG_FILTER_ITEMS && IsActive())\r
264       {\r
265         m_filter = message.GetStringParam();\r
266         m_filter.TrimLeft().ToLower();\r
267         OnFilterItems();\r
268       }\r
269       else if (message.GetParam1()==GUI_MSG_UPDATE_SOURCES)\r
270       {\r
271         CUtil::DeleteVideoDatabaseDirectoryCache();\r
272         if (!m_vecItems.m_strPath.Equals("?"))\r
273           Update(m_vecItems.m_strPath);\r
274         return true;\r
275       }\r
276     }\r
277     break;\r
278   }\r
279   return CGUIWindowVideoBase::OnMessage(message);\r
280 }\r
281 \r
282 CStdString CGUIWindowVideoNav::GetQuickpathName(const CStdString& strPath) const\r
283 {\r
284   if (strPath.Equals("videodb://1/1/"))\r
285     return "MovieGenres";\r
286   else if (strPath.Equals("videodb://1/2/"))\r
287     return "MovieTitles";\r
288   else if (strPath.Equals("videodb://1/3/"))\r
289     return "MovieYears";\r
290   else if (strPath.Equals("videodb://1/4/"))\r
291     return "MovieActors";\r
292   else if (strPath.Equals("videodb://1/5/"))\r
293     return "MovieDirectors";\r
294   else if (strPath.Equals("videodb://1/"))\r
295     return "Movies";\r
296   else if (strPath.Equals("videodb://2/1/"))\r
297     return "TvShowGenres";\r
298   else if (strPath.Equals("videodb://2/2/"))\r
299     return "TvShowTitles";\r
300   else if (strPath.Equals("videodb://2/3/"))\r
301     return "TvShowYears";\r
302   else if (strPath.Equals("videodb://2/4/"))\r
303     return "TvShowActors";\r
304   else if (strPath.Equals("videodb://2/"))\r
305     return "TvShows";\r
306   else if (strPath.Equals("videodb://3/1/"))\r
307     return "MusicVideoGenres";\r
308   else if (strPath.Equals("videodb://3/2/"))\r
309     return "MusicVideoTitles";\r
310   else if (strPath.Equals("videodb://3/3/"))\r
311     return "MusicVideoYears";\r
312   else if (strPath.Equals("videodb://3/4/"))\r
313     return "MusicVideoArtists";\r
314   else if (strPath.Equals("videodb://3/5/"))\r
315     return "MusicVideoDirectors";\r
316   else if (strPath.Equals("videodb://3/"))\r
317     return "MusicVideos";\r
318   else if (strPath.Equals("videodb://4/"))\r
319     return "RecentlyAddedMovies";\r
320   else if (strPath.Equals("videodb://5/"))\r
321     return "RecentlyAddedEpisodes";\r
322   else if (strPath.Equals("videodb://6/"))\r
323     return "RecentlyAddedMusicVideos";\r
324   else if (strPath.Equals("special://videoplaylists/"))\r
325     return "Playlists";\r
326   else\r
327   {\r
328     CLog::Log(LOGERROR, "  CGUIWindowVideoNav::GetQuickpathName: Unknown parameter (%s)", strPath.c_str());\r
329     return strPath;\r
330   }\r
331 }\r
332 \r
333 bool CGUIWindowVideoNav::GetDirectory(const CStdString &strDirectory, CFileItemList &items)\r
334 {\r
335   if (m_bDisplayEmptyDatabaseMessage)\r
336     return true;\r
337 \r
338   CFileItem directory(strDirectory, true);\r
339 \r
340   if (m_thumbLoader.IsLoading())\r
341     m_thumbLoader.StopThread();\r
342 \r
343   m_rootDir.SetCacheDirectory(false);\r
344   items.ClearProperties();\r
345 \r
346   bool bResult = CGUIWindowVideoBase::GetDirectory(strDirectory, items);\r
347   if (bResult)\r
348   {\r
349     if (items.IsVideoDb())\r
350     {\r
351       DIRECTORY::CVideoDatabaseDirectory dir;\r
352       CQueryParams params;\r
353       dir.GetQueryParams(items.m_strPath,params);\r
354       VIDEODATABASEDIRECTORY::NODE_TYPE node = dir.GetDirectoryChildType(items.m_strPath);\r
355       \r
356       items.SetThumbnailImage("");\r
357       if (node == VIDEODATABASEDIRECTORY::NODE_TYPE_EPISODES || node == NODE_TYPE_SEASONS || node == NODE_TYPE_RECENTLY_ADDED_EPISODES)\r
358       {\r
359         CLog::Log(LOGDEBUG, "WindowVideoNav::GetDirectory");\r
360         // grab the show thumb\r
361         CFileItem showItem;\r
362         m_database.GetFilePath(params.GetTvShowId(),showItem.m_strPath,2);\r
363         showItem.SetVideoThumb();\r
364         items.SetProperty("tvshowthumb", showItem.GetThumbnailImage());\r
365         // Grab fanart data\r
366         CVideoInfoTag details;\r
367         m_database.GetTvShowInfo(showItem.m_strPath, details, params.GetTvShowId());\r
368         items.SetProperty("fanart_color1", details.m_fanart.GetColor(0));\r
369         items.SetProperty("fanart_color2", details.m_fanart.GetColor(1));\r
370         items.SetProperty("fanart_color3", details.m_fanart.GetColor(2));\r
371         showItem.CacheVideoFanart();\r
372         CStdString fanart(showItem.GetCachedVideoFanart());\r
373         if (CFile::Exists(fanart))\r
374           items.SetProperty("fanart_image", fanart);\r
375         \r
376         // set the season thumb\r
377         CStdString strLabel;\r
378         if (params.GetSeason() == 0)\r
379           strLabel = g_localizeStrings.Get(20381);\r
380         else\r
381           strLabel.Format(g_localizeStrings.Get(20358), params.GetSeason());\r
382 \r
383         CFileItem item(strLabel);\r
384         CUtil::GetParentPath(items.m_strPath,item.m_strPath);\r
385         item.m_bIsFolder = true;\r
386         item.SetCachedSeasonThumb();\r
387         if (item.HasThumbnail())\r
388           items.SetProperty("seasonthumb",item.GetThumbnailImage());\r
389 \r
390         // the container folder thumb is the parent (i.e. season or show)\r
391         if (node == NODE_TYPE_EPISODES || node == NODE_TYPE_RECENTLY_ADDED_EPISODES)\r
392         {\r
393           g_infoManager.m_content = "episodes";\r
394           // grab the season thumb as the folder thumb\r
395           CStdString strLabel;\r
396           CStdString strPath;\r
397           if (params.GetSeason() == -1 && items.Size() > 0)\r
398           {\r
399             CQueryParams params2;\r
400             dir.GetQueryParams(items[0]->m_strPath,params2);\r
401             strLabel.Format(g_localizeStrings.Get(20358), params2.GetSeason());\r
402             CUtil::GetParentPath(items.m_strPath,strPath);\r
403           }\r
404           else\r
405           {\r
406             if (params.GetSeason() == 0)\r
407               strLabel = g_localizeStrings.Get(20381); \r
408             else\r
409               strLabel.Format(g_localizeStrings.Get(20358), params.GetSeason());\r
410             strPath = items.m_strPath;\r
411           }\r
412 \r
413           CFileItem item(strLabel);\r
414           item.m_strPath = strPath;\r
415           item.m_bIsFolder = true;\r
416           item.GetVideoInfoTag()->m_strPath = showItem.m_strPath;\r
417           item.SetCachedSeasonThumb();\r
418 \r
419           items.SetThumbnailImage(item.GetThumbnailImage());\r
420           items.SetProperty("seasonthumb",item.GetThumbnailImage());\r
421         }\r
422         else\r
423         {\r
424           g_infoManager.m_content = "seasons";\r
425           items.SetThumbnailImage(showItem.GetThumbnailImage());\r
426         }\r
427       }\r
428       else if (node == NODE_TYPE_TITLE_MOVIES || node == NODE_TYPE_RECENTLY_ADDED_MOVIES)\r
429         g_infoManager.m_content = "movies";\r
430       else if (node == NODE_TYPE_TITLE_TVSHOWS)\r
431         g_infoManager.m_content = "tvshows";\r
432       else if (node == NODE_TYPE_TITLE_MUSICVIDEOS || node == NODE_TYPE_RECENTLY_ADDED_MUSICVIDEOS)\r
433         g_infoManager.m_content = "musicvideos";\r
434       else\r
435         g_infoManager.m_content = "";\r
436     }\r
437     else\r
438       g_infoManager.m_content = items.GetContent();\r
439   }\r
440 \r
441   return bResult;\r
442 }\r
443 \r
444 void CGUIWindowVideoNav::UpdateButtons()\r
445 {\r
446   CGUIWindowVideoBase::UpdateButtons();\r
447 \r
448   // Update object count\r
449   int iItems = m_vecItems.Size();\r
450   if (iItems)\r
451   {\r
452     // check for parent dir and "all" items\r
453     // should always be the first two items\r
454     for (int i = 0; i <= (iItems>=2 ? 1 : 0); i++)\r
455     {\r
456       CFileItem* pItem = m_vecItems[i];\r
457       if (pItem->IsParentFolder()) iItems--;\r
458       if (pItem->m_strPath.Left(4).Equals("/-1/")) iItems--;\r
459     }\r
460     // or the last item\r
461     if (m_vecItems.Size() > 2 &&\r
462       m_vecItems[m_vecItems.Size()-1]->m_strPath.Left(4).Equals("/-1/"))\r
463       iItems--;\r
464   }\r
465   CStdString items;\r
466   items.Format("%i %s", iItems, g_localizeStrings.Get(127).c_str());\r
467   SET_CONTROL_LABEL(CONTROL_LABELFILES, items);\r
468 \r
469   // set the filter label\r
470   CStdString strLabel;\r
471 \r
472   // "Playlists"\r
473   if (m_vecItems.m_strPath.Equals("special://videoplaylists/"))\r
474     strLabel = g_localizeStrings.Get(136);\r
475   // "{Playlist Name}"\r
476   else if (m_vecItems.IsPlayList())\r
477   {\r
478     // get playlist name from path\r
479     CStdString strDummy;\r
480     CUtil::Split(m_vecItems.m_strPath, strDummy, strLabel);\r
481   }\r
482   // everything else is from a videodb:// path\r
483   else\r
484   {\r
485     CVideoDatabaseDirectory dir;\r
486     dir.GetLabel(m_vecItems.m_strPath, strLabel);\r
487   }\r
488 \r
489   SET_CONTROL_LABEL(CONTROL_FILTER, strLabel);\r
490 \r
491   SET_CONTROL_LABEL(CONTROL_BTNSHOWMODE, g_localizeStrings.Get(16100 + g_stSettings.m_iMyVideoWatchMode));\r
492 \r
493   SET_CONTROL_SELECTED(GetID(),CONTROL_BTNSHOWALL,g_stSettings.m_iMyVideoWatchMode != VIDEO_SHOW_ALL);\r
494 \r
495   SET_CONTROL_SELECTED(GetID(),CONTROL_BTN_FILTER, !m_filter.IsEmpty());\r
496 \r
497   SET_CONTROL_SELECTED(GetID(),CONTROL_BTNPARTYMODE, g_partyModeManager.IsEnabled());\r
498 \r
499   SET_CONTROL_SELECTED(GetID(),CONTROL_BTNFLATTEN, g_stSettings.m_bMyVideoNavFlatten);\r
500 }\r
501 \r
502 /// \brief Search for genres, artists and albums with search string \e strSearch in the musicdatabase and return the found \e items\r
503 /// \param strSearch The search string\r
504 /// \param items Items Found\r
505 void CGUIWindowVideoNav::DoSearch(const CStdString& strSearch, CFileItemList& items)\r
506 {\r
507   // get matching genres\r
508   CFileItemList tempItems;\r
509 \r
510   m_database.GetMovieGenresByName(strSearch, tempItems);\r
511   if (tempItems.Size())\r
512   {\r
513     CStdString strGenre = g_localizeStrings.Get(515); // Genre\r
514     for (int i = 0; i < (int)tempItems.Size(); i++)\r
515     {\r
516       tempItems[i]->SetLabel("[" + strGenre + " - "+g_localizeStrings.Get(20342)+"] " + tempItems[i]->GetLabel());\r
517     }\r
518     items.Append(tempItems);\r
519   }\r
520   \r
521   tempItems.Clear();\r
522   m_database.GetTvShowGenresByName(strSearch, tempItems);\r
523   if (tempItems.Size())\r
524   {\r
525     CStdString strGenre = g_localizeStrings.Get(515); // Genre\r
526     for (int i = 0; i < (int)tempItems.Size(); i++)\r
527     {\r
528       tempItems[i]->SetLabel("[" + strGenre + " - "+g_localizeStrings.Get(20343)+"] " + tempItems[i]->GetLabel());\r
529     }\r
530     items.Append(tempItems);\r
531   }\r
532 \r
533   tempItems.Clear();\r
534   m_database.GetMusicVideoGenresByName(strSearch, tempItems);\r
535   if (tempItems.Size())\r
536   {\r
537     CStdString strGenre = g_localizeStrings.Get(515); // Genre\r
538     for (int i = 0; i < (int)tempItems.Size(); i++)\r
539     {\r
540       tempItems[i]->SetLabel("[" + strGenre + " - "+g_localizeStrings.Get(20389)+"] " + tempItems[i]->GetLabel());\r
541     }\r
542     items.Append(tempItems);\r
543   }\r
544 \r
545   tempItems.Clear();\r
546   m_database.GetMovieActorsByName(strSearch, tempItems);\r
547   if (tempItems.Size())\r
548   {\r
549     CStdString strActor = g_localizeStrings.Get(20337); // Actor\r
550     for (int i = 0; i < (int)tempItems.Size(); i++)\r
551     {\r
552       tempItems[i]->SetLabel("[" + strActor + " - "+g_localizeStrings.Get(20342)+"] " + tempItems[i]->GetLabel());\r
553     }\r
554     items.Append(tempItems);\r
555   }\r
556 \r
557   tempItems.Clear();\r
558   m_database.GetTvShowsActorsByName(strSearch, tempItems);\r
559   if (tempItems.Size())\r
560   {\r
561     CStdString strActor = g_localizeStrings.Get(20337); // Actor\r
562     for (int i = 0; i < (int)tempItems.Size(); i++)\r
563     {\r
564       tempItems[i]->SetLabel("[" + strActor + " - "+g_localizeStrings.Get(20343)+"] " + tempItems[i]->GetLabel());\r
565     }\r
566     items.Append(tempItems);\r
567   }\r
568 \r
569   tempItems.Clear();\r
570   m_database.GetMusicVideoArtistsByName(strSearch, tempItems);\r
571   if (tempItems.Size())\r
572   {\r
573     CStdString strActor = g_localizeStrings.Get(484); // Actor\r
574     for (int i = 0; i < (int)tempItems.Size(); i++)\r
575     {\r
576       tempItems[i]->SetLabel("[" + strActor + " - "+g_localizeStrings.Get(20389)+"] " + tempItems[i]->GetLabel());\r
577     }\r
578     items.Append(tempItems);\r
579   }\r
580 \r
581   tempItems.Clear();\r
582   m_database.GetMovieDirectorsByName(strSearch, tempItems);\r
583   if (tempItems.Size())\r
584   {\r
585     CStdString strMovie = g_localizeStrings.Get(20339); // Director\r
586     for (int i = 0; i < (int)tempItems.Size(); i++)\r
587     {\r
588       tempItems[i]->SetLabel("[" + strMovie + " - "+g_localizeStrings.Get(20342)+"] " + tempItems[i]->GetLabel());\r
589     }\r
590     items.Append(tempItems);\r
591   }\r
592 \r
593   tempItems.Clear();\r
594   m_database.GetTvShowsDirectorsByName(strSearch, tempItems);\r
595   if (tempItems.Size())\r
596   {\r
597     CStdString strMovie = g_localizeStrings.Get(20339); // Director\r
598     for (int i = 0; i < (int)tempItems.Size(); i++)\r
599     {\r
600       tempItems[i]->SetLabel("[" + strMovie + " - "+g_localizeStrings.Get(20343)+"] " + tempItems[i]->GetLabel());\r
601     }\r
602     items.Append(tempItems);\r
603   }\r
604 \r
605   tempItems.Clear();\r
606   m_database.GetMusicVideoDirectorsByName(strSearch, tempItems);\r
607   if (tempItems.Size())\r
608   {\r
609     CStdString strMovie = g_localizeStrings.Get(20339); // Director\r
610     for (int i = 0; i < (int)tempItems.Size(); i++)\r
611     {\r
612       tempItems[i]->SetLabel("[" + strMovie + " - "+g_localizeStrings.Get(20389)+"] " + tempItems[i]->GetLabel());\r
613     }\r
614     items.Append(tempItems);\r
615   }\r
616 \r
617   tempItems.Clear();\r
618   m_database.GetMoviesByName(strSearch, tempItems);\r
619 \r
620   if (tempItems.Size())\r
621   {\r
622     for (int i = 0; i < (int)tempItems.Size(); i++)\r
623     {\r
624       tempItems[i]->SetLabel("[" + g_localizeStrings.Get(20338) + "] " + tempItems[i]->GetLabel());\r
625     }\r
626     items.Append(tempItems);\r
627   }\r
628 \r
629   tempItems.Clear();\r
630   m_database.GetEpisodesByName(strSearch, tempItems);\r
631 \r
632   if (tempItems.Size())\r
633   {\r
634     for (int i = 0; i < (int)tempItems.Size(); i++)\r
635     {\r
636       tempItems[i]->SetLabel("[" + g_localizeStrings.Get(20359) + "] " + tempItems[i]->GetLabel());\r
637     }\r
638     items.Append(tempItems);\r
639   }\r
640 \r
641   tempItems.Clear();\r
642   m_database.GetMusicVideosByName(strSearch, tempItems);\r
643 \r
644   if (tempItems.Size())\r
645   {\r
646     for (int i = 0; i < (int)tempItems.Size(); i++)\r
647     {\r
648       tempItems[i]->SetLabel("[" + g_localizeStrings.Get(20391) + "] " + tempItems[i]->GetLabel());\r
649     }\r
650     items.Append(tempItems);\r
651   }\r
652 \r
653   tempItems.Clear();\r
654   m_database.GetMusicVideosByAlbum(strSearch, tempItems);\r
655 \r
656   if (tempItems.Size())\r
657   {\r
658     for (int i = 0; i < (int)tempItems.Size(); i++)\r
659     {\r
660       tempItems[i]->SetLabel("[" + g_localizeStrings.Get(483) + "] " + tempItems[i]->GetLabel());\r
661     }\r
662     items.Append(tempItems);\r
663   }\r
664 \r
665   tempItems.Clear();\r
666   m_database.GetEpisodesByPlot(strSearch, tempItems);\r
667 \r
668   if (tempItems.Size())\r
669   {\r
670     for (int i = 0; i < (int)tempItems.Size(); i++)\r
671     {\r
672       tempItems[i]->SetLabel("[" + g_localizeStrings.Get(20365) + "] " + tempItems[i]->GetLabel());\r
673     }\r
674     items.Append(tempItems);\r
675   }\r
676 }\r
677 \r
678 void CGUIWindowVideoNav::PlayItem(int iItem)\r
679 {\r
680   // unlike additemtoplaylist, we need to check the items here\r
681   // before calling it since the current playlist will be stopped\r
682   // and cleared!\r
683 \r
684   // root is not allowed\r
685   if (m_vecItems.IsVirtualDirectoryRoot())\r
686     return;\r
687 \r
688   CGUIWindowVideoBase::PlayItem(iItem);\r
689 }\r
690 \r
691 void CGUIWindowVideoNav::OnWindowLoaded()\r
692 {\r
693 #ifdef PRE_SKIN_VERSION_2_1_COMPATIBILITY\r
694   const CGUIControl *pList = GetControl(CONTROL_LIST);\r
695   if (pList && !GetControl(CONTROL_LABELEMPTY))\r
696   {\r
697     CLabelInfo info;\r
698     info.align = XBFONT_CENTER_X | XBFONT_CENTER_Y;\r
699     info.font = g_fontManager.GetFont("font13");\r
700     info.textColor = 0xffffffff;\r
701     CGUILabelControl *pLabel = new CGUILabelControl(GetID(),CONTROL_LABELEMPTY,pList->GetXPosition(),pList->GetYPosition(),pList->GetWidth(),pList->GetHeight(),info,false,false);\r
702     pLabel->SetAnimations(pList->GetAnimations());\r
703     Add(pLabel);\r
704   }\r
705 #endif\r
706   CGUIWindowVideoBase::OnWindowLoaded();\r
707 }\r
708 \r
709 void CGUIWindowVideoNav::DisplayEmptyDatabaseMessage(bool bDisplay)\r
710 {\r
711   m_bDisplayEmptyDatabaseMessage = bDisplay;\r
712 }\r
713 \r
714 void CGUIWindowVideoNav::Render()\r
715 {\r
716   if (m_bDisplayEmptyDatabaseMessage)\r
717   {\r
718     SET_CONTROL_LABEL(CONTROL_LABELEMPTY,g_localizeStrings.Get(745)+'\n'+g_localizeStrings.Get(746))\r
719   }\r
720   else\r
721   {\r
722     SET_CONTROL_LABEL(CONTROL_LABELEMPTY,"")\r
723   }\r
724   CGUIWindowVideoBase::Render();\r
725 }\r
726 \r
727 void CGUIWindowVideoNav::OnInfo(CFileItem* pItem, const SScraperInfo& info)\r
728 {\r
729   SScraperInfo info2(info);\r
730   CStdString strPath,strFile;\r
731   m_database.Open(); // since we can be called from the music library without being inited\r
732   if (pItem->IsVideoDb())\r
733     m_database.GetScraperForPath(pItem->GetVideoInfoTag()->m_strPath,info2);\r
734   else if (m_vecItems.IsPluginFolder())\r
735     info2.strContent = "plugin";\r
736   else\r
737   {\r
738     CUtil::Split(pItem->m_strPath,strPath,strFile);\r
739     m_database.GetScraperForPath(strPath,info2);\r
740   }\r
741   m_database.Close();\r
742   CGUIWindowVideoBase::OnInfo(pItem,info2);\r
743 }\r
744 \r
745 void CGUIWindowVideoNav::OnDeleteItem(int iItem)\r
746 {\r
747   if (iItem < 0 || iItem >= (int)m_vecItems.Size()) return;\r
748 \r
749   if (m_vecItems.m_strPath.Equals("special://videoplaylists/"))\r
750   {\r
751     CGUIWindowVideoBase::OnDeleteItem(iItem);\r
752     return;\r
753   }\r
754 \r
755   CFileItem* pItem = m_vecItems[iItem];\r
756   DeleteItem(pItem);\r
757 \r
758   CStdString strDeletePath;\r
759   if (pItem->m_bIsFolder)\r
760     strDeletePath=pItem->GetVideoInfoTag()->m_strPath;\r
761   else\r
762     strDeletePath=pItem->GetVideoInfoTag()->m_strFileNameAndPath;\r
763 \r
764   if (g_guiSettings.GetBool("filelists.allowfiledeletion") && CUtil::SupportsFileOperations(strDeletePath))\r
765   {\r
766     pItem->m_strPath = strDeletePath;\r
767     CGUIWindowVideoBase::OnDeleteItem(iItem);\r
768   }\r
769 \r
770   CUtil::DeleteVideoDatabaseDirectoryCache();\r
771 \r
772   DisplayEmptyDatabaseMessage(m_database.GetItemCount() <= 0);\r
773   Update( m_vecItems.m_strPath );\r
774   m_viewControl.SetSelectedItem(iItem);\r
775   return;\r
776 }\r
777 \r
778 void CGUIWindowVideoNav::DeleteItem(CFileItem* pItem)\r
779 {\r
780   int iType=0;\r
781   if (pItem->HasVideoInfoTag() && !pItem->GetVideoInfoTag()->m_strShowTitle.IsEmpty()) // tvshow\r
782     iType = 2;\r
783   if (pItem->HasVideoInfoTag() && pItem->GetVideoInfoTag()->m_iSeason > -1 && !pItem->m_bIsFolder) // episode\r
784     iType = 1;\r
785   if (pItem->HasVideoInfoTag() && pItem->GetVideoInfoTag()->m_artist.size() > 0)\r
786     iType = 3;\r
787 \r
788   CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)m_gWindowManager.GetWindow(WINDOW_DIALOG_YES_NO);\r
789   if (!pDialog) return;\r
790   if (iType == 0)\r
791     pDialog->SetHeading(432);\r
792   if (iType == 1)\r
793     pDialog->SetHeading(20362);\r
794   if (iType == 2)\r
795     pDialog->SetHeading(20363);\r
796   if (iType == 3)\r
797     pDialog->SetHeading(20392);\r
798   CStdString strLine;\r
799   strLine.Format(g_localizeStrings.Get(433),pItem->GetLabel());\r
800   pDialog->SetLine(0, strLine);\r
801   pDialog->SetLine(1, "");\r
802   pDialog->SetLine(2, "");;\r
803   pDialog->DoModal();\r
804   if (!pDialog->IsConfirmed()) return;\r
805 \r
806   CStdString path;\r
807   CVideoDatabase database;\r
808   database.Open();\r
809 \r
810   database.GetFilePath(pItem->GetVideoInfoTag()->m_iDbId, path, iType);\r
811   if (path.IsEmpty()) return;\r
812   if (iType == 0)\r
813     database.DeleteMovie(path);\r
814   if (iType == 1)\r
815     database.DeleteEpisode(path);\r
816   if (iType == 2)\r
817     database.DeleteTvShow(path);\r
818   if (iType == 3)\r
819     database.DeleteMusicVideo(path);\r
820 \r
821   if (iType == 2)\r
822     database.SetPathHash(path,"");  \r
823   else\r
824   {\r
825     CStdString strDirectory;\r
826     CUtil::GetDirectory(path,strDirectory);\r
827     database.SetPathHash(strDirectory,"");\r
828   }\r
829 \r
830   // delete the cached thumb for this item (it will regenerate if it is a user thumb)\r
831   CStdString thumb(pItem->GetCachedVideoThumb());\r
832   CFile::Delete(thumb);\r
833 }\r
834 \r
835 void CGUIWindowVideoNav::OnFinalizeFileItems(CFileItemList& items)\r
836 {\r
837   m_unfilteredItems.AppendPointer(items);\r
838   // now filter as necessary\r
839   CVideoDatabaseDirectory dir;\r
840   CQueryParams params;\r
841   dir.GetQueryParams(items.m_strPath,params);\r
842   bool filterWatched=false;\r
843   if ((params.GetContentType() == VIDEODB_CONTENT_TVSHOWS && dir.GetDirectoryChildType(items.m_strPath) == NODE_TYPE_EPISODES) || dir.GetDirectoryChildType(items.m_strPath) == NODE_TYPE_RECENTLY_ADDED_EPISODES)\r
844     filterWatched = true;\r
845   if (items.IsPluginFolder())\r
846     filterWatched = true;\r
847   if (g_stSettings.m_iMyVideoWatchMode == VIDEO_SHOW_ALL)\r
848     filterWatched = false;\r
849   if (params.GetContentType() == VIDEODB_CONTENT_MOVIES || params.GetContentType() == VIDEODB_CONTENT_MUSICVIDEOS || dir.GetDirectoryChildType(items.m_strPath) == NODE_TYPE_RECENTLY_ADDED_MOVIES || dir.GetDirectoryChildType(items.m_strPath) == NODE_TYPE_RECENTLY_ADDED_MUSICVIDEOS) // need to filter no matter to get rid of duplicates - price to pay for not filtering in db\r
850     filterWatched = true;\r
851 \r
852   if (filterWatched || !m_filter.IsEmpty())\r
853     FilterItems(items);\r
854 }\r
855 \r
856 void CGUIWindowVideoNav::ClearFileItems()\r
857 {\r
858   m_viewControl.Clear();\r
859   m_vecItems.ClearKeepPointer();\r
860   m_unfilteredItems.Clear();\r
861 }\r
862 \r
863 void CGUIWindowVideoNav::OnFilterItems()\r
864 {\r
865   CStdString currentItem;\r
866   int item = m_viewControl.GetSelectedItem();\r
867   if (item >= 0)\r
868     currentItem = m_vecItems[item]->m_strPath;\r
869 \r
870   m_viewControl.Clear();\r
871 \r
872   FilterItems(m_vecItems);\r
873 \r
874   // and update our view control + buttons\r
875   m_viewControl.SetItems(m_vecItems);\r
876   m_viewControl.SetSelectedItem(currentItem);\r
877   UpdateButtons();\r
878 }\r
879 \r
880 void CGUIWindowVideoNav::FilterItems(CFileItemList &items)\r
881 {\r
882   CVideoDatabaseDirectory dir;\r
883   CQueryParams params;\r
884   dir.GetQueryParams(items.m_strPath,params);\r
885   bool filterWatched=false;\r
886   if ((params.GetContentType() == VIDEODB_CONTENT_TVSHOWS && dir.GetDirectoryChildType(items.m_strPath) == NODE_TYPE_EPISODES) || dir.GetDirectoryChildType(items.m_strPath) == NODE_TYPE_RECENTLY_ADDED_EPISODES)\r
887     filterWatched = true;\r
888   if (params.GetContentType() == VIDEODB_CONTENT_MOVIES || params.GetContentType() == VIDEODB_CONTENT_MUSICVIDEOS|| dir.GetDirectoryChildType(items.m_strPath) == NODE_TYPE_RECENTLY_ADDED_MOVIES || dir.GetDirectoryChildType(items.m_strPath) == NODE_TYPE_RECENTLY_ADDED_MUSICVIDEOS)\r
889     filterWatched = true;\r
890   if (items.IsPluginFolder())\r
891     filterWatched = true;\r
892   if (g_stSettings.m_iMyVideoWatchMode == VIDEO_SHOW_ALL)\r
893     filterWatched = false;\r
894   \r
895   NODE_TYPE node = dir.GetDirectoryChildType(items.m_strPath);\r
896   if (m_vecItems.IsVirtualDirectoryRoot() || node == NODE_TYPE_MOVIES_OVERVIEW || node == NODE_TYPE_TVSHOWS_OVERVIEW || node == NODE_TYPE_MUSICVIDEOS_OVERVIEW)\r
897     return;\r
898 \r
899   items.ClearKeepPointer();\r
900   for (int i = 0; i < m_unfilteredItems.Size(); i++)\r
901   {\r
902     CFileItem *item = m_unfilteredItems[i];\r
903     if (item->m_bIsFolder || item->IsParentFolder() || CVideoDatabaseDirectory::IsAllItem(item->m_strPath) ||\r
904         (m_filter.IsEmpty() && (!filterWatched || item->GetVideoInfoTag()->m_bWatched == (g_stSettings.m_iMyVideoWatchMode==2))))\r
905     {\r
906       if ((params.GetContentType() != VIDEODB_CONTENT_MOVIES  && params.GetContentType() != VIDEODB_CONTENT_MUSICVIDEOS) || !items.Contains(item->m_strPath))\r
907         items.Add(item);\r
908       continue;\r
909     }\r
910     // TODO: Need to update this to get all labels, ideally out of the displayed info (ie from m_layout and m_focusedLayout)\r
911     // though that isn't practical.  Perhaps a better idea would be to just grab the info that we should filter on based on\r
912     // where we are in the library tree.\r
913     // Another idea is tying the filter string to the current level of the tree, so that going deeper disables the filter,\r
914     // but it's re-enabled on the way back out.\r
915     CStdString match;\r
916 /*    if (item->GetFocusedLayout())\r
917       match = item->GetFocusedLayout()->GetAllText();\r
918     else if (item->GetLayout())\r
919       match = item->GetLayout()->GetAllText();\r
920     else*/\r
921       match = item->GetLabel() + " " + item->GetLabel2();\r
922     if (StringUtils::FindWords(match.c_str(), m_filter.c_str()) && \r
923         (!filterWatched || item->GetVideoInfoTag()->m_bWatched == (g_stSettings.m_iMyVideoWatchMode==2)))\r
924     {\r
925       if ((params.GetContentType() != VIDEODB_CONTENT_MOVIES && params.GetContentType() != VIDEODB_CONTENT_MUSICVIDEOS) || !items.Contains(item->m_strPath))\r
926         items.Add(item);\r
927     }\r
928   }\r
929 }\r
930 \r
931 void CGUIWindowVideoNav::GetContextButtons(int itemNumber, CContextButtons &buttons)\r
932 {\r
933   CFileItem *item = (itemNumber >= 0 && itemNumber < m_vecItems.Size()) ? m_vecItems[itemNumber] : NULL;\r
934 \r
935   CGUIWindowVideoBase::GetContextButtons(itemNumber, buttons);\r
936 \r
937   CVideoDatabaseDirectory dir;\r
938   NODE_TYPE node = dir.GetDirectoryChildType(m_vecItems.m_strPath);\r
939   \r
940   if (!item)\r
941   {       \r
942     CGUIDialogVideoScan *pScanDlg = (CGUIDialogVideoScan *)m_gWindowManager.GetWindow(WINDOW_DIALOG_VIDEO_SCAN);\r
943     if (pScanDlg && pScanDlg->IsScanning())\r
944       buttons.Add(CONTEXT_BUTTON_STOP_SCANNING, 13353);\r
945     else\r
946       buttons.Add(CONTEXT_BUTTON_UPDATE_LIBRARY, 653);\r
947   }\r
948   else\r
949   {\r
950     SScraperInfo info;\r
951     VIDEO::SScanSettings settings;\r
952     GetScraperForItem(item, info, settings);\r
953     \r
954     if (info.strContent.Equals("tvshows"))\r
955       buttons.Add(CONTEXT_BUTTON_INFO, item->m_bIsFolder ? 20351 : 20352);\r
956     else if (info.strContent.Equals("musicvideos"))\r
957       buttons.Add(CONTEXT_BUTTON_INFO,20393);\r
958     else if (!item->m_bIsFolder && !item->m_strPath.Left(19).Equals("newsmartplaylist://"))\r
959       buttons.Add(CONTEXT_BUTTON_INFO, 13346);\r
960 \r
961     if (item->HasVideoInfoTag() && item->GetVideoInfoTag()->GetArtist().size() > 0)\r
962     {\r
963       CMusicDatabase database;\r
964       database.Open();\r
965       if (database.GetArtistByName(item->GetVideoInfoTag()->GetArtist()) > -1)\r
966         buttons.Add(CONTEXT_BUTTON_GO_TO_ARTIST, 20396);\r
967     }\r
968     if (item->HasVideoInfoTag() && item->GetVideoInfoTag()->m_strAlbum.size() > 0)\r
969     {\r
970       CMusicDatabase database;\r
971       database.Open();\r
972       if (database.GetAlbumByName(item->GetVideoInfoTag()->m_strAlbum) > -1)\r
973         buttons.Add(CONTEXT_BUTTON_GO_TO_ALBUM, 20397);\r
974     }\r
975     if (item->HasVideoInfoTag() && item->GetVideoInfoTag()->m_strAlbum.size() > 0 && item->GetVideoInfoTag()->GetArtist().size() > 0 && item->GetVideoInfoTag()->m_strTitle.size() > 0)\r
976     {\r
977       CMusicDatabase database;\r
978       database.Open();\r
979       if (database.GetSongByArtistAndAlbumAndTitle(item->GetVideoInfoTag()->GetArtist(),item->GetVideoInfoTag()->m_strAlbum,item->GetVideoInfoTag()->m_strTitle) > -1)\r
980         buttons.Add(CONTEXT_BUTTON_PLAY_OTHER, 20398);\r
981     }\r
982     if (!item->IsParentFolder())\r
983     {\r
984       // can we update the database?\r
985       if (g_settings.m_vecProfiles[g_settings.m_iLastLoadedProfileIndex].canWriteDatabases() || g_passwordManager.bMasterUser)\r
986       {\r
987         if (node == NODE_TYPE_TITLE_TVSHOWS)\r
988         {\r
989           CGUIDialogVideoScan *pScanDlg = (CGUIDialogVideoScan *)m_gWindowManager.GetWindow(WINDOW_DIALOG_VIDEO_SCAN);\r
990           if (pScanDlg && pScanDlg->IsScanning())\r
991             buttons.Add(CONTEXT_BUTTON_STOP_SCANNING, 13353);\r
992           else\r
993             buttons.Add(CONTEXT_BUTTON_UPDATE_TVSHOW, 13349);\r
994         }\r
995         if (node == NODE_TYPE_TITLE_TVSHOWS || node == NODE_TYPE_SEASONS || (item->IsVideoDb() && item->HasVideoInfoTag() && !item->m_bIsFolder))\r
996         {\r
997           if (item->m_bIsFolder || item->GetVideoInfoTag()->m_bWatched)\r
998             buttons.Add(CONTEXT_BUTTON_MARK_UNWATCHED, 16104); //Mark as UnWatched\r
999           if (item->m_bIsFolder || !item->GetVideoInfoTag()->m_bWatched)\r
1000             buttons.Add(CONTEXT_BUTTON_MARK_WATCHED, 16103);   //Mark as Watched\r
1001           if (node != NODE_TYPE_SEASONS)\r
1002             buttons.Add(CONTEXT_BUTTON_EDIT, 16105); //Edit Title\r
1003         }\r
1004         if (m_database.GetTvShowCount() > 0 && item->HasVideoInfoTag() && !item->m_bIsFolder && item->GetVideoInfoTag()->m_iEpisode == -1 && item->GetVideoInfoTag()->m_artist.size() == 0) // movie entry\r
1005         {\r
1006           if (m_database.IsLinkedToTvshow(item->GetVideoInfoTag()->m_iDbId))\r
1007             buttons.Add(CONTEXT_BUTTON_UNLINK_MOVIE,20385);\r
1008           else\r
1009             buttons.Add(CONTEXT_BUTTON_LINK_MOVIE,20384);\r
1010         }\r
1011 \r
1012         if (node == NODE_TYPE_SEASONS && !dir.IsAllItem(item->m_strPath) && item->m_bIsFolder)\r
1013           buttons.Add(CONTEXT_BUTTON_SET_SEASON_THUMB, 20371);\r
1014 \r
1015         if (m_vecItems.m_strPath.Equals("plugin://video/"))\r
1016           buttons.Add(CONTEXT_BUTTON_SET_PLUGIN_THUMB, 1044);\r
1017         \r
1018         if (node == NODE_TYPE_ACTOR && !dir.IsAllItem(item->m_strPath) && item->m_bIsFolder)\r
1019         {\r
1020           if (m_vecItems.m_strPath.Left(11).Equals("videodb://3")) // mvids\r
1021             buttons.Add(CONTEXT_BUTTON_SET_ARTIST_THUMB, 13359);\r
1022           else\r
1023             buttons.Add(CONTEXT_BUTTON_SET_ACTOR_THUMB, 20403);\r
1024         }\r
1025         if (item->IsVideoDb() && item->HasVideoInfoTag() && (!item->m_bIsFolder || node == NODE_TYPE_TITLE_TVSHOWS))\r
1026         {\r
1027           if (info.strContent.Equals("tvshows")) \r
1028           {\r
1029             if(item->GetVideoInfoTag()->m_iBookmarkId != -1 && item->GetVideoInfoTag()->m_iBookmarkId != 0)\r
1030               buttons.Add(CONTEXT_BUTTON_UNLINK_BOOKMARK, 20405);\r
1031           }\r
1032           buttons.Add(CONTEXT_BUTTON_DELETE, 646);\r
1033         }\r
1034 \r
1035         // this should ideally be non-contextual (though we need some context for non-tv show node I guess)\r
1036         CGUIDialogVideoScan *pScanDlg = (CGUIDialogVideoScan *)m_gWindowManager.GetWindow(WINDOW_DIALOG_VIDEO_SCAN);\r
1037         if (pScanDlg && pScanDlg->IsScanning())\r
1038         {\r
1039           if (node != NODE_TYPE_TITLE_TVSHOWS)\r
1040             buttons.Add(CONTEXT_BUTTON_STOP_SCANNING, 13353);\r
1041         }\r
1042         else\r
1043           buttons.Add(CONTEXT_BUTTON_UPDATE_LIBRARY, 653);\r
1044       }\r
1045 \r
1046       //Set default and/or clear default\r
1047       CVideoDatabaseDirectory dir;\r
1048       NODE_TYPE nodetype = dir.GetDirectoryType(item->m_strPath);\r
1049       if (!item->IsParentFolder() && !m_vecItems.m_strPath.Equals("special://videoplaylists/") &&\r
1050         (nodetype == NODE_TYPE_ROOT || nodetype == NODE_TYPE_OVERVIEW || nodetype == NODE_TYPE_TVSHOWS_OVERVIEW || nodetype == NODE_TYPE_MOVIES_OVERVIEW || nodetype == NODE_TYPE_MUSICVIDEOS_OVERVIEW))\r
1051       {\r
1052         if (!item->m_strPath.Equals(g_settings.m_defaultVideoLibSource))\r
1053           buttons.Add(CONTEXT_BUTTON_SET_DEFAULT, 13335); // set default\r
1054         if (strcmp(g_settings.m_defaultVideoLibSource, ""))\r
1055           buttons.Add(CONTEXT_BUTTON_CLEAR_DEFAULT, 13403); // clear default\r
1056       }\r
1057 \r
1058       if (m_vecItems.m_strPath.Equals("special://videoplaylists/"))\r
1059       { // video playlists, file operations are allowed\r
1060         if (!item->IsReadOnly())\r
1061         {\r
1062           buttons.Add(CONTEXT_BUTTON_DELETE, 117);\r
1063           buttons.Add(CONTEXT_BUTTON_RENAME, 118);\r
1064         }\r
1065       }\r
1066     }\r
1067   }\r
1068   CGUIWindowVideoBase::GetNonContextButtons(itemNumber, buttons);\r
1069 }\r
1070 \r
1071 bool CGUIWindowVideoNav::OnContextButton(int itemNumber, CONTEXT_BUTTON button)\r
1072 {\r
1073   switch (button)\r
1074   {\r
1075   case CONTEXT_BUTTON_SET_DEFAULT:\r
1076     g_settings.m_defaultVideoLibSource = GetQuickpathName(m_vecItems[itemNumber]->m_strPath);\r
1077     g_settings.Save();\r
1078     return true;\r
1079 \r
1080   case CONTEXT_BUTTON_CLEAR_DEFAULT:\r
1081     g_settings.m_defaultVideoLibSource.Empty();\r
1082     g_settings.Save();\r
1083     return true;\r
1084 \r
1085   case CONTEXT_BUTTON_MARK_WATCHED:\r
1086     MarkWatched(m_vecItems[itemNumber]);\r
1087     CUtil::DeleteVideoDatabaseDirectoryCache();\r
1088     Update(m_vecItems.m_strPath);\r
1089     return true;\r
1090 \r
1091 \r
1092   case CONTEXT_BUTTON_MARK_UNWATCHED:\r
1093     MarkUnWatched(m_vecItems[itemNumber]);\r
1094     CUtil::DeleteVideoDatabaseDirectoryCache();\r
1095     Update(m_vecItems.m_strPath);\r
1096     return true;\r
1097 \r
1098   case CONTEXT_BUTTON_EDIT:\r
1099     UpdateVideoTitle(m_vecItems[itemNumber]);\r
1100     CUtil::DeleteVideoDatabaseDirectoryCache();\r
1101     Update(m_vecItems.m_strPath);\r
1102     return true;\r
1103 \r
1104   case CONTEXT_BUTTON_SET_SEASON_THUMB:\r
1105   case CONTEXT_BUTTON_SET_ACTOR_THUMB:\r
1106   case CONTEXT_BUTTON_SET_ARTIST_THUMB:\r
1107   case CONTEXT_BUTTON_SET_PLUGIN_THUMB:\r
1108     {\r
1109       // Grab the thumbnails from the web\r
1110       CStdString strPath;\r
1111       CFileItemList items;\r
1112       CUtil::AddFileToFolder(g_advancedSettings.m_cachePath,"imdbthumbs",strPath);\r
1113       CUtil::WipeDir(strPath);\r
1114       DIRECTORY::CDirectory::Create(strPath);\r
1115       CFileItem* noneitem = new CFileItem("thumb://None", false);\r
1116       int i=1;\r
1117       CVideoInfoTag tag;\r
1118       if (button != CONTEXT_BUTTON_SET_ARTIST_THUMB && button != CONTEXT_BUTTON_SET_PLUGIN_THUMB)\r
1119       {\r
1120         if (button == CONTEXT_BUTTON_SET_SEASON_THUMB)\r
1121           m_database.GetTvShowInfo("",tag,m_vecItems[itemNumber]->GetVideoInfoTag()->m_iDbId);\r
1122         else\r
1123           tag = *m_vecItems[itemNumber]->GetVideoInfoTag();\r
1124         for (std::vector<CScraperUrl::SUrlEntry>::iterator iter=tag.m_strPictureURL.m_url.begin();iter != tag.m_strPictureURL.m_url.end();++iter)\r
1125         {\r
1126           if ((iter->m_type != CScraperUrl::URL_TYPE_SEASON || iter->m_season != m_vecItems[itemNumber]->GetVideoInfoTag()->m_iSeason) && button == CONTEXT_BUTTON_SET_SEASON_THUMB)\r
1127             continue;\r
1128           CStdString thumbFromWeb;\r
1129           CStdString strLabel;\r
1130           strLabel.Format("imdbthumb%i.jpg",i);\r
1131           CUtil::AddFileToFolder(strPath, strLabel, thumbFromWeb);\r
1132           if (CScraperUrl::DownloadThumbnail(thumbFromWeb,*iter))\r
1133           {\r
1134             CStdString strItemPath;\r
1135             strItemPath.Format("thumb://IMDb%i",i++);\r
1136             CFileItem *item = new CFileItem(strItemPath, false);\r
1137             item->SetThumbnailImage(thumbFromWeb);\r
1138             CStdString strLabel;\r
1139             item->SetLabel(g_localizeStrings.Get(20015));\r
1140             items.Add(item);\r
1141           }\r
1142         }\r
1143       }\r
1144       CStdString cachedThumb = m_vecItems[itemNumber]->GetCachedSeasonThumb();\r
1145       if (button == CONTEXT_BUTTON_SET_ACTOR_THUMB)\r
1146         cachedThumb = m_vecItems[itemNumber]->GetCachedActorThumb();\r
1147       if (button == CONTEXT_BUTTON_SET_ARTIST_THUMB)\r
1148         cachedThumb = m_vecItems[itemNumber]->GetCachedArtistThumb();\r
1149       if (button == CONTEXT_BUTTON_SET_SEASON_THUMB)\r
1150       {\r
1151         CFileItemList tbnItems;\r
1152         CDirectory::GetDirectory(tag.m_strPath,tbnItems,".tbn");\r
1153         CStdString strExpression;\r
1154         strExpression.Format("season[ ._-](0?%i)\\.tbn",m_vecItems[itemNumber]->GetVideoInfoTag()->m_iSeason);\r
1155         CRegExp reg;\r
1156         if (reg.RegComp(strExpression.c_str()))\r
1157         {\r
1158           for (int j=0;j<tbnItems.Size();++j)\r
1159           {\r
1160             CStdString strCheck = CUtil::GetFileName(tbnItems[j]->m_strPath);\r
1161             strCheck.ToLower();\r
1162             if (reg.RegFind(strCheck.c_str()) > -1)\r
1163             {\r
1164               CFileItem *item = new CFileItem("thumb://Local", false);\r
1165               item->SetThumbnailImage(cachedThumb); // this doesn't look right to me - perhaps tbnItems[j]->m_strPath?\r
1166               item->SetLabel(g_localizeStrings.Get(20017));\r
1167               items.Add(item);              \r
1168               break;\r
1169             }\r
1170             else\r
1171             {\r
1172               noneitem->SetThumbnailImage("DefaultFolderBig.png");\r
1173               noneitem->SetLabel(g_localizeStrings.Get(20018));\r
1174             }\r
1175           }\r
1176         }\r
1177       }\r
1178       if (button == CONTEXT_BUTTON_SET_PLUGIN_THUMB)\r
1179       {\r
1180         strPath = m_vecItems[itemNumber]->m_strPath;\r
1181         strPath.Replace("plugin://video/","Q:\\plugins\\video\\");\r
1182         strPath.Replace("/","\\");\r
1183         CFileItem item(strPath,true);\r
1184         cachedThumb = item.GetCachedProgramThumb();\r
1185       }\r
1186       if (CFile::Exists(cachedThumb))\r
1187       {\r
1188         CFileItem *item = new CFileItem("thumb://Current", false);\r
1189         item->SetThumbnailImage(cachedThumb);\r
1190         item->SetLabel(g_localizeStrings.Get(20016));\r
1191         items.Add(item);\r
1192       }\r
1193       else\r
1194       {\r
1195         noneitem->SetThumbnailImage("DefaultFolderBig.png");\r
1196         noneitem->SetLabel(g_localizeStrings.Get(20018));\r
1197       }\r
1198 \r
1199       if (button == CONTEXT_BUTTON_SET_PLUGIN_THUMB)\r
1200       {\r
1201         if (items.Size() == 0)\r
1202         {\r
1203           CFileItem item2(strPath,false);\r
1204           CUtil::AddFileToFolder(strPath,"default.py",item2.m_strPath);\r
1205           if (CFile::Exists(item2.GetCachedProgramThumb()))\r
1206           {\r
1207             CFileItem *item = new CFileItem("thumb://Current", false);\r
1208             item->SetThumbnailImage(item2.GetCachedProgramThumb());\r
1209             item->SetLabel(g_localizeStrings.Get(20016));\r
1210             items.Add(item);\r
1211           }\r
1212           else\r
1213           {\r
1214             noneitem->SetThumbnailImage("DefaultFolderBig.png");\r
1215             noneitem->SetLabel(g_localizeStrings.Get(20018));\r
1216           }\r
1217         }\r
1218         CStdString strThumb;\r
1219         CUtil::AddFileToFolder(strPath,"folder.jpg",strThumb);\r
1220         if (CFile::Exists(strThumb))\r
1221         {\r
1222           CFileItem* item = new CFileItem(strThumb,false);\r
1223           item->SetThumbnailImage(strThumb);\r
1224           item->SetLabel(g_localizeStrings.Get(20017));\r
1225           items.Add(item);\r
1226         }\r
1227         else\r
1228         {\r
1229           noneitem->SetThumbnailImage("DefaultFolderBig.png");\r
1230           noneitem->SetLabel(g_localizeStrings.Get(20018));\r
1231         }\r
1232         CUtil::AddFileToFolder(strPath,"default.tbn",strThumb);\r
1233         if (CFile::Exists(strThumb))\r
1234         {\r
1235           CFileItem* item = new CFileItem(strThumb,false);\r
1236           item->SetThumbnailImage(strThumb);\r
1237           item->SetLabel(g_localizeStrings.Get(20017));\r
1238           items.Add(item);\r
1239         }\r
1240         else\r
1241         {\r
1242           noneitem->SetThumbnailImage("DefaultFolderBig.png");\r
1243           noneitem->SetLabel(g_localizeStrings.Get(20018));\r
1244         }\r
1245       }\r
1246       if (button == CONTEXT_BUTTON_SET_ARTIST_THUMB)\r
1247       {\r
1248         CStdString picturePath;\r
1249 \r
1250         CStdString strPath = m_vecItems[itemNumber]->m_strPath;\r
1251         CUtil::RemoveSlashAtEnd(strPath);\r
1252 \r
1253         int nPos=strPath.ReverseFind("/");\r
1254         if (nPos>-1)\r
1255         {\r
1256           //  try to guess where the user should start\r
1257           //  browsing for the artist thumb\r
1258           CMusicDatabase database;\r
1259           database.Open();\r
1260           CFileItemList albums;\r
1261           long idArtist=database.GetArtistByName(m_vecItems[itemNumber]->GetLabel());\r
1262           CStdString path;\r
1263           database.GetArtistPath(idArtist, picturePath);\r
1264         }\r
1265 \r
1266         CStdString strThumb;\r
1267         CUtil::AddFileToFolder(picturePath,"folder.jpg",strThumb);\r
1268         if (XFILE::CFile::Exists(strThumb))\r
1269         {\r
1270           CFileItem* pItem = new CFileItem(strThumb,false);\r
1271           pItem->SetLabel(g_localizeStrings.Get(20017));\r
1272           pItem->SetThumbnailImage(strThumb);\r
1273           items.Add(pItem);\r
1274         }\r
1275         else\r
1276         {\r
1277           noneitem->SetThumbnailImage("DefaultArtistBig.png");\r
1278           noneitem->SetLabel(g_localizeStrings.Get(20018));\r
1279         }\r
1280       }\r
1281 \r
1282       if (button == CONTEXT_BUTTON_SET_ACTOR_THUMB)\r
1283       {\r
1284         CStdString picturePath;\r
1285         CStdString strThumb;\r
1286         CUtil::AddFileToFolder(picturePath,"folder.jpg",strThumb);\r
1287         if (XFILE::CFile::Exists(strThumb))\r
1288         {\r
1289           CFileItem* pItem = new CFileItem(strThumb,false);\r
1290           pItem->SetLabel(g_localizeStrings.Get(20017));\r
1291           pItem->SetThumbnailImage(strThumb);\r
1292           items.Add(pItem);\r
1293         }\r
1294         else\r
1295         {\r
1296           noneitem->SetThumbnailImage("DefaultActorBig.png");\r
1297           noneitem->SetLabel(g_localizeStrings.Get(20018));\r
1298         }\r
1299       }\r
1300 \r
1301       items.Add(noneitem);\r
1302 \r
1303       CStdString result;\r
1304       if (!CGUIDialogFileBrowser::ShowAndGetImage(items, g_settings.m_videoSources, g_localizeStrings.Get(20019), result))\r
1305         return false;   // user cancelled\r
1306 \r
1307       if (result == "thumb://Current")\r
1308         return false;   // user chose the one they have\r
1309 \r
1310       // delete the thumbnail if that's what the user wants, else overwrite with the\r
1311       // new thumbnail\r
1312       if (result.Mid(0,12) == "thumb://IMDb")\r
1313       {\r
1314         CStdString strFile;\r
1315         CUtil::AddFileToFolder(strPath,"imdbthumb"+result.Mid(12)+".jpg",strFile);\r
1316         if (CFile::Exists(strFile))\r
1317           CFile::Cache(strFile, cachedThumb);\r
1318         else\r
1319           result = "thumb://None";\r
1320       }\r
1321       if (result == "thumb://None")\r
1322       {\r
1323         CFile::Delete(cachedThumb);\r
1324         if (button == CONTEXT_BUTTON_SET_PLUGIN_THUMB)\r
1325         {\r
1326           CPicture picture;\r
1327           picture.CacheSkinImage("DefaultFolderBig.png",cachedThumb);\r
1328           CFileItem item2(strPath,false);\r
1329           CUtil::AddFileToFolder(strPath,"default.py",item2.m_strPath);\r
1330           CFile::Delete(item2.GetCachedProgramThumb());\r
1331         }\r
1332       }\r
1333       else\r
1334         CFile::Cache(result,cachedThumb);\r
1335 \r
1336       CUtil::DeleteVideoDatabaseDirectoryCache();\r
1337       CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_REFRESH_THUMBS, 0, NULL);\r
1338       g_graphicsContext.SendMessage(msg);\r
1339       Update(m_vecItems.m_strPath);\r
1340 \r
1341       return true;\r
1342     }\r
1343   case CONTEXT_BUTTON_UPDATE_LIBRARY:\r
1344     {\r
1345       SScraperInfo info;\r
1346       VIDEO::SScanSettings settings;\r
1347       OnScan("",info,settings);\r
1348       return true;\r
1349     }\r
1350   case CONTEXT_BUTTON_UNLINK_MOVIE:\r
1351     {\r
1352       m_database.LinkMovieToTvshow(m_vecItems[itemNumber]->GetVideoInfoTag()->m_iDbId,-1);\r
1353       CUtil::DeleteVideoDatabaseDirectoryCache();\r
1354       return true;\r
1355     }\r
1356   case CONTEXT_BUTTON_LINK_MOVIE:\r
1357     {\r
1358       OnLinkMovieToTvShow(itemNumber);\r
1359       return true;\r
1360     }\r
1361   case CONTEXT_BUTTON_GO_TO_ARTIST:\r
1362     {\r
1363       CStdString strPath;\r
1364       CMusicDatabase database;\r
1365       database.Open();\r
1366       strPath.Format("musicdb://2/%ld/",database.GetArtistByName(m_vecItems[itemNumber]->GetVideoInfoTag()->GetArtist()));\r
1367       m_gWindowManager.ActivateWindow(WINDOW_MUSIC_NAV,strPath);\r
1368       return true;\r
1369     }\r
1370   case CONTEXT_BUTTON_GO_TO_ALBUM:\r
1371     {\r
1372       CStdString strPath;\r
1373       CMusicDatabase database;\r
1374       database.Open();\r
1375       strPath.Format("musicdb://3/%ld/",database.GetAlbumByName(m_vecItems[itemNumber]->GetVideoInfoTag()->m_strAlbum));\r
1376       m_gWindowManager.ActivateWindow(WINDOW_MUSIC_NAV,strPath);\r
1377       return true;\r
1378     }\r
1379   case CONTEXT_BUTTON_PLAY_OTHER:\r
1380     {\r
1381       CMusicDatabase database;\r
1382       database.Open();\r
1383       CSong song;\r
1384       if (database.GetSongById(database.GetSongByArtistAndAlbumAndTitle(m_vecItems[itemNumber]->GetVideoInfoTag()->GetArtist(),m_vecItems[itemNumber]->GetVideoInfoTag()->m_strAlbum,m_vecItems[itemNumber]->GetVideoInfoTag()->m_strTitle),song))\r
1385         g_applicationMessenger.PlayFile(song);\r
1386       return true;\r
1387     }\r
1388 \r
1389   case CONTEXT_BUTTON_UNLINK_BOOKMARK:\r
1390     {\r
1391       m_database.Open();\r
1392       m_database.DeleteBookMarkForEpisode(*m_vecItems[itemNumber]->GetVideoInfoTag());\r
1393       m_database.Close();\r
1394       CUtil::DeleteVideoDatabaseDirectoryCache();\r
1395       Update(m_vecItems.m_strPath);\r
1396       return true;\r
1397     }\r
1398   \r
1399   default:\r
1400     break;\r
1401 \r
1402   }\r
1403   return CGUIWindowVideoBase::OnContextButton(itemNumber, button);\r
1404 }\r
1405 \r
1406 void CGUIWindowVideoNav::OnLinkMovieToTvShow(int itemnumber)\r
1407 {\r
1408   CFileItemList list;\r
1409   m_database.GetTvShowsNav("videodb://2/2",list);\r
1410   list.Sort(SORT_METHOD_LABEL,SORT_ORDER_ASC);\r
1411   CGUIDialogSelect* pDialog = (CGUIDialogSelect*)m_gWindowManager.GetWindow(WINDOW_DIALOG_SELECT);\r
1412   pDialog->Reset();\r
1413   pDialog->SetItems(&list);\r
1414   pDialog->SetHeading(20356);\r
1415   pDialog->DoModal();\r
1416   if (pDialog->GetSelectedLabel() > -1)\r
1417   {\r
1418     m_database.LinkMovieToTvshow(m_vecItems[itemnumber]->GetVideoInfoTag()->m_iDbId,pDialog->GetSelectedItem().GetVideoInfoTag()->m_iDbId);\r
1419     CUtil::DeleteVideoDatabaseDirectoryCache();\r
1420   }\r
1421 }\r
1422 \r
1423 \r
1424 \r