diff --git a/Applications/Calendar.app/Icon.pic b/Applications/Calendar.app/Icon.pic new file mode 100644 index 00000000..020a44ae Binary files /dev/null and b/Applications/Calendar.app/Icon.pic differ diff --git a/Applications/Calendar.app/Icons/ArrowLeft.pic b/Applications/Calendar.app/Icons/ArrowLeft.pic new file mode 100644 index 00000000..68fc39ea Binary files /dev/null and b/Applications/Calendar.app/Icons/ArrowLeft.pic differ diff --git a/Applications/Calendar.app/Icons/ArrowLeftBlack.pic b/Applications/Calendar.app/Icons/ArrowLeftBlack.pic new file mode 100644 index 00000000..965a36ca Binary files /dev/null and b/Applications/Calendar.app/Icons/ArrowLeftBlack.pic differ diff --git a/Applications/Calendar.app/Icons/ArrowRight.pic b/Applications/Calendar.app/Icons/ArrowRight.pic new file mode 100644 index 00000000..71673044 Binary files /dev/null and b/Applications/Calendar.app/Icons/ArrowRight.pic differ diff --git a/Applications/Calendar.app/Icons/ArrowRightBlack.pic b/Applications/Calendar.app/Icons/ArrowRightBlack.pic new file mode 100644 index 00000000..c1459dcb Binary files /dev/null and b/Applications/Calendar.app/Icons/ArrowRightBlack.pic differ diff --git a/Applications/Calendar.app/Localizations/English.lang b/Applications/Calendar.app/Localizations/English.lang new file mode 100644 index 00000000..3f89aab8 --- /dev/null +++ b/Applications/Calendar.app/Localizations/English.lang @@ -0,0 +1,21 @@ +{ + weekLine = "Mo Tu We Th Fr Sa Su", + weekLineAlt = "Su Mo Tu We Th Fr Sa", + months = { + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", + }, + startWeek = "Start week from ", + monday = "Monday", + sunday = "Sunday" +} diff --git a/Applications/Calendar.app/Localizations/Russian.lang b/Applications/Calendar.app/Localizations/Russian.lang new file mode 100644 index 00000000..5c9fa81e --- /dev/null +++ b/Applications/Calendar.app/Localizations/Russian.lang @@ -0,0 +1,21 @@ +{ + weekLine = "Пн Вт Ср Чт Пт Сб Вс", + weekLineAlt = "Вс Пн Вт Ср Чт Пт Сб", + months = { + "Январь", + "Февраль", + "Март", + "Апрель", + "Май", + "Июнь", + "Июль", + "Август", + "Сентябрь", + "Октябрь", + "Ноябрь", + "Декабрь", + }, + startWeek = "Начинать неделю с ", + monday = "Понедельника", + sunday = "Воскресенья" +} diff --git a/Applications/Calendar.app/Main.lua b/Applications/Calendar.app/Main.lua new file mode 100644 index 00000000..e7454eca --- /dev/null +++ b/Applications/Calendar.app/Main.lua @@ -0,0 +1,217 @@ +local GUI = require("GUI") +local system = require("System") +local bigLetters = require("BigLetters") +local screen = require("Screen") +local image = require("Image") +local fs = require("Filesystem") + + +local workspace, window, menu = system.addWindow(GUI.filledWindow(1, 1, 42, 24, 0xFFFFFF)) +window.actionButtons.localY = 1 + +local localization = system.getCurrentScriptLocalization() +local iconsPath = fs.path(system.getCurrentScript()) .. "Icons/" +local isWeekAlt = false + +local countOfDays = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} +local monthDateMove = {3, 2, 3, 2, 3, 2, 3, 3, 2, 3, 2, 3} +local lastCountedYear = 0 +local comMonthMem +local curYearList + +local function isLeap(year) + if year % 4 == 0 or year % 400 == 0 then return true else return false end +end + +local function getNextDay(day) + return day < 7 and day + 1 or 1 +end + +local function calculateYear(year, fstDayPos) + local yearList = {} + local leap = isLeap(year) + + for month = 1, 12 do + yearList[month] = {} + + if month == 2 then + if leap then + yearList[month].countOfDays = 29 + yearList[month].fstDayPos = fstDayPos + fstDayPos = getNextDay(fstDayPos) + else + yearList[month].countOfDays = 28 + yearList[month].fstDayPos = fstDayPos + end + else + yearList[month].countOfDays = countOfDays[month] + yearList[month].fstDayPos = fstDayPos + for i = 1, monthDateMove[month] do + fstDayPos = getNextDay(fstDayPos) + end + end + end + + return yearList +end + +local function fstJanPos(year) + local day = 0 + + local difference = math.abs(year - 1010) + local leapCount + + if difference % 4 == 0 then + leapCount = difference / 4 + elseif difference % 4 == 1 or difference % 4 == 2 then + leapCount = math.floor(difference / 4) + elseif difference % 4 == 3 then + leapCount = math.floor(difference / 4) + 1 + end + + local offset = difference + leapCount + + if offset % 7 == 0 then + day = 1 + else + day = offset % 7 + 1 + end + + return day +end + +local function makeIconButton(x, y, parentObj, icon, onTouch) + local obj = GUI.image(x, y, image.load(iconsPath .. icon .. ".pic")) + parentObj:addChild(obj).eventHandler = function(_, _, event) + if event == "touch" then + onTouch() + end + end + return obj +end + +local currentStamp = os.date("*t", system.getTime()) +local currentYear, currentMonth, currentDay = currentStamp.year, currentStamp.month, currentStamp.day +local selectedYear, selectedMonth = currentYear, currentMonth + +local function renderYear(object) + local text = tostring(selectedYear) + local width = bigLetters.getTextSize(text) + bigLetters.drawText(math.floor(object.x + object.width / 2 - width / 2), object.y, 0x000000, text) +end + +local year = window:addChild(GUI.object(8, 3, 28, 5)) +year.draw = function(object) + renderYear(object) +end + + +local function renderMonth(xCoord, yCoord, width, monthPos) + local text = localization.months[monthPos] + local weekText = isWeekAlt and localization.weekLineAlt or localization.weekLine + local xStart = math.floor(xCoord + width / 2 - unicode.len(weekText) / 2) + screen.drawText(math.floor(xCoord + width / 2 - unicode.len(text) / 2), yCoord, 0xFF0000, text) + screen.drawText(xStart, yCoord + 2, 0x888888, weekText) + if not curYearList or selectedYear ~= lastCountedYear then + curYearList = calculateYear(selectedYear, fstJanPos(selectedYear)) + end + + local counter, line = curYearList[monthPos].fstDayPos - 1, 4 + if isWeekAlt then + counter = counter + 1 == 7 and 0 or counter + 1 + end + for i=1, curYearList[monthPos].countOfDays do + local numColor = (isWeekAlt and (counter == 0 or counter == 6) and 0xFF0000) or (not isWeekAlt and counter > 4 and 0xFF0000) or 0x262626 + if selectedYear == currentYear and monthPos == currentMonth and i == currentDay then + screen.drawText(xStart + (counter * 4) - 1, yCoord + line - 1, 0xC3C3C3, '⢀▄▄⡀') + screen.drawRectangle(xStart + (counter * 4) - 1, yCoord + line, 4, 1, 0xC3C3C3, 0x000000, ' ') + screen.drawText(xStart + (counter * 4) - 1, yCoord + line + 1, 0xC3C3C3, '⠈▀▀⠁') + end + screen.drawText(xStart + (counter * 4), yCoord + line, numColor, (i < 10 and ' ' or '')..tostring(i)) + counter = counter == 6 and 0 or counter + 1 + if counter == 0 then line = line + 2 end + end +end + +local month = window:addChild(GUI.object(9, 9, 26, 15)) +month.draw = function(object) + renderMonth(object.x, object.y, object.width, selectedMonth) +end + + +local function prevYear() + selectedYear = selectedYear == 0 and selectedYear or selectedYear - 1 + workspace:draw() +end + +local function nextYear() + selectedYear = selectedYear == 9999 and selectedYear or selectedYear + 1 + workspace:draw() +end + +local arrowLeftBlack = makeIconButton(3, 4, window, "ArrowLeftBlack", prevYear) + +local arrowRightBlack = makeIconButton(39, 4, window, "ArrowRightBlack", nextYear) + + +local function prevMonth() + selectedMonth = selectedMonth - 1 + if selectedMonth < 1 then if selectedYear - 1 ~= -1 then selectedMonth = 12 prevYear() else selectedMonth = 1 end + else workspace:draw() end +end + +local function nextMonth() + selectedMonth = selectedMonth + 1 + if selectedMonth > 12 then if selectedYear + 1 ~= 10000 then selectedMonth = 1 nextYear() else selectedMonth = 12 end + else workspace:draw() end +end + + +local arrowLeft = makeIconButton(3, 15, window, "ArrowLeft", prevMonth) + +local arrowRight = makeIconButton(39, 15, window, "ArrowRight", nextMonth) + + +local weekType = menu:addItem(localization.startWeek..localization.sunday) +weekType.onTouch = function() + isWeekAlt = not isWeekAlt + weekType.text = isWeekAlt and localization.startWeek..localization.monday or localization.startWeek..localization.sunday +end + + +window.actionButtons.maximize.onTouch = function() + if not window.maximized then + year.localX, year.localY = 130, 3 + arrowLeftBlack.localX, arrowLeftBlack.localY = 129, 9 + arrowRightBlack.localX, arrowRightBlack.localY = 157, 9 + month.localX, month.localY = 3, 2 + comMonthMem = selectedMonth + selectedMonth = 1 + local mx, my = 35, 2 + for i=2, 12 do + local newMonth = window:addChild(GUI.object(mx, my, 26, 15)) + newMonth.draw = function(object) + renderMonth(object.x, object.y, object.width, i) + end + mx = mx + 32 == 131 and 3 or mx + 32 + if mx == 3 then my = my + 16 end + end + else + year.localX, year.localY = 8, 3 + arrowLeftBlack.localX, arrowLeftBlack.localY = 3, 4 + arrowRightBlack.localX, arrowRightBlack.localY = 39, 4 + month.localX, month.localY = 9, 9 + selectedMonth = comMonthMem + window:removeChildren(9) + end + window:maximize() + arrowLeft.hidden = not arrowLeft.hidden + arrowRight.hidden = not arrowRight.hidden +end + + +window.onResize = function(newWidth, newHeight) + window.backgroundPanel.width, window.backgroundPanel.height = newWidth, newHeight +end + +workspace:draw() diff --git a/Installer/Files.cfg b/Installer/Files.cfg index c5c5ded6..b4380ac0 100644 --- a/Installer/Files.cfg +++ b/Installer/Files.cfg @@ -182,6 +182,15 @@ "Applications/Settings.app/Localizations/Italian.lang", "Applications/Settings.app/Localizations/Japanese.lang", "Applications/Settings.app/Localizations/Dutch.lang", + -- Calendar + { path="Applications/Calendar.app/Main.lua", shortcut = true }, + "Applications/Calendar.app/Icon.pic", + "Applications/Calendar.app/Icons/ArrowLeft.pic", + "Applications/Calendar.app/Icons/ArrowRight.pic", + "Applications/Calendar.app/Icons/ArrowLeftBlack.pic", + "Applications/Calendar.app/Icons/ArrowRightBlack.pic", + "Applications/Calendar.app/Localizations/English.lang", + "Applications/Calendar.app/Localizations/Russian.lang", -- 3D Print { path="Applications/3D Print.app/Main.lua", id=859, shortcut = true }, "Applications/3D Print.app/Icon.pic",