Merge branch 'IgorTimofeev:master' into master

This commit is contained in:
Alexander 2021-09-12 22:57:28 +07:00 committed by GitHub
commit c051b742c5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
30 changed files with 805 additions and 74 deletions

View File

@ -241,7 +241,7 @@ local function checkImage(url, mneTolkoSprosit)
if data:sub(1, 4) == "OCIF" then
local encodingMethod = string.byte(data:sub(5, 5))
if encodingMethod == 6 or encodingMethod == 7 then
if encodingMethod >= 6 or encodingMethod <= 8 then
if string.byte(data:sub(6, 6)) == 8 and string.byte(data:sub(7, 7)) == 4 then
if mneTolkoSprosit then
handle:close()

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -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"
}

View File

@ -0,0 +1,21 @@
{
weekLine = "Пн Вт Ср Чт Пт Сб Вс",
weekLineAlt = "Вс Пн Вт Ср Чт Пт Сб",
months = {
"Январь",
"Февраль",
"Март",
"Апрель",
"Май",
"Июнь",
"Июль",
"Август",
"Сентябрь",
"Октябрь",
"Ноябрь",
"Декабрь",
},
startWeek = "Начинать неделю с ",
monday = "Понедельника",
sunday = "Воскресенья"
}

View File

@ -0,0 +1,257 @@
local GUI = require("GUI")
local system = require("System")
local bigLetters = require("BigLetters")
local screen = require("Screen")
local image = require("Image")
local paths = require("paths")
local fs = require("Filesystem")
---------------------------------------------------------------------------------------
local currentScriptPath = fs.path(system.getCurrentScript())
local localization = system.getLocalization(currentScriptPath .. "Localizations/")
local arrowLeftIcon = image.load(currentScriptPath .. "Icons/ArrowLeft.pic")
local arrowRightIcon = image.load(currentScriptPath .. "Icons/ArrowRight.pic")
local configPath = paths.user.applicationData .. "Calendar/Config.cfg"
local config = fs.exists(configPath) and fs.readTable(configPath) or {
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 workspace, window, menu = system.addWindow(GUI.filledWindow(1, 1, 42, 24, 0xFFFFFF))
window.actionButtons.localY = 1
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, right, onTouch)
local obj = GUI.image(x, y, right and arrowRightIcon or arrowLeftIcon)
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 = config.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 config.isWeekAlt then
counter = counter + 1 == 7 and 0 or counter + 1
end
for i=1, curYearList[monthPos].countOfDays do
local numColor = (config.isWeekAlt and (counter == 0 or counter == 6) and 0xFF0000) or (not config.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, 0xD2D2D2, '⢀▄▄⡀')
screen.drawRectangle(xStart + (counter * 4) - 1, yCoord + line, 4, 1, 0xD2D2D2, 0x000000, ' ')
screen.drawText(xStart + (counter * 4) - 1, yCoord + line + 1, 0xD2D2D2, '⠈▀▀⠁')
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, false, prevYear)
local arrowRightBlack = makeIconButton(39, 4, window, true, 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, false, prevMonth)
local arrowRight = makeIconButton(39, 15, window, true, nextMonth)
local weekType = menu:addItem(localization.startWeek..localization.sunday)
weekType.onTouch = function()
config.isWeekAlt = not config.isWeekAlt
weekType.text = config.isWeekAlt and localization.startWeek..localization.monday or localization.startWeek..localization.sunday
fs.writeTable(configPath, config)
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()

View File

