progressbar: Add shape support
The current progressbar code dates from a time when Awesome had a very limited drawing API. This commit first re-write the algorithm to remove the workaround used to draw the border using full rectangles only. It then add support for outer and inner shapes with their respective border settings. This commit also add clip support. This is enabled by default, but could be disabled to have the bar taller than the background.
This commit is contained in:
parent
8ec53c827b
commit
915c10b1f8
|
@ -19,6 +19,7 @@ local util = require("awful.util")
|
||||||
local base = require("wibox.widget.base")
|
local base = require("wibox.widget.base")
|
||||||
local color = require("gears.color")
|
local color = require("gears.color")
|
||||||
local beautiful = require("beautiful")
|
local beautiful = require("beautiful")
|
||||||
|
local shape = require("gears.shape")
|
||||||
|
|
||||||
local progressbar = { mt = {} }
|
local progressbar = { mt = {} }
|
||||||
|
|
||||||
|
@ -28,6 +29,18 @@ local progressbar = { mt = {} }
|
||||||
-- @property border_color
|
-- @property border_color
|
||||||
-- @tparam gears.color color The border color to set.
|
-- @tparam gears.color color The border color to set.
|
||||||
|
|
||||||
|
--- The progressbar border width.
|
||||||
|
-- @property border_width
|
||||||
|
|
||||||
|
--- The progressbar inner border color.
|
||||||
|
-- If the value is nil, no border will be drawn.
|
||||||
|
--
|
||||||
|
-- @property bar_border_color
|
||||||
|
-- @tparam gears.color color The border color to set.
|
||||||
|
|
||||||
|
--- The progressbar inner border width.
|
||||||
|
-- @property bar_border_width
|
||||||
|
|
||||||
--- The progressbar foreground color.
|
--- The progressbar foreground color.
|
||||||
--
|
--
|
||||||
-- @property color
|
-- @property color
|
||||||
|
@ -38,11 +51,26 @@ local progressbar = { mt = {} }
|
||||||
-- @property background_color
|
-- @property background_color
|
||||||
-- @tparam gears.color color The progressbar background color.
|
-- @tparam gears.color color The progressbar background color.
|
||||||
|
|
||||||
|
--- The progressbar inner shape.
|
||||||
|
-- @property bar_shape
|
||||||
|
-- @tparam[opt=gears.shape.rectangle] gears.shape shape
|
||||||
|
-- @see gears.shape
|
||||||
|
|
||||||
|
--- The progressbar shape.
|
||||||
|
-- @property shape
|
||||||
|
-- @tparam[opt=gears.shape.rectangle] gears.shape shape
|
||||||
|
-- @see gears.shape
|
||||||
|
|
||||||
--- Set the progressbar to draw vertically.
|
--- Set the progressbar to draw vertically.
|
||||||
-- This doesn't do anything anymore, use a `wibox.container.rotate` widget.
|
-- This doesn't do anything anymore, use a `wibox.container.rotate` widget.
|
||||||
-- @deprecated set_vertical
|
-- @deprecated set_vertical
|
||||||
-- @tparam boolean vertical
|
-- @tparam boolean vertical
|
||||||
|
|
||||||
|
--- Force the inner part (the bar) to fit in the background shape.
|
||||||
|
--
|
||||||
|
-- @property clip
|
||||||
|
-- @tparam[opt=true] boolean clip
|
||||||
|
|
||||||
--- The progressbar to draw ticks. Default is false.
|
--- The progressbar to draw ticks. Default is false.
|
||||||
--
|
--
|
||||||
-- @property ticks
|
-- @property ticks
|
||||||
|
@ -69,12 +97,32 @@ local progressbar = { mt = {} }
|
||||||
--- The progressbar foreground color.
|
--- The progressbar foreground color.
|
||||||
-- @beautiful beautiful.progressbar_fg
|
-- @beautiful beautiful.progressbar_fg
|
||||||
|
|
||||||
|
--- The progressbar shape.
|
||||||
|
-- @beautiful beautiful.progressbar_shape
|
||||||
|
-- @see gears.shape
|
||||||
|
|
||||||
--- The progressbar border color.
|
--- The progressbar border color.
|
||||||
-- @beautiful beautiful.progressbar_border_color
|
-- @beautiful beautiful.progressbar_border_color
|
||||||
|
|
||||||
local properties = { "border_color", "color" , "background_color",
|
--- The progressbar outer border width.
|
||||||
"value" , "max_value", "ticks",
|
-- @beautiful beautiful.progressbar_border_width
|
||||||
"ticks_gap" , "ticks_size" }
|
|
||||||
|
--- The progressbar inner shape.
|
||||||
|
-- @beautiful beautiful.progressbar_bar_shape
|
||||||
|
-- @see gears.shape
|
||||||
|
|
||||||
|
--- The progressbar bar border width.
|
||||||
|
-- @beautiful beautiful.progressbar_bar_border_width
|
||||||
|
|
||||||
|
--- The progressbar bar border color.
|
||||||
|
-- @beautiful beautiful.progressbar_bar_border_color
|
||||||
|
|
||||||
|
local properties = { "border_color", "color" , "background_color",
|
||||||
|
"value" , "max_value" , "ticks",
|
||||||
|
"ticks_gap" , "ticks_size", "border_width",
|
||||||
|
"shape" , "bar_shape" , "bar_border_width",
|
||||||
|
"clip" , "bar_border_color"
|
||||||
|
}
|
||||||
|
|
||||||
function progressbar.draw(pbar, _, cr, width, height)
|
function progressbar.draw(pbar, _, cr, width, height)
|
||||||
local ticks_gap = pbar._private.ticks_gap or 1
|
local ticks_gap = pbar._private.ticks_gap or 1
|
||||||
|
@ -93,32 +141,92 @@ function progressbar.draw(pbar, _, cr, width, height)
|
||||||
|
|
||||||
local over_drawn_width = width
|
local over_drawn_width = width
|
||||||
local over_drawn_height = height
|
local over_drawn_height = height
|
||||||
local border_width = 0
|
local border_width = pbar._private.border_width
|
||||||
local col = pbar._private.border_color or beautiful.progressbar_border_color
|
or beautiful.progressbar_border_width or 0
|
||||||
if col then
|
|
||||||
-- Draw border
|
|
||||||
cr:rectangle(0.5, 0.5, width - 1, height - 1)
|
|
||||||
cr:set_source(color(col))
|
|
||||||
cr:stroke()
|
|
||||||
|
|
||||||
over_drawn_width = width - 2 -- remove 2 for borders
|
local bcol = pbar._private.border_color or beautiful.progressbar_border_color
|
||||||
over_drawn_height = height - 2 -- remove 2 for borders
|
|
||||||
border_width = 1
|
border_width = bcol and border_width or 0
|
||||||
|
|
||||||
|
local bg = pbar._private.background_color or
|
||||||
|
beautiful.progressbar_bg or "#ff0000aa"
|
||||||
|
|
||||||
|
local bg_width, bg_height = width, height
|
||||||
|
|
||||||
|
-- Draw the background shape
|
||||||
|
if border_width > 0 then
|
||||||
|
-- Cairo draw half of the border outside of the path area
|
||||||
|
cr:translate(border_width/2, border_width/2)
|
||||||
|
bg_width, bg_height = bg_width - border_width, bg_height - border_width
|
||||||
|
cr:set_line_width(border_width)
|
||||||
end
|
end
|
||||||
|
|
||||||
cr:rectangle(border_width, border_width,
|
local background_shape = pbar._private.shape or
|
||||||
over_drawn_width, over_drawn_height)
|
beautiful.progressbar_shape or shape.rectangle
|
||||||
cr:set_source(color(pbar._private.color or beautiful.progressbar_fg or "#ff0000"))
|
|
||||||
cr:fill()
|
background_shape(cr, bg_width, bg_height)
|
||||||
|
|
||||||
|
cr:set_source(color(bg))
|
||||||
|
|
||||||
|
if border_width > 0 then
|
||||||
|
cr:fill_preserve()
|
||||||
|
|
||||||
|
-- Draw the border
|
||||||
|
cr:set_source(color(bcol))
|
||||||
|
|
||||||
|
cr:stroke()
|
||||||
|
|
||||||
|
over_drawn_width = width - 2*border_width
|
||||||
|
over_drawn_height = height - 2*border_width
|
||||||
|
else
|
||||||
|
cr:fill()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Undo the translation
|
||||||
|
if border_width > 0 then
|
||||||
|
cr:translate(-border_width/2, -border_width/2)
|
||||||
|
end
|
||||||
|
|
||||||
-- Cover the part that is not set with a rectangle
|
|
||||||
local rel_x = over_drawn_width * value
|
local rel_x = over_drawn_width * value
|
||||||
cr:rectangle(border_width + rel_x,
|
|
||||||
border_width,
|
cr:translate(border_width, border_width)
|
||||||
over_drawn_width - rel_x,
|
|
||||||
over_drawn_height)
|
-- Make sure the bar stay in the shape
|
||||||
cr:set_source(color(pbar._private.background_color or "#000000aa"))
|
if pbar._private.clip ~= false and beautiful.progressbar_clip ~= false then
|
||||||
cr:fill()
|
background_shape(cr, over_drawn_width, over_drawn_height)
|
||||||
|
cr:clip()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Draw the progressbar shape
|
||||||
|
|
||||||
|
local bar_shape = pbar._private.bar_shape or
|
||||||
|
beautiful.progressbar_bar_shape or shape.rectangle
|
||||||
|
|
||||||
|
local bar_border_width = pbar._private.bar_border_width or
|
||||||
|
beautiful.progressbar_bar_border_width or pbar._private.border_width or
|
||||||
|
beautiful.progressbar_border_width or 0
|
||||||
|
|
||||||
|
local bar_border_color = pbar._private.bar_border_color or
|
||||||
|
beautiful.progressbar_bar_border_color
|
||||||
|
|
||||||
|
bar_border_width = bar_border_color and bar_border_width or 0
|
||||||
|
|
||||||
|
over_drawn_width = over_drawn_width - bar_border_width
|
||||||
|
over_drawn_height = over_drawn_height - bar_border_width
|
||||||
|
cr:translate(bar_border_width/2, bar_border_width/2)
|
||||||
|
|
||||||
|
bar_shape(cr, rel_x, over_drawn_height)
|
||||||
|
|
||||||
|
cr:set_source(color(pbar._private.color or beautiful.progressbar_fg or "#ff0000"))
|
||||||
|
|
||||||
|
if bar_border_width > 0 then
|
||||||
|
cr:fill_preserve()
|
||||||
|
cr:set_source(color(bar_border_color))
|
||||||
|
cr:set_line_width(bar_border_width)
|
||||||
|
cr:stroke()
|
||||||
|
else
|
||||||
|
cr:fill()
|
||||||
|
end
|
||||||
|
|
||||||
if pbar._private.ticks then
|
if pbar._private.ticks then
|
||||||
for i=0, width / (ticks_size+ticks_gap)-border_width do
|
for i=0, width / (ticks_size+ticks_gap)-border_width do
|
||||||
|
|
Loading…
Reference in New Issue