Выводим текст в виджете с помощью lua+cairo

Разработка скриптов на lua. Создание виджетов, диалогов и т.д.
Ответить
Аватара пользователя
olgmen
Сообщения: 155
Зарегистрирован: 30 ноя 2012, 11:00
Темы: 32
Откуда: Санкт-Петербург
Статус: Не в сети

Выводим текст в виджете с помощью lua+cairo

Сообщение olgmen » 04 янв 2014, 15:22

Я уже писал о том, как можно вывести текст с помощью встроенных в awesome команд. В отличие от команд awesome, с помощью связки lua+cairo, можно вывести текст с наклоном под любым углом, даже перевернутым. Для начала просто выведем обыкновенный текст. Я просто приведу примеры команд, и покажу как это будет выглядеть, а как это применить в своих виджетах придумайте сами.
При использовании lua+cairo всё начинается с точки, независимо от того, рисунок, чертёж или текст выводится на экран, нужна начальная точка, с которой всё начинается. Начальная точка задаётся командой

cr:move_to(x, y)

cr -- даёт указания, что используется cairo
move_to -- поместить в точку
x, y -- координаты точки

Координаты точки всегда идут от верхнего левого угла виджета и их можно или вписать прямо в команду

cr:move_to(20, 100)

или задать переменными

local x = 20
local y = 100


а можно и так

local x, y = 20, 100

lua понимает все эти варианты.

Вывод текста осуществляется с помощью команды

cr:show_text("Вывод текста")

Тут всё и так ясно, команда даёт указание показать текст начиная с заданной точки. Но если мы вставим в виджет эти строки, ничего не произойдет, так как не задан цвет текста, шрифт и размер шрифта.

Задаём цвет выводимого текста, для этого есть несколько вариантов команд, но пока используем самый простой

cr:set_source_rgb(0,0,0)

Здесь тоже всё просто, задаем цвет в системе RGB - красный, зелёный, голубой значения от 0 до 1. В данном случае цвет черный.

Теперь задаем шрифт. Шрифт задаётся командой

cr:select_font_face(название_шрифта, тип_шрифта, толщина_шрифта)

название_шрифта "Sans" или на ваше усмотрение, но обязательно в кавычках, и шрифт должен быть установлен в системе
тип_шрифта 0 - нормальный, по умолчанию
1 - italic
2 - oblique
толщина шрифта 0 - нормальный
1 - bold

т.е. команда

cr:select_font_face("Sans")

или

cr:select_font_face("Sans", 0, 0)

будет выведен "нормальный" текст

команда

cr:select_font_face("Sans", 1, 1)

будет выведен наклонный текст утолщенными буквами, можете поэкперементировать и выбрать подходящий вам.

Осталось задать размер шрифта. Команда тоже очень простая, как и все команды в lua и cairo.

cr:set_font_size(fontSize)

Здесь тоже вместо fontSize необходимо указать размер шрифта, или задать размер переменной

local fontSize = 16

Пример вывода текста

Изображение


под спойлером образец виджета с картинки

[spoiler]local wibox = require("wibox")
local oapi = { screen = screen }
local scrn = oapi.screen[1].geometry
local cw = require ("cairo_widgets")

proba = {}

proba.width = 250 -- ширина виджета
proba.height = 250 -- высота виджета
proba.bg_color = "#ffffffff" -- цвет фона черный полу прозрачный

proba.x = 200 -- Координаты
proba.y = 50 -- левого верхнего угла

local proba_wbox = wibox({ bg = proba.bg_color,
width = proba.width,
height = proba.height })

proba_wbox.ontop = true -- true - поверх всех окон / false - на рабочий стол
proba_wbox.visible = false -- true - при запуске компа виден / false - не виден

proba_wbox:geometry({x = proba.x, y = proba.y})

local proba_widget = wibox.widget.base.make_widget()

proba_widget.fit = function( proba_widget, width, height )
return width, height
end

proba_widget.draw = function(proba_widget, proba_wbox, cr, width, height)

local fontSize = 16
-- задаем цвет текста - черный
cr:set_source_rgb(0,0,0)

cr:move_to(width/2, height/2-fontSize*2)
--cr:select_font_face(название_шрифта, тип_шрифта, толщина_шрифта)
-- название_шрифта "Sans" или на ваше усмотрение, но обязательно в кавычках, и шрифт должен быть установлен
-- тип_шрифта 0 - нормальный, по умолчанию
-- 1 - italic
-- 2 - oblique
-- толщина шрифта 0 - нормальный
-- 1 - bold
cr:set_font_size(fontSize)
cr:select_font_face("Sans")
cr:show_text("test")

