[weather] fix #176 - support negative temp

This commit is contained in:
streetturtle 2020-10-19 23:15:48 -04:00
parent 6de58c7700
commit f00c2454f4
10 changed files with 1529 additions and 1248 deletions

View File

@ -47,7 +47,7 @@ To add your custom icons, create a folder with the pack name under `/icons` and
#### Custom font, icons #### Custom font, icons
![example1](./screenshots/example1.png) ![example1](./example1.png)
```lua ```lua
weather_curl_widget({ weather_curl_widget({
@ -65,7 +65,7 @@ weather_curl_widget({
#### Only current weather #### Only current weather
![example2](./screenshots/example2.png) ![example2](./example2.png)
```lua ```lua
weather_curl_widget({ weather_curl_widget({
@ -74,8 +74,6 @@ weather_curl_widget({
}), }),
``` ```
## Installation ## Installation
1. Download json parser for lua from [github.com/rxi/json.lua](https://github.com/rxi/json.lua) and place it under **~/.config/awesome/** (don't forget to star a repo <i class="fa fa-github-alt"></i> ): 1. Download json parser for lua from [github.com/rxi/json.lua](https://github.com/rxi/json.lua) and place it under **~/.config/awesome/** (don't forget to star a repo <i class="fa fa-github-alt"></i> ):
@ -126,6 +124,15 @@ weather_curl_widget({
... ...
``` ```
## More screenshots
Only negative temperature:
![negative](./negative.png)
Both positive and negative tempertature:
![both](./both.png)
## How it works ## How it works

BIN
weather-widget/both.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 45 KiB

View File

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

File diff suppressed because it is too large Load Diff

BIN
weather-widget/negative.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 26 KiB

File diff suppressed because it is too large Load Diff

View File

@ -140,7 +140,7 @@ local function worker(args)
local timeout = args.timeout or 120 local timeout = args.timeout or 120
local owm_one_cal_api = local owm_one_cal_api =
('https://api.openweathermap.org/data/2.5/onecall' .. ('https://api.openweathermap.org/data/2.5/onecall' ..
'?lat=' .. coordinates[1] .. '&lon=' .. coordinates[2] .. '&appid=' .. api_key .. '?lat=' .. coordinates[1] .. '&lon=' .. coordinates[2] .. '&appid=' .. api_key ..
'&units=' .. units .. '&exclude=minutely' .. '&units=' .. units .. '&exclude=minutely' ..
(show_hourly_forecast == false and ',hourly' or '') .. (show_hourly_forecast == false and ',hourly' or '') ..
@ -325,12 +325,27 @@ local function worker(args)
self.min_value = new_min_value self.min_value = new_min_value
end end
} }
local hourly_forecast_negative_graph = wibox.widget {
step_width = 12,
color = '#5E81AC',
background_color = beautiful.bg_normal,
forced_height = 100,
forced_width = 300,
widget = wibox.widget.graph,
set_max_value = function(self, new_max_value)
self.max_value = new_max_value
end,
set_min_value = function(self, new_min_value)
self.min_value = new_min_value
end
}
local hourly_forecast_widget = { local hourly_forecast_widget = {
layout = wibox.layout.fixed.vertical, layout = wibox.layout.fixed.vertical,
update = function(self, hourly) update = function(self, hourly)
local hours_below = { local hours_below = {
id = 'hours', id = 'hours',
forced_width = 300,
layout = wibox.layout.flex.horizontal layout = wibox.layout.flex.horizontal
} }
local temp_below = { local temp_below = {
@ -355,37 +370,101 @@ local function worker(args)
widget = wibox.widget.textbox widget = wibox.widget.textbox
}) })
table.insert(temp_below, wibox.widget { table.insert(temp_below, wibox.widget {
markup = '<span foreground="#2E3440">' .. string.format('%.0f', hour.temp) .. '°' .. '</span>', markup = '<span >' .. string.format('%.0f', hour.temp) .. '°' .. '</span>',
align = 'center', align = 'center',
font = font_name .. ' 9', font = font_name .. ' 9',
widget = wibox.widget.textbox widget = wibox.widget.textbox
}) })
end end
end end
hourly_forecast_graph:set_max_value(max_temp)
hourly_forecast_graph:set_min_value(min_temp * 0.7) -- move graph a bit up hourly_forecast_graph:set_max_value(math.max(max_temp, math.abs(min_temp)))
hourly_forecast_graph:set_min_value(min_temp > 0 and min_temp * 0.7 or 0) -- move graph a bit up
hourly_forecast_negative_graph:set_max_value(math.abs(min_temp))
hourly_forecast_negative_graph:set_min_value(max_temp < 0 and math.abs(max_temp) * 0.7 or 0)
for i, value in ipairs(values) do for i, value in ipairs(values) do
hourly_forecast_graph:add_value(value) print(value)
if value >= 0 then
hourly_forecast_graph:add_value(value)
hourly_forecast_negative_graph:add_value(0)
else
hourly_forecast_graph:add_value(0)
hourly_forecast_negative_graph:add_value(math.abs(value))
end
end end
local count = #self local count = #self
for i = 0, count do self[i]=nil end for i = 0, count do self[i]=nil end
table.insert(self, wibox.widget{ -- all temperatures are positive
{ if min_temp > 0 then
hourly_forecast_graph, table.insert(self, wibox.widget{
reflection = {horizontal = true}, {
widget = wibox.container.mirror hourly_forecast_graph,
}, reflection = {horizontal = true},
{ widget = wibox.container.mirror
temp_below, },
valign = 'bottom', {
widget = wibox.container.place temp_below,
}, valign = 'bottom',
id = 'graph', widget = wibox.container.place
layout = wibox.layout.stack },
}) id = 'graph',
table.insert(self, hours_below) layout = wibox.layout.stack
})
table.insert(self, hours_below)
-- all temperatures are negative
elseif max_temp < 0 then
table.insert(self, hours_below)
table.insert(self, wibox.widget{
{
hourly_forecast_negative_graph,
reflection = {horizontal = true, vertical = true},
widget = wibox.container.mirror
},
{
temp_below,
valign = 'top',
widget = wibox.container.place
},
id = 'graph',
layout = wibox.layout.stack
})
-- there are both negative and positive temperatures
else
table.insert(self, wibox.widget{
{
hourly_forecast_graph,
reflection = {horizontal = true},
widget = wibox.container.mirror
},
{
temp_below,
valign = 'bottom',
widget = wibox.container.place
},
id = 'graph',
layout = wibox.layout.stack
})
table.insert(self, wibox.widget{
{
hourly_forecast_negative_graph,
reflection = {horizontal = true, vertical = true},
widget = wibox.container.mirror
},
{
hours_below,
valign = 'top',
widget = wibox.container.place
},
id = 'graph',
layout = wibox.layout.stack
})
end
end end
} }