419 lines
12 KiB
QML
419 lines
12 KiB
QML
import QtQuick 2.15
|
|
import QtQuick.Controls 2.15
|
|
import org.kde.plasma.plasmoid
|
|
import "../js/traductor.js" as Traduc
|
|
import "../js/GetInfoApi.js" as GetInfoApi
|
|
import "../js/geoCoordinates.js" as GeoCoordinates
|
|
import "../js/GetCity.js" as GetCity
|
|
import "../js/GetModelWeather.js" as GetModelWeather
|
|
|
|
Item {
|
|
signal dataChanged // Definir el signal aquí
|
|
signal simpleDataReady // Definir el signal aquí
|
|
|
|
function obtener(texto, indice) {
|
|
var palabras = texto.split(/\s+/); // Divide el texto en palabras utilizando el espacio como separador
|
|
return palabras[indice - 1]; // El índice - 1 porque los índices comienzan desde 0 en JavaScript
|
|
}
|
|
|
|
function fahrenheit(temp) {
|
|
if (temperatureUnit == 0) {
|
|
return temp;
|
|
} else {
|
|
return Math.round((temp * 9 / 5) + 32);
|
|
}
|
|
}
|
|
|
|
property bool isUpdate: false
|
|
property string lastUpdate: "0"
|
|
property int hoursC: 0
|
|
property string newValuesWeather: "0"
|
|
property string newValuesForeWeather: "0"
|
|
property bool active: true// Plasmoid.configuration.weatheCardActive
|
|
property bool isInExecution: false
|
|
property string useCoordinatesIp: Plasmoid.configuration.useCoordinatesIp//"true"
|
|
property string latitudeC: Plasmoid.configuration.manualLatitude
|
|
property string longitudeC: Plasmoid.configuration.manualLongitude
|
|
property string temperatureUnit: Plasmoid.configuration.temperatureUnit
|
|
|
|
property string latitude: (useCoordinatesIp === "true") ? latitudeIP : (latitudeC === "0") ? latitudeIP : latitudeC
|
|
property string longitud: (useCoordinatesIp === "true") ? longitudIP : (longitudeC === "0") ? longitudIP : longitudeC
|
|
|
|
property var observerCoordenates: latitude + longitud
|
|
|
|
property int currentTime: Number(Qt.formatDateTime(new Date(), "h"))
|
|
|
|
property string datosweather: "0"
|
|
property string forecastWeather: "0"
|
|
property string observer: datosweather + forecastWeather
|
|
property int retrysCity: 0
|
|
|
|
property string oneIcon: asingicon(obtener(forecastWeather, 1))
|
|
property string twoIcon: asingicon(obtener(forecastWeather, 2))
|
|
property string threeIcon: asingicon(obtener(forecastWeather, 3))
|
|
property string fourIcon: asingicon(obtener(forecastWeather, 4))
|
|
property string fiveIcon: asingicon(obtener(forecastWeather, 5))
|
|
property string sixIcon: asingicon(obtener(forecastWeather, 6))
|
|
property string sevenIcon: asingicon(obtener(forecastWeather, 7))
|
|
property int oneMax: fahrenheit(obtener(forecastWeather, 8))
|
|
property int twoMax: fahrenheit(obtener(forecastWeather, 9))
|
|
property int threeMax: fahrenheit(obtener(forecastWeather, 10))
|
|
property int fourMax: fahrenheit(obtener(forecastWeather, 11))
|
|
property int fiveMax: fahrenheit(obtener(forecastWeather, 12))
|
|
property int sixMax: fahrenheit(obtener(forecastWeather, 13))
|
|
property int sevenMax: fahrenheit(obtener(forecastWeather, 14))
|
|
property int oneMin: fahrenheit(obtener(forecastWeather, 15))
|
|
property int twoMin: fahrenheit(obtener(forecastWeather, 16))
|
|
property int threeMin: fahrenheit(obtener(forecastWeather, 17))
|
|
property int fourMin: fahrenheit(obtener(forecastWeather, 18))
|
|
property int fiveMin: fahrenheit(obtener(forecastWeather, 19))
|
|
property int sixMin: fahrenheit(obtener(forecastWeather, 20))
|
|
property int sevenMin: fahrenheit(obtener(forecastWeather, 21))
|
|
|
|
property string day: (Qt.formatDateTime(new Date(), "yyyy-MM-dd"))
|
|
property string therday: Qt.formatDateTime(new Date(new Date().getTime() + (numberOfDays * 24 * 60 * 60 * 1000)), "yyyy-MM-dd")
|
|
|
|
property string finDay: Qt.formatDateTime(new Date(new Date().getTime() + (1 * 24 * 60 * 60 * 1000)), "yyyy-MM-dd")
|
|
|
|
property int numberOfDays: 6
|
|
property string currentTemperature: datosweather !== "0" ? fahrenheit(obtener(datosweather, 1)) : "?"
|
|
property string codeleng: ((Qt.locale().name)[0] + (Qt.locale().name)[1])
|
|
property string codeweather: obtener(datosweather, 4)
|
|
property string codeweatherTomorrow: obtener(forecastWeather, 2)
|
|
property string codeweatherDayAftertomorrow: obtener(forecastWeather, 3)
|
|
property string codeweatherTwoDaysAfterTomorrow: obtener(forecastWeather, 4)
|
|
property string minweatherCurrent: fahrenheit(obtener(datosweather, 2))
|
|
property string maxweatherCurrent: fahrenheit(obtener(datosweather, 3))
|
|
|
|
property var tempHours: [fahrenheit(obtener(datosweather, 9)), fahrenheit(obtener(datosweather, 10)), fahrenheit(obtener(datosweather, 11)), fahrenheit(obtener(datosweather, 12)), fahrenheit(obtener(datosweather, 13))]
|
|
|
|
|
|
property var iconHours: [asingicon(obtener(datosweather, 14)), asingicon(obtener(datosweather, 15)), asingicon(obtener(datosweather, 16)), asingicon(obtener(datosweather, 17)), asingicon(obtener(datosweather, 18)) ]
|
|
|
|
property string minweatherTomorrow: twoMin
|
|
property string maxweatherTomorrow: twoMax
|
|
property string minweatherDayAftertomorrow: threeMin
|
|
property string maxweatherDayAftertomorrow: threeMax
|
|
property string minweatherTwoDaysAfterTomorrow: fourMax
|
|
property string maxweatherTwoDaysAfterTomorrow: fourMax
|
|
property string iconWeatherCurrent: asingicon(codeweather)
|
|
property string uvindex: uvIndexLevelAssignment(obtener(datosweather, 7))
|
|
property string windSpeed: obtener(datosweather, 6)
|
|
|
|
property string weatherLongtext: i18n(textWeather(codeweather))
|
|
property string weatherShottext: i18n(shortTextWeather(codeweather))
|
|
|
|
property string probabilidadDeLLuvia: obtener(datosweather, 5)
|
|
property string textProbability: Traduc.rainProbabilityText(codeleng)
|
|
|
|
property string completeCoordinates: ""
|
|
property string oldCompleteCoordinates: "1"
|
|
property string latitudeIP: completeCoordinates.substring(0, (completeCoordinates.indexOf(' ')) - 1)
|
|
property string longitudIP: completeCoordinates.substring(completeCoordinates.indexOf(' ') + 1)
|
|
|
|
property string uvtext: Traduc.uvRadiationText(codeleng)
|
|
property string windSpeedText: Traduc.windSpeedText(codeleng)
|
|
property int isDay: obtener(datosweather, 8)
|
|
property string city: "unk"
|
|
property string prefixIcon: isDay === 1 ? "" : "-night"
|
|
|
|
Component.onCompleted: {
|
|
updateWeather(1);
|
|
}
|
|
|
|
function uvIndexLevelAssignment(nivel) {
|
|
if (nivel < 3) {
|
|
return nivel + " " + Traduc.lavelUV(codeleng, 0);
|
|
} else {
|
|
if (nivel < 6) {
|
|
return nivel + " " + Traduc.lavelUV(codeleng, 1);
|
|
} else {
|
|
if (nivel < 8) {
|
|
return nivel + " " + Traduc.lavelUV(codeleng, 2);
|
|
} else {
|
|
if (nivel < 11) {
|
|
return nivel + " " + Traduc.lavelUV(codeleng, 3);
|
|
} else {
|
|
return nivel + " " + Traduc.lavelUV(codeleng, 4);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function getCoordinatesWithIp() {
|
|
GeoCoordinates.obtenerCoordenadas(function(result) {
|
|
|
|
completeCoordinates = result;
|
|
retryCoordinate.start()
|
|
});
|
|
}
|
|
|
|
onObserverCoordenatesChanged: {
|
|
console.log("Coordenadas cambiaron, actualizando clima");
|
|
if (latitude && longitud && latitude !== "0" && longitud !== "0") {
|
|
updateWeather(2);
|
|
getCityFuncion();
|
|
} else {
|
|
console.warn("Coordenadas inválidas, reintentando...");
|
|
retryCoordinate.start();
|
|
}
|
|
}
|
|
|
|
function getCityFuncion() {
|
|
|
|
if (!latitude || !longitud || latitude === "0" || longitud === "0") {
|
|
console.error("Coordenadas inválidas para la solicitud de ciudad");
|
|
return;
|
|
}
|
|
GetCity.getNameCity(latitude, longitud, codeleng, function(result) {
|
|
|
|
city = result;
|
|
retrycity.start()
|
|
});
|
|
}
|
|
|
|
function getWeatherApi() {
|
|
GetInfoApi.obtenerDatosClimaticos(latitude, longitud, day, finDay, currentTime, function(result) {
|
|
|
|
if (isUpdate) {
|
|
newValuesWeather = result;
|
|
} else {
|
|
datosweather = result;
|
|
}
|
|
getForecastWeather()
|
|
retry.start()
|
|
});
|
|
}
|
|
|
|
function getForecastWeather() {
|
|
GetModelWeather.GetForecastWeather(latitude, longitud, day, therday, function(result) {
|
|
if (isUpdate) {
|
|
newValuesForeWeather = result
|
|
} else {
|
|
forecastWeather = result
|
|
};
|
|
});
|
|
}
|
|
|
|
|
|
|
|
function asingicon(x, b) {
|
|
let wmocodes = {
|
|
0: "clear",
|
|
1: "few-clouds",
|
|
2: "few-clouds",
|
|
3: "clouds",
|
|
51: "showers-scattered",
|
|
53: "showers-scattered",
|
|
55: "showers-scattered",
|
|
56: "showers-scattered",
|
|
57: "showers-scattered",
|
|
61: "showers",
|
|
63: "showers",
|
|
65: "showers",
|
|
66: "showers-scattered",
|
|
67: "showers",
|
|
71: "snow-scattered",
|
|
73: "snow",
|
|
75: "snow",
|
|
77: "hail",
|
|
80: "showers",
|
|
81: "showers",
|
|
82: "showers",
|
|
85: "snow-scattered",
|
|
86: "snow",
|
|
95: "storm",
|
|
96: "storm",
|
|
99: "storm",
|
|
};
|
|
var iconName = "weather-" + (wmocodes[x] || "unknown");
|
|
var iconNamePresicion = iconName + prefixIcon
|
|
return b === "preciso" ? iconNamePresicion : iconName;
|
|
}
|
|
|
|
function textWeather(x) {
|
|
let text = {
|
|
0: "Clear",
|
|
1: "Mainly clear",
|
|
2: "Partly cloudy",
|
|
3: "Overcast",
|
|
51: "Drizzle light intensity",
|
|
53: "Drizzle moderate intensity",
|
|
55: "Drizzle dense intensity",
|
|
56: "Freezing Drizzle light intensity",
|
|
57: "Freezing Drizzle dense intensity",
|
|
61: "Rain slight intensity",
|
|
63: "Rain moderate intensity",
|
|
65: "Rain heavy intensity",
|
|
66: "Freezing Rain light intensity",
|
|
67: "Freezing Rain heavy intensity",
|
|
71: "Snowfall slight intensity",
|
|
73: "Snowfall moderate intensity",
|
|
75: "Snowfall heavy intensity",
|
|
77: "Snow grains",
|
|
80: "Rain showers slight",
|
|
81: "Rain showers moderate",
|
|
82: "Rain showers violent",
|
|
85: "Snow showers slight",
|
|
86: "Snow showers heavy",
|
|
95: "Thunderstorm",
|
|
96: "Thunderstorm with slight hail"
|
|
};
|
|
return text[x]
|
|
}
|
|
|
|
function shortTextWeather(x) {
|
|
let text = {
|
|
0: "Clear",
|
|
1: "Clear",
|
|
2: "Cloudy",
|
|
3: "Cloudy",
|
|
51: "Drizzle",
|
|
53: "Drizzle",
|
|
55: "Drizzle",
|
|
56: "Drizzle",
|
|
57: "Drizzle",
|
|
61: "Rain",
|
|
63: "Rain",
|
|
65: "Rain",
|
|
66: "Rain",
|
|
67: "Rain",
|
|
71: "Snow",
|
|
73: "Snow",
|
|
75: "Snow",
|
|
77: "Hail",
|
|
80: "Showers",
|
|
81: "Showers",
|
|
82: "Showers",
|
|
85: "Showers",
|
|
86: "Showers",
|
|
95: "Storm",
|
|
96: "Storm",
|
|
99: "Storm"
|
|
};
|
|
return text[x]
|
|
}
|
|
|
|
function updateWeather(x) {
|
|
if (x === 1) {
|
|
if (useCoordinatesIp === "true") {
|
|
getCoordinatesWithIp();
|
|
} else {
|
|
if (latitudeC === "0" || longitudC === "0") {
|
|
getCoordinatesWithIp();
|
|
} else {
|
|
getWeatherApi()
|
|
}
|
|
}
|
|
}
|
|
///
|
|
if (x === 2) {
|
|
getWeatherApi();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
onObserverChanged: {
|
|
if (forecastWeather.length > 3) {
|
|
lastUpdate = new Date()
|
|
dataChanged();
|
|
}
|
|
}
|
|
|
|
onNewValuesForeWeatherChanged: {
|
|
if (newValuesForeWeather.length > 3) {
|
|
datosweather = newValuesWeather;
|
|
forecastWeather = newValuesForeWeather;
|
|
newValuesWeather = "0";
|
|
newValuesForeWeather= "0";
|
|
}
|
|
}
|
|
|
|
Timer {
|
|
id: retryCoordinate
|
|
interval: 5000
|
|
running: false
|
|
repeat: false
|
|
onTriggered: {
|
|
if (completeCoordinates === "") {
|
|
getCoordinatesWithIp();
|
|
} else {
|
|
if (isUpdate) {
|
|
veri.start()
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
Timer {
|
|
id: retrycity
|
|
interval: 6000
|
|
running: false
|
|
repeat: false
|
|
onTriggered: {
|
|
if (city === "unk" && retrysCity < 5) {
|
|
retrysCity = retrysCity + 1
|
|
getCityFuncion();
|
|
}
|
|
}
|
|
}
|
|
Timer {
|
|
id: retry
|
|
interval: 5000
|
|
running: false
|
|
repeat: false
|
|
onTriggered: {
|
|
if (datosweather === "0") {
|
|
getWeatherApi();
|
|
}
|
|
}
|
|
}
|
|
|
|
Timer {
|
|
id: weatherupdate
|
|
interval: 900000
|
|
running: true
|
|
repeat: true
|
|
onTriggered: {
|
|
isUpdate = true
|
|
oldCompleteCoordinates = completeCoordinates
|
|
getCoordinatesWithIp()
|
|
//updateWeather(1);
|
|
//veri.start()
|
|
}
|
|
}
|
|
|
|
Timer {
|
|
id: observateHours
|
|
interval: 1000
|
|
running: true
|
|
repeat: true
|
|
onTriggered: {
|
|
hoursC = Qt.formatDateTime(new Date(), "h")
|
|
}
|
|
}
|
|
|
|
Timer {
|
|
id: veri
|
|
interval: 4000
|
|
running: false
|
|
repeat: false
|
|
onTriggered: {
|
|
//newValuesWeather = "0"
|
|
if (oldCompleteCoordinates === completeCoordinates) {
|
|
updateWeather(2)
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
onUseCoordinatesIpChanged: {
|
|
if (active) {
|
|
updateWeather(1);
|
|
isInExecution = true
|
|
}
|
|
}
|
|
}
|
|
|