From 2d7334d498a771a2136ff390d05161897dcac97b Mon Sep 17 00:00:00 2001 From: Igor Timofeev Date: Sat, 21 Jan 2017 13:22:07 +0300 Subject: [PATCH] =?UTF-8?q?=D1=84=D1=83=D0=B0=D1=84=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 18436 -> 18436 bytes Applications.txt | 2 +- Applications/.DS_Store | Bin 79876 -> 79876 bytes .../MineCodeIDE/Localization/English.lang | 2 + .../MineCodeIDE/Localization/Russian.lang | 2 + Applications/MineCodeIDE/MineCodeIDE.lua | 92 +++++++++++++----- 6 files changed, 70 insertions(+), 28 deletions(-) diff --git a/.DS_Store b/.DS_Store index e1afaa0999cdd98af8c970a378aee31c5c28eeb2..ac5624afb0b9aacd2090c07334494058b7489a85 100644 GIT binary patch delta 771 zcmaLTTS${(7zgm@Kc{|Qz2-YNPn-G8!#uHUn$t~VS&1pj4z$h@Xii;grU+YYI4& zHpgm~Z!VO1qvQ()_WQ$0+>prZtXSqj+1DQEY>p=861GU<&GPz=#wLG<7L_xX#J%#y z9{=uOpsQ00tC;w1Th>RjFQ>Xd`^g+6(R|7y7gdvwTBwWq=>(0?7){V5J*MaMmfq7e z&CoacK|eu|kpvTxkpcx)WFrR-xKW8JtiT$q#X9(~8BN#$KU&a^ZtTHc?88AU7{oCg z#}EY0;{qPD?ji%A8E$u_~SvUEP(8alNXmT|GFrI!drUrF2fcYFYZnVRoh#2+U8j${{k~3upxcC%dRfZkAT^WtyxgAk8f7?K63zj__m|;kL;)1O!=xMYy>q z+o*ala!+nmHSp(Fm(t`ENaP49&a6tkA|xQl&#l9)$0<@EoB|9S$`Ji4S+_Cn hWZX45T2vS8qbHhcSvD`%Yv$c7qEpMXdAVIICjek>NYDTP diff --git a/Applications.txt b/Applications.txt index 743d1bb5..179a85ee 100644 --- a/Applications.txt +++ b/Applications.txt @@ -517,7 +517,7 @@ icon="IgorTimofeev/OpenComputers/master/Applications/MineCodeIDE/Icon.pic", createShortcut="dock", forceDownload=true, - version=1.42, + version=1.43, resources={ { name="Localization/Russian.lang", diff --git a/Applications/.DS_Store b/Applications/.DS_Store index f0250a3169b82006470fad5a40c6302184417fc3..dbfcb25ce37c72007454adecfb57c67fea50b34a 100644 GIT binary patch delta 31 ncmZqqz|!)8Wkc0=4pT!@9R(u`)5)Pv9VcJeCcgRBcC7{g&^-;1 delta 22 ecmZqqz|!)8Wkc2W$)~S-PQJ2DeDkgCS`7e>#|&}+ diff --git a/Applications/MineCodeIDE/Localization/English.lang b/Applications/MineCodeIDE/Localization/English.lang index fd0d9fd6..333a702a 100755 --- a/Applications/MineCodeIDE/Localization/English.lang +++ b/Applications/MineCodeIDE/Localization/English.lang @@ -1,4 +1,6 @@ { + url = "http://example.com/something.lua", + getFromWeb = "Download from URL", debugging = "Debugger on line ", runtimeError = "Runtime error", variablesNotAvailable = "No variables found", diff --git a/Applications/MineCodeIDE/Localization/Russian.lang b/Applications/MineCodeIDE/Localization/Russian.lang index d92b3ae5..2291b016 100755 --- a/Applications/MineCodeIDE/Localization/Russian.lang +++ b/Applications/MineCodeIDE/Localization/Russian.lang @@ -1,4 +1,6 @@ { + url = "http://example.com/something.lua", + getFromWeb = "Загрузить по URL", debugging = "Отладчик на строке ", runtimeError = "Ошибка при выполнении программы", variablesNotAvailable = "Не найдено возможных переменных", diff --git a/Applications/MineCodeIDE/MineCodeIDE.lua b/Applications/MineCodeIDE/MineCodeIDE.lua index 8dec8df8..796eae57 100755 --- a/Applications/MineCodeIDE/MineCodeIDE.lua +++ b/Applications/MineCodeIDE/MineCodeIDE.lua @@ -288,6 +288,8 @@ end local function hideSettingsContainer() for childIndex = 2, #mainWindow.settingsContainer.children do mainWindow.settingsContainer.children[childIndex] = nil end mainWindow.settingsContainer.isHidden = true + mainWindow:draw() + buffer.draw() end local function clearHighlights() @@ -438,6 +440,8 @@ local function selectWord() end end +------------------------------------------------------------------------------------------------------------------ + local function removeTabs(text) local result = text:gsub("\t", string.rep(" ", mainWindow.codeView.indentationWidth)) return result @@ -448,8 +452,23 @@ local function removeWindowsLineEndings(text) return result end +local function createInputTextBoxForSettingsWindow(title, placeholder) + mainWindow.settingsContainer.isHidden = false + local elementWidth = math.floor(mainWindow.width * 0.3) + local x, y = math.floor(mainWindow.width / 2 - elementWidth / 2), math.floor(mainWindow.height / 2) - 3 + mainWindow.settingsContainer:addLabel(1, y, mainWindow.settingsContainer.width, 1, 0xFFFFFF, title):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top); y = y + 3 + return mainWindow.settingsContainer:addInputTextBox(x, y, elementWidth, 3, 0xCCCCCC, 0x777777, 0xCCCCCC, 0x2D2D2D, "", placeholder) +end + +local function newFile() + mainWindow.codeView.lines = {""} + mainWindow.codeView.maximumLineLength = 1 + mainWindow.leftTreeView.currentFile = nil + setCursorPositionAndClearSelection(1, 1) +end + local function loadFile(path) - mainWindow.codeView.fromLine, mainWindow.codeView.fromSymbol, mainWindow.codeView.lines, mainWindow.codeView.maximumLineLength = 1, 1, {}, 0 + newFile() local file = io.open(path, "r") for line in file:lines() do line = removeWindowsLineEndings(removeTabs(line)) @@ -458,8 +477,6 @@ local function loadFile(path) end file:close() mainWindow.leftTreeView.currentFile = path - if #mainWindow.codeView.lines == 0 then table.insert(mainWindow.codeView.lines, "") end - setCursorPositionAndClearSelection(1, 1) end local function saveFile(path) @@ -471,19 +488,8 @@ local function saveFile(path) file:close() end -local function newFile() - mainWindow.codeView.lines = {""} - mainWindow.codeView.maximumLineLength = 1 - mainWindow.leftTreeView.currentFile = nil - setCursorPositionAndClearSelection(1, 1) -end - local function open() - mainWindow.settingsContainer.isHidden = false - local elementWidth = math.floor(mainWindow.width * 0.3) - local x, y = math.floor(mainWindow.width / 2 - elementWidth / 2), math.floor(mainWindow.height / 2) - 3 - mainWindow.settingsContainer:addLabel(1, y, mainWindow.settingsContainer.width, 1, 0xFFFFFF, localization.openFile):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top); y = y + 3 - local inputTextBox = mainWindow.settingsContainer:addInputTextBox(x, y, elementWidth, 3, 0xCCCCCC, 0x777777, 0xCCCCCC, 0x2D2D2D, "", localization.pathToFile); y = y + 5 + local inputTextBox = createInputTextBoxForSettingsWindow(localization.openFile, localization.pathToFile) inputTextBox.validator = function(text) if fs.exists(text) then return true end end @@ -494,11 +500,7 @@ local function open() end local function saveAs() - mainWindow.settingsContainer.isHidden = false - local elementWidth = math.floor(mainWindow.width * 0.3) - local x, y = math.floor(mainWindow.width / 2 - elementWidth / 2), math.floor(mainWindow.height / 2) - 3 - mainWindow.settingsContainer:addLabel(1, y, mainWindow.settingsContainer.width, 1, 0xFFFFFF, localization.saveAs):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top); y = y + 3 - local inputTextBox = mainWindow.settingsContainer:addInputTextBox(x, y, elementWidth, 3, 0xCCCCCC, 0x777777, 0xCCCCCC, 0x2D2D2D, "", localization.pathToFile); y = y + 5 + local inputTextBox = createInputTextBoxForSettingsWindow(localization.saveAs, localization.pathToFile) inputTextBox.onInputFinished = function() saveFile(inputTextBox.text) mainWindow.leftTreeView.currentFile = inputTextBox.text @@ -511,6 +513,42 @@ local function save() saveFile(mainWindow.leftTreeView.currentFile) end +local function splitStringIntoLines(s) + s = removeWindowsLineEndings(removeTabs(s)) + + local lines, searchLineEndingFrom, maximumLineLength, lineEndingFoundAt, line = {}, 1, 0 + repeat + lineEndingFoundAt = string.unicodeFind(s, "\n", searchLineEndingFrom) + if lineEndingFoundAt then + line = unicode.sub(s, searchLineEndingFrom, lineEndingFoundAt - 1) + searchLineEndingFrom = lineEndingFoundAt + 1 + else + line = unicode.sub(s, searchLineEndingFrom, -1) + end + + table.insert(lines, line) + maximumLineLength = math.max(maximumLineLength, unicode.len(line)) + until not lineEndingFoundAt + + return lines, maximumLineLength +end + +local function downloadFromWeb() + local inputTextBox = createInputTextBoxForSettingsWindow(localization.getFromWeb, localization.url) + inputTextBox.onInputFinished = function() + local success, reason = ecs.internetRequest(inputTextBox.text) + if success then + newFile() + mainWindow.codeView.lines, mainWindow.codeView.maximumLineLength = splitStringIntoLines(reason) + hideSettingsContainer() + else + GUI.error(reason, {title = {color = 0xFFDB40, text = "Failed to connect to URL"}}) + end + end +end + +------------------------------------------------------------------------------------------------------------------ + local function addErrorLine(line) lastErrorLine = line mainWindow.codeView.highlights[line] = colors.highlights.onError @@ -969,6 +1007,9 @@ local function createWindow() menu:addItem(localization.open, false, "^O").onTouch = function() open() end + menu:addItem(localization.getFromWeb, false, "^U").onTouch = function() + downloadFromWeb() + end menu:addSeparator() menu:addItem(localization.save, not mainWindow.leftTreeView.currentFile, "^S").onTouch = function() save() @@ -1258,6 +1299,9 @@ local function createWindow() -- O elseif eventData[4] == 24 then open() + -- U + elseif eventData[4] == 22 then + downloadFromWeb() -- S elseif eventData[4] == 31 then -- Shift @@ -1336,13 +1380,7 @@ local function createWindow() end end elseif eventData[1] == "clipboard" then - local lines = {} - for line in eventData[3]:gmatch("([^\r\n]+)\r?\n?") do - line = removeTabs(line) - table.insert(lines, line) - end - table.insert(lines, "") - paste(lines) + paste(splitStringIntoLines(eventData[3])) elseif eventData[1] == "scroll" then if isClickedOnCodeArea(eventData[3], eventData[4]) then scroll(eventData[5], config.scrollSpeed)