summaryrefslogtreecommitdiffstats
path: root/xbmc/guilib/guiinfo/PicturesGUIInfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/guilib/guiinfo/PicturesGUIInfo.cpp')
-rw-r--r--xbmc/guilib/guiinfo/PicturesGUIInfo.cpp259
1 files changed, 259 insertions, 0 deletions
diff --git a/xbmc/guilib/guiinfo/PicturesGUIInfo.cpp b/xbmc/guilib/guiinfo/PicturesGUIInfo.cpp
new file mode 100644
index 0000000..6115517
--- /dev/null
+++ b/xbmc/guilib/guiinfo/PicturesGUIInfo.cpp
@@ -0,0 +1,259 @@
+/*
+ * Copyright (C) 2012-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#include "guilib/guiinfo/PicturesGUIInfo.h"
+
+#include "FileItem.h"
+#include "ServiceBroker.h"
+#include "URL.h"
+#include "guilib/GUIComponent.h"
+#include "guilib/GUIWindowManager.h"
+#include "guilib/guiinfo/GUIInfo.h"
+#include "guilib/guiinfo/GUIInfoLabels.h"
+#include "pictures/GUIWindowSlideShow.h"
+#include "pictures/PictureInfoTag.h"
+#include "utils/StringUtils.h"
+#include "utils/URIUtils.h"
+#include "utils/log.h"
+
+#include <map>
+
+using namespace KODI::GUILIB::GUIINFO;
+
+static const std::map<int, int> listitem2slideshow_map =
+{
+ { LISTITEM_PICTURE_RESOLUTION , SLIDESHOW_RESOLUTION },
+ { LISTITEM_PICTURE_LONGDATE , SLIDESHOW_EXIF_LONG_DATE },
+ { LISTITEM_PICTURE_LONGDATETIME , SLIDESHOW_EXIF_LONG_DATE_TIME },
+ { LISTITEM_PICTURE_DATE , SLIDESHOW_EXIF_DATE },
+ { LISTITEM_PICTURE_DATETIME , SLIDESHOW_EXIF_DATE_TIME },
+ { LISTITEM_PICTURE_COMMENT , SLIDESHOW_COMMENT },
+ { LISTITEM_PICTURE_CAPTION , SLIDESHOW_IPTC_CAPTION },
+ { LISTITEM_PICTURE_DESC , SLIDESHOW_EXIF_DESCRIPTION },
+ { LISTITEM_PICTURE_KEYWORDS , SLIDESHOW_IPTC_KEYWORDS },
+ { LISTITEM_PICTURE_CAM_MAKE , SLIDESHOW_EXIF_CAMERA_MAKE },
+ { LISTITEM_PICTURE_CAM_MODEL , SLIDESHOW_EXIF_CAMERA_MODEL },
+ { LISTITEM_PICTURE_APERTURE , SLIDESHOW_EXIF_APERTURE },
+ { LISTITEM_PICTURE_FOCAL_LEN , SLIDESHOW_EXIF_FOCAL_LENGTH },
+ { LISTITEM_PICTURE_FOCUS_DIST , SLIDESHOW_EXIF_FOCUS_DIST },
+ { LISTITEM_PICTURE_EXP_MODE , SLIDESHOW_EXIF_EXPOSURE_MODE },
+ { LISTITEM_PICTURE_EXP_TIME , SLIDESHOW_EXIF_EXPOSURE_TIME },
+ { LISTITEM_PICTURE_ISO , SLIDESHOW_EXIF_ISO_EQUIV },
+ { LISTITEM_PICTURE_AUTHOR , SLIDESHOW_IPTC_AUTHOR },
+ { LISTITEM_PICTURE_BYLINE , SLIDESHOW_IPTC_BYLINE },
+ { LISTITEM_PICTURE_BYLINE_TITLE , SLIDESHOW_IPTC_BYLINE_TITLE },
+ { LISTITEM_PICTURE_CATEGORY , SLIDESHOW_IPTC_CATEGORY },
+ { LISTITEM_PICTURE_CCD_WIDTH , SLIDESHOW_EXIF_CCD_WIDTH },
+ { LISTITEM_PICTURE_CITY , SLIDESHOW_IPTC_CITY },
+ { LISTITEM_PICTURE_URGENCY , SLIDESHOW_IPTC_URGENCY },
+ { LISTITEM_PICTURE_COPYRIGHT_NOTICE , SLIDESHOW_IPTC_COPYRIGHT_NOTICE },
+ { LISTITEM_PICTURE_COUNTRY , SLIDESHOW_IPTC_COUNTRY },
+ { LISTITEM_PICTURE_COUNTRY_CODE , SLIDESHOW_IPTC_COUNTRY_CODE },
+ { LISTITEM_PICTURE_CREDIT , SLIDESHOW_IPTC_CREDIT },
+ { LISTITEM_PICTURE_IPTCDATE , SLIDESHOW_IPTC_DATE },
+ { LISTITEM_PICTURE_DIGITAL_ZOOM , SLIDESHOW_EXIF_DIGITAL_ZOOM, },
+ { LISTITEM_PICTURE_EXPOSURE , SLIDESHOW_EXIF_EXPOSURE },
+ { LISTITEM_PICTURE_EXPOSURE_BIAS , SLIDESHOW_EXIF_EXPOSURE_BIAS },
+ { LISTITEM_PICTURE_FLASH_USED , SLIDESHOW_EXIF_FLASH_USED },
+ { LISTITEM_PICTURE_HEADLINE , SLIDESHOW_IPTC_HEADLINE },
+ { LISTITEM_PICTURE_COLOUR , SLIDESHOW_COLOUR },
+ { LISTITEM_PICTURE_LIGHT_SOURCE , SLIDESHOW_EXIF_LIGHT_SOURCE },
+ { LISTITEM_PICTURE_METERING_MODE , SLIDESHOW_EXIF_METERING_MODE },
+ { LISTITEM_PICTURE_OBJECT_NAME , SLIDESHOW_IPTC_OBJECT_NAME },
+ { LISTITEM_PICTURE_ORIENTATION , SLIDESHOW_EXIF_ORIENTATION },
+ { LISTITEM_PICTURE_PROCESS , SLIDESHOW_PROCESS },
+ { LISTITEM_PICTURE_REF_SERVICE , SLIDESHOW_IPTC_REF_SERVICE },
+ { LISTITEM_PICTURE_SOURCE , SLIDESHOW_IPTC_SOURCE },
+ { LISTITEM_PICTURE_SPEC_INSTR , SLIDESHOW_IPTC_SPEC_INSTR },
+ { LISTITEM_PICTURE_STATE , SLIDESHOW_IPTC_STATE },
+ { LISTITEM_PICTURE_SUP_CATEGORIES , SLIDESHOW_IPTC_SUP_CATEGORIES },
+ { LISTITEM_PICTURE_TX_REFERENCE , SLIDESHOW_IPTC_TX_REFERENCE },
+ { LISTITEM_PICTURE_WHITE_BALANCE , SLIDESHOW_EXIF_WHITE_BALANCE },
+ { LISTITEM_PICTURE_IMAGETYPE , SLIDESHOW_IPTC_IMAGETYPE },
+ { LISTITEM_PICTURE_SUBLOCATION , SLIDESHOW_IPTC_SUBLOCATION },
+ { LISTITEM_PICTURE_TIMECREATED , SLIDESHOW_IPTC_TIMECREATED },
+ { LISTITEM_PICTURE_GPS_LAT , SLIDESHOW_EXIF_GPS_LATITUDE },
+ { LISTITEM_PICTURE_GPS_LON , SLIDESHOW_EXIF_GPS_LONGITUDE },
+ { LISTITEM_PICTURE_GPS_ALT , SLIDESHOW_EXIF_GPS_ALTITUDE }
+};
+
+CPicturesGUIInfo::CPicturesGUIInfo() = default;
+
+CPicturesGUIInfo::~CPicturesGUIInfo() = default;
+
+void CPicturesGUIInfo::SetCurrentSlide(CFileItem *item)
+{
+ if (m_currentSlide && item && m_currentSlide->GetPath() == item->GetPath())
+ return;
+
+ if (item)
+ {
+ if (item->HasPictureInfoTag()) // Note: item may also be a video
+ {
+ CPictureInfoTag* tag = item->GetPictureInfoTag();
+ if (!tag->Loaded()) // If picture metadata has not been loaded yet, load it now
+ tag->Load(item->GetPath());
+ }
+ m_currentSlide.reset(new CFileItem(*item));
+ }
+ else if (m_currentSlide)
+ {
+ m_currentSlide.reset();
+ }
+}
+
+const CFileItem* CPicturesGUIInfo::GetCurrentSlide() const
+{
+ return m_currentSlide.get();
+}
+
+bool CPicturesGUIInfo::InitCurrentItem(CFileItem *item)
+{
+ return false;
+}
+
+bool CPicturesGUIInfo::GetLabel(std::string& value, const CFileItem *item, int contextWindow, const CGUIInfo &info, std::string *fallback) const
+{
+ if (item->IsPicture() && info.m_info >= LISTITEM_PICTURE_START && info.m_info <= LISTITEM_PICTURE_END)
+ {
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+ // LISTITEM_*
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+ const auto& it = listitem2slideshow_map.find(info.m_info);
+ if (it != listitem2slideshow_map.end())
+ {
+ if (item->HasPictureInfoTag())
+ {
+ value = item->GetPictureInfoTag()->GetInfo(it->second);
+ return true;
+ }
+ }
+ else
+ {
+ CLog::Log(LOGERROR,
+ "CPicturesGUIInfo::GetLabel - cannot map LISTITEM ({}) to SLIDESHOW label!",
+ info.m_info);
+ return false;
+ }
+ }
+ else if (m_currentSlide && info.m_info >= SLIDESHOW_LABELS_START && info.m_info <= SLIDESHOW_LABELS_END)
+ {
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+ // SLIDESHOW_*
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+ switch (info.m_info)
+ {
+ case SLIDESHOW_FILE_NAME:
+ {
+ value = URIUtils::GetFileName(m_currentSlide->GetPath());
+ return true;
+ }
+ case SLIDESHOW_FILE_PATH:
+ {
+ const std::string path = URIUtils::GetDirectory(m_currentSlide->GetPath());
+ value = CURL(path).GetWithoutUserDetails();
+ return true;
+ }
+ case SLIDESHOW_FILE_SIZE:
+ {
+ if (!m_currentSlide->m_bIsFolder || m_currentSlide->m_dwSize)
+ {
+ value = StringUtils::SizeToString(m_currentSlide->m_dwSize);
+ return true;
+ }
+ break;
+ }
+ case SLIDESHOW_FILE_DATE:
+ {
+ if (m_currentSlide->m_dateTime.IsValid())
+ {
+ value = m_currentSlide->m_dateTime.GetAsLocalizedDate();
+ return true;
+ }
+ break;
+ }
+ case SLIDESHOW_INDEX:
+ {
+ CGUIWindowSlideShow *slideshow = CServiceBroker::GetGUI()->GetWindowManager().GetWindow<CGUIWindowSlideShow>(WINDOW_SLIDESHOW);
+ if (slideshow && slideshow->NumSlides())
+ {
+ value = StringUtils::Format("{}/{}", slideshow->CurrentSlide(), slideshow->NumSlides());
+ return true;
+ }
+ break;
+ }
+ default:
+ {
+ value = m_currentSlide->GetPictureInfoTag()->GetInfo(info.m_info);
+ return true;
+ }
+ }
+ }
+
+ if (item->IsPicture())
+ {
+ /////////////////////////////////////////////////////////////////////////////////////////////////
+ // LISTITEM_*
+ /////////////////////////////////////////////////////////////////////////////////////////////////
+ switch (info.m_info)
+ {
+ case LISTITEM_PICTURE_PATH:
+ {
+ if (!(item->IsZIP() || item->IsRAR() || item->IsCBZ() || item->IsCBR()))
+ {
+ value = item->GetPath();
+ return true;
+ }
+ break;
+ }
+ }
+ }
+
+ return false;
+}
+
+bool CPicturesGUIInfo::GetInt(int& value, const CGUIListItem *gitem, int contextWindow, const CGUIInfo &info) const
+{
+ return false;
+}
+
+bool CPicturesGUIInfo::GetBool(bool& value, const CGUIListItem *gitem, int contextWindow, const CGUIInfo &info) const
+{
+ switch (info.m_info)
+ {
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+ // SLIDESHOW_*
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+ case SLIDESHOW_ISPAUSED:
+ {
+ CGUIWindowSlideShow *slideShow = CServiceBroker::GetGUI()->GetWindowManager().GetWindow<CGUIWindowSlideShow>(WINDOW_SLIDESHOW);
+ value = (slideShow && slideShow->IsPaused());
+ return true;
+ }
+ case SLIDESHOW_ISRANDOM:
+ {
+ CGUIWindowSlideShow *slideShow = CServiceBroker::GetGUI()->GetWindowManager().GetWindow<CGUIWindowSlideShow>(WINDOW_SLIDESHOW);
+ value = (slideShow && slideShow->IsShuffled());
+ return true;
+ }
+ case SLIDESHOW_ISACTIVE:
+ {
+ CGUIWindowSlideShow *slideShow = CServiceBroker::GetGUI()->GetWindowManager().GetWindow<CGUIWindowSlideShow>(WINDOW_SLIDESHOW);
+ value = (slideShow && slideShow->InSlideShow());
+ return true;
+ }
+ case SLIDESHOW_ISVIDEO:
+ {
+ CGUIWindowSlideShow *slideShow = CServiceBroker::GetGUI()->GetWindowManager().GetWindow<CGUIWindowSlideShow>(WINDOW_SLIDESHOW);
+ value = (slideShow && slideShow->GetCurrentSlide() && slideShow->GetCurrentSlide()->IsVideo());
+ return true;
+ }
+ }
+
+ return false;
+}