cr:move_to(width/2, height/2)
cr:set_font_size(fontSize)
cr:select_font_face("Sans",1,0)
cr:show_text("test")

cr:move_to(width/2, height/2+fontSize*2)
cr:set_font_size(fontSize)
cr:select_font_face("Sans",1,1)
cr:show_text("test")

cr:stroke()

end

local proba_layout = wibox.layout.fixed.horizontal()
proba_layout:add(proba_widget)
proba_wbox:set_widget(proba_layout)
proba.wibox = proba_wbox
return proba[/spoiler]
Кто ищет, тот всегда найдет

Arch Linux
Conky - 1.9

Аватара пользователя
olgmen
Сообщения: 155
Зарегистрирован: 30 ноя 2012, 11:00
Темы: 32
Откуда: Санкт-Петербург
Статус: Не в сети

Re: Выводим текст в виджете с помощью lua+cairo

Сообщение olgmen » 07 янв 2014, 15:33

Продолжаем. Теперь о том, как вывести текст выравненый по правому краю и по центру текста. Для этого необходимо использовать команду которая вычисляет длину текста, но сначала, для наглядности, нарисуем крест посередине нашего виджета

-- крест будет красного цвета

cr:set_source_rgb(1,0,0)

cr:set_line_width(1)
cr:move_to(width/2, 0)
cr:line_to(width/2, height)
cr:move_to(0, height/2)
cr:line_to(width, height/2)
cr:stroke()


Для выравниванию текста по левому краю ничего не требуется, просто все новые строки начинаем с одного и того же значения x.

Выводим слово test с началом слова посередине виджета, немного, на высоту шрифта приподнимем его для наглядности

cr:set_source_rgb(0,0,0)

local x = width/2
local y = height/2
local text = "test"

cr:set_font_size(26)
cr:select_font_face("Sans")
cr:move_to(x,y-fontSize)
cr:show_text("test")


При выравнивании текста по правой кромке, последней букве, необходимо высчитать длину этого текста. Это делается с помощью следующей команды

te = cr:text_extents(text)

эта команда высчитывает не только длину, но и высоту текста и помещает данные в таблицу

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

cr:move_to(x-te["x_advance"],y)

здесь te["x_advanse"] и есть длина нашего текста
te["y_bearing"] высота текста

Полностью это выглядит так

cr:save()
te=cr:text_extents(text)
cr:move_to(x-te["x_advance"],y)
cr:show_text(text)
cr:stroke()
cr:restore()


ну и центровка посередине текста

cr:save()
te=cr:text_extents(text)
cr:move_to(x-te["x_advance"]/2,y+fontSize)
cr:show_text(text)
cr:stroke()
cr:restore()


и на нашем виджете

Изображение

По вертикали выравнивание текста такое же, но только с использованием y_bearing

опускаем текст на высоту шрифта

cr:save()
te=cr:text_extents(text)
cr:move_to(x-te["x_advance"]/2,y-te["y_bearing"])
cr:show_text(text)
cr:stroke()
cr:restore()


поднимаем текст на высоту шрифта

cr:save()
te=cr:text_extents(text)
cr:move_to(180, y+te["y_bearing"])
cr:show_text(text)
cr:stroke()
cr:restore()


Так это выглядит на нашем виджете

Изображение


Осталось самое малое с текстом, это повернуть текст на какой-нибудь угол.

Для поворота текста, можно картинки, графика, имеется команда

cr:rotate(угол_в_радианах)

а так как при повороте смещаются координаты, то указываем (транслируем) куда вывести изображение

cr:translate(x, y)

cr:save()
cr:translate(x, y)
cr:rotate(-math.pi/2)
cr:show_text("test")
cr:stroke()
cr:restore()


Изображение

Ну и всё вместе, разворот со смещением центра текста в центр виджета

te=cr:text_extents(text)
cr:save()
cr:translate(x-te["y_bearing"]/2, y+te["x_advance"]/2)
cr:rotate(-math.pi/2)
cr:show_text("test")
cr:stroke()
cr:restore()


Изображение

Ну вот кажется и всё по выводу текста, если чего непонятно, спрашивайте, а если что пропустил, то допишу
Кто ищет, тот всегда найдет

Arch Linux
Conky - 1.9

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость