Авто-генерация виджетов в Awesome - PullRequest
0 голосов
/ 04 апреля 2019

Итак, что я сейчас хочу сделать, это в значительной степени реализовать Rofi в Awesome.

Причина, по которой я хочу это сделать, а не просто использую rofi, заключается в том, что я хочу научиться «автоматически генерировать» виджеты в удивительном виде. Это пригодится позже, когда я буду реализовывать такие вещи, как сетевые виджеты, которые при нажатии будут отображать панель, отображать точки доступа Wi-Fi, доступные в виде строк и т. Д., И т. Д. Так что я просто хочу узнать, как работает классно. Но я также хочу запускать программу.

И еще, прежде чем кто-то предложит это, я уже знаю, что есть встроенный лаунчер в awesome, и я также знаю, что есть это . Это не то, что я ищу. Я хочу, чтобы у rofi и dmenu было то же самое: я хочу, чтобы при нажатии клавиш появлялись предложения. и я хочу иметь возможность нажимать на предложения и т. д То, что я хочу, это что-то вроде этого: ухххх

Итак, у меня проблемы: как мне автоматически сгенерировать строки? Я хочу иметь возможность указывать только в одном месте, сколько строк я хочу, и я должен сделать все остальное.

Я просмотрел элитный гитхуб и нашел radical, и хотя он создал систему меню, я подумал, что могу использовать часть его кода, чтобы делать то, что я хочу. Но я не могу из любви к Богу понять, как это работает. Не обижайтесь на него, но он не слишком хорошо документирован, даже для пользователей, и для реального объяснения того, как работает код, нет документации.

Итак, мой вопрос: как я могу заставить эту работу? Как мне сделать так, чтобы виджеты автоматически выступали в роли строк?

TL; DR:

  • Я хочу написать программный лаунчер, например, Rofi, в Awesome
  • я хочу иметь возможность указывать только в одном месте количество строк
  • поэтому (((я думаю))) Мне нужно как-то автоматически генерировать виджеты в виде строк, как я могу это сделать?

EDIT:

Я хочу, чтобы я мог автоматически создавать строки моего модуля запуска. Я знаю, что могу сам жестко закодировать строки, чтобы у каждой строки был свой идентификатор, а затем я мог бы написать функцию, которая при каждом нажатии клавиши будет обновлять каждый виджет с наиболее подходящими соответствиями. Так что это было бы что-то вроде (не проверено вообще):


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

local num_rows = 10
local row_height = 40

-- set the height of the background in accordance to how many rows there are,
-- and how high each row should be
local prompt_height = row_height * num_rows
local prompt_width = 300

-- make a widget in the middle of the screen
local background = wibox({
    x = awful.screen.focused().geometry.width / 2 - prompt_width / 2,
    y = awful.screen.focused().geometry.height / 2 - prompt_height / 2,
    width = prompt_width,
    height = prompt_height,
    bg = "#111111",
    visible = false,
    ontop = false
})
local rofi_launcher = wibox.widget({
    widget = background,
    {
        -- get a flexible layout so the searchbox and the suggestion boxes get 
        -- scaled to take up all the space of the background
        layout = wibox.layout.flex.vertical,
        { -- the prompt you actually type in
            -- set id here so we can adjust its ratio later, so the magnifying
            -- glass will end up on the right, and the texbox will take up the left side
            id = "searchbox_and_mangifying_glass",
            layout = wibox.layout.ratio.horizontal,
            {
                -- set id so we can use it as a prompt later
                id = "searchbox",
                widget = wibox.widget.textbox,
            },
            {
                widget = wibox.widget.imagebox,
                icon = '~/path/to/magnifying_glass_icon.svg',

            },
        },
        { -- this is where I actually create the rows that will display suggestions
            { -- row number 1
                -- make a background for the textbox to sit in, so you can change 
                -- background color later for the selected widget, etc etc. 
                widget = wibox.widget.background,
                    {
                        -- give it an id so we can change what's displayed in the
                        -- textbox when we press keys in the prompt
                        id = "suggestion_1",
                        widget = wibox.widget.textbox,
                    },
            },
            { -- row number 2
                -- background, again
                widget = wibox.widget.background,
                    {
                        -- id and textbox again
                        id = "suggestion_2",
                        widget = wibox.widget.textbox,
                    },
            },
            -- and another 8 (according to the `num_rows` variable) of the same two 
            -- textboxes above. This is exactly my problem. How can I make these 
            -- textboxes automatically and still be able to interact with them to 
            -- display suggestions on the fly, as the user types keys into the prompt?

        },

    },
})

Если это не совсем понятно, пожалуйста, дайте мне знать, что вы не понимаете, и я обновлю свой вопрос.

1 Ответ

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

Столь же непроверенный, как и ваш код, но при этом создаются таблицы текстовых полей вместо использования декларативного макета для создания всех этих текстовых полей:

[SNIP; For shorter code I removed some stuff at the beginning]

local textboxes = {}
local widgets = {}

for i = 1, num_rows do
    local tb = wibox.widget.textbox()
    local bg = wibox.widget.background(tb)
    bg:set_bg("#ff0000") -- The original code did not set a bg color, but that would make the bg widget useless...?

    tb.id = "suggestion_" .. tostring(i) -- This is likely unnecessary, but the original code set these IDs, too

    table.insert(textboxes, tb)
    table.insert(widgets, bg)
end

local rofi_launcher = wibox.widget({
    widget = background,
    {
        -- get a flexible layout so the searchbox and the suggestion boxes get 
        -- scaled to take up all the space of the background
        layout = wibox.layout.flex.vertical,
        { -- the prompt you actually type in
        [SNIP - I did not change anything here; I only removed this part to make the code shorter]
        },
        widgets
    },
})

-- Now make the textboxes display something
textboxes[3].text = "I am the third row"
textboxes[5].text = "I am not"
...