From cbcfecd96de013dd103206c3a3a704a2045005c3 Mon Sep 17 00:00:00 2001 From: Igor Timofeev Date: Wed, 25 Jan 2017 09:21:28 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=84=D0=B8=D1=87=D0=B0=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=B0=D0=B2=D1=82=D0=BE=D0=B4=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=82=D0=B5=D0=BA=D1=81=D1=82=D0=B0?= =?UTF-8?q?=20=D0=B2=20=D0=BC=D0=B0=D0=B9=D0=BD=D0=BA=D0=BE=D0=B4=D1=8B?= =?UTF-8?q?=D1=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 18436 -> 18436 bytes Applications.txt | 4 +- Applications/.DS_Store | Bin 79876 -> 79876 bytes Applications/MineCodeIDE/MineCodeIDE.lua | 274 ++++++++++++++++++----- lib/syntax.lua | 2 +- 5 files changed, 227 insertions(+), 53 deletions(-) diff --git a/.DS_Store b/.DS_Store index 6ce89af8d91d3e9fb0c89c2419d159518e430bf5..8f6631f45094dffcf917dec603160044152dea45 100644 GIT binary patch delta 48 vcmZpfz}PZ@al5giQj+3A47T 0 then + mainWindow.autocompleteWindow.fromMatch, mainWindow.autocompleteWindow.currentMatch = 1, 1 + mainWindow.autocompleteWindow.isHidden = false + else + hideAutocompleteWindow() + end + else + hideAutocompleteWindow() + end + end +end + +------------------------------------------------------------------------------------------------------------------ local function saveConfig() table.toFile(configPath, config) @@ -357,6 +455,7 @@ local function setCursorPosition(symbol, line) fixFromSymbolByCursorPosition() clearHighlights() hideErrorMessage() + hideAutocompleteWindow() end local function setCursorPositionAndClearSelection(symbol, line) @@ -364,10 +463,6 @@ local function setCursorPositionAndClearSelection(symbol, line) clearSelection() end -local function convertScreenCoordinatesToCursorPosition(x, y) - return x - mainWindow.codeView.codeAreaPosition + mainWindow.codeView.fromSymbol - 1, y - mainWindow.codeView.y + mainWindow.codeView.fromLine -end - local function isClickedOnCodeArea(x, y) return x >= mainWindow.codeView.codeAreaPosition and @@ -377,22 +472,36 @@ local function isClickedOnCodeArea(x, y) end local function moveCursor(symbolOffset, lineOffset) - if mainWindow.codeView.selections[1] then - if symbolOffset < 0 or lineOffset < 0 then - setCursorPositionAndClearSelection(mainWindow.codeView.selections[1].from.symbol, mainWindow.codeView.selections[1].from.line) + if mainWindow.autocompleteWindow.isHidden or lineOffset == 0 then + if mainWindow.codeView.selections[1] then + if symbolOffset < 0 or lineOffset < 0 then + setCursorPositionAndClearSelection(mainWindow.codeView.selections[1].from.symbol, mainWindow.codeView.selections[1].from.line) + else + setCursorPositionAndClearSelection(mainWindow.codeView.selections[1].to.symbol, mainWindow.codeView.selections[1].to.line) + end else - setCursorPositionAndClearSelection(mainWindow.codeView.selections[1].to.symbol, mainWindow.codeView.selections[1].to.line) - end - else - local newSymbol, newLine = cursor.position.symbol + symbolOffset, cursor.position.line + lineOffset - - if symbolOffset < 0 and newSymbol < 1 then - newLine, newSymbol = newLine - 1, math.huge - elseif symbolOffset > 0 and newSymbol > unicode.len(mainWindow.codeView.lines[newLine] or "") + 1 then - newLine, newSymbol = newLine + 1, 1 - end + local newSymbol, newLine = cursor.position.symbol + symbolOffset, cursor.position.line + lineOffset + + if symbolOffset < 0 and newSymbol < 1 then + newLine, newSymbol = newLine - 1, math.huge + elseif symbolOffset > 0 and newSymbol > unicode.len(mainWindow.codeView.lines[newLine] or "") + 1 then + newLine, newSymbol = newLine + 1, 1 + end - setCursorPositionAndClearSelection(newSymbol, newLine) + setCursorPositionAndClearSelection(newSymbol, newLine) + end + elseif not mainWindow.autocompleteWindow.isHidden then + mainWindow.autocompleteWindow.currentMatch = mainWindow.autocompleteWindow.currentMatch + lineOffset + + if mainWindow.autocompleteWindow.currentMatch < 1 then + mainWindow.autocompleteWindow.currentMatch = 1 + elseif mainWindow.autocompleteWindow.currentMatch > #mainWindow.autocompleteWindow.matches then + mainWindow.autocompleteWindow.currentMatch = #mainWindow.autocompleteWindow.matches + elseif mainWindow.autocompleteWindow.currentMatch < mainWindow.autocompleteWindow.fromMatch then + mainWindow.autocompleteWindow.fromMatch = mainWindow.autocompleteWindow.currentMatch + elseif mainWindow.autocompleteWindow.currentMatch > mainWindow.autocompleteWindow.fromMatch + mainWindow.autocompleteWindow.height - 1 then + mainWindow.autocompleteWindow.fromMatch = mainWindow.autocompleteWindow.currentMatch - mainWindow.autocompleteWindow.height + 1 + end end end @@ -438,18 +547,7 @@ local function gotoLine(line) end local function selectWord() - local shittySymbolsRegexp, from, to = "[%s%c%p]" - - for i = cursor.position.symbol, 1, -1 do - if unicode.sub(mainWindow.codeView.lines[cursor.position.line], i, i):match(shittySymbolsRegexp) then break end - from = i - end - - for i = cursor.position.symbol, unicode.len(mainWindow.codeView.lines[cursor.position.line]) do - if unicode.sub(mainWindow.codeView.lines[cursor.position.line], i, i):match(shittySymbolsRegexp) then break end - to = i - end - + local from, to = getCurrentWordStartingAndEnding(cursor.position.symbol) if from and to then mainWindow.codeView.selections[1] = { from = {symbol = from, line = cursor.position.line}, @@ -480,6 +578,7 @@ local function createInputTextBoxForSettingsWindow(title, placeholder) end local function newFile() + autocompleteDatabase = {} mainWindow.codeView.lines = {""} mainWindow.codeView.maximumLineLength = 1 mainWindow.leftTreeView.currentFile = nil @@ -496,6 +595,7 @@ local function loadFile(path) end file:close() mainWindow.leftTreeView.currentFile = path + updateAutocompleteDatabaseFromFile() end local function saveFile(path) @@ -686,6 +786,8 @@ local function deleteLine(line) if #mainWindow.codeView.lines > 1 then table.remove(mainWindow.codeView.lines, line) setCursorPositionAndClearSelection(1, cursor.position.line) + + updateAutocompleteDatabaseFromFile() end end @@ -697,6 +799,8 @@ local function deleteSpecifiedData(fromSymbol, fromLine, toSymbol, toLine) end mainWindow.codeView.lines[fromLine] = upperLine .. lowerLine setCursorPositionAndClearSelection(fromSymbol, fromLine) + + updateAutocompleteDatabaseFromFile() end local function deleteSelectedData() @@ -707,6 +811,7 @@ local function deleteSelectedData() mainWindow.codeView.selections[1].to.symbol, mainWindow.codeView.selections[1].to.line ) + clearSelection() end end @@ -732,6 +837,14 @@ local function cut() end end +local function pasteSelectedAutocompletion() + local firstPart = unicode.sub(mainWindow.codeView.lines[cursor.position.line], 1, mainWindow.autocompleteWindow.currentWordStarting - 1) + local secondPart = unicode.sub(mainWindow.codeView.lines[cursor.position.line], mainWindow.autocompleteWindow.currentWordEnding + 1, -1) + mainWindow.codeView.lines[cursor.position.line] = firstPart .. mainWindow.autocompleteWindow.matches[mainWindow.autocompleteWindow.currentMatch][1] .. secondPart + setCursorPositionAndClearSelection(unicode.len(firstPart .. mainWindow.autocompleteWindow.matches[mainWindow.autocompleteWindow.currentMatch][1]) + 1, cursor.position.line) + hideAutocompleteWindow() +end + local function paste(pasteLines) if pasteLines then if mainWindow.codeView.selections[1] then @@ -752,6 +865,8 @@ local function paste(pasteLines) table.insert(mainWindow.codeView.lines, cursor.position.line + #pasteLines - 1, pasteLines[#pasteLines] .. secondPart) setCursorPositionAndClearSelection(unicode.len(pasteLines[#pasteLines]) + 1, cursor.position.line + #pasteLines - 1) end + + updateAutocompleteDatabaseFromFile() end end @@ -770,6 +885,10 @@ end local function pasteRegularChar(unicodeByte, char) if not keyboard.isControl(unicodeByte) then paste({char}) + if char == " " then + updateAutocompleteDatabaseFromFile() + end + showAutocompleteWindow() end end @@ -838,6 +957,9 @@ local function delete() deleteSpecifiedData(unicode.len(mainWindow.codeView.lines[cursor.position.line]) + 1, cursor.position.line, 0, cursor.position.line + 1) end end + + -- updateAutocompleteDatabaseFromFile() + showAutocompleteWindow() end end @@ -853,6 +975,9 @@ local function backspace() deleteSpecifiedData(unicode.len(mainWindow.codeView.lines[cursor.position.line - 1]) + 1, cursor.position.line - 1, 0, cursor.position.line) end end + + -- updateAutocompleteDatabaseFromFile() + showAutocompleteWindow() end end @@ -1139,7 +1264,7 @@ local function createWindow() editOrRightClickMenu:show() end - local item4 = mainWindow.topMenu:addItem(localization.view) + local item4 = mainWindow.topMenu:addItem(localization.properties) item4.onTouch = function() local menu = GUI.contextMenu(item4.x, item4.y + 1) menu:addItem(localization.colorScheme).onTouch = function() @@ -1153,10 +1278,17 @@ local function createWindow() mainWindow.settingsContainer:addLabel(1, y, mainWindow.settingsContainer.width, 1, 0xFFFFFF, localization.colorScheme):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top); y = y + 3 local x, counter = startX, 1 + local colors = {} for key in pairs(config.syntaxColorScheme) do - local colorSelector = mainWindow.settingsContainer:addColorSelector(x, y, colorSelectorWidth, colorSelectorHeight, config.syntaxColorScheme[key], key) + table.insert(colors, {key}) + end + + aplhabeticalSort(colors) + + for i = 1, #colors do + local colorSelector = mainWindow.settingsContainer:addColorSelector(x, y, colorSelectorWidth, colorSelectorHeight, config.syntaxColorScheme[colors[i][1]], colors[i][1]) colorSelector.onTouch = function() - config.syntaxColorScheme[key] = colorSelector.color + config.syntaxColorScheme[colors[i][1]] = colorSelector.color syntax.colorScheme = config.syntaxColorScheme saveConfig() end @@ -1195,18 +1327,15 @@ local function createWindow() toggleTopToolBar() end end - if config.enableAutoBrackets then - menu:addItem(localization.disableAutoBrackets, false, "^]").onTouch = function() - config.enableAutoBrackets = false - saveConfig() - end - else - menu:addItem(localization.enableAutoBrackets, false, "^]").onTouch = function() - config.enableAutoBrackets = true - saveConfig() - end + menu:addSeparator() + menu:addItem(config.enableAutoBrackets and localization.disableAutoBrackets or localization.enableAutoBrackets, false, "^]").onTouch = function() + config.enableAutoBrackets = not config.enableAutoBrackets + saveConfig() + end + menu:addItem(config.enableAutocompletion and localization.disableAutocompletion or localization.enableAutocompletion, false, "^I").onTouch = function() + config.enableAutocompletion = not config.enableAutocompletion + saveConfig() end - menu:addSeparator() menu:addItem(localization.scalePlus, false, "^+").onTouch = function() scalePlus() @@ -1318,6 +1447,42 @@ local function createWindow() mainWindow.settingsContainer.backgroundPanel = mainWindow.settingsContainer:addPanel(1, 1, mainWindow.settingsContainer.width, mainWindow.settingsContainer.height, 0x0, 30) mainWindow.settingsContainer.backgroundPanel.onTouch = hideSettingsContainer mainWindow.settingsContainer.isHidden = true + + mainWindow.autocompleteWindow = mainWindow:addObject(1, 1, 40, 1) + mainWindow.autocompleteWindow.maximumHeight = 8 + mainWindow.autocompleteWindow.matches = {} + mainWindow.autocompleteWindow.fromMatch = 1 + mainWindow.autocompleteWindow.currentMatch = 1 + mainWindow.autocompleteWindow.isHidden = true + mainWindow.autocompleteWindow.draw = function(object) + mainWindow.autocompleteWindow.x, mainWindow.autocompleteWindow.y = convertTextPositionToScreenCoordinates(mainWindow.autocompleteWindow.currentWordStarting, cursor.position.line) + mainWindow.autocompleteWindow.x, mainWindow.autocompleteWindow.y = mainWindow.autocompleteWindow.x, mainWindow.autocompleteWindow.y + 1 + + object.height = object.maximumHeight + if object.height > #object.matches then object.height = #object.matches end + + buffer.square(object.x, object.y, object.width, object.height, 0xFFFFFF, 0x0, " ") + + local y = object.y + for i = object.fromMatch, #object.matches do + local firstColor, secondColor = 0x3C3C3C, 0x777777 + + if i == object.currentMatch then + buffer.square(object.x, y, object.width, 1, 0x2D2D2D, 0xEEEEEE, " ") + firstColor, secondColor = 0xEEEEEE, 0x999999 + end + + buffer.text(object.x + 1, y, secondColor, unicode.sub(object.matches[i][1], 1, object.width - 2)) + buffer.text(object.x + 1, y, firstColor, unicode.sub(object.matches[i][2], 1, object.width - 2)) + + y = y + 1 + if y > object.y + object.height - 1 then break end + end + + if object.height < #object.matches then + GUI.scrollBar(object.x + object.width - 1, object.y, 1, object.height, 0x444444, 0x00DBFF, 1, #object.matches, object.currentMatch, object.height, 1, true):draw() + end + end mainWindow.onAnyEvent = function(eventData) if eventData[1] == "touch" and isClickedOnCodeArea(eventData[3], eventData[4]) then @@ -1327,7 +1492,7 @@ local function createWindow() editOrRightClickMenu.x, editOrRightClickMenu.y = eventData[3], eventData[4] editOrRightClickMenu:show() else - setCursorPositionAndClearSelection(convertScreenCoordinatesToCursorPosition(eventData[3], eventData[4])) + setCursorPositionAndClearSelection(convertScreenCoordinatesToTextPosition(eventData[3], eventData[4])) local newUptime = computer.uptime() if newUptime - lastClickUptime <= config.doubleClickDelay then selectWord() end @@ -1339,7 +1504,7 @@ local function createWindow() if eventData[5] ~= 1 then mainWindow.codeView.selections[1] = mainWindow.codeView.selections[1] or {from = {}, to = {}} mainWindow.codeView.selections[1].from.symbol, mainWindow.codeView.selections[1].from.line = cursor.position.symbol, cursor.position.line - mainWindow.codeView.selections[1].to.symbol, mainWindow.codeView.selections[1].to.line = fixCursorPosition(convertScreenCoordinatesToCursorPosition(eventData[3], eventData[4])) + mainWindow.codeView.selections[1].to.symbol, mainWindow.codeView.selections[1].to.line = fixCursorPosition(convertScreenCoordinatesToTextPosition(eventData[3], eventData[4])) if mainWindow.codeView.selections[1].from.line > mainWindow.codeView.selections[1].to.line then mainWindow.codeView.selections[1].from.line, mainWindow.codeView.selections[1].to.line = swap(mainWindow.codeView.selections[1].from.line, mainWindow.codeView.selections[1].to.line) @@ -1362,6 +1527,10 @@ local function createWindow() elseif eventData[4] == 27 then config.enableAutoBrackets = not config.enableAutoBrackets saveConfig() + -- I + elseif eventData[4] == 23 then + config.enableAutocompletion = not config.enableAutocompletion + saveConfig() -- A elseif eventData[4] == 30 then selectAll() @@ -1439,7 +1608,11 @@ local function createWindow() end -- Enter elseif eventData[4] == 28 then - enter() + if mainWindow.autocompleteWindow.isHidden then + enter() + else + pasteSelectedAutocompletion() + end -- F5 elseif eventData[4] == 63 then run() @@ -1480,7 +1653,8 @@ local function createWindow() updateRAMProgressBar() mainWindow:draw() if cursor.blinkState then - local x, y = mainWindow.codeView.codeAreaPosition + cursor.position.symbol - mainWindow.codeView.fromSymbol + 1, mainWindow.codeView.y + cursor.position.line - mainWindow.codeView.fromLine + -- local x, y = mainWindow.codeView.codeAreaPosition + cursor.position.symbol - mainWindow.codeView.fromSymbol + 1, mainWindow.codeView.y + cursor.position.line - mainWindow.codeView.fromLine + local x, y = convertTextPositionToScreenCoordinates(cursor.position.symbol, cursor.position.line) if x >= mainWindow.codeView.codeAreaPosition + 1 and x <= mainWindow.codeView.codeAreaPosition + mainWindow.codeView.codeAreaWidth - 2 and diff --git a/lib/syntax.lua b/lib/syntax.lua index fbc44a25..9b316c2d 100755 --- a/lib/syntax.lua +++ b/lib/syntax.lua @@ -11,7 +11,7 @@ syntax.indentationSeparator = "│" syntax.colorScheme = { background = 0x1E1E1E, - text = 0xffffff, + text = 0xEEEEEE, strings = 0x99FF80, loops = 0xffff98, comments = 0x888888,