Merge pull request #3819 from arnova/subtitles_for_stacks
[vuplus_xbmc] / xbmc / video / dialogs / GUIDialogSubtitles.cpp
index e9c2eaf..1be5b6b 100644 (file)
@@ -30,6 +30,8 @@
 #include "filesystem/PluginDirectory.h"
 #include "filesystem/SpecialProtocol.h"
 #include "guilib/GUIImage.h"
+#include "guilib/GUIKeyboardFactory.h"
+#include "guilib/Key.h"
 #include "settings/MediaSettings.h"
 #include "settings/Settings.h"
 #include "settings/VideoSettings.h"
@@ -52,6 +54,7 @@ using namespace XFILE;
 #define CONTROL_SUBSEXIST            130
 #define CONTROL_SUBSTATUS            140
 #define CONTROL_SERVICELIST          150
+#define CONTROL_MANUALSEARCH         160
 
 /*! \brief simple job to retrieve a directory and store a string (language)
  */
@@ -112,7 +115,9 @@ CGUIDialogSubtitles::~CGUIDialogSubtitles(void)
 
 bool CGUIDialogSubtitles::OnMessage(CGUIMessage& message)
 {
-  if  (message.GetMessage() == GUI_MSG_CLICKED)
+  if  (message.GetMessage() == GUI_MSG_CLICKED &&
+       (message.GetParam1() == ACTION_SELECT_ITEM ||
+        message.GetParam1() == ACTION_MOUSE_LEFT_CLICK))
   {
     int iControl = message.GetSenderId();
 
@@ -138,6 +143,15 @@ bool CGUIDialogSubtitles::OnMessage(CGUIMessage& message)
 
       return true;
     }
+    else if (iControl == CONTROL_MANUALSEARCH)
+    {
+      //manual search
+      if (CGUIKeyboardFactory::ShowAndGetInput(m_strManualSearch, g_localizeStrings.Get(24121), true))
+      {
+        Search(m_strManualSearch);
+        return true;
+      }
+    }
   }
   else if (message.GetMessage() == GUI_MSG_WINDOW_DEINIT)
   {
@@ -222,7 +236,7 @@ void CGUIDialogSubtitles::FillServices()
   }
 
   std::string defaultService;
-  const CFileItem &item = g_application.CurrentFileItem();
+  const CFileItem &item = g_application.CurrentUnstackedItem();
   if (item.GetVideoContentType() == VIDEODB_CONTENT_TVSHOWS ||
       item.GetVideoContentType() == VIDEODB_CONTENT_EPISODES)
     // Set default service for tv shows
@@ -290,7 +304,7 @@ const CFileItemPtr CGUIDialogSubtitles::GetService() const
   return CFileItemPtr();
 }
 
-void CGUIDialogSubtitles::Search()
+void CGUIDialogSubtitles::Search(const std::string &search/*=""*/)
 {
   if (m_currentService.empty())
     return; // no services available
@@ -299,7 +313,13 @@ void CGUIDialogSubtitles::Search()
   ClearSubtitles();
 
   CURL url("plugin://" + m_currentService + "/");
-  url.SetOption("action", "search");
+  if (!search.empty())
+  {
+    url.SetOption("action", "manualsearch");
+    url.SetOption("searchstring", search);
+  }
+  else
+    url.SetOption("action", "search");
 
   const CSetting *setting = CSettings::Get().GetSetting("subtitles.languages");
   if (setting)
@@ -313,7 +333,7 @@ void CGUIDialogSubtitles::OnJobComplete(unsigned int jobID, bool success, CJob *
   const CURL &url             = ((CSubtitlesJob *)job)->GetURL();
   const CFileItemList *items  = ((CSubtitlesJob *)job)->GetItems();
   const std::string &language = ((CSubtitlesJob *)job)->GetLanguage();
-  if (url.GetOption("action") == "search")
+  if (url.GetOption("action") == "search" || url.GetOption("action") == "manualsearch")
     OnSearchComplete(items);
   else
     OnDownloadComplete(items, language);
@@ -386,6 +406,8 @@ void CGUIDialogSubtitles::OnDownloadComplete(const CFileItemList *items, const s
 
   CStdString strFileName;
   CStdString strDestPath;
+#if 0
+  // TODO: Code to download all subtitles for all stack items in one run
   if (g_application.CurrentFileItem().IsStack())
   {
     for (int i = 0; i < items->Size(); i++)
@@ -394,17 +416,22 @@ void CGUIDialogSubtitles::OnDownloadComplete(const CFileItemList *items, const s
 //    CLog::Log(LOGDEBUG, "Stack Subs [%s} Found", vecItems[i]->GetLabel().c_str());
     }
   }
-  else if (StringUtils::StartsWith(g_application.CurrentFile(), "http://"))
+#endif
+
+  // Get (unstacked) path
+  const CStdString &strCurrentFile = g_application.CurrentUnstackedItem().GetPath();
+
+  if (StringUtils::StartsWith(strCurrentFile, "http://"))
   {
     strFileName = "TemporarySubs";
     strDestPath = "special://temp/";
   }
   else
   {
-    strFileName = URIUtils::GetFileName(g_application.CurrentFile());
+    strFileName = URIUtils::GetFileName(strCurrentFile);
     if (CSettings::Get().GetBool("subtitles.savetomoviefolder"))
     {
-      strDestPath = URIUtils::GetDirectory(g_application.CurrentFile());
+      strDestPath = URIUtils::GetDirectory(strCurrentFile);
       if (!CUtil::SupportsWriteFileOperations(strDestPath))
         strDestPath.clear();
     }