Как получить ширину и высоту виджета после того, как он нарисован в удивительном? - PullRequest
0 голосов
/ 24 апреля 2019

Итак, это сценарий: допустим, у меня есть текстовое поле, которое я хочу разместить точно в правой части экрана, но ОСТАЛОСЬ, чтобы текстовое поле сохраняло свои собственные размеры. Другими словами, я хочу просто указать шрифт, позволить текстовому полю выбрать правильные размеры, а затем поместить его на край экрана. Было бы очень легко, если бы я знал размеры, с тех пор я могу сделать

local awful = require("awful")
local wibox = require("wibox")

local text_widget = wibox.widget({
    widget = wibox.widget.textbox,
    font = "Roboto Medium 15",
    text = "hello world",
})

local rightmost_place = wibox.widget({
    layout = wibox.layout.manual,
    {
        text_widget,
        point = {
            y = 0, 
            -- You can't actually do the `text_widget.geometry.width`
            x = awful.screen.focused().geometry.width
                - text_widget.geometry.width
        },
        -- We're not setting these so the textbox
        -- will get its size automatically
        -- forced_width = 
        -- forced_height = 
    },
})

Таким образом, всякий раз, когда я должен был что-то вводить, текстовое поле будет увеличиваться, но оно автоматически перемещается в соответствии с координатой x.

Кроме того, речь идет не только о текстовых полях. У меня была такая же проблема с другими виджетами, поэтому мой вопрос: есть ли какой-нибудь способ, позволяющий виджетам получать размеры, которые они предпочитают, но все же получить их геометрию, чтобы переместить их туда, где вы хотите? *

1 Ответ

0 голосов
/ 24 апреля 2019

Проблема в том, что виджеты могут быть размещены в нескольких местах (с несколькими размерами) одновременно.Это полезно для некоторых случаев, таких как текстовый блок, чтобы иметь один экземпляр (с одним таймером) для всех экранов.Это делает получение размера немного сложнее.Если вы не планируете использовать виджет в нескольких местах, вы можете обмануть и добавить свойства width / height.

-- in the declarative syntax, add an `id`
id = `id_of_the_widget_with_size`,

-- Get the widget (somewhere outside of the declarative section)
local w = rightmost_place:get_children_by_id("id_of_the_widget_with_size")[1]
w._real_draw = w.draw
w.draw = function(self, context, cr, width, height)
    self.width, self.height = width, height
    w._real_draw(self, context, cr, width, height)
end

Теперь, теоретически, виджет будет иметь width и height собственность.

...