From 379b83875198c6468ab11ee198a0e2838d6286d7 Mon Sep 17 00:00:00 2001 From: Yessiest Date: Mon, 24 Oct 2022 15:19:57 +0400 Subject: [PATCH] Creation callbacks for templates --- libs/awmtk2.lua | 125 +++++++++++++++++++++++++++++++----------------- 1 file changed, 80 insertions(+), 45 deletions(-) diff --git a/libs/awmtk2.lua b/libs/awmtk2.lua index 839e158..920b729 100644 --- a/libs/awmtk2.lua +++ b/libs/awmtk2.lua @@ -1,11 +1,11 @@ --- This file is part of Reno desktop. +-- this file is part of reno desktop. -- --- Reno desktop is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. +-- reno desktop is free software: you can redistribute it and/or modify it under the terms of the gnu general public license as published by the free software foundation, either version 3 of the license, or (at your option) any later version. -- --- Reno desktop is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +-- reno desktop is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. see the gnu general public license for more details. -- --- You should have received a copy of the GNU General Public License along with Reno desktop. If not, see . --- RenoTK (formerly AWMTK2) - Template/Granular styling library for Reno +-- you should have received a copy of the gnu general public license along with reno desktop. if not, see . +-- renotk (formerly awmtk2) - template/granular styling library for reno local wibox = require("wibox") local awful = require("awful") local gears = require("gears") @@ -15,23 +15,23 @@ beautiful.templates = beautiful.templates or {} local awmtk = {} --- {{{ Utils +-- {{{ utils awmtk.create_delta = function(name,instance_delta,class_delta,parent_delta) - -- To save memory, we create proxies for lower layers called "deltas" - -- This function creates that proxy layer using metatables + -- to save memory, we create proxies for lower layers called "deltas" + -- this function creates that proxy layer using metatables - -- Fun story - i used instance_delta instead of {} at first. - -- The results were horrifying and confusing. + -- fun story - i used instance_delta instead of {} at first. + -- the results were horrifying and confusing. return setmetatable({},{ __index = function(self,k) - -- Per-instance overrides are top priority + -- per-instance overrides are top priority if rawget(instance_delta,k) then return rawget(instance_delta,k) - -- Class-wide overrides are second in priority + -- class-wide overrides are second in priority elseif type(class_delta[name]) == "table" and rawget(class_delta[name],k) then return rawget(class_delta[name],k) - -- Parent is fallback + -- parent is fallback elseif parent_delta[k] then return parent_delta[k] end @@ -40,7 +40,7 @@ awmtk.create_delta = function(name,instance_delta,class_delta,parent_delta) end awmtk.create_style = function(name,parent,overrides) - -- A style is essentially a layer of deltas upon the previous (parent) style + -- a style is essentially a layer of deltas upon the previous (parent) style local new_style = {} local odelta = (overrides and overrides[name]) or {} local cdelta = beautiful.widgets[name] or {} @@ -73,35 +73,70 @@ awmtk.build_templates = function(templates,style) return new_templates end +awmtk.mask_object_call = function(obj,call) + local new = {} + for k,v in pairs(obj) do + new[k] = v + end + return setmetatable(new,{ + __index = obj, + __call = call + }) +end + +awmtk.wrap_hooks = function(w,callbacks) + -- attach hooks to function + local mcall = getmetatable(w).__call + return awmtk.mask_object_call(w,function(...) + if callbacks and callbacks.on_create_pre then + callbacks.on_create_pre(...) + end + local widget = mcall(...) + if callbacks and callbacks.on_create then + callbacks.on_create(widget,...) + end + if callbacks and callbacks.on_ready then + local func = function() + callbacks.on_ready(widget) + end + widget:connect_signal("widget::layout_changed",func) + widget:connect_signal("widget::layout_changed",function() + widget:disconnect_signal("widget::layout_changed",func) + end) + end + return widget + end) +end + awmtk.merge = gears.table.join -- }}} --- {{{ Default style +-- {{{ default style --- Prototype style --- Notice that it's not awmtk.default style - it's used as a base for default. +-- prototype style +-- notice that it's not awmtk.default style - it's used as a base for default. awmtk.proto_style = { base = setmetatable({ - -- { Backgrounds + -- { backgrounds -- custom background color for highlighting elements bg_highlight = beautiful.bg_highlight or beautiful.bg_focus, -- allow more complex themes to define background images bgimage_focus = beautiful.bgimage_focus, bgimage_normal = beautiful.bgimage_normal, -- } - -- { Borders - -- Borders for popups + -- { borders + -- borders for popups shape_border_width = beautiful.shape_border_width or 0, shape_border_color = beautiful.shape_border_color or beautiful.bg_normal, -- } - -- { Callbacks + -- { callbacks -- a tiny bit more complex thing to account for more extensibility -- the stub functions do nothing - you should implement functionality inside theme onpress = function() end, onrelease = function() end, -- } - -- { Shapes + -- { shapes margins = 5, spacing = 5, shape = function(cr, width, height) @@ -111,7 +146,7 @@ awmtk.proto_style = { },{__index = beautiful}) } --- Subclasses +-- subclasses awmtk.proto_style.container = awmtk.create_delta("container",{ },awmtk.proto_style,awmtk.proto_style.base) @@ -167,13 +202,13 @@ awmtk.proto_style.checkbox = awmtk.create_delta("checkbox", { }, awmtk.proto_style,awmtk.proto_style.base) -- }}} --- {{{ Generic templates +-- {{{ generic templates awmtk.proto_templates = { - -- Templates are built first using the given style, then applied to contents + -- templates are built first using the given style, then applied to contents -- through returned function container = function(style) - -- Container is practically any "box" that contains buttons, textboxes, - -- and anything you want to put into the container. Do not confuse with + -- container is practically any "box" that contains buttons, textboxes, + -- and anything you want to put into the container. do not confuse with -- popup - containers are designed to separate contents within a popup. return function(layout,options) return awmtk.merge({ @@ -188,14 +223,14 @@ awmtk.proto_templates = { shape = style.container.shape, shape_border_color = style.container.shape_border_color, shape_border_width = style.container.shape_border_width, - widget = wibox.container.background + widget = awmtk.wrap_hooks(wibox.container.background,options) },options or {}) end end, button = function(style) - -- Self explanatory. Notice that this does not bear any function - - -- only the visual part of the button. By design, onpress and onrelease + -- self explanatory. notice that this does not bear any function - + -- only the visual part of the button. by design, onpress and onrelease -- callbacks should be connected to button events for animations return function(layout,options) return awmtk.merge({ @@ -216,7 +251,7 @@ awmtk.proto_templates = { end, textbox = function(style) - -- Nothing fancy here, but you can set per-widget fonts using beautiful. + -- nothing fancy here, but you can set per-widget fonts using beautiful. return function(options) return awmtk.merge({ font = style.textbox.font, @@ -226,7 +261,7 @@ awmtk.proto_templates = { end, hseparator = function(style) - -- Wow, i guess? + -- wow, i guess? return function(options) return awmtk.merge({ widget = wibox.widget.separator, @@ -239,7 +274,7 @@ awmtk.proto_templates = { end, vseparator = function(style) - -- I'm running out of comments + -- i'm running out of comments return function(options) return awmtk.merge({ widget = wibox.widget.separator, @@ -252,8 +287,8 @@ awmtk.proto_templates = { end, article = function(style) - -- Article is a template that combines 3 common pieces of a full item: - -- Icon, name and description. Designed to be placed within a container + -- article is a template that combines 3 common pieces of a full item: + -- icon, name and description. designed to be placed within a container -- or a button. return function(options) return awmtk.merge({ @@ -323,7 +358,7 @@ awmtk.proto_templates = { end, popup = function(style) - -- Popup is a distinct template designed to accomodate the "root" of + -- popup is a distinct template designed to accomodate the "root" of -- a popup, allowing one to add titlebars to popups, for example. return function(widget,options) return awmtk.merge({ @@ -341,13 +376,13 @@ awmtk.proto_templates = { end, titlebar = function(style) - -- Titlebar is a separate class specifically for window and popup - -- titlebars. The decision to make it a separate class was due to + -- titlebar is a separate class specifically for window and popup + -- titlebars. the decision to make it a separate class was due to -- the fact that much customization is done through default theme table return function(layout,options) - -- If there's one thing that fascinates me, it's how much weird + -- if there's one thing that fascinates me, it's how much weird -- bugs i manage to uncover by some sort of miraculous accident. - -- This one fixes a race condition in margins+(left/right/bottom/top) configuration scenario + -- this one fixes a race condition in margins+(left/right/bottom/top) configuration scenario local margins = style.titlebar.margins if (style.titlebar.left or style.titlebar.right or @@ -368,7 +403,7 @@ awmtk.proto_templates = { end, wibar = function(style) - -- Just you regular old wibar, but as a style template. + -- just you regular old wibar, but as a style template. return function(layout,options) local margins = style.wibar.margins if (style.wibar.left or @@ -390,7 +425,7 @@ awmtk.proto_templates = { end, slider = function(style) - -- Slider widget but wired to work with the AWMTK2 namespace system + -- slider widget but wired to work with the awmtk2 namespace system return function(args) return awmtk.merge({ handle_shape = style.slider.handle_shape or style.slider.shape, @@ -426,12 +461,12 @@ awmtk.proto_templates = { end } --- Last but not least - we export a default template lib and default style. --- This is done in order to allow overriding default style behaviour from theme +-- last but not least - we export a default template lib and default style. +-- this is done in order to allow overriding default style behaviour from theme awmtk.default = awmtk.create_style("default",awmtk.proto_style,{}) awmtk.templates = awmtk.create_template_lib("templates",awmtk.proto_templates,{}) --- Generic styles for widgets that need them +-- generic styles for widgets that need them awmtk.generic = {} awmtk.generic.menu = awmtk.create_style("generic_menu",awmtk.default,{}) awmtk.generic.button_list = awmtk.create_style("generic_button_list",awmtk.default,{})