diff --git a/Icons/3DModel.pic b/Applications/3D Print.app/Extensions/.3dm/Icon.pic similarity index 100% rename from Icons/3DModel.pic rename to Applications/3D Print.app/Extensions/.3dm/Icon.pic diff --git a/Applications/3D Print.app/Main.lua b/Applications/3D Print.app/Main.lua index 09e40fb7..1304bdf2 100644 --- a/Applications/3D Print.app/Main.lua +++ b/Applications/3D Print.app/Main.lua @@ -4,7 +4,8 @@ local GUI = require("GUI") local screen = require("Screen") local color = require("Color") local system = require("System") -local bigLetters = require("bigLetters") +local bigLetters = require("BigLetters") +local filesystem = require("Filesystem") local args, options = system.parseArguments(...) diff --git a/Icons/Config.pic b/Applications/MineCode IDE.app/Extensions/.cfg/Icon.pic similarity index 100% rename from Icons/Config.pic rename to Applications/MineCode IDE.app/Extensions/.cfg/Icon.pic diff --git a/Icons/Localization.pic b/Applications/MineCode IDE.app/Extensions/.lang/Icon.pic similarity index 100% rename from Icons/Localization.pic rename to Applications/MineCode IDE.app/Extensions/.lang/Icon.pic diff --git a/Extensions/Lua/Context menu.lua b/Applications/MineCode IDE.app/Extensions/.lua/Context menu.lua similarity index 88% rename from Extensions/Lua/Context menu.lua rename to Applications/MineCode IDE.app/Extensions/.lua/Context menu.lua index 28b71c5a..8024aaed 100755 --- a/Extensions/Lua/Context menu.lua +++ b/Applications/MineCode IDE.app/Extensions/.lua/Context menu.lua @@ -7,20 +7,11 @@ local system = require("System") local workspace, icon, menu = select(1, ...), select(2, ...), select(3, ...) local localization = system.getSystemLocalization() -menu:addItem(localization.edit).onTouch = function() - system.execute(paths.system.applicationMineCodeIDE, icon.path) -end menu:addItem(localization.uploadToPastebin, not component.isAvailable("internet")).onTouch = function() system.uploadToPastebin(icon.path) end -menu:addSeparator() - -menu:addItem(localization.launchWithArguments).onTouch = function() - system.launchWithArguments(workspace, icon.path) -end - menu:addItem(localization.flashEEPROM, not component.isAvailable("eeprom") or filesystem.size(icon.path) > 4096).onTouch = function() local container = GUI.addBackgroundContainer(workspace, true, true, localization.flashEEPROM) container.layout:addChild(GUI.label(1, 1, container.width, 1, 0x969696, localization.flashingEEPROM .. "...")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP) @@ -31,3 +22,7 @@ menu:addItem(localization.flashEEPROM, not component.isAvailable("eeprom") or fi container:remove() workspace:draw() end + +menu:addItem(localization.launchWithArguments).onTouch = function() + system.launchWithArguments(workspace, icon.path) +end diff --git a/Icons/Lua.pic b/Applications/MineCode IDE.app/Extensions/.lua/Icon.pic similarity index 100% rename from Icons/Lua.pic rename to Applications/MineCode IDE.app/Extensions/.lua/Icon.pic diff --git a/Icons/Text.pic b/Applications/MineCode IDE.app/Extensions/.txt/Icon.pic similarity index 100% rename from Icons/Text.pic rename to Applications/MineCode IDE.app/Extensions/.txt/Icon.pic diff --git a/Icons/Image.pic b/Applications/Picture Edit.app/Extensions/.pic/Icon.pic similarity index 100% rename from Icons/Image.pic rename to Applications/Picture Edit.app/Extensions/.pic/Icon.pic diff --git a/Extensions/3dm/Context menu.lua b/Extensions/3dm/Context menu.lua deleted file mode 100644 index 72cc41ac..00000000 --- a/Extensions/3dm/Context menu.lua +++ /dev/null @@ -1,14 +0,0 @@ - -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.edit).onTouch = function() - system.execute(paths.editor, icon.path) -end - -menu:addItem(localization.uploadToPastebin, not component.isAvailable("internet")).onTouch = function() - system.uploadToPastebin(icon.path) -end diff --git a/Extensions/Lua/Launcher.lua b/Extensions/Lua/Launcher.lua deleted file mode 100755 index 08459732..00000000 --- a/Extensions/Lua/Launcher.lua +++ /dev/null @@ -1,2 +0,0 @@ - -require("System").execute(select(1, ...)) diff --git a/Extensions/Pic/Context menu.lua b/Extensions/Pic/Context menu.lua deleted file mode 100755 index c414731d..00000000 --- a/Extensions/Pic/Context menu.lua +++ /dev/null @@ -1,20 +0,0 @@ - -local system = require("System") - -local workspace, icon, menu = select(1, ...), select(2, ...), select(3, ...) -local localization = system.getSystemLocalization() -local userSettings = system.getUserSettings() - -menu:addItem(localization.setAsWallpaper).onTouch = function() - userSettings.interfaceWallpaperEnabled = true - userSettings.interfaceWallpaperPath = icon.path - - system.updateWallpaper() - workspace:draw() - - system.saveUserSettings() -end - -menu:addItem(localization.uploadToPastebin, not component.isAvailable("internet")).onTouch = function() - system.uploadToPastebin(icon.path) -end diff --git a/Extensions/Pkg/Launcher.lua b/Extensions/Pkg/Launcher.lua deleted file mode 100755 index 1f12050e..00000000 --- a/Extensions/Pkg/Launcher.lua +++ /dev/null @@ -1,8 +0,0 @@ -local path = select(1, ...) - -local success, reason = require("Compressor").unpack(path, require("Filesystem").path(path)) -if not success then - require("GUI").alert(reason) -end - -computer.pushSignal("system", "updateFileList") \ No newline at end of file diff --git a/Installer/Files.cfg b/Installer/Files.cfg index abf5e2b3..f3650a73 100644 --- a/Installer/Files.cfg +++ b/Installer/Files.cfg @@ -50,28 +50,16 @@ { path="Libraries/Internet.lua" }, -- Scripts { path="OS.lua", id=106 }, - -- Extensions - "Extensions/Lua/Context menu.lua", - "Extensions/Lua/Launcher.lua", - "Extensions/Pic/Context menu.lua", - "Extensions/Pkg/Launcher.lua", - "Extensions/3dm/Context menu.lua", -- System icons - "Icons/3DModel.pic", "Icons/Application.pic", "Icons/Archive.pic", - "Icons/Config.pic", "Icons/FileNotExists.pic", "Icons/Floppy.pic", "Icons/Folder.pic", "Icons/HDD.pic", - "Icons/Image.pic", - "Icons/Lua.pic", "Icons/Script.pic", - "Icons/Text.pic", "Icons/Trash.pic", "Icons/User.pic", - "Icons/Localization.pic", -- Sample "Applications/Sample.app/Main.lua", "Applications/Sample.app/Icon.pic", @@ -93,6 +81,11 @@ "Applications/MineCode IDE.app/Localizations/English.lang", "Applications/MineCode IDE.app/Localizations/French.lang", "Applications/MineCode IDE.app/Localizations/Ukrainian.lang", + "Applications/MineCode IDE.app/Extensions/.txt/Icon.pic", + "Applications/MineCode IDE.app/Extensions/.cfg/Icon.pic", + "Applications/MineCode IDE.app/Extensions/.lang/Icon.pic", + "Applications/MineCode IDE.app/Extensions/.lua/Icon.pic", + "Applications/MineCode IDE.app/Extensions/.lua/Context menu.lua", -- Picture Edit { path="Applications/Picture Edit.app/Main.lua", id=798 }, "Applications/Picture Edit.app/Icon.pic", @@ -104,6 +97,7 @@ "Applications/Picture Edit.app/Tools/6.lua", "Applications/Picture Edit.app/Tools/7.lua", "Applications/Picture Edit.app/Tools/8.lua", + "Applications/Picture Edit.app/Extensions/.pic/Icon.pic", -- Finder { path="Applications/Finder.app/Main.lua", id=175 }, "Applications/Finder.app/Icon.pic", @@ -153,6 +147,7 @@ "Applications/3D Print.app/Localizations/Russian.lang", "Applications/3D Print.app/Localizations/French.lang", "Applications/3D Print.app/Localizations/Ukrainian.lang", + "Applications/3D Print.app/Extensions/.3dm/Icon.pic", -- Weather { path="Applications/Weather.app/Main.lua", id=240, shortcut = true }, "Applications/Weather.app/Icon.pic", diff --git a/Libraries/System.lua b/Libraries/System.lua index 424d8110..f57ad7fb 100755 --- a/Libraries/System.lua +++ b/Libraries/System.lua @@ -116,39 +116,12 @@ function system.getDefaultUserSettings() filesystem.path(paths.system.applicationSettings), }, extensions = { - [".3dm"] = { - icon = paths.system.icons .. "3DModel.pic", - launcher = paths.system.applications .. "3D Print.app/Main.lua", - contextMenu = paths.system.extensions .. "3dm/Context menu.lua" - }, - [".pic"] = { - icon = paths.system.icons .. "Image.pic", - launcher = paths.system.applicationPictureEdit, - contextMenu = paths.system.extensions .. "Pic/Context menu.lua" - }, - [".cfg"] = { - icon = paths.system.icons .. "Config.pic" - }, - [".txt"] = { - icon = paths.system.icons .. "Text.pic" - }, - [".lang"] = { - icon = paths.system.icons .. "Localization.pic" - }, - [".pkg"] = { - icon = paths.system.icons .. "Archive.pic", - launcher = paths.system.extensions .. "Pkg/Launcher.lua", - }, - [".lua"] = { - icon = paths.system.icons .. "Lua.pic", - launcher = paths.system.extensions .. "Lua/Launcher.lua", - contextMenu = paths.system.extensions .. "Lua/Context menu.lua" - }, - ["script"] = { - icon = paths.system.icons .. "Script.pic", - launcher = paths.system.extensions .. "Lua/Launcher.lua", - contextMenu = paths.system.extensions .. "Lua/Context menu.lua" - }, + [".lua"] = filesystem.path(paths.system.applicationMineCodeIDE), + [".cfg"] = filesystem.path(paths.system.applicationMineCodeIDE), + [".txt"] = filesystem.path(paths.system.applicationMineCodeIDE), + [".lang"] = filesystem.path(paths.system.applicationMineCodeIDE), + [".pic"] = filesystem.path(paths.system.applicationPictureEdit), + [".3dm"] = paths.system.applications .. "3D Print.app/" }, } end @@ -345,14 +318,14 @@ local iconLaunchers = { extension = function(icon) if icon.isShortcut then - system.execute(userSettings.extensions[icon.shortcutExtension].launcher, icon.shortcutPath, "-o") + system.execute(userSettings.extensions[icon.shortcutExtension] .. "Main.lua", icon.shortcutPath, "-o") else - system.execute(userSettings.extensions[icon.extension].launcher, icon.path, "-o") + system.execute(userSettings.extensions[icon.extension] .. "Main.lua", icon.path, "-o") end end, script = function(icon) - system.execute(icon.path) + system.execute(paths.system.applicationMineCodeIDE, icon.path) end, showPackageContent = function(icon) @@ -368,6 +341,15 @@ local iconLaunchers = { workspace:draw() end, + + archive = function(icon) + local success, reason = require("Compressor").unpack(icon.path, filesystem.path(icon.path)) + if success then + computer.pushSignal("system", "updateFileList") + else + GUI.alert(reason) + end + end } function system.calculateIconProperties() @@ -515,23 +497,7 @@ local function iconAnalyseExtension(icon, launchers) if icon.isDirectory then if icon.extension == ".app" then if userSettings.filesShowApplicationIcon then - if filesystem.exists(icon.path .. "Icon.pic") then - icon.image = image.load(icon.path .. "Icon.pic") - elseif filesystem.exists(icon.path .. "Icon.lua") then - local result, reason = loadfile(icon.path .. "Icon.lua") - if result then - result, reason = pcall(result) - if result then - icon.liveImage = reason - else - error("Failed to load live icon image: " .. tostring(reason)) - end - else - error("Failed to load live icon image: " .. tostring(reason)) - end - else - icon.image = iconCache.fileNotExists - end + icon.image = image.load(icon.path .. "Icon.pic") or iconCache.fileNotExists else icon.image = iconCache.application end @@ -563,17 +529,22 @@ local function iconAnalyseExtension(icon, launchers) icon.image = shortcutIcon.image icon.shortcutLaunch = shortcutIcon.launch icon.launch = launchers.shortcut + elseif icon.extension == ".pkg" then + icon.image = iconCache.archive + icon.launch = launchers.archive + elseif userSettings.extensions[icon.extension] then + icon.image = + image.load(userSettings.extensions[icon.extension] .. "Extensions/" .. icon.extension .. "/Icon.pic") or + image.load(userSettings.extensions[icon.extension] .. "Icon.pic") or + iconCache.fileNotExists + + icon.launch = launchers.extension elseif not filesystem.exists(icon.path) then icon.image = iconCache.fileNotExists icon.launch = launchers.corrupted else - if userSettings.extensions[icon.extension] then - icon.launch = launchers.extension - icon.image = system.cacheIcon(icon.extension, userSettings.extensions[icon.extension].icon) - else - icon.launch = launchers.script - icon.image = iconCache.script - end + icon.image = iconCache.script + icon.launch = launchers.script end end @@ -765,6 +736,10 @@ local function iconOnRightClick(icon, e1, e2, e3, e4) if #selectedIcons == 1 then if icon.isDirectory then if icon.extension == ".app" then + contextMenu:addItem(localization.edit .. " Main.lua").onTouch = function() + system.execute(paths.system.applicationMineCodeIDE, icon.path .. "Main.lua") + end + contextMenu:addItem(localization.showPackageContent).onTouch = function() icon.parent.parent.launchers.showPackageContent(icon) end @@ -790,10 +765,6 @@ local function iconOnRightClick(icon, e1, e2, e3, e4) workspace:draw() end - contextMenu:addItem(localization.edit .. " Main.lua").onTouch = function() - system.execute(paths.system.applicationMineCodeIDE, icon.path .. "Main.lua") - end - contextMenu:addSeparator() end @@ -842,33 +813,70 @@ local function iconOnRightClick(icon, e1, e2, e3, e4) end contextMenu:addSeparator() - else - if userSettings.extensions[icon.extension] and userSettings.extensions[icon.extension].contextMenu then - local success, reason = pcall(loadfile(userSettings.extensions[icon.extension].contextMenu), workspace, icon, contextMenu) - if success then - contextMenu:addSeparator() - else - GUI.alert("Failed to load extension association: " .. tostring(reason)) - end - else - contextMenu:addItem(localization.edit).onTouch = function() - system.execute(paths.system.applicationMineCodeIDE, icon.path) - end - + else + local function addDefault() contextMenu:addItem(localization.uploadToPastebin, not component.isAvailable("internet")).onTouch = function() system.uploadToPastebin(icon.path) end - contextMenu:addSeparator() end - -- local subMenu = contextMenu:addSubMenuItem(localization.openWith) - -- local fileList = filesystem.sortedList(paths.system.applications, "name") - -- subMenu:addItem(localization.select) - -- subMenu:addSeparator() - -- for i = 1, #fileList do - -- subMenu:addItem(fileList[i].nameWithoutExtension) - -- end + if userSettings.extensions[icon.extension] then + local result, reason = loadfile(userSettings.extensions[icon.extension] .. "Extensions/" .. icon.extension .. "/Context menu.lua") + if result then + result, reason = pcall(result, workspace, icon, contextMenu) + + if result then + contextMenu:addSeparator() + else + GUI.alert("Failed to load extension association: " .. tostring(reason)) + end + else + addDefault() + end + else + addDefault() + end + + -- Open with + local subMenu = contextMenu:addSubMenuItem(localization.openWith) + + local function setAssociation(path) + userSettings.extensions[icon.extension] = path + + icon:analyseExtension(icon.parent.parent.launchers) + icon:launch() + workspace:draw() + + system.saveUserSettings() + end + + subMenu:addItem(localization.select).onTouch = function() + local filesystemDialog = GUI.addFilesystemDialog(workspace, true, 50, math.floor(workspace.height * 0.8), localization.open, localization.cancel, localization.fileName, "/") + + filesystemDialog:setMode(GUI.IO_MODE_OPEN, GUI.IO_MODE_DIRECTORY) + filesystemDialog:addExtensionFilter(".app") + filesystemDialog:expandPath(paths.system.applications) + filesystemDialog.filesystemTree.selectedItem = userSettings.extensions[icon.extension] + filesystemDialog.onSubmit = function(path) + setAssociation(path) + end + + filesystemDialog:show() + end + + subMenu:addSeparator() + + local list = filesystem.list(paths.system.applications) + for i = 1, #list do + local path = paths.system.applications .. list[i] + + if filesystem.isDirectory(path) and filesystem.extension(list[i]) == ".app" then + subMenu:addItem(filesystem.hideExtension(list[i])).onTouch = function() + setAssociation(path) + end + end + end end end end @@ -897,50 +905,6 @@ local function iconOnRightClick(icon, e1, e2, e3, e4) contextMenu:addSeparator() end - local subMenu = contextMenu:addSubMenuItem(localization.archive .. (#selectedIcons > 1 and " (" .. #selectedIcons .. ")" or "")) - - local function archive(where) - local itemsToArchive = {} - for i = 1, #selectedIcons do - table.insert(itemsToArchive, selectedIcons[i].path) - end - - local success, reason = require("Compressor").pack(where .. "/Archive.pkg", itemsToArchive) - if not success then - GUI.alert(reason) - end - - computer.pushSignal("system", "updateFileList") - end - - subMenu:addItem(localization.inCurrentDirectory).onTouch = function() - archive(filesystem.path(icon.path)) - end - - subMenu:addItem(localization.onDesktop).onTouch = function() - archive(paths.user.desktop) - end - - local function cutOrCopy(cut) - for i = 1, #icon.parent.children do - icon.parent.children[i].cut = nil - end - - system.clipboard = {cut = cut} - for i = 1, #selectedIcons do - selectedIcons[i].cut = cut - table.insert(system.clipboard, selectedIcons[i].path) - end - end - - contextMenu:addItem(localization.cut).onTouch = function() - cutOrCopy(true) - end - - contextMenu:addItem(localization.copy).onTouch = function() - cutOrCopy() - end - if not icon.isShortcut or #selectedIcons > 1 then local subMenu = contextMenu:addSubMenuItem(localization.createShortcut) @@ -971,6 +935,59 @@ local function iconOnRightClick(icon, e1, e2, e3, e4) end end + local subMenu = contextMenu:addSubMenuItem(localization.archive .. (#selectedIcons > 1 and " (" .. #selectedIcons .. ")" or "")) + + local function archive(where) + local itemsToArchive = {} + for i = 1, #selectedIcons do + table.insert(itemsToArchive, selectedIcons[i].path) + end + + local success, reason = require("Compressor").pack(where .. "/Archive.pkg", itemsToArchive) + if not success then + GUI.alert(reason) + end + + computer.pushSignal("system", "updateFileList") + end + + subMenu:addItem(localization.inCurrentDirectory).onTouch = function() + archive(filesystem.path(icon.path)) + end + + subMenu:addItem(localization.onDesktop).onTouch = function() + archive(paths.user.desktop) + end + + if #selectedIcons == 1 then + contextMenu:addItem(localization.addToDock).onTouch = function() + dockContainer.addIcon(icon.path).keepInDock = true + dockContainer.saveUserSettings() + end + end + + contextMenu:addSeparator() + + local function cutOrCopy(cut) + for i = 1, #icon.parent.children do + icon.parent.children[i].cut = nil + end + + system.clipboard = {cut = cut} + for i = 1, #selectedIcons do + selectedIcons[i].cut = cut + table.insert(system.clipboard, selectedIcons[i].path) + end + end + + contextMenu:addItem(localization.cut).onTouch = function() + cutOrCopy(true) + end + + contextMenu:addItem(localization.copy).onTouch = function() + cutOrCopy() + end + if #selectedIcons == 1 then contextMenu:addItem(localization.rename).onTouch = function() local container = addBackgroundContainerWithInput(filesystem.name(icon.path), localization.rename, localization.newName) @@ -1006,13 +1023,6 @@ local function iconOnRightClick(icon, e1, e2, e3, e4) contextMenu:addSeparator() - if #selectedIcons == 1 then - contextMenu:addItem(localization.addToDock).onTouch = function() - dockContainer.addIcon(icon.path).keepInDock = true - dockContainer.saveUserSettings() - end - end - contextMenu:addItem(localization.properties).onTouch = function() for i = 1, #selectedIcons do system.addPropertiesWindow(e3, e4, 46, selectedIcons[i]) @@ -2659,6 +2669,7 @@ bootRealTime = math.floor(filesystem.lastModified(temporaryPath) / 1000) filesystem.remove(temporaryPath) -- Caching commonly used icons +system.cacheIcon("archive", paths.system.icons .. "Archive.pic") system.cacheIcon("directory", paths.system.icons .. "Folder.pic") system.cacheIcon("fileNotExists", paths.system.icons .. "FileNotExists.pic") system.cacheIcon("application", paths.system.icons .. "Application.pic")