diff --git a/Applications/App Market.app/Main.lua b/Applications/App Market.app/Main.lua index 19caa8a0..4e3ae519 100644 --- a/Applications/App Market.app/Main.lua +++ b/Applications/App Market.app/Main.lua @@ -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() diff --git a/Applications/Calendar.app/Icon.pic b/Applications/Calendar.app/Icon.pic new file mode 100644 index 00000000..d50467ae 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..ce0cfdf4 Binary files /dev/null and b/Applications/Calendar.app/Icons/ArrowLeft.pic differ diff --git a/Applications/Calendar.app/Icons/ArrowRight.pic b/Applications/Calendar.app/Icons/ArrowRight.pic new file mode 100644 index 00000000..20aaac1f Binary files /dev/null and b/Applications/Calendar.app/Icons/ArrowRight.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..5527998a --- /dev/null +++ b/Applications/Calendar.app/Main.lua @@ -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() diff --git a/Applications/HEX.app/Main.lua b/Applications/HEX.app/Main.lua index f7a1810c..bb5ddd4d 100755 --- a/Applications/HEX.app/Main.lua +++ b/Applications/HEX.app/Main.lua @@ -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() - - - - - - - - - diff --git a/Applications/MineCode IDE.app/Main.lua b/Applications/MineCode IDE.app/Main.lua index 18982634..08c49bfa 100755 --- a/Applications/MineCode IDE.app/Main.lua +++ b/Applications/MineCode IDE.app/Main.lua @@ -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() diff --git a/Applications/Picture Edit.app/Localizations/English.lang b/Applications/Picture Edit.app/Localizations/English.lang index 0056dfc0..ebe33c98 100644 --- a/Applications/Picture Edit.app/Localizations/English.lang +++ b/Applications/Picture Edit.app/Localizations/English.lang @@ -85,5 +85,7 @@ brightness = "Brightness: ", filterColor = "Filter color", transparency = "Transparency: ", - force = "Force" + force = "Force", + rasterizePolygon = "Rasterize polygon", + polygonEdges = "Number of polygon edges:" } diff --git a/Applications/Picture Edit.app/Localizations/Russian.lang b/Applications/Picture Edit.app/Localizations/Russian.lang index 52a4f90a..c2d43776 100644 --- a/Applications/Picture Edit.app/Localizations/Russian.lang +++ b/Applications/Picture Edit.app/Localizations/Russian.lang @@ -85,5 +85,7 @@ brightness = "Яркость: ", filterColor = "Цвет фильтра", transparency = "Прозрачность: ", - force = "Сила: " + force = "Сила: ", + rasterizePolygon = "Растеризировать полигон", + polygonEdges = "Количество граней полигона:" } diff --git a/Applications/Picture Edit.app/Main.lua b/Applications/Picture Edit.app/Main.lua index 8c25b5f2..c1df5d78 100644 --- a/Applications/Picture Edit.app/Main.lua +++ b/Applications/Picture Edit.app/Main.lua @@ -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) diff --git a/Applications/Picture Edit.app/Tools/1.lua b/Applications/Picture Edit.app/Tools/1.lua index dc16522d..984701bc 100644 --- a/Applications/Picture Edit.app/Tools/1.lua +++ b/Applications/Picture Edit.app/Tools/1.lua @@ -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 diff --git a/Applications/Picture View.app/Extensions/.pic/Context menu.lua b/Applications/Picture View.app/Extensions/.pic/Context menu.lua new file mode 100644 index 00000000..d1ebe992 --- /dev/null +++ b/Applications/Picture View.app/Extensions/.pic/Context menu.lua @@ -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) diff --git a/Applications/Picture View.app/Extensions/.pic/Icon.pic b/Applications/Picture View.app/Extensions/.pic/Icon.pic new file mode 100644 index 00000000..269a6401 Binary files /dev/null and b/Applications/Picture View.app/Extensions/.pic/Icon.pic differ diff --git a/Applications/Picture View.app/Icon.pic b/Applications/Picture View.app/Icon.pic new file mode 100644 index 00000000..0534eba5 Binary files /dev/null and b/Applications/Picture View.app/Icon.pic differ diff --git a/Applications/Picture View.app/Icons/ArrowLeft.pic b/Applications/Picture View.app/Icons/ArrowLeft.pic new file mode 100644 index 00000000..849bf011 Binary files /dev/null and b/Applications/Picture View.app/Icons/ArrowLeft.pic differ diff --git a/Applications/Picture View.app/Icons/ArrowRight.pic b/Applications/Picture View.app/Icons/ArrowRight.pic new file mode 100644 index 00000000..ad5bf95c Binary files /dev/null and b/Applications/Picture View.app/Icons/ArrowRight.pic differ diff --git a/Applications/Picture View.app/Icons/Play.pic b/Applications/Picture View.app/Icons/Play.pic new file mode 100644 index 00000000..1f2d432a Binary files /dev/null and b/Applications/Picture View.app/Icons/Play.pic differ diff --git a/Applications/Picture View.app/Icons/SetWallpaper.pic b/Applications/Picture View.app/Icons/SetWallpaper.pic new file mode 100644 index 00000000..1e92c8d8 Binary files /dev/null and b/Applications/Picture View.app/Icons/SetWallpaper.pic differ diff --git a/Applications/Picture View.app/Localizations/English.lang b/Applications/Picture View.app/Localizations/English.lang new file mode 100644 index 00000000..da4b28ae --- /dev/null +++ b/Applications/Picture View.app/Localizations/English.lang @@ -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" +} diff --git a/Applications/Picture View.app/Localizations/Russian.lang b/Applications/Picture View.app/Localizations/Russian.lang new file mode 100644 index 00000000..c57b3872 --- /dev/null +++ b/Applications/Picture View.app/Localizations/Russian.lang @@ -0,0 +1,12 @@ +{ + noPictures = "В этой папке отутствуют изображения.", + slideShow = "Слайдшоу", + delay = "Задержка: ", + seconds = " секунд(ы)", + fullScreen = "На полный экран", + setWallpaper = "Вы хотите установить это изображение в качестве обоев?", + yes = "Да", + no = "Нет", + start = "Начать", + cancel = "Отмена" +} diff --git a/Applications/Picture View.app/Main.lua b/Applications/Picture View.app/Main.lua new file mode 100644 index 00000000..2d58d7ae --- /dev/null +++ b/Applications/Picture View.app/Main.lua @@ -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() diff --git a/Installer/Files.cfg b/Installer/Files.cfg index 4425d39a..102997ab 100644 --- a/Installer/Files.cfg +++ b/Installer/Files.cfg @@ -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", diff --git a/Libraries/Color.lua b/Libraries/Color.lua index 31c02008..9f38da65 100755 --- a/Libraries/Color.lua +++ b/Libraries/Color.lua @@ -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 diff --git a/Libraries/GUI.lua b/Libraries/GUI.lua index 6ad1b409..459b52db 100755 --- a/Libraries/GUI.lua +++ b/Libraries/GUI.lua @@ -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 diff --git a/Libraries/Image.lua b/Libraries/Image.lua index 9b84094f..2a1215ac 100755 --- a/Libraries/Image.lua +++ b/Libraries/Image.lua @@ -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 -------------------------------------------------------------------------------- diff --git a/Libraries/Paths.lua b/Libraries/Paths.lua index 94c20776..fe77ca04 100755 --- a/Libraries/Paths.lua +++ b/Libraries/Paths.lua @@ -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" -------------------------------------------------------------------------------- diff --git a/Libraries/Screen.lua b/Libraries/Screen.lua index 0b2b602a..ec0846f4 100755 --- a/Libraries/Screen.lua +++ b/Libraries/Screen.lua @@ -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, diff --git a/Libraries/System.lua b/Libraries/System.lua index cd8ba73e..7ddf42f3 100755 --- a/Libraries/System.lua +++ b/Libraries/System.lua @@ -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")