fixed: quirks with album information in file view
[xbmc:xbmc-antiquated.git] / xbmc / GUIDialogSongInfo.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 "GUIDialogSongInfo.h"\r
24 #include "utils/HTTP.h"\r
25 #include "Util.h"\r
26 #include "Picture.h"\r
27 #include "GUIDialogFileBrowser.h"\r
28 #include "GUIPassword.h"\r
29 #include "MusicDatabase.h"\r
30 #include "GUIWindowMusicBase.h"\r
31 \r
32 using namespace XFILE;\r
33 \r
34 #define CONTROL_OK        10\r
35 #define CONTROL_CANCEL    11\r
36 #define CONTROL_ALBUMINFO 12\r
37 #define CONTROL_GETTHUMB  13\r
38 \r
39 CGUIDialogSongInfo::CGUIDialogSongInfo(void)\r
40     : CGUIDialog(WINDOW_DIALOG_SONG_INFO, "DialogSongInfo.xml")\r
41 {\r
42   m_cancelled = false;\r
43   m_needsUpdate = false;\r
44   m_startRating = -1;\r
45 }\r
46 \r
47 CGUIDialogSongInfo::~CGUIDialogSongInfo(void)\r
48 {\r
49 }\r
50 \r
51 bool CGUIDialogSongInfo::OnMessage(CGUIMessage& message)\r
52 {\r
53   switch (message.GetMessage())\r
54   {\r
55   case GUI_MSG_WINDOW_DEINIT:\r
56     {\r
57       if (!m_cancelled && m_startRating != m_song.GetMusicInfoTag()->GetRating())\r
58       {\r
59         CMusicDatabase db;\r
60         if (db.Open())      // OpenForWrite() ?\r
61         {\r
62           db.SetSongRating(m_song.m_strPath, m_song.GetMusicInfoTag()->GetRating());\r
63           db.Close();\r
64         }\r
65         m_needsUpdate = true;\r
66       }\r
67       else\r
68       { // cancelled - reset the song rating\r
69         SetRating(m_startRating);\r
70         m_needsUpdate = false;\r
71       }\r
72       break;\r
73     }\r
74   case GUI_MSG_WINDOW_INIT:\r
75     m_cancelled = false;\r
76     break;\r
77 \r
78   case GUI_MSG_CLICKED:\r
79     {\r
80       int iControl = message.GetSenderId();\r
81       if (iControl == CONTROL_CANCEL)\r
82       {\r
83         m_cancelled = true;\r
84         Close();\r
85         return true;\r
86       }\r
87       else if (iControl == CONTROL_OK)\r
88       {\r
89         m_cancelled = false;\r
90         Close();\r
91         return true;\r
92       }\r
93       else if (iControl == CONTROL_ALBUMINFO)\r
94       {\r
95         CGUIWindowMusicBase *window = (CGUIWindowMusicBase *)m_gWindowManager.GetWindow(m_gWindowManager.GetActiveWindow());\r
96         if (window)\r
97         {\r
98           CFileItem item(m_song);\r
99           CUtil::GetDirectory(m_song.m_strPath,item.m_strPath);\r
100           item.m_bIsFolder = true;\r
101           window->OnInfo(&item, true);\r
102         }\r
103         return true;\r
104       }\r
105       else if (iControl == CONTROL_GETTHUMB)\r
106       {\r
107         OnGetThumb();\r
108         return true;\r
109       }\r
110     }\r
111     break;\r
112   }\r
113 \r
114   return CGUIDialog::OnMessage(message);\r
115 }\r
116 \r
117 bool CGUIDialogSongInfo::OnAction(const CAction &action)\r
118 {\r
119   char rating = m_song.GetMusicInfoTag()->GetRating();\r
120   if (action.wID == ACTION_INCREASE_RATING)\r
121   {\r
122     if (rating < '5')\r
123       SetRating(rating + 1);\r
124     return true;\r
125   }\r
126   else if (action.wID == ACTION_DECREASE_RATING)\r
127   {\r
128     if (rating > '0')\r
129       SetRating(rating - 1);\r
130     return true;\r
131   }\r
132   else if (action.wID == ACTION_PREVIOUS_MENU)\r
133     m_cancelled = true;\r
134   return CGUIDialog::OnAction(action);\r
135 }\r
136 \r
137 void CGUIDialogSongInfo::OnInitWindow()\r
138 {\r
139   if (!g_guiSettings.GetBool("musiclibrary.enabled") || m_song.GetMusicInfoTag()->GetDatabaseId() == -1)\r
140   {\r
141     CONTROL_DISABLE(CONTROL_ALBUMINFO)\r
142   }\r
143   else\r
144   {\r
145     CONTROL_ENABLE(CONTROL_ALBUMINFO)\r
146   }\r
147 }\r
148 \r
149 void CGUIDialogSongInfo::SetRating(char rating)\r
150 {\r
151   if (rating < '0') rating = '0';\r
152   if (rating > '5') rating = '5';\r
153   m_song.GetMusicInfoTag()->SetRating(rating);\r
154   // send a message to all windows to tell them to update the fileitem (eg playlistplayer, media windows)\r
155   CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE_ITEM, 0, &m_song);\r
156   g_graphicsContext.SendMessage(msg);\r
157 }\r
158 \r
159 void CGUIDialogSongInfo::SetSong(CFileItem *item)\r
160 {\r
161   m_song = *item;\r
162   m_song.LoadMusicTag();\r
163   m_startRating = m_song.GetMusicInfoTag()->GetRating();\r
164   MUSIC_INFO::CMusicInfoLoader::LoadAdditionalTagInfo(&m_song);\r
165   m_needsUpdate = false;\r
166 }\r
167 \r
168 CFileItem* CGUIDialogSongInfo::GetCurrentListItem(int offset)\r
169 {\r
170   return &m_song;\r
171 }\r
172 \r
173 bool CGUIDialogSongInfo::DownloadThumbnail(const CStdString &thumbFile)\r
174 {\r
175   // TODO: Obtain the source...\r
176   CStdString source;\r
177   CHTTP http;\r
178   http.Download(source, thumbFile);\r
179   return true;\r
180 }\r
181 \r
182 // Get Thumb from user choice.\r
183 // Options are:\r
184 // 1.  Current thumb\r
185 // 2.  AllMusic.com thumb\r
186 // 3.  Local thumb\r
187 // 4.  No thumb (if no Local thumb is available)\r
188 \r
189 // TODO: Currently no support for "embedded thumb" as there is no easy way to grab it\r
190 //       without sending a file that has this as it's album to this class\r
191 void CGUIDialogSongInfo::OnGetThumb()\r
192 {\r
193   CFileItemList items;\r
194 \r
195   \r
196   // Grab the thumbnail from the web\r
197   CStdString thumbFromWeb;\r
198   /*\r
199   CUtil::AddFileToFolder(g_advancedSettings.m_cachePath, "allmusicThumb.jpg", thumbFromWeb);\r
200   if (DownloadThumbnail(thumbFromWeb))\r
201   {\r
202     CFileItem *item = new CFileItem("thumb://allmusic.com", false);\r
203     item->SetThumbnailImage(thumbFromWeb);\r
204     item->SetLabel(g_localizeStrings.Get(20055));\r
205     items.Add(item);\r
206   }*/\r
207 \r
208   // Current thumb\r
209   if (CFile::Exists(m_song.GetThumbnailImage()))\r
210   {\r
211     CFileItem *item = new CFileItem("thumb://Current", false);\r
212     item->SetThumbnailImage(m_song.GetThumbnailImage());\r
213     item->SetLabel(g_localizeStrings.Get(20016));\r
214     items.Add(item);\r
215   }\r
216 \r
217   // local thumb\r
218   CStdString cachedLocalThumb;\r
219   CStdString localThumb(m_song.GetUserMusicThumb(true));\r
220   if (m_song.IsMusicDb())\r
221   {\r
222     CFileItem item(m_song.GetMusicInfoTag()->GetURL(), false);\r
223     localThumb = item.GetUserMusicThumb(true);\r
224   }\r
225   if (CFile::Exists(localThumb))\r
226   {\r
227     CUtil::AddFileToFolder(g_advancedSettings.m_cachePath, "localthumb.jpg", cachedLocalThumb);\r
228     CPicture pic;\r
229     if (pic.DoCreateThumbnail(localThumb, cachedLocalThumb))\r
230     {\r
231       CFileItem *item = new CFileItem("thumb://Local", false);\r
232       item->SetThumbnailImage(cachedLocalThumb);\r
233       item->SetLabel(g_localizeStrings.Get(20017));\r
234       items.Add(item);\r
235     }\r
236   }\r
237   else\r
238   { // no local thumb exists, so we are just using the allmusic.com thumb or cached thumb\r
239     // which is probably the allmusic.com thumb.  These could be wrong, so allow the user\r
240     // to delete the incorrect thumb\r
241     CFileItem *item = new CFileItem("thumb://None", false);\r
242     item->SetThumbnailImage("defaultAlbumCover.png");\r
243     item->SetLabel(g_localizeStrings.Get(20018));\r
244     items.Add(item);\r
245   }\r
246 \r
247   CStdString result;\r
248   if (!CGUIDialogFileBrowser::ShowAndGetImage(items, g_settings.m_musicSources, g_localizeStrings.Get(1030), result))\r
249     return;   // user cancelled\r
250 \r
251   if (result == "thumb://Current")\r
252     return;   // user chose the one they have\r
253 \r
254   // delete the thumbnail if that's what the user wants, else overwrite with the\r
255   // new thumbnail\r
256 \r
257   CStdString cachedThumb(CUtil::GetCachedAlbumThumb(m_song.GetMusicInfoTag()->GetAlbum(), m_song.GetMusicInfoTag()->GetArtist()));\r
258 \r
259   if (result == "thumb://None")\r
260   { // cache the default thumb\r
261     CPicture pic;\r
262     pic.CacheSkinImage("defaultAlbumCover.png", cachedThumb);\r
263   }\r
264   else if (result == "thumb://allmusic.com")\r
265     CFile::Cache(thumbFromWeb, cachedThumb);\r
266   else if (result == "thumb://Local")\r
267     CFile::Cache(cachedLocalThumb, cachedThumb);\r
268   else if (CFile::Exists(result))\r
269   {\r
270     CPicture pic;\r
271     pic.DoCreateThumbnail(result, cachedThumb);\r
272   }\r
273 \r
274   m_song.SetThumbnailImage(cachedThumb);\r
275 \r
276   // tell our GUI to completely reload all controls (as some of them\r
277   // are likely to have had this image in use so will need refreshing)\r
278   CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_REFRESH_THUMBS, 0, NULL);\r
279   g_graphicsContext.SendMessage(msg);\r
280 \r
281 //  m_hasUpdatedThumb = true;\r
282 }\r