summaryrefslogtreecommitdiffstats
path: root/xbmc/weather/GUIWindowWeather.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/weather/GUIWindowWeather.cpp')
-rw-r--r--xbmc/weather/GUIWindowWeather.cpp299
1 files changed, 299 insertions, 0 deletions
diff --git a/xbmc/weather/GUIWindowWeather.cpp b/xbmc/weather/GUIWindowWeather.cpp
new file mode 100644
index 0000000..66b93b5
--- /dev/null
+++ b/xbmc/weather/GUIWindowWeather.cpp
@@ -0,0 +1,299 @@
+/*
+ * Copyright (C) 2005-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 "GUIWindowWeather.h"
+
+#include "GUIUserMessages.h"
+#include "LangInfo.h"
+#include "ServiceBroker.h"
+#include "guilib/WindowIDs.h"
+#include "utils/StringUtils.h"
+#include "utils/URIUtils.h"
+#include "utils/Variant.h"
+#include "weather/WeatherManager.h"
+
+#include <utility>
+
+using namespace ADDON;
+
+#define CONTROL_BTNREFRESH 2
+#define CONTROL_SELECTLOCATION 3
+#define CONTROL_LABELUPDATED 11
+
+#define CONTROL_STATICTEMP 223
+#define CONTROL_STATICFEEL 224
+#define CONTROL_STATICUVID 225
+#define CONTROL_STATICWIND 226
+#define CONTROL_STATICDEWP 227
+#define CONTROL_STATICHUMI 228
+
+#define CONTROL_LABELD0DAY 31
+#define CONTROL_LABELD0HI 32
+#define CONTROL_LABELD0LOW 33
+#define CONTROL_LABELD0GEN 34
+#define CONTROL_IMAGED0IMG 35
+
+#define LOCALIZED_TOKEN_FIRSTID 370
+#define LOCALIZED_TOKEN_LASTID 395
+
+/*
+FIXME'S
+>strings are not centered
+*/
+
+CGUIWindowWeather::CGUIWindowWeather(void)
+ : CGUIWindow(WINDOW_WEATHER, "MyWeather.xml")
+{
+ m_loadType = KEEP_IN_MEMORY;
+}
+
+CGUIWindowWeather::~CGUIWindowWeather(void) = default;
+
+bool CGUIWindowWeather::OnMessage(CGUIMessage& message)
+{
+ switch ( message.GetMessage() )
+ {
+ case GUI_MSG_CLICKED:
+ {
+ int iControl = message.GetSenderId();
+ if (iControl == CONTROL_BTNREFRESH)
+ {
+ CServiceBroker::GetWeatherManager().Refresh(); // Refresh clicked so do a complete update
+ }
+ else if (iControl == CONTROL_SELECTLOCATION)
+ {
+ CGUIMessage msg(GUI_MSG_ITEM_SELECTED,GetID(),CONTROL_SELECTLOCATION);
+ OnMessage(msg);
+
+ SetLocation(msg.GetParam1());
+ }
+ }
+ break;
+ case GUI_MSG_NOTIFY_ALL:
+ if (message.GetParam1() == GUI_MSG_WINDOW_RESET)
+ {
+ CServiceBroker::GetWeatherManager().Reset();
+ return true;
+ }
+ else if (message.GetParam1() == GUI_MSG_WEATHER_FETCHED)
+ {
+ UpdateLocations();
+ SetProperties();
+ }
+ break;
+ case GUI_MSG_ITEM_SELECT:
+ {
+ if (message.GetSenderId() == 0) //handle only message from builtin
+ {
+ SetLocation(message.GetParam1());
+ return true;
+ }
+ }
+ break;
+ case GUI_MSG_MOVE_OFFSET:
+ {
+ if (message.GetSenderId() == 0 && m_maxLocation > 0) //handle only message from builtin
+ {
+ // Clamp location between 1 and m_maxLocation
+ int v = (CServiceBroker::GetWeatherManager().GetArea() + message.GetParam1() - 1) % m_maxLocation + 1;
+ if (v < 1) v += m_maxLocation;
+ SetLocation(v);
+ return true;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ return CGUIWindow::OnMessage(message);
+}
+
+void CGUIWindowWeather::OnInitWindow()
+{
+ // call UpdateButtons() so that we start with our initial stuff already present
+ UpdateButtons();
+ UpdateLocations();
+ CGUIWindow::OnInitWindow();
+}
+
+void CGUIWindowWeather::UpdateLocations()
+{
+ if (!IsActive()) return;
+ m_maxLocation = strtol(GetProperty("Locations").asString().c_str(),0,10);
+ if (m_maxLocation < 1) return;
+
+ std::vector< std::pair<std::string, int> > labels;
+
+ unsigned int iCurWeather = CServiceBroker::GetWeatherManager().GetArea();
+
+ if (iCurWeather > m_maxLocation)
+ {
+ CServiceBroker::GetWeatherManager().SetArea(m_maxLocation);
+ iCurWeather = m_maxLocation;
+ ClearProperties();
+ CServiceBroker::GetWeatherManager().Refresh();
+ }
+
+ for (unsigned int i = 1; i <= m_maxLocation; i++)
+ {
+ std::string strLabel = CServiceBroker::GetWeatherManager().GetLocation(i);
+ if (strLabel.size() > 1) //got the location string yet?
+ {
+ size_t iPos = strLabel.rfind(", ");
+ if (iPos != std::string::npos)
+ {
+ std::string strLabel2(strLabel);
+ strLabel = strLabel2.substr(0,iPos);
+ }
+ labels.emplace_back(strLabel, i);
+ }
+ else
+ {
+ strLabel = StringUtils::Format("AreaCode {}", i);
+ labels.emplace_back(strLabel, i);
+ }
+ // in case it's a button, set the label
+ if (i == iCurWeather)
+ SET_CONTROL_LABEL(CONTROL_SELECTLOCATION,strLabel);
+ }
+
+ SET_CONTROL_LABELS(CONTROL_SELECTLOCATION, iCurWeather, &labels);
+}
+
+void CGUIWindowWeather::UpdateButtons()
+{
+ CONTROL_ENABLE(CONTROL_BTNREFRESH);
+
+ SET_CONTROL_LABEL(CONTROL_BTNREFRESH, 184); //Refresh
+
+ SET_CONTROL_LABEL(WEATHER_LABEL_LOCATION, CServiceBroker::GetWeatherManager().GetLocation(CServiceBroker::GetWeatherManager().GetArea()));
+ SET_CONTROL_LABEL(CONTROL_LABELUPDATED, CServiceBroker::GetWeatherManager().GetLastUpdateTime());
+
+ SET_CONTROL_LABEL(WEATHER_LABEL_CURRENT_COND, CServiceBroker::GetWeatherManager().GetInfo(WEATHER_LABEL_CURRENT_COND));
+ SET_CONTROL_LABEL(WEATHER_LABEL_CURRENT_TEMP, CServiceBroker::GetWeatherManager().GetInfo(WEATHER_LABEL_CURRENT_TEMP) + g_langInfo.GetTemperatureUnitString());
+ SET_CONTROL_LABEL(WEATHER_LABEL_CURRENT_FEEL, CServiceBroker::GetWeatherManager().GetInfo(WEATHER_LABEL_CURRENT_FEEL) + g_langInfo.GetTemperatureUnitString());
+ SET_CONTROL_LABEL(WEATHER_LABEL_CURRENT_UVID, CServiceBroker::GetWeatherManager().GetInfo(WEATHER_LABEL_CURRENT_UVID));
+ SET_CONTROL_LABEL(WEATHER_LABEL_CURRENT_WIND, CServiceBroker::GetWeatherManager().GetInfo(WEATHER_LABEL_CURRENT_WIND));
+ SET_CONTROL_LABEL(WEATHER_LABEL_CURRENT_DEWP, CServiceBroker::GetWeatherManager().GetInfo(WEATHER_LABEL_CURRENT_DEWP) + g_langInfo.GetTemperatureUnitString());
+ SET_CONTROL_LABEL(WEATHER_LABEL_CURRENT_HUMI, CServiceBroker::GetWeatherManager().GetInfo(WEATHER_LABEL_CURRENT_HUMI));
+ SET_CONTROL_FILENAME(WEATHER_IMAGE_CURRENT_ICON, CServiceBroker::GetWeatherManager().GetInfo(WEATHER_IMAGE_CURRENT_ICON));
+
+ //static labels
+ SET_CONTROL_LABEL(CONTROL_STATICTEMP, 401); //Temperature
+ SET_CONTROL_LABEL(CONTROL_STATICFEEL, 402); //Feels Like
+ SET_CONTROL_LABEL(CONTROL_STATICUVID, 403); //UV Index
+ SET_CONTROL_LABEL(CONTROL_STATICWIND, 404); //Wind
+ SET_CONTROL_LABEL(CONTROL_STATICDEWP, 405); //Dew Point
+ SET_CONTROL_LABEL(CONTROL_STATICHUMI, 406); //Humidity
+
+ for (int i = 0; i < NUM_DAYS; i++)
+ {
+ SET_CONTROL_LABEL(CONTROL_LABELD0DAY + (i*10), CServiceBroker::GetWeatherManager().GetForecast(i).m_day);
+ SET_CONTROL_LABEL(CONTROL_LABELD0HI + (i*10), CServiceBroker::GetWeatherManager().GetForecast(i).m_high + g_langInfo.GetTemperatureUnitString());
+ SET_CONTROL_LABEL(CONTROL_LABELD0LOW + (i*10), CServiceBroker::GetWeatherManager().GetForecast(i).m_low + g_langInfo.GetTemperatureUnitString());
+ SET_CONTROL_LABEL(CONTROL_LABELD0GEN + (i*10), CServiceBroker::GetWeatherManager().GetForecast(i).m_overview);
+ SET_CONTROL_FILENAME(CONTROL_IMAGED0IMG + (i*10), CServiceBroker::GetWeatherManager().GetForecast(i).m_icon);
+ }
+}
+
+void CGUIWindowWeather::FrameMove()
+{
+ // update our controls
+ UpdateButtons();
+
+ CGUIWindow::FrameMove();
+}
+
+/*!
+ \brief Sets the location to the specified index and refreshes the weather
+ \param loc the location index (in the range [1..MAXLOCATION])
+ */
+void CGUIWindowWeather::SetLocation(int loc)
+{
+ if (loc < 1 || loc > (int)m_maxLocation)
+ return;
+ // Avoid a settings write if old location == new location
+ if (CServiceBroker::GetWeatherManager().GetArea() != loc)
+ {
+ ClearProperties();
+ CServiceBroker::GetWeatherManager().SetArea(loc);
+ std::string strLabel = CServiceBroker::GetWeatherManager().GetLocation(loc);
+ size_t iPos = strLabel.rfind(", ");
+ if (iPos != std::string::npos)
+ strLabel = strLabel.substr(0, iPos);
+ SET_CONTROL_LABEL(CONTROL_SELECTLOCATION, strLabel);
+ }
+ CServiceBroker::GetWeatherManager().Refresh();
+}
+
+void CGUIWindowWeather::SetProperties()
+{
+ // Current weather
+ int iCurWeather = CServiceBroker::GetWeatherManager().GetArea();
+ SetProperty("Location", CServiceBroker::GetWeatherManager().GetLocation(iCurWeather));
+ SetProperty("LocationIndex", iCurWeather);
+ SetProperty("Updated", CServiceBroker::GetWeatherManager().GetLastUpdateTime());
+ SetProperty("Current.ConditionIcon", CServiceBroker::GetWeatherManager().GetInfo(WEATHER_IMAGE_CURRENT_ICON));
+ SetProperty("Current.Condition", CServiceBroker::GetWeatherManager().GetInfo(WEATHER_LABEL_CURRENT_COND));
+ SetProperty("Current.Temperature", CServiceBroker::GetWeatherManager().GetInfo(WEATHER_LABEL_CURRENT_TEMP));
+ SetProperty("Current.FeelsLike", CServiceBroker::GetWeatherManager().GetInfo(WEATHER_LABEL_CURRENT_FEEL));
+ SetProperty("Current.UVIndex", CServiceBroker::GetWeatherManager().GetInfo(WEATHER_LABEL_CURRENT_UVID));
+ SetProperty("Current.Wind", CServiceBroker::GetWeatherManager().GetInfo(WEATHER_LABEL_CURRENT_WIND));
+ SetProperty("Current.DewPoint", CServiceBroker::GetWeatherManager().GetInfo(WEATHER_LABEL_CURRENT_DEWP));
+ SetProperty("Current.Humidity", CServiceBroker::GetWeatherManager().GetInfo(WEATHER_LABEL_CURRENT_HUMI));
+ // we use the icons code number for fanart as it's the safest way
+ std::string fanartcode = URIUtils::GetFileName(CServiceBroker::GetWeatherManager().GetInfo(WEATHER_IMAGE_CURRENT_ICON));
+ URIUtils::RemoveExtension(fanartcode);
+ SetProperty("Current.FanartCode", fanartcode);
+
+ // Future weather
+ std::string day;
+ for (int i = 0; i < NUM_DAYS; i++)
+ {
+ day = StringUtils::Format("Day{}.", i);
+ SetProperty(day + "Title", CServiceBroker::GetWeatherManager().GetForecast(i).m_day);
+ SetProperty(day + "HighTemp", CServiceBroker::GetWeatherManager().GetForecast(i).m_high);
+ SetProperty(day + "LowTemp", CServiceBroker::GetWeatherManager().GetForecast(i).m_low);
+ SetProperty(day + "Outlook", CServiceBroker::GetWeatherManager().GetForecast(i).m_overview);
+ SetProperty(day + "OutlookIcon", CServiceBroker::GetWeatherManager().GetForecast(i).m_icon);
+ fanartcode = URIUtils::GetFileName(CServiceBroker::GetWeatherManager().GetForecast(i).m_icon);
+ URIUtils::RemoveExtension(fanartcode);
+ SetProperty(day + "FanartCode", fanartcode);
+ }
+}
+
+void CGUIWindowWeather::ClearProperties()
+{
+ // Current weather
+ SetProperty("Location", "");
+ SetProperty("LocationIndex", "");
+ SetProperty("Updated", "");
+ SetProperty("Current.ConditionIcon", "");
+ SetProperty("Current.Condition", "");
+ SetProperty("Current.Temperature", "");
+ SetProperty("Current.FeelsLike", "");
+ SetProperty("Current.UVIndex", "");
+ SetProperty("Current.Wind", "");
+ SetProperty("Current.DewPoint", "");
+ SetProperty("Current.Humidity", "");
+ SetProperty("Current.FanartCode", "");
+
+ // Future weather
+ std::string day;
+ for (int i = 0; i < NUM_DAYS; i++)
+ {
+ day = StringUtils::Format("Day{}.", i);
+ SetProperty(day + "Title", "");
+ SetProperty(day + "HighTemp", "");
+ SetProperty(day + "LowTemp", "");
+ SetProperty(day + "Outlook", "");
+ SetProperty(day + "OutlookIcon", "");
+ SetProperty(day + "FanartCode", "");
+ }
+}