diff --git a/Applications/Settings.app/Modules/2_Icons/Main.lua b/Applications/Settings.app/Modules/2_Icons/Main.lua index 27e0a81c..4d07caac 100644 --- a/Applications/Settings.app/Modules/2_Icons/Main.lua +++ b/Applications/Settings.app/Modules/2_Icons/Main.lua @@ -24,21 +24,6 @@ module.onTouch = function() window.contentLayout:addChild(GUI.textBox(1, 1, 36, 1, nil, 0xA5A5A5, {localization.appearanceTransparencyInfo}, 1, 0, 0, true, true)) - window.contentLayout:addChild(GUI.text(1, 1, 0x2D2D2D, localization.appearanceColorScheme)) - - local function addColorSelector(key, ...) - local c = window.contentLayout:addChild(GUI.colorSelector(1, 1, 36, 1, userSettings[key], ...)) - c.onColorSelected = function() - userSettings[key] = c.color - - system.updateColorScheme() - workspace:draw() - system.saveUserSettings() - end - end - - addColorSelector("interfaceColorDesktopBackground", localization.appearanceDesktopBackground) - window.contentLayout:addChild(GUI.text(1, 1, 0x2D2D2D, localization.appearanceSize)) local iconWidthSlider = window.contentLayout:addChild(GUI.slider(1, 1, 36, 0x66DB80, 0xE1E1E1, 0xFFFFFF, 0xA5A5A5, 8, 16, userSettings.iconWidth, false, localization.appearanceHorizontal .. ": ", "")) diff --git a/Libraries/Filesystem.lua b/Libraries/Filesystem.lua index 1b12dd2f..1043fc2b 100644 --- a/Libraries/Filesystem.lua +++ b/Libraries/Filesystem.lua @@ -642,6 +642,7 @@ end function loadfile(path) local data, reason = filesystem.read(path) + if data then return load(data, "=" .. path) end @@ -653,6 +654,7 @@ function dofile(path, ...) local result, reason = loadfile(path) if result then local data = {xpcall(result, debug.traceback, ...)} + if data[1] then return table.unpack(data, 2) else diff --git a/Libraries/GUI.lua b/Libraries/GUI.lua index a509882f..fee80042 100755 --- a/Libraries/GUI.lua +++ b/Libraries/GUI.lua @@ -307,7 +307,7 @@ local function containerRemoveChildren(container, from, to) end end -local function getRectangleIntersection(R1X1, R1Y1, R1X2, R1Y2, R2X1, R2Y1, R2X2, R2Y2) +local function getRectangleBounds(R1X1, R1Y1, R1X2, R1Y2, R2X1, R2Y1, R2X2, R2Y2) if R2X1 <= R1X2 and R2Y1 <= R1Y2 and R2X2 >= R1X1 and R2Y2 >= R1Y1 then return math.max(R2X1, R1X1), @@ -321,7 +321,8 @@ end local function containerDraw(container) local R1X1, R1Y1, R1X2, R1Y2, child = screen.getDrawLimit() - local intersectionX1, intersectionY1, intersectionX2, intersectionY2 = getRectangleIntersection( + + local boundsX1, boundsY1, boundsX2, boundsY2 = getRectangleBounds( R1X1, R1Y1, R1X2, @@ -332,8 +333,8 @@ local function containerDraw(container) container.y + container.height - 1 ) - if intersectionX1 then - screen.setDrawLimit(intersectionX1, intersectionY1, intersectionX2, intersectionY2) + if boundsX1 then + screen.setDrawLimit(boundsX1, boundsY1, boundsX2, boundsY2) for i = 1, #container.children do child = container.children[i] @@ -366,20 +367,23 @@ end -------------------------------------------------------------------------------- local function workspaceStart(workspace, eventPullTimeout) - local animation, animationIndex, animationOnFinishMethodsIndex, animationOnFinishMethods, roundedX, roundedY, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32 + local animation, animationIndex, animationOnFinishMethodsIndex, animationOnFinishMethods, roundedX, roundedY, isScreenEvent, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32 - local function handleContainer(isScreenEvent, currentContainer, intersectionX1, intersectionY1, intersectionX2, intersectionY2) - local currentContainerPassed, child, newIntersectionX1, newIntersectionY1, newIntersectionX2, newIntersectionY2 + local function handleContainer(currentContainer, boundsX1, boundsY1, boundsX2, boundsY2) + local currentContainerPassed, child, newBoundsX1, newBoundsY1, newBoundsX2, newBoundsY2 if isScreenEvent then roundedX, roundedY = math.ceil(e3), math.ceil(e4) - if - roundedX < intersectionX1 - or roundedX > intersectionX2 - or roundedY < intersectionY1 - or roundedY > intersectionY2 - then + if not ( + roundedX >= boundsX1 + and roundedX <= boundsX2 + + and roundedY >= boundsY1 + and roundedY <= boundsY2 + + or currentContainer.ignoresBoundsCheckOnScreenEvents + ) then return end @@ -397,12 +401,13 @@ local function workspaceStart(workspace, eventPullTimeout) child = currentContainer.children[i] if not child.hidden then + -- Container if child.children then - newIntersectionX1, newIntersectionY1, newIntersectionX2, newIntersectionY2 = getRectangleIntersection( - intersectionX1, - intersectionY1, - intersectionX2, - intersectionY2, + newBoundsX1, newBoundsY1, newBoundsX2, newBoundsY2 = getRectangleBounds( + boundsX1, + boundsY1, + boundsX2, + boundsY2, child.x, child.y, child.x + child.width - 1, @@ -410,19 +415,20 @@ local function workspaceStart(workspace, eventPullTimeout) ) if - newIntersectionX1 + newBoundsX1 and handleContainer( - isScreenEvent, child, - newIntersectionX1, - newIntersectionY1, - newIntersectionX2, - newIntersectionY2, + newBoundsX1, + newBoundsY1, + newBoundsX2, + newBoundsY2, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32 ) then return true end + + -- Not container else if workspace.needConsume then workspace.needConsume = nil @@ -431,7 +437,7 @@ local function workspaceStart(workspace, eventPullTimeout) end if isScreenEvent then - if child:isPointInside(roundedX, roundedY) then + if child:isPointInside(roundedX, roundedY) or child.ignoresBoundsCheckOnScreenEvents then if child.eventHandler and not child.disabled then child.eventHandler(workspace, child, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32) end @@ -458,12 +464,14 @@ local function workspaceStart(workspace, eventPullTimeout) repeat e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32 = event.pull(workspace.animations and 0 or workspace.eventPullTimeout) - handleContainer( + isScreenEvent = e1 == "touch" or e1 == "drag" or e1 == "drop" or e1 == "scroll" or - e1 == "double_touch", + e1 == "double_touch" + + handleContainer( workspace, workspace.x, workspace.y, @@ -473,6 +481,7 @@ local function workspaceStart(workspace, eventPullTimeout) if workspace.animations then animationIndex, animationOnFinishMethodsIndex, animationOnFinishMethods = 1, 1, {} + -- Продрачиваем анимации и вызываем обработчики кадров while animationIndex <= #workspace.animations do animation = workspace.animations[animationIndex] @@ -4494,7 +4503,7 @@ local function windowDraw(window) return window end -local function windowCheck(window, x, y) +local function windowScreenEventCheck(window, x, y) local child, result for i = #window.children, 1, -1 do @@ -4509,7 +4518,7 @@ local function windowCheck(window, x, y) return true elseif child.children then - result = windowCheck(child, x, y) + result = windowScreenEventCheck(child, x, y) -- Nil causes next child processing if result == true then @@ -4531,10 +4540,12 @@ local function windowEventHandler(workspace, window, e1, e2, e3, e4, ...) if e1 == "touch" then e3, e4 = math.ceil(e3), math.ceil(e4) - if not windowCheck(window, e3, e4) then + if not windowScreenEventCheck(window, e3, e4) then + window.ignoresBoundsCheckOnScreenEvents = true window.lastTouchX, window.lastTouchY = e3, e4 end + -- Focusing window if it's not focused if window ~= window.parent.children[#window.parent.children] then window:focus() @@ -4544,7 +4555,7 @@ local function windowEventHandler(workspace, window, e1, e2, e3, e4, ...) elseif e1 == "drag" and window.lastTouchX then e3, e4 = math.ceil(e3), math.ceil(e4) - if windowCheck(window, e3, e4) then + if windowScreenEventCheck(window, e3, e4) then return end @@ -4554,7 +4565,7 @@ local function windowEventHandler(workspace, window, e1, e2, e3, e4, ...) workspace:draw() elseif e1 == "drop" then - window.lastTouchX, window.lastTouchY = nil, nil + window.lastTouchX, window.lastTouchY, window.ignoresBoundsCheckOnScreenEvents = nil, nil, nil end end diff --git a/Libraries/System.lua b/Libraries/System.lua index 36c15d28..51433c6c 100755 --- a/Libraries/System.lua +++ b/Libraries/System.lua @@ -1067,9 +1067,10 @@ local function iconOnDoubleClick(icon) end local function iconFieldIconEventHandler(workspace, icon, e1, e2, e3, e4, e5, ...) - if e1 == "touch" and icon:isPointInside(e3, e4) then + if e1 == "touch" then local iconField = icon.parent + icon.ignoresBoundsCheckOnScreenEvents = true GUI.focusedObject = iconField icon.lastTouchPosition = icon.lastTouchPosition or {} @@ -1092,7 +1093,7 @@ local function iconFieldIconEventHandler(workspace, icon, e1, e2, e3, e4, e5, .. end end - elseif e1 == "double_touch" and icon:isPointInside(e3, e4) and e5 == 0 then + elseif e1 == "double_touch" and e5 == 0 then iconOnDoubleClick(icon, e1, e2, e3, e4, e5, ...) elseif e1 == "drag" and icon.parent.iconConfigEnabled and icon.lastTouchPosition then @@ -1104,9 +1105,8 @@ local function iconFieldIconEventHandler(workspace, icon, e1, e2, e3, e4, e5, .. workspace:draw() - elseif e1 == "drop" and icon.dragStarted then - icon.dragStarted = nil - icon.lastTouchPosition = nil + elseif e1 == "drop" then + icon.dragStarted, icon.lastTouchPosition, icon.ignoresBoundsCheckOnScreenEvents = nil, nil, nil iconFieldSaveIconPosition( icon.parent, diff --git a/Libraries/Text.lua b/Libraries/Text.lua index 71178bf3..df669c2a 100755 --- a/Libraries/Text.lua +++ b/Libraries/Text.lua @@ -97,7 +97,8 @@ end function text.deserialize(s) checkArg(1, s, "string") - local result, reason = load("return " .. s) + local result, reason = load("return " .. s, "=deserialization", "t", {}) + if result then result, reason = pcall(result)