doc(w.w.template) 3rd party lib usage example

This commit is contained in:
Aire-One 2021-11-12 16:05:22 +01:00 committed by Emmanuel Lepage Vallee
parent bfe4832c63
commit 8803878e1f
3 changed files with 120 additions and 0 deletions

View File

@ -22,6 +22,32 @@
--
--@DOC_wibox_widget_template_basic_textbox_declarative_EXAMPLE@
--
-- Usage in libraries
-- ==================
--
-- (this part is to be completed according to awful.widget comming PRs to implement the widget_template usage)
--
-- This widget was designed to be used as a standard way to offer customization
-- over concrete widget implementation. We use the `wibox.widget.template` as a
-- base to implement widgets from the `awful.widget` library. This way, it is
-- easy for the final user to customize the standard widget offered by awesome!
--
-- It is possible to use the template widget as a base for a custom 3rd party
-- widget module to offer more customization to the final user.
--
-- Here is an example of implementation for a custom widget inheriting from
-- `wibox.widget.template` :
--
-- The module definition should include a default widget and a builder function
-- that can build the widget with either, the user values or the default.
--
--@DOC_wibox_widget_template_concrete_implementation_module_EXAMPLE@
--
-- On the user side, it only requires to call the builder function to get an
-- instance of the widget.
--
--@DOC_wibox_widget_template_concrete_implementation_user_EXAMPLE@
--
-- @author Aire-One
-- @copyright 2021 Aire-One <aireone@aireone.xyz>
--

View File

@ -0,0 +1,56 @@
--DOC_NO_USAGE
--DOC_HIDE_START
local parent = ...
local gears = require("gears")
local wibox = require("wibox")
local concrete_widget_template_builder
--DOC_HIDE_END
-- Build the default widget used as a fallback if user doesn't provide a template
local default_widget = {
template = wibox.widget.textclock,
update_callback = function(widget_template, args)
local text = args and args.text or "???"
widget_template.widget.text = text
end,
}
--DOC_NEWLINE
function concrete_widget_template_builder(args)
args = args or {}
--DOC_NEWLINE
-- Build an instance of the template widget with either, the
-- user provided parameters or the default
local ret = wibox.widget.template(
args.widget_template and args.widget_template or
default_widget
)
--DOC_NEWLINE
-- Patch the methods and fields the widget instance should have
--DOC_NEWLINE
-- e.g. Apply the received buttons, visible, forced_width and so on
gears.table.crush(ret, args)
--DOC_NEWLINE
-- Optionally, call update once with parameters to prepare the widget
ret:update {
text = "default text",
}
--DOC_NEWLINE
return ret
end
--DOC_HIDE_START
local w = concrete_widget_template_builder()
parent:add(w)
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80

View File

@ -0,0 +1,38 @@
--DOC_NO_USAGE
--DOC_HIDE_START
local parent = ...
local wibox = require("wibox")
local function concrete_widget_template_builder(args)
return wibox.widget.template(args)
end
--DOC_HIDE_END
-- Instanciate the widget with the default template
local default_widget = concrete_widget_template_builder()
--DOC_NEWLINE
-- Instanciate the widget with a custom template
local custom_widget = concrete_widget_template_builder {
widget_template = {
template = wibox.widget.imagebox,
update_callback = function (template, args)
if args and args.text == "default text" then
template.widget.image = "/path/to/image.png"
else
template.widget.image = "/path/to/another-image.png"
end
end
}
}
--DOC_HIDE_START
parent:add(default_widget)
parent:add(custom_widget)
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80