понедельник, 28 февраля 2011 г.

Добавляем команду разворота текста

В прошлый раз я описал несколько команд для вывода простого текста, но если использовать получившийся скрипт, придется для каждого вывода текста заново писать такой же скрипт. Сейчас, на основе своего скрипта, я покажу как я пишу подобные скрипты и расскажу о команде позволяющей развернуть текст под любым углом и отцентрировать его относительно координат x, y.

Чтобы была возможность использовать один скрипт для вывода текстов в разные места окна конки я выношу из функции строки с данными и помещаю их отдельно от функции. Вот мой скрипт, те строки, которые я объяснял в предыдущем посте я комментировать не буду. Новые функции буду выделять цветом.


--[[ Простой скрипт вывода текста с возможностью разворота текста на любой угол и центрирование текста относительно координат.
by olgmen 28.01.2011
]]

require 'cairo'


 -- создаем функцию

function conky_draw_text()

--[[ создаем блок данных, все данные разделяются запятыми. Можно написать и одной строкой, но для наглядности каждое значение написал в отдельной строке.]]

    text_settings={
          
{
text = conky_parse("${time %H:%M:%S}"), 
-- будем выводить время 
x = 10,  -- координаты по горизонтали
y = 120,  -- координаты по вертикали 
bold = true,  -- шрифт жирный
colour = 0xFFFFFF,   -- выбираем белый цвет
alpha = 1,   -- насыщенность цвета
},

{
 -- следующий блок
},
-- закрываем блок данных

    if conky_window == nil then return end

    if tonumber(conky_parse("$updates"))<3 then return end

    local cs = cairo_xlib_surface_create(conky_window.display, conky_window.drawable, conky_window.visual, conky_window.width, conky_window.height)


-- Забираем данные из блока данных и передаем их функции вывода текста

    for i,v in pairs(text_settings) do

        cr = cairo_create (cs)

-- вызываем функцию вывода текста

        display_text(v)
 
        cairo_destroy(cr)
    end

    cairo_surface_destroy(cs)
end

-- -----------------------------------------
--[[ функция перекодировки цвета забирает код цвета в формате 0xRRGGBB и пересчитывает его в формат RGB ]]

function rgb_to_r_g_b(colour,alpha)
    return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha
end

-- -----------------------------------------
--[[ создаем функцию вывода текста на экран. Буква t, в скобках, означает, что к названию всех данных будет добавлена буква t ]]

function display_text(t)


-- [[ создаём блок проверки вводимых данных, в случае пропуска каких либо данных, будут использованы данные по умолчанию ]]

--[[ если отсутствуют данные о тексте, то будет выведена строка "Conky is good for you !" ]]
    if t.text    == nil then t.text = "Conky is good for you !" end
--[[ если отсутствуют координаты, то текст будет выведен начиная с центра окна конки ]]
    if t.x        == nil then t.x = conky_window.width/2 end
    if t.y        == nil then t.y = conky_window.height/2 end
 --[[ если не задан цвет, то текст в данном случае, будет выводиться белым ]]
    if t.colour    == nil then t.colour = 0xffffff end
--[[ если отсутствуют данные о насыщенности (яркости) цвета, то насыщенность будет выставлена по максимуму ]]
    if t.alpha    == nil then t.alpha = 1 end
--[[ если не задан шрифт, то будет использоваться шрифт "Ubuntu" ]]
    if t.font_name    == nil then t.font_name = "Ubuntu" end
--[[ если не задан размер шрифта, то размер шрифта равен 14 ]]
    if t.font_size    == nil then t.font_size = 14 end
--[[ если не задан угол разворота текста, то угол равен 0 ]]
    if t.angle    == nil then t.angle = 0 end
--[[ если не задан вывод текста курсивом, то вывод курсивом не используется]]
    if t.italic    == nil then t.italic = false end
--[[ если не задан жирный шрифт, то он не используется]]
    if t.bold    == nil then t.bold = false end
--[[ если не задана горизонтальная центровка текста относительно координаты y. Возможные варианты:
"l" - координата "y" расположена слева от текста (по умолчанию)


"c" - координата "y" расположена по середине текста
 "r" - координата "y" расположена справа от текста ]]
    if t.h_align    == nil then t.h_align = "l" end
 --[[ если не задана вертикальная центровка текста относительно координаты "x".
Возможные варианты:
"b" - текст выводится выше линии "x" (по умолчанию)
 "t" - текст выводится ниже линии "x"
"m" - середина текста на линии "x"]]

    if t.v_align    == nil then t.v_align = "b" end

--[[ На этом блок проверки данных закончен. Кроме проверки данных, этот блок позволяет сократить вводимые параметры, например, не нужно каждый раз вводить название и размер шрифта, центровку, цвет. Всё это можно задать в этом блоке.]]

-- переносим выводимый текст в заданную точку x, y

    cairo_translate(cr, t.x, t.y)
-- разворачиваем текст на заданный угол. В связи с тем, что мы задаём угол поворота текста в градусах, а программа принимает углы в радианах, умножаем значение градусов на пи/180 ]]
    cairo_rotate(cr, t.angle*math.pi/180)

-- настройка шрифта, просто присваиваем значения переменным
    local slant = CAIRO_FONT_SLANT_NORMAL
    local weight =CAIRO_FONT_WEIGHT_NORMAL
-- проверяем, надо ли включать курсив и жирный шрифт
    if t.italic then slant = CAIRO_FONT_SLANT_ITALIC end
    if t.bold then weight = CAIRO_FONT_WEIGHT_BOLD end

    cairo_select_font_face(cr, t.font_name, slant, weight)


    cairo_set_font_size(cr, t.font_size)
--[[ далее следует команда которая определяет длину выводимой информации, которая находится в строке, в данном случае это вывод времени,

text = conky_parse("${time %H:%M:%S}"),

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

Сейчас 15:00

тогда строка будет иметь такой вид

text = "Сейчас" .. " " .. conky_parse("${time %H:%M}")

здесь пробел между кавычками задает интервал между словом и командой]]
    te=cairo_text_extents_t:create()
    cairo_text_extents (cr,t.text,te)
-- даем команду пересчитать и установить цвет текста
    cairo_set_source_rgba(cr, rgb_to_r_g_b(t.colour, t.alpha))
--[[ в связи с тем, что текст можно центрировать, назначаем новые координаты для вывода текста mx и my, предварительно сбросив их значения на 0 ]]          
    mx,my=0,0
--[[ проверяем, будем ли центрировать текст. Если будем, то из заданных координат вычтем половину длины текста]]  
    if t.h_align=="c" then
        mx=-te.width/2
--[[ также проверяем, будем ли выводить текст левее заданных координат. Если будем, то из заданных координат вычтем длину текста]]
    elseif t.h_align=="r" then
        mx=-te.width
    end
--[[ такие же проверки производим относительно сдвига текста вверх и вниз]]
    if t.v_align=="m" then
        my=-te.height/2-te.y_bearing
    elseif t.v_align=="t" then
        my=-te.y_bearing
    end
-- назначаем точку для вывода текста
    cairo_move_to(cr,mx,my)
-- выводим текст  
    cairo_show_text(cr,t.text)
 -- конец функции

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

text = conky_parse("${time %H:%M:%S}"),
x = 150,
y = 120,
font_size = 36,
bold = true,
h_align = "c",
v_align = "m",
angle = 45,

Готовый скрипт можно взять здесь

Комментариев нет:

Отправить комментарий