--[[СonkyCalendar.lua by ramZport,
http://ramzport.blogspot.com]]--
require 'cairo'
--[[Начальная функция вызываемая из Conky]]--
function conky_startlua()
if conky_window == nil then return end
local cs = cairo_xlib_surface_create(conky_window.display, conky_window.drawable, conky_window.visual, conky_window.width, conky_window.height)
cr = cairo_create(cs)
cairo_scale (cr, 1, 1)
fSimpleSkin(0, 0, 200, 230, 5, 0x555555, 0x222222, 0x000000, 0.5)
fDrawTextCenter (46, 51, tonumber(os.date('%d')), 'ubuntu', 48, 0, 1, 0x000000, 0.8, 0)
fDrawTextCenter (45, 50, tonumber(os.date('%d')), 'ubuntu', 48, 0, 1, 0xFFFFFF, 1, 0)
fDrawTextCenter (131, 33, fBigNameMonth(tonumber(os.date('%m'))), 'ubuntu', 20, 0, 1, 0x000000, 0.8, 0)
fDrawTextCenter (130, 32, fBigNameMonth(tonumber(os.date('%m'))), 'ubuntu', 20, 0, 1, 0xFFFFFF, 1, 0)
fDrawTextCenter (131, 51, fNameWeekDay(tonumber(os.date('%u'))), 'ubuntu', 14, 0, 0, 0x000000, 0.8, 0)
fDrawTextCenter (130, 50, fNameWeekDay(tonumber(os.date('%u'))), 'ubuntu', 14, 0, 0, 0xFFFFFF, 1, 0)
fCalendar(0xff0000, 'ubuntu', 0xFFFFFF, 1)
cairo_destroy(cr)
end
--[[ Подложка ]]--
function fSimpleSkin(nXSkin, nYSkin, nWidth, nHeight, nRadius, nColor1, nColor2, nColor3, nAlpha)
--nXSkin - x-координата
--nYSkin - y-координата
--nHeight - высота
--nWidth - ширина
--nRadius - радиус скругления углов
--nColor1 - начальный цвет градиентной заливки
--nColor2 - средний цвет градиентной заливки
--nColor3 - конечный цвет градиентной заливки
--nAlpha - степень прозрачности, от 0 до 1
cairo_move_to(cr, nXSkin+nRadius, nYSkin)
cairo_line_to(cr, nXSkin+nWidth-nRadius, nYSkin)
cairo_arc (cr, nXSkin+nWidth-nRadius, nYSkin+nRadius, nRadius, math.rad(270), math.rad(360))
cairo_line_to(cr, nXSkin+nWidth, nYSkin+nHeight-nRadius)
cairo_arc (cr, nXSkin+nWidth-nRadius, nYSkin+nHeight-nRadius, nRadius, math.rad(0), math.rad(90))
cairo_line_to(cr, nXSkin+nRadius, nYSkin+nHeight)
cairo_arc (cr, nXSkin+nRadius, nYSkin+nHeight-nRadius, nRadius, math.rad(90), math.rad(180))
cairo_line_to(cr, nXSkin, nYSkin+nRadius)
cairo_arc (cr, nXSkin+nRadius, nYSkin+nRadius, nRadius, math.rad(180), math.rad(270))
local pPath=cairo_copy_path (cr)
local pLin = cairo_pattern_create_linear (nXSkin, nYSkin, nWidth,nYSkin+nHeight)
cairo_pattern_add_color_stop_rgba (pLin, 0.0, ((nColor1 / 0x10000) % 0x100) / 255, ((nColor1 / 0x100) % 0x100) / 255, (nColor1 % 0x100) / 255, nAlpha)
cairo_pattern_add_color_stop_rgba (pLin, 0.6, ((nColor2 / 0x10000) % 0x100) / 255, ((nColor2 / 0x100) % 0x100) / 255, (nColor2 % 0x100) / 255, nAlpha)
cairo_pattern_add_color_stop_rgba (pLin, 1, ((nColor3 / 0x10000) % 0x100) / 255, ((nColor3 / 0x100) % 0x100) / 255, (nColor3 % 0x100) / 255, nAlpha)
cairo_set_source (cr, pLin)
cairo_fill (cr)
cairo_append_path(cr, pPath)
cairo_set_source_rgba(cr, fRGBtoARGB(nColor3, 0.5))
cairo_set_line_width (cr, 0.3)
cairo_stroke(cr)
end
--[[Функция перевода цвета из RGB в ARGB]]--
function fRGBtoARGB (nColor, nAlpha)
-- nColor - цвет RGB (0x000000)
-- nAlpha - степень прозрачности, от 0 до 1
return ((nColor / 0x10000) % 0x100) / 255., ((nColor / 0x100) % 0x100) / 255., (nColor % 0x100) / 255., nAlpha
end
--[[Функция вывода текста]]--
function fDrawText (nXCoord, nYCoord, sText, sFontName, sFontSize, nFontSlant, nFontWeight, nColor, nAlpha, nRotate)
-- nXCoord, nYCoord - координаты для вывода
-- sText - отображаемый текст
-- sFontName - название шрифта
-- sFontSize - размер шрифта
-- nFontSlant - стиль шрифта (0 - normal, 1 - italic, 2 - oblique)
-- nFontWeight - толщина шрифта (0 - normal, 1 - bold)
-- nColor - цвет шрифта в формате 0×000000
-- nAlpha - степень прозрачности, от 0 до 1
-- nRotate - угол поворота
cairo_select_font_face (cr, sFontName, nFontSlant, nFontWeight)
cairo_set_font_size (cr, sFontSize)
cairo_move_to (cr, nXCoord, nYCoord)
cairo_set_source_rgba(cr, fRGBtoARGB (nColor, nAlpha))
cairo_rotate (cr, nRotate*math.pi/180)
cairo_show_text(cr, sText)
cairo_rotate (cr, (0-nRotate)*math.pi/180)
end
--[[Функция вывода текста с выравниванием по центру]]--
function fDrawTextCenter (nXCenter, nYCenter, sText, sFontName, sFontSize, nFontSlant, nFontWeight, nColor, nAlpha, nRotate)
-- nXCenter, nYCenter - координаты центра для вывода
-- sText - отображаемый текст
-- sFontName - название шрифта
-- sFontSize - размер шрифта
-- nFontSlant - стиль шрифта (0 - normal, 1 - italic, 2 - oblique)
-- nFontWeight - толщина шрифта (0 - normal, 1 - bold)
-- nColor - цвет шрифта в формате 0×000000
-- nAlpha - степень прозрачности, от 0 до 1
-- nRotate - угол поворота
local extents = cairo_text_extents_t:create()
cairo_select_font_face (cr, sFontName, nFontSlant, nFontWeight)
cairo_set_font_size (cr, sFontSize)
cairo_text_extents (cr, sText, extents)
local nXSpace = nXCenter-(extents.width/2)-- + extents.x_bearing)
local nYSpace = nYCenter
cairo_move_to (cr, nXSpace, nYSpace)
cairo_set_source_rgba(cr, fRGBtoARGB (nColor, nAlpha))
cairo_rotate (cr, nRotate*math.pi/180)
cairo_show_text(cr, sText)
cairo_rotate (cr, (0-nRotate)*math.pi/180)
end
function fBigNameMonth(nMonth)
-- nMonth - месяц
tBigNameMonth = {'ЯНВАРЯ', 'ФЕВРАЛЯ', 'МАРТА', 'АПРЕЛЯ', 'МАЯ', 'ИЮНЯ', 'ИЮЛЯ', 'АВГУСТА', 'СЕНТЯБРЯ', 'ОКТЯБРЯ', 'НОЯБРЯ', 'ДЕКАБРЯ'}
return tBigNameMonth[nMonth]
end
function fNameWeekDay(nWeekDay)
-- nWeekDay - день недели
tWeekDay = {'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота', 'воскресенье'}
return tWeekDay[nWeekDay]
end
function fCalendar(nColorNow, sFont, nColor, nAlpha)
-- nColorNow - цвет обводки текущего дня
-- sFont - шрифт
-- nColor - цвет индикатора в формате 0×000000
-- nAlpha - степень прозрачности, от 0 до 1
local nXCal = -5
local nYCal = 60
local nXShift = 23
local nYShift = 20
nYCal = nYCal+25
local tWeekDay={"ПН", "ВТ", "СР", "ЧТ", "ПТ", "СБ", "ВС"}
local nNextWeekDay = fWeekDayByDate(1, tonumber(os.date('%m')), tonumber(os.date('%Y')))
for i = 1, 7 do
fDrawText(nXCal+(i*nXShift), nYCal, tWeekDay
, sFont, 12, 0, 0, nColor, nAlpha, 0)
end
nYCal = nYCal + 25
for i = 1, fDayCount(tonumber(os.date('%m')), tonumber(os.date('%Y'))) do
if i<10 then
fDrawText(nXCal+(nNextWeekDay*nXShift)+3, nYCal, i, sFont, 14, 0, 1, nColor, nAlpha, 0)
if i == tonumber(os.date('%e')) then
fArc(nXCal+(nNextWeekDay*nXShift)+8, nYCal-5, 12, 0, 360, nColorNow, nAlpha, 2)
end
else
fDrawText(nXCal+(nNextWeekDay*nXShift), nYCal, i, sFont, 14, 0, 1, nColor, nAlpha, 0)
if i == tonumber(os.date('%e')) then
fArc(nXCal+(nNextWeekDay*nXShift)+8, nYCal-5, 12, 0, 360, nColorNow, nAlpha, 2)
end
end
nNextWeekDay=nNextWeekDay+1
if nNextWeekDay==8 then
nNextWeekDay = 1
nXCal = -5
nYCal = nYCal + nYShift
end
end
end
function fWeekDayByDate(nDay, nMonth, nYear)
-- nDay - день
-- nMonth - месяц
-- nYear - год
tWeekDay = {6, 7, 1, 2, 3, 4, 5}
local nAux=math.floor ((14-nMonth)/12)
nYear=nYear + 1 - nAux
nMonth=nMonth+12*nAux-2
local nIndex = math.fmod(7000+(nDay+nYear+math.floor (nYear/4)-math.floor (nYear/100)+math.floor (nYear/400)+math.floor ((31*nMonth)/12)), 7) + 1
return tWeekDay[nIndex]
end
function fDayCount(nMonth, nYear)
-- nMonth - месяц
-- nYear - год
local tMonthDays={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
if nMonth==2 then
if ((math.fmod(nYear, 4)==0) and ((math.fmod(nYear,100)<0) or (math.fmod(nYear,100)>0))) or (math.fmod(nYear,400)==0) then
tMonthDays[2] = tMonthDays[2]+1
end
end
return tMonthDays[nMonth]
end
--[[ функция отрисовки дуги ]]--
function fArc(nXCoord, nYCoord, nRadius, noDegrees, nDegrees, nColor, nAlpha, nWidthLine)
-- nXCoord, nYCoord - координаты центра дуги
-- nRadius - радиус дуги
-- noDegrees - начальный радиус
-- nDegrees - конечный радиус
-- nColor - цвет линии в формате 0×000000
-- nAlpha - степень прозрачности, от 0 до 1
-- nWidthLine - толщина линии
cairo_set_source_rgba(cr, fRGBtoARGB(nColor, nAlpha))
cairo_set_line_width (cr, nWidthLine)
cairo_move_to(cr, nXCoord, nYCoord)
cairo_new_sub_path(cr)
cairo_arc (cr, nXCoord, nYCoord, nRadius, math.rad(noDegrees), math.rad(nDegrees))
cairo_stroke(cr)
end