@ -1,13 +1,18 @@
local text = require("Text")
local number = require("Number")
local filesystem = require("Filesystem")
local GUI = require("GUI")
local screen = require("Screen")
local system = require("System")
local paths = require("Paths")
------------------------------------------------------------------------------------------------------------------
local configPath = paths.user.applicationData .. "HEX Editor/Config.cfg"
local config = filesystem.exists(configPath) and filesystem.readTable(configPath) or {
recentPath = "/OS.lua"
}
local colors = {
background = 0xF0F0F0,
backgroundText = 0x555555,
@ -39,8 +44,13 @@ local scrollBar, titleTextBox
local workspace, window = system.addWindow(GUI.filledWindow(1, 1, 98, 25, colors.background))
window.maxWidth = window.width
window.showDesktopOnMaximize = true
window.backgroundPanel.localX, window.backgroundPanel.localY = 11, 5
window.backgroundPanel.width, window.backgroundPanel.height = window.width - 10, window.height - 4
window.backgroundPanel.width = window.width - 10
window.actionButtons.localY = 2
local function byteArrayToNumber(b)
local n = 0
@ -204,8 +214,8 @@ local function byteFieldEventHandler(workspace, object, e1, e2, e3, e4, e5)
end
end
local function newByteField(x, y, width, height, elementWidth, elementHeight, asChar)
local object = GUI.object(x, y, width, height)
local function newByteField(x, y, width, elementWidth, elementHeight, asChar)
local object = GUI.object(x, y, width, 1)
object.elementWidth = elementWidth
object.elementHeight = elementHeight
@ -221,20 +231,19 @@ end
window:addChild(GUI.panel(1, 1, window.width, 3, 0x3C3C3C)):moveToBack()
local byteField = window:addChild(newByteField(13, 6, 64, 20, 4, 2, false))
local charField = window:addChild(newByteField(byteField.localX + byteField.width + 3, 6, 16, 20, 1, 2, true))
local separator = window:addChild(GUI.object(byteField.localX + byteField.width, 5, 1, 21))
local byteField = window:addChild(newByteField(13, 6, 64, 4, 2, false))
local charField = window:addChild(newByteField(byteField.localX + byteField.width + 3, 6, 16, 1, 2, true))
local separator = window:addChild(GUI.object(byteField.localX + byteField.width, 5, 1, 1))
separator.draw = function(object)
for i = object.y, object.y + object.height - 1 do
screen.drawText(object.x, i, colors.separator, "")
end
end
window:addChild(GUI.panel(11, 4, window.width - 10, 1, colors.panel))
-- Vertical
local verticalCounter = window:addChild(GUI.object(1, 4, 10, window.height - 3))
local verticalCounter = window:addChild(GUI.object(1, 4, 10, 1))
verticalCounter.draw = function(object)
screen.drawRectangle(object.x, object.y, object.width, object.height, colors.panel, colors.panelText, " ")
@ -277,12 +286,11 @@ window:addChild(GUI.object(13, 4, 62, 1)).draw = function(object)
end
end
scrollBar = window:addChild(GUI.scrollBar(window.width, 5, 1, window.height - 4, 0xC3C3C3, 0x393939, 0, 1, 1, 160, 1, true))
scrollBar = window:addChild(GUI.scrollBar(window.width, 5, 1, 1, 0xC3C3C3, 0x393939, 0, 1, 1, 160, 1, true))
scrollBar.eventHandler = nil
titleTextBox = window:addChild(
GUI.textBox(
1, 1, math.floor(window.width * 0.35), 3,
GUI.textBox(1, 1, math.floor(window.width * 0.35), 3,
colors.titleBackground,
colors.titleText,
{
@ -293,6 +301,7 @@ titleTextBox = window:addChild(
1, 1, 0
)
)
titleTextBox.localX = math.floor(window.width / 2 - titleTextBox.width / 2)
titleTextBox:setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP)
titleTextBox.eventHandler = nil
@ -307,6 +316,7 @@ local function load(path)
if file then
bytes = {}
local byte
while true do
byte = file:readBytes(1)
@ -318,9 +328,11 @@ local function load(path)
end
file:close()
offset = 0
selection.from, selection.to = 1, 1
scrollBar.value, scrollBar.maximumValue = 0, #bytes
status()
else
GUI.alert("Failed to open file for reading: " .. tostring(reason))
@ -329,18 +341,26 @@ end
openFileButton.onTouch = function()
local filesystemDialog = GUI.addFilesystemDialog(workspace, true, 50, math.floor(workspace.height * 0.8), "Open", "Cancel", "File name", "/")
filesystemDialog:setMode(GUI.IO_MODE_OPEN, GUI.IO_MODE_FILE)
filesystemDialog:show()
filesystemDialog.onSubmit = function(path)
load(path)
config.recentPath = path
filesystem.writeTable(configPath, config)
workspace:draw()
end
end
saveFileButton.onTouch = function()
local filesystemDialog = GUI.addFilesystemDialog(workspace, true, 50, math.floor(workspace.height * 0.8), "Save", "Cancel", "File name", "/")
filesystemDialog:setMode(GUI.IO_MODE_SAVE, GUI.IO_MODE_FILE)
filesystemDialog:show()
filesystemDialog.onSubmit = function(path)
local file = filesystem.open(path, "wb")
if file then
@ -354,31 +374,21 @@ saveFileButton.onTouch = function()
end
end
window.actionButtons.localY = 2
window.actionButtons.maximize.onTouch = function()
window.height = window.parent.height
byteField.height = window.height - 6
window.onResize = function(width, height)
byteField.height = height - 6
charField.height = byteField.height
scrollBar.height = byteField.height
window.backgroundPanel.height = window.height - 4
window.backgroundPanel.height = height - 4
verticalCounter.height = window.backgroundPanel.height + 1
separator.height = byteField.height + 2
window.localY = 1
workspace:draw()
end
------------------------------------------------------------------------------------------------------------------
load("/OS.lua")
window.onResize(window.width, window.height)
local args, options = system.parseArguments(...)
load(((options.o or options.open) and args[1] and filesystem.exists(args[1])) and args[1] or config.recentPath)
workspace:draw()

View File

@ -533,8 +533,10 @@ end
local function openFile(path)
local file, reason = filesystem.open(path, "r")
if file then
newFile()
leftTreeView.selectedItem = path
codeView.hidden = true
@ -548,11 +550,12 @@ local function openFile(path)
local counter, currentSize, totalSize = 1, 0, filesystem.size(path)
for line in file:lines() do
counter, currentSize = counter + 1, currentSize + #line + 1
line = optimizeString(line)
table.insert(lines, line)
codeView.maximumLineLength = math.max(codeView.maximumLineLength, unicode.len(line))
counter, currentSize = counter + 1, currentSize + #line
if counter % config.linesToShowOpenProgress == 0 then
progressBar.value = math.floor(currentSize / totalSize * 100)
computer.pullSignal(0)
@ -562,15 +565,15 @@ local function openFile(path)
file:close()
if #lines > 1 then
table.remove(lines, 1)
end
if counter > config.linesToShowOpenProgress then
progressBar.value = 100
workspace:draw()
end
if #lines > 1 then
table.remove(lines, 1)
end
codeView.hidden = false
container:remove()
updateAutocompleteDatabaseFromAllLines()

View File

@ -85,5 +85,7 @@
brightness = "Brightness: ",
filterColor = "Filter color",
transparency = "Transparency: ",
force = "Force"
force = "Force",
rasterizePolygon = "Rasterize polygon",
polygonEdges = "Number of polygon edges:"
}

View File

@ -85,5 +85,7 @@
brightness = "Яркость: ",
filterColor = "Цвет фильтра",
transparency = "Прозрачность: ",
force = "Сила: "
force = "Сила: ",
rasterizePolygon = "Растеризировать полигон",
polygonEdges = "Количество граней полигона:"
}

View File

@ -315,7 +315,7 @@ end
local function save(path)
if filesystem.extension(path) == ".pic" then
local result, reason = image.save(path, window.image.data, 7)
local result, reason = image.save(path, window.image.data, 8)
if result then
setSavePath(path)

View File

@ -19,6 +19,7 @@ local fillButton = window.newButton1(locale.fill)
local outlineButton = window.newButton1(locale.outline)
local rasterizeLineButton = window.newButton1(locale.rasterizeLine)
local rasterizeEllipseButton = window.newButton1(locale.rasterizeEllipse)
local rasterizePolygonButton = window.newButton1(locale.rasterizePolygon)
local clearButton = window.newButton2(locale.clear)
local cropButton = window.newButton2(locale.crop)
@ -101,6 +102,39 @@ tool.onSelection = function()
workspace:draw()
end
window.currentToolLayout:addChild(rasterizePolygonButton).onTouch = function()
local container = GUI.addBackgroundContainer(workspace, true, true, locale.polygonEdges)
container.panel.eventHandler = nil
local edgesSelector = container.layout:addChild(GUI.comboBox(1, 1, 30, 3, 0xEEEEEE, 0x2D2D2D, 0xCCCCCC, 0x888888))
for i = 3, 10 do
edgesSelector:addItem(i)
end
container.layout:addChild(GUI.button(1, 1, 30, 3, 0xFFFFFF, 0x555555, 0x880000, 0xFFFFFF, locale.ok)).onTouch = function()
screen.rasterizePolygon(
touchX - window.image.x + 1,
touchY - window.image.y + 1,
dragX - window.image.x + 1,
dragY - window.image.y + 1,
edgesSelector.selectedItem + 2,
function(x, y)
if x <= window.image.data[1] and y <= window.image.data[2] and x > 0 and y > 0 then
image.set(window.image.data, x, y, window.primaryColorSelector.color, 0x0, 0, " ")
end
end
)
container:remove()
end
container.layout:addChild(GUI.button(1, 1, 30, 3, 0xFFFFFF, 0x555555, 0x880000, 0xFFFFFF, locale.cancel)).onTouch = function()
container:remove()
end
workspace:draw()
end
window.currentToolLayout:addChild(clearButton).onTouch = function()
for j = selector.y, selector.y + selector.height - 1 do

View File

@ -0,0 +1,21 @@
local filesystem = require("Filesystem")
local GUI = require("GUI")
local paths = require("Paths")
local system = require("System")
local workspace, icon, menu = select(1, ...), select(2, ...), select(3, ...)
local localization = system.getSystemLocalization()
menu:addItem(localization.setAsWallpaper).onTouch = function()
local userSettings = system.getUserSettings()
userSettings.interfaceWallpaperPath = icon.path
userSettings.interfaceWallpaperEnabled = true
system.updateWallpaper()
workspace:draw()
system.saveUserSettings()
end
system.addUploadToPastebinMenuItem(menu, icon.path)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,12 @@
{
noPictures = "There is no pictures.",
slideShow = "Slideshow",
delay = "Delay: ",
seconds = " seconds",
fullScreen = "Full screen",
setWallpaper = "Do you want to set this picture as wallpaper?",
yes = "Yes",
no = "No",
start = "Start",
cancel = "Cancel"
}

View File

@ -0,0 +1,12 @@
{
noPictures = "В этой папке отутствуют изображения.",
slideShow = "Слайдшоу",
delay = "Задержка: ",
seconds = " секунд(ы)",
fullScreen = "На полный экран",
setWallpaper = "Вы хотите установить это изображение в качестве обоев?",
yes = "Да",
no = "Нет",
start = "Начать",
cancel = "Отмена"
}

View File

@ -0,0 +1,236 @@
local GUI = require("GUI")
local system = require("System")
local fs = require("Filesystem")
local image = require("Image")
local text = require("Text")
local screen = require("Screen")
local paths = require("Paths")
local localization = system.getCurrentScriptLocalization()
local args, options = system.parseArguments(...)
local iconsPath = fs.path(system.getCurrentScript()) .. "Icons/"
local currentDir, files = ((options.o or options.open) and args[1] and fs.exists(args[1])) and fs.path(args[1]) or paths.system.pictures
local fileIndex = 1
local loadedImage, title
--------------------------------------------------------------------------------
local workspace, window, menu = system.addWindow(GUI.filledWindow(1, 1, 80, 25, 0x1E1E1E))
local imageObject = window:addChild(GUI.object(1, 1, 1, 1))
imageObject.draw = function()
local halfX, halfY = imageObject.x + imageObject.width / 2, imageObject.y + imageObject.height / 2
if loadedImage then
screen.drawImage(
math.floor(halfX - loadedImage[1] / 2),
math.floor(halfY - loadedImage[2] / 2),
loadedImage
)
if title then
screen.drawText(math.floor(halfX - unicode.len(title) / 2), imageObject.y + 1, 0xFFFFFF, title, 0.5)
end
elseif #files == 0 then
screen.drawText(math.floor(halfX - unicode.len(localization.noPictures) / 2), math.floor(halfY), 0x5A5A5A, localization.noPictures)
end
end
window.actionButtons:moveToFront()
local panel = window:addChild(GUI.panel(1, 1, 1, 6, 0x000000, 0.5))
local panelContainer = window:addChild(GUI.container(1, 1, 1, panel.height))
local slideShowDelay, slideShowDeadline
local function updateTitle()
if panel.hidden then
title = nil
else
title = fs.name(files[fileIndex])
end
end
local function setUIHidden(state)
panel.hidden = state
panelContainer.hidden = state
window.actionButtons.hidden = state
updateTitle()
end
local function updateSlideshowDeadline()
slideShowDeadline = computer.uptime() + slideShowDelay
end
local function loadImage()
local result, reason = image.load(files[fileIndex])
if result then
loadedImage = result
updateTitle()
else
GUI.alert(reason)
window:remove()
end
workspace:draw()
end
local function loadIncremented(value)
fileIndex = fileIndex + value
if fileIndex > #files then
fileIndex = 1
elseif fileIndex < 1 then
fileIndex = #files
end
loadImage()
end
local function addButton(imageName, onTouch)
-- Spacing
if #panelContainer.children > 0 then
panelContainer.width = panelContainer.width + 5
end
local i = GUI.image(panelContainer.width, 2, image.load(iconsPath .. imageName .. ".pic"))
panelContainer:addChild(i).eventHandler = function(_, _, e)
if e == "touch" then
onTouch()
end
end
panelContainer.width = panelContainer.width + i.width
end
addButton("ArrowLeft", function()
loadIncremented(-1)
end)
addButton("Play", function()
local container = GUI.addBackgroundContainer(workspace, true, true, localization.slideShow)
container.panel.eventHandler = nil
container.layout:setSpacing(1, 1, 2)
local delay = container.layout:addChild(GUI.slider(1, 1, 50, 0x66DB80, 0x0, 0xFFFFFF, 0xFFFFFF, 3, 30, 0, true, localization.delay, localization.seconds))
delay.roundValues = true
local buttonsLay = container.layout:addChild(GUI.layout(1, 1, 30, 7, 1, 1))
buttonsLay:addChild(GUI.button(1, 1, 30, 3, 0xFFFFFF, 0x555555, 0x880000, 0xFFFFFF, localization.start)).onTouch = function()
setUIHidden(true)
if not window.maximized then
window:maximize()
end
slideShowDelay = delay.value
updateSlideshowDeadline()
container:remove()
end
buttonsLay:addChild(GUI.button(1, 1, 30, 3, 0xFFFFFF, 0x555555, 0x880000, 0xFFFFFF, localization.cancel)).onTouch = function()
container:remove()
end
workspace:draw()
end)
-- Arrow right
addButton("ArrowRight", function()
loadIncremented(1)
end)
-- Set wallpaper
addButton("SetWallpaper", function()
local container = GUI.addBackgroundContainer(workspace, true, true, localization.setWallpaper)
container.panel.eventHandler = nil
local buttLay = container.layout:addChild(GUI.layout(1, 1, 24, 6, 2, 1))
buttLay:addChild(GUI.button(1, 1, 10, 3, 0xFFFFFF, 0x555555, 0x880000, 0xFFFFFF, localization.yes)).onTouch = function()
local sets = system.getUserSettings()
sets.interfaceWallpaperPath = files[fileIndex]
system.saveUserSettings()
system.updateWallpaper()
container:remove()
end
local cancel = buttLay:addChild(GUI.button(1, 1, 10, 3, 0xFFFFFF, 0x555555, 0x880000, 0xFFFFFF, localization.no))
cancel.onTouch = function()
container:remove()
end
buttLay:setPosition(2, 1, cancel)
end)
window.onResize = function(newWidth, newHeight)
window.backgroundPanel.width, window.backgroundPanel.height = newWidth, newHeight
imageObject.width, imageObject.height = newWidth, newHeight
panel.width, panel.localY = newWidth, newHeight - 5
panelContainer.localX, panelContainer.localY = math.floor(newWidth / 2 - panelContainer.width / 2), panel.localY
end
local overrideWindowEventHandler = window.eventHandler
window.eventHandler = function(workspace, window, e1, ...)
if e1 == "double_touch" then
setUIHidden(not panel.hidden)
workspace:draw()
elseif e1 == "touch" or e1 == "key_down" then
if slideShowDeadline then
setUIHidden(false)
slideShowDelay, slideShowDeadline = nil, nil
workspace:draw()
end
else
if slideShowDelay and computer.uptime() > slideShowDeadline then
loadIncremented(1)
workspace:draw()
updateSlideshowDeadline()
end
end
overrideWindowEventHandler(workspace, window, e1, ...)
end
--------------------------------------------------------------------------------
window.onResize(window.width, window.height)
files = fs.list(currentDir)
local i, extension = 1
while i <= #files do
extension = fs.extension(files[i])
if extension and extension:lower() == ".pic" then
files[i] = currentDir .. files[i]
if args and args[1] == files[i] then
fileIndex = i
end
i = i + 1
else
table.remove(files, i)
end
end
if #files == 0 then
panel.hidden = true
panelContainer.hidden = true
else
loadImage()
end
workspace:draw()

View File

@ -134,6 +134,18 @@
"Applications/Picture Edit.app/Localizations/English.lang",
"Applications/Picture Edit.app/Localizations/Russian.lang",
"Applications/Picture Edit.app/Extensions/.pic/Icon.pic",
"Applications/Picture Edit.app/Extensions/.pic/Context menu.lua",
-- Picture View
{ path="Applications/Picture View.app/Main.lua" },
"Applications/Picture View.app/Icon.pic",
"Applications/Picture View.app/Icons/ArrowLeft.pic",
"Applications/Picture View.app/Icons/ArrowRight.pic",
"Applications/Picture View.app/Icons/Play.pic",
"Applications/Picture View.app/Icons/SetWallpaper.pic",
"Applications/Picture View.app/Localizations/English.lang",
"Applications/Picture View.app/Localizations/Russian.lang",
"Applications/Picture View.app/Extensions/.pic/Icon.pic",
"Applications/Picture View.app/Extensions/.pic/Context menu.lua",
-- Finder
{ path="Applications/Finder.app/Main.lua", id=175 },
"Applications/Finder.app/Icon.pic",
@ -272,6 +284,13 @@
"Applications/VK.app/Styles/Default.lua",
"Applications/VK.app/Styles/Bright.lua",
"Applications/VK.app/Styles/Dark.lua",
-- 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/Localizations/English.lang",
"Applications/Calendar.app/Localizations/Russian.lang",
},
wallpapers = {
"Pictures/AhsokaTano.pic",

View File

@ -23,6 +23,7 @@ if computer.getArchitecture and computer.getArchitecture() == "Lua 5.3" then
function(color1, color2, transparency)
local invertedTransparency = 1 - transparency
return
((color2 >> 16) * invertedTransparency + (color1 >> 16) * transparency) // 1 << 16 |
((color2 >> 8 & 0xFF) * invertedTransparency + (color1 >> 8 & 0xFF) * transparency) // 1 << 8 |
@ -31,6 +32,7 @@ if computer.getArchitecture and computer.getArchitecture() == "Lua 5.3" then
function(color1, color2, position)
local r1, g1, b1 = color1 >> 16, color1 >> 8 & 0xFF, color1 & 0xFF
return
(r1 + ((color2 >> 16) - r1) * position) // 1 << 16 |
(g1 + ((color2 >> 8 & 0xFF) - g1) * position) // 1 << 8 |
@ -49,6 +51,7 @@ if computer.getArchitecture and computer.getArchitecture() == "Lua 5.3" then
paletteR, paletteG, paletteB = paletteColor >> 16, paletteColor >> 8 & 0xFF, paletteColor & 0xFF
delta = (paletteR - r) ^ 2 + (paletteG - g) ^ 2 + (paletteB - b) ^ 2
if delta < closestDelta then
closestDelta, closestIndex = delta, i
end
@ -66,6 +69,7 @@ else
function(integerColor)
local r = integerColor / 65536
r = r - r % 1
local g = (integerColor - r * 65536) / 256
g = g - g % 1
@ -81,11 +85,13 @@ else
local r1 = color1 / 65536
r1 = r1 - r1 % 1
local g1 = (color1 - r1 * 65536) / 256
g1 = g1 - g1 % 1
local r2 = color2 / 65536
r2 = r2 - r2 % 1
local g2 = (color2 - r2 * 65536) / 256
g2 = g2 - g2 % 1
@ -103,12 +109,15 @@ else
function(color1, color2, position)
local r1 = color1 / 65536
r1 = r1 - r1 % 1
local g1 = (color1 - r1 * 65536) / 256
g1 = g1 - g1 % 1
local b1 = color1 - r1 * 65536 - g1 * 256
local r2 = color2 / 65536
r2 = r2 - r2 % 1
local g2 = (color2 - r2 * 65536) / 256
g2 = g2 - g2 % 1
@ -128,12 +137,15 @@ else
local r = color24Bit / 65536
r = r - r % 1
local g = (color24Bit - r * 65536) / 256
g = g - g % 1
local b = color24Bit - r * 65536 - g * 256
for index = 1, #palette do
paletteColor = palette[index]
if color24Bit == paletteColor then
return index - 1
else
@ -144,6 +156,7 @@ else
paletteB = paletteColor - paletteR * 65536 - paletteG * 256
delta = (paletteR - r) ^ 2 + (paletteG - g) ^ 2 + (paletteB - b) ^ 2
if delta < closestDelta then
closestDelta, closestIndex = delta, index
end

View File

@ -1242,19 +1242,19 @@ end
--------------------------------------------------------------------------------
local function getAxisValue(number, postfix, roundValues)
local function getAxisValue(num, postfix, roundValues)
if roundValues then
return math.floor(number) .. postfix
return math.floor(num) .. postfix
else
local integer, fractional = math.modf(number)
local integer, fractional = math.modf(num)
local firstPart, secondPart = "", ""
if math.abs(integer) >= 1000 then
return number.shorten(integer, 2) .. postfix
else
if math.abs(fractional) > 0 then
return string.format("%.2f", number) .. postfix
return string.format("%.2f", num) .. postfix
else
return number .. postfix
return num .. postfix
end
end
end
@ -3524,20 +3524,23 @@ end
local function textUpdate(object)
object.width = unicode.len(object.text)
return object
end
local function textDraw(object)
object:update()
screen.drawText(object.x, object.y, object.color, object.text)
screen.drawText(object.x, object.y, object.color, object.text, object.transparency)
return object
end
function GUI.text(x, y, color, text)
function GUI.text(x, y, color, text, transparency)
local object = GUI.object(x, y, 1, 1)
object.text = text
object.color = color
object.transparency = transparency
object.update = textUpdate
object.draw = textDraw
object:update()
@ -4286,6 +4289,7 @@ local function windowCheck(window, x, y)
return true
elseif child.children then
local result = windowCheck(child, x, y)
if result == true then
return true
elseif result == false then
@ -4310,6 +4314,7 @@ local function windowEventHandler(workspace, window, e1, e2, e3, e4, ...)
end
elseif e1 == "drag" and window.lastTouchX and not windowCheck(window, e3, e4) then
local xOffset, yOffset = e3 - window.lastTouchX, e4 - window.lastTouchY
if xOffset ~= 0 or yOffset ~= 0 then
window.localX, window.localY = window.localX + xOffset, window.localY + yOffset
window.lastTouchX, window.lastTouchY = e3, e4
@ -4341,10 +4346,22 @@ function GUI.windowMaximize(window, animationDisabled)
if window.maximized then
toX, toY, toWidth, toHeight = window.oldGeometryX, window.oldGeometryY, window.oldGeometryWidth, window.oldGeometryHeight
window.oldGeometryX, window.oldGeometryY, window.oldGeometryWidth, window.oldGeometryHeight = nil, nil, nil, nil
window.maximized = nil
else
toX, toY, toWidth, toHeight = 1, 1, window.parent.width, window.parent.height
toWidth, toHeight = window.parent.width, window.parent.height
if window.maxWidth then
toWidth = math.min(toWidth, window.maxWidth)
end
if window.maxHeight then
toHeight = math.min(toHeight, window.maxHeight)
end
toX, toY = math.floor(1 + window.parent.width / 2 - toWidth / 2), math.floor(1 + window.parent.height / 2 - toHeight / 2)
window.oldGeometryX, window.oldGeometryY, window.oldGeometryWidth, window.oldGeometryHeight = window.localX, window.localY, window.width, window.height
window.maximized = true
end

View File

@ -78,32 +78,32 @@ encodingMethodsLoad[5] = function(file, picture)
end
end
local function loadOCIF67(file, picture, mode)
picture[1] = file:readBytes(1)
picture[2] = file:readBytes(1)
local function loadOCIF678(file, picture, is7, is8)
picture[1] = file:readBytes(1) + is8
picture[2] = file:readBytes(1) + is8
local currentAlpha, currentSymbol, currentBackground, currentForeground, currentY
for alpha = 1, file:readBytes(1) + mode do
for alpha = 1, file:readBytes(1) + is7 do
currentAlpha = file:readBytes(1) / 255
for symbol = 1, file:readBytes(2) + mode do
for symbol = 1, file:readBytes(2) + is7 do
currentSymbol = file:readUnicodeChar()
for background = 1, file:readBytes(1) + mode do
for background = 1, file:readBytes(1) + is7 do
currentBackground = color.to24Bit(file:readBytes(1))
for foreground = 1, file:readBytes(1) + mode do
for foreground = 1, file:readBytes(1) + is7 do
currentForeground = color.to24Bit(file:readBytes(1))
for y = 1, file:readBytes(1) + mode do
for y = 1, file:readBytes(1) + is7 do
currentY = file:readBytes(1)
for x = 1, file:readBytes(1) + mode do
for x = 1, file:readBytes(1) + is7 do
image.set(
picture,
file:readBytes(1),
currentY,
file:readBytes(1) + is8,
currentY + is8,
currentBackground,
currentForeground,
currentAlpha,
@ -117,9 +117,9 @@ local function loadOCIF67(file, picture, mode)
end
end
local function saveOCIF67(file, picture, mode)
local function saveOCIF678(file, picture, is7, is8)
local function getGroupSize(t)
local size = mode == 1 and -1 or 0
local size = -is7
for key in pairs(t) do
size = size + 1
@ -133,8 +133,8 @@ local function saveOCIF67(file, picture, mode)
-- Writing 1 byte per image width and height
file:writeBytes(
picture[1],
picture[2]
picture[1] - is8,
picture[2] - is8
)
-- Writing 1 byte for alphas array size
@ -178,13 +178,14 @@ local function saveOCIF67(file, picture, mode)
for y in pairs(groupedPicture[alpha][symbol][background][foreground]) do
file:writeBytes(
-- Writing 1 byte for current y value
y,
y - is8,
-- Writing 1 byte for x array size
#groupedPicture[alpha][symbol][background][foreground][y] - mode
#groupedPicture[alpha][symbol][background][foreground][y] - is7
)
for x = 1, #groupedPicture[alpha][symbol][background][foreground][y] do
file:writeBytes(groupedPicture[alpha][symbol][background][foreground][y][x])
-- Wrting 1 byte for current x value
file:writeBytes(groupedPicture[alpha][symbol][background][foreground][y][x] - is8)
end
end
end
@ -194,19 +195,27 @@ local function saveOCIF67(file, picture, mode)
end
encodingMethodsSave[6] = function(file, picture)
saveOCIF67(file, picture, 0)
saveOCIF678(file, picture, 0, 0)
end
encodingMethodsLoad[6] = function(file, picture)
loadOCIF67(file, picture, 0)
loadOCIF678(file, picture, 0, 0)
end
encodingMethodsSave[7] = function(file, picture)
saveOCIF67(file, picture, 1)
saveOCIF678(file, picture, 1, 0)
end
encodingMethodsLoad[7] = function(file, picture)
loadOCIF67(file, picture, 1)
loadOCIF678(file, picture, 1, 0)
end
encodingMethodsSave[8] = function(file, picture)
saveOCIF678(file, picture, 1, 1)
end
encodingMethodsLoad[8] = function(file, picture)
loadOCIF678(file, picture, 1, 1)
end
--------------------------------------------------------------------------------

View File

@ -23,6 +23,7 @@ paths.system.applicationPictureEdit = paths.system.applications .. "Picture Edit
paths.system.applicationSettings = paths.system.applications .. "Settings.app/Main.lua"
paths.system.applicationPrint3D = paths.system.applications .. "3D Print.app/Main.lua"
paths.system.applicationConsole = paths.system.applications .. "Console.app/Main.lua"
paths.system.applicationPictureView = paths.system.applications .. "Picture View.app/Main.lua"
--------------------------------------------------------------------------------

View File

@ -426,6 +426,38 @@ local function rasterizeEllipse(centerX, centerY, radiusX, radiusY, method)
end
end
local function rasterizePolygon(centerX, centerY, startX, startY, countOfEdges, method)
local degreeStep = 360 / countOfEdges
local deltaX, deltaY = startX - centerX, startY - centerY
local radius = math.sqrt(deltaX ^ 2 + deltaY ^ 2)
local halfRadius = radius / 2
local startDegree = math.deg(math.asin(deltaX / radius))
local function round(num)
if num >= 0 then
return math.floor(num + 0.5)
else
return math.ceil(num - 0.5)
end
end
local function calculatePosition(degree)
local radDegree = math.rad(degree)
local deltaX2 = math.sin(radDegree) * radius
local deltaY2 = math.cos(radDegree) * radius
return round(centerX + deltaX2), round(centerY + (deltaY >= 0 and deltaY2 or -deltaY2))
end
local xOld, yOld, xNew, yNew = calculatePosition(startDegree)
for degree = (startDegree + degreeStep - 1), (startDegree + 360), degreeStep do
xNew, yNew = calculatePosition(degree)
rasterizeLine(xOld, yOld, xNew, yNew, method)
xOld, yOld = xNew, yNew
end
end
local function drawLine(x1, y1, x2, y2, background, foreground, symbol)
rasterizeLine(x1, y1, x2, y2, function(x, y)
set(x, y, background, foreground, symbol)
@ -438,6 +470,12 @@ local function drawEllipse(centerX, centerY, radiusX, radiusY, background, foreg
end)
end
local function drawPolygon(centerX, centerY, radiusX, radiusY, background, foreground, countOfEdges, symbol)
rasterizePolygon(centerX, centerY, radiusX, radiusY, countOfEdges, function(x, y)
set(x, y, background, foreground, symbol)
end)
end
local function drawText(x, y, textColor, data, transparency)
if y >= drawLimitY1 and y <= drawLimitY2 then
local charIndex, screenIndex = 1, bufferWidth * (y - 1) + x
@ -776,6 +814,7 @@ return {
paste = paste,
rasterizeLine = rasterizeLine,
rasterizeEllipse = rasterizeEllipse,
rasterizePolygon = rasterizePolygon,
semiPixelRawSet = semiPixelRawSet,
semiPixelSet = semiPixelSet,
update = update,
@ -783,6 +822,7 @@ return {
drawRectangle = drawRectangle,
drawLine = drawLine,
drawEllipse = drawEllipse,
drawPolygon = drawPolygon,
drawText = drawText,
drawImage = drawImage,
drawFrame = drawFrame,

View File

@ -131,7 +131,7 @@ function system.getDefaultUserSettings()
[".cfg"] = filesystem.path(paths.system.applicationMineCodeIDE),
[".txt"] = filesystem.path(paths.system.applicationMineCodeIDE),
[".lang"] = filesystem.path(paths.system.applicationMineCodeIDE),
[".pic"] = filesystem.path(paths.system.applicationPictureEdit),
[".pic"] = filesystem.path(paths.system.applicationPictureView),
[".3dm"] = paths.system.applications .. "3D Print.app/"
},
}
@ -1361,10 +1361,11 @@ local function iconFieldBackgroundClick(iconField, e1, e2, e3, e4, e5, ...)
if e1 == "touch" then
if #container.input.text > 0 then
local path = iconField.path .. container.input.text .. ".app/"
if checkFileToExists(container, path) then
system.copy({ paths.system.applicationSample }, iconField.path)
filesystem.rename(iconField.path .. filesystem.name(paths.system.applicationSample), path)
system.copy({ paths.system.applicationSample }, paths.system.temporary)
filesystem.rename(paths.system.temporary .. filesystem.name(paths.system.applicationSample), path)
container:remove()
iconFieldSaveIconPosition(iconField, container.input.text .. ".app/", e3, e4)
computer.pushSignal("system", "updateFileList")