From 146fa814e5f587a9464111869329158147d01add Mon Sep 17 00:00:00 2001 From: Robert Jelic <36573031+NoryiE@users.noreply.github.com> Date: Sat, 2 Apr 2022 15:28:43 +0200 Subject: [PATCH] Update NyoUI.lua --- NyoUI.lua | 473 ++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 408 insertions(+), 65 deletions(-) diff --git a/NyoUI.lua b/NyoUI.lua index 43202f9..50de700 100644 --- a/NyoUI.lua +++ b/NyoUI.lua @@ -1,8 +1,3 @@ --- Shad's GUI free for everyone to use -local debugger = true - - - animation = {__type = "Animation", name = ""} animation.__index = animation @@ -14,6 +9,8 @@ local activeFrame local _frames = {} local animations = {} local keyModifier = {} +local parentTerminal = term.current() + --Utility Functions: local function getTextHorizontalAlign(text, w, textAlign) @@ -148,7 +145,7 @@ end --Object Constructors: --(base class for every element/object even frames) function object:new() - local newElement = {__type = "Object",name="",links={},zIndex=1,drawCalls=0,x=1,y=1,w=1,h=1,textAlign="left",draw=false,changed=true,bgcolor=colors.black,fgcolor=colors.white,text="",hanchor="left",vanchor="top"} + local newElement = {__type = "Object",name="",links={},zIndex=1,drawCalls=0,x=1,y=1,w=1,h=1,draw=false,changed=true,bgcolor=colors.black,fgcolor=colors.white,hanchor="left",vanchor="top"} setmetatable(newElement, {__index = self}) return newElement end @@ -192,14 +189,14 @@ end input = object:new() function input:new() - local newElement = {__type = "Input",zIndex=5,bgcolor=colors.lightBlue,fgcolor=colors.black,w=5, value = ""} + local newElement = {__type = "Input",zIndex=5,bgcolor=colors.lightBlue,fgcolor=colors.black,w=5, value = "", iType = "text"} setmetatable(newElement, {__index = self}) return newElement end button = object:new() function button:new() - local newElement = {__type = "Button",zIndex=5,bgcolor=colors.lightBlue,fgcolor=colors.black,w=5,horizontalTextAlign="center",verticalTextAlign="center"} + local newElement = {__type = "Button",zIndex=5,bgcolor=colors.lightBlue,fgcolor=colors.black,w=5,horizontalTextAlign="center",verticalTextAlign="center",value=""} setmetatable(newElement, {__index = self}) return newElement end @@ -213,21 +210,28 @@ end list = object:new() function list:new() - local newElement = {__type = "List",index=1,colorIndex=1,textColorIndex=1,zIndex=5,itemColors={colors.lightGray},itemTextColors={colors.black},symbol=">",bgcolor=colors.lightGray,fgcolor=colors.black,w=5,horizontalTextAlign="center",items={},value={text=""}} + local newElement = {__type = "List",index=1,colorIndex=1,textColorIndex=1,zIndex=5,itemColors={colors.lightGray},itemTextColors={colors.black},symbol=">",bgcolor=colors.lightGray,fgcolor=colors.black,w=8,h=5,horizontalTextAlign="center",items={},value={text=""}} setmetatable(newElement, {__index = self}) return newElement end textfield = object:new() function textfield:new() - local newElement = {__type = "Textfield",hIndex=1,wIndex=1,textX=1,textY=1,zIndex=5,bgcolor=colors.lightBlue,fgcolor=colors.black,w=5,h=2,value="",lines={""}} + local newElement = {__type = "Textfield",hIndex=1,wIndex=1,textX=1,textY=1,zIndex=5,bgcolor=colors.gray,fgcolor=colors.black,w=10,h=4,value="",lines={""}} setmetatable(newElement, {__index = self}) return newElement end scrollbar = object:new() function scrollbar:new() - local newElement = {__type = "Scrollbar",value=1,zIndex=5,bgcolor=colors.gray,fgcolor=colors.black,w=5,h=2,barType="vertical", symbolColor=colors.lightGray, symbol = " "} + local newElement = {__type = "Scrollbar",value=1,zIndex=5,bgcolor=colors.gray,fgcolor=colors.black,w=5,h=1,barType="vertical", symbolColor=colors.lightGray, symbol = " "} + setmetatable(newElement, {__index = self}) + return newElement +end + +program = object:new() +function program:new() + local newElement = {__type = "Program",value="",zIndex=5,bgcolor=colors.black,fgcolor=colors.white,w=12,h=6} setmetatable(newElement, {__index = self}) return newElement end @@ -241,7 +245,7 @@ function frame:new(name,scrn,frameObj) newElement = object:copy(frameObj) newElement.fWindow = window.create(parent,1,1,frameObj.w,frameObj.h) else - newElement = {__type = "Frame",name=name, parent = parent,zIndex=1, fWindow = window.create(parent,1,1,w,h),x=1,y=1,w=w,h=h, objects={},objZKeys={},bgcolor = colors.black, fgcolor=colors.white,barActive = false, title="New Frame", titlebgcolor = colors.lightBlue, titlefgcolor = colors.black, horizontalTextAlign="left",focusedObject={}, isMoveable = false} + newElement = {__type = "Frame",name=name, parent = parent,zIndex=1, fWindow = window.create(parent,1,1,w,h),x=1,y=1,w=w,h=h, objects={},objZKeys={},bgcolor = colors.black, fgcolor=colors.white,barActive = false, title="New Frame", titlebgcolor = colors.lightBlue, titlefgcolor = colors.black, horizontalTextAlign="left",focusedObject={}, isMoveable = false,cursorBlink=false} end setmetatable(newElement, {__index = self}) return newElement @@ -322,7 +326,7 @@ function object:onChange(func) return self end -function object:onKeyClick(func) +function object:onKey(func) if(self.keyEventFunc==nil)then self.keyEventFunc = {} end table.insert(self.keyEventFunc,func) return self @@ -341,12 +345,6 @@ function object:onGetFocus(func) end -------------------- -function object:setText(text) - self.text = text - self.changed = true - return self -end - function object:setSize(w,h) self.w = tonumber(w) self.h = tonumber(h) @@ -396,9 +394,6 @@ function object:setValue(val) end function object:getValue() - if(tonumber(self.value)~=nil)then - return tonumber(self.value) - end return self.value; end @@ -454,18 +449,6 @@ function object:relativeToAbsolutePosition(x,y) -- relative position return x, y end -function object:relativeToAbsolutePositionOLD(x,y) -- relative position - if(x==nil)then x = 0 end - if(y==nil)then y = 0 end - - x = x+self.x;y=y+self.y - if(self.frame~=nil)then - x,y = self.frame:relativeToAbsolutePosition(x,y) - x = x-1; y = y-1 - end - return x, y -end - function object:getAnchorPosition(x,y) if(x==nil)then x = self.x end if(y==nil)then y = self.y end @@ -478,7 +461,7 @@ function object:getAnchorPosition(x,y) return x, y end -function object:isFocusedElement() +function object:isFocusedObject() if(self.frame~=nil)then return self == self.frame.focusedObject end @@ -507,6 +490,10 @@ local vx,vy = self:relativeToAbsolutePosition(self:getAnchorPosition()) return false end +function object:eventListener(event,p1,p2,p3,p4) + +end + function object:keyEvent(event,typ) -- internal class, dont use unless you know what you do if(self.keyEventFunc~=nil)then callAll(self.keyEventFunc,self,typ) @@ -555,7 +542,7 @@ end --Frame object NyoUI.createFrame = function(name, scrn) -- this is also just a frame, but its a level 0 frame -local obj = frame:new(name,scrn) +local obj = frame:new(name,scrn or parentTerminal) if(_frames[name] == nil)then _frames[name] = obj obj.fWindow.setVisible(false) @@ -605,6 +592,7 @@ end function frame:showBar(active) -- shows the top bar self.barActive = active ~= nil and active or true + self.changed = true return self end @@ -743,6 +731,7 @@ function frame:drawObject() -- this draws the frame, you dont need that functio self.fWindow.setCursorPos(1,1) self.fWindow.write(getTextHorizontalAlign(self.title,self.w,self.horizontalTextAlign)) end + local keys = {} for k in pairs(self.objects)do table.insert(keys,k) @@ -754,10 +743,25 @@ function frame:drawObject() -- this draws the frame, you dont need that functio end end end + if(self.focusedObject.cursorX~=nil)and(self.focusedObject.cursorY~=nil)then self.fWindow.setCursorPos(self.focusedObject.cursorX, self.focusedObject.cursorY) - --self.fWindow.setCursorBlink(true) end + + if(self.focusedObject.__type=="Program")then + if not(self.focusedObject.process:isDead())then + term.redirect(self.focusedObject.pWindow) + self.focusedObject.pWindow.restoreCursor() + end + else + self.fWindow.setTextColor(self.cursorColor or self.fgcolor) + self.fWindow.setCursorBlink(self.cursorBlink) + end + if(self.focusedObject.__type=="Frame")then + term.redirect(self.focusedObject.fWindow) + self.focusedObject.fWindow.restoreCursor() + end + self.fWindow.setBackgroundColor(self.bgcolor) self.fWindow.setTextColor(self.fgcolor) self.fWindow.setVisible(true) @@ -765,6 +769,14 @@ function frame:drawObject() -- this draws the frame, you dont need that functio end end +function frame:setCursorBlink(bool,color) + if(self.frame~=nil)then + --self.frame:setCursorBlink(bool) + end + self.cursorBlink = bool + self.cursorColor = color +end + function frame:mouseEvent(event,typ,x,y) -- internal mouse event, should make it local but as lazy as i am.. local fx,fy = self:relativeToAbsolutePosition(self:getAnchorPosition()) if(self.drag)and(self.draw)then @@ -789,6 +801,18 @@ function frame:mouseEvent(event,typ,x,y) -- internal mouse event, should make it for k in pairs(self.objects)do table.insert(keys,k) end + + for _,b in pairs(keys)do + for _,v in rpairs(self.objects[b])do + if(v.draw~=false)then + if(v.__type=="Frame")then + v:removeFocusedElement() + end + end + end + end + + for _,b in pairs(keys)do for _,v in rpairs(self.objects[b])do if(v.draw~=false)then @@ -812,6 +836,40 @@ function frame:mouseEvent(event,typ,x,y) -- internal mouse event, should make it return false end +function frame:eventListener(event,p1,p2,p3,p4) + local keys = {} + local terminatingprogram = false + for k in pairs(self.objects)do + table.insert(keys,k) + end + for _,b in pairs(keys)do + for _,v in rpairs(self.objects[b])do + if(v.draw~=false)then + v:eventListener(event,p1,p2,p3,p4) + + if(v:isFocusedObject()and(v.__type=="Program"))then + terminatingprogram = true + end + end + end + end + --if(event=="terminate")then NyoUI.debug(terminatingprogram) end -- kack buggy + if(event=="terminate")and(terminatingprogram == false)then + if(self.terminatedTime==nil)then self.terminatedTime = 0 end + if(self.terminatedTime+5<=os.clock())then + --if("asd"=="b")then + NyoUI.stopUpdate() + for k,v in pairs(_frames)do + v:hide() + end + term.redirect(parentTerminal) + term.setCursorPos(1,1) + term.clear() + --end + end + end +end + function frame:keyEvent(event,key)-- internal key event, should make it local but as lazy i am.. for _,b in pairs(self.objects)do for _,v in pairs(b)do @@ -857,7 +915,7 @@ end function frame:loseFocusEvent()--event which gets fired when the frame lost the focus in this case i remove the cursor blink from the active input object object.loseFocusEvent(self) - self.inputActive = false + self.cursorBlink = false self.fWindow.setCursorBlink(false) end @@ -991,11 +1049,11 @@ function radio:setSymbol(symbol) return self end -function radio:addItem(text,x,y,bgcolor,fgcolor) +function radio:addItem(text,x,y,bgcolor,fgcolor,...) if(x==nil)or(y==nil)then - table.insert(self.items,{text=text,bgcolor=(bgcolor ~= nil and bgcolor or self.bgcolor),fgcolor=(fgcolor ~= nil and fgcolor or self.fgcolor),x=0,y=#self.items}) + table.insert(self.items,{text=text,bgcolor=(bgcolor ~= nil and bgcolor or self.bgcolor),fgcolor=(fgcolor ~= nil and fgcolor or self.fgcolor),x=0,y=#self.items,vars=table.pack(...)}) else - table.insert(self.items,{text=text,bgcolor=(bgcolor ~= nil and bgcolor or self.bgcolor),fgcolor=(fgcolor ~= nil and fgcolor or self.fgcolor),x=x,y=y}) + table.insert(self.items,{text=text,bgcolor=(bgcolor ~= nil and bgcolor or self.bgcolor),fgcolor=(fgcolor ~= nil and fgcolor or self.fgcolor),x=x,y=y,vars=table.pack(...)}) end if(#self.items==1)then self:setValue(self.items[1]) @@ -1003,6 +1061,22 @@ function radio:addItem(text,x,y,bgcolor,fgcolor) return self end +function radio:removeItem(item) + if(type(item)=="table")then + for k,v in pairs(self.items)do + if(v==item)then + table.remove(self.items,k) + break; + end + end + elseif(type(item)=="number")then + if(self.items[item]~=nil)then + table.remove(self.items,item) + end + end + return self +end + function radio:mouseEvent(event,typ,x,y) if(object.mouseEvent(self,event,typ,x,y))then if(#self.items>0)then @@ -1069,7 +1143,7 @@ function label:drawObject() self.frame.fWindow.setCursorPos(self:getAnchorPosition()) self.frame.fWindow.setBackgroundColor(self.bgcolor) self.frame.fWindow.setTextColor(self.fgcolor) - self.frame.fWindow.write(self.value) + self.frame.fWindow.write(self.value:sub(1,self.w)) self.changed = false end end @@ -1086,6 +1160,12 @@ function frame:addInput(name) end end +function input:setInputType(typ) + self.iType = typ + self.changed = true + return self +end + function input:mouseEvent(event,typ,x,y) if(object.mouseEvent(self,event,typ,x,y))then local anchX,anchY = self:getAnchorPosition() @@ -1098,8 +1178,20 @@ function input:mouseEvent(event,typ,x,y) return false end +function input:getValue() + if(self.iType=="number")then + if(tonumber(self.value)~=nil)then + return tonumber(self.value) + else + self:setValue(0) + return 0 + end + end + return self.value +end + function input:keyEvent(event,key) - if(self:isFocusedElement())then + if(self:isFocusedObject())then if(self.draw)then if(event=="key")then if(key==259)then @@ -1113,7 +1205,17 @@ function input:keyEvent(event,key) end end if(event=="char")then - self:setValue(self.value..key) + if(self.iType=="number")then + local cache = self.value + if (key==".")or(tonumber(key)~=nil)then + self:setValue(self.value..key) + end + if(tonumber(self.value)==nil)then + self:setValue(cache) + end + else + self:setValue(self.value..key) + end end local anchX,anchY = self:getAnchorPosition() self.cursorX = anchX+(string.len(self.value) < self.w and string.len(self.value) or self.w-1) @@ -1131,8 +1233,18 @@ function input:drawObject() if(self.draw)then if(string.len(self.value)>=self.w)then text = string.sub(self.value, string.len(self.value)-self.w+2, string.len(self.value)) + if(self.iType=="password")then + text = string.sub(string.rep("*",self.value:len()), string.len(self.value)-self.w+2, string.len(self.value)) + else + text = string.sub(self.value, string.len(self.value)-self.w+2, string.len(self.value)) + end else - text = self.value + if(self.iType=="password")then + text = string.rep("*",self.value:len()) + else + text = self.value + end + end local n = self.w-string.len(text) text = text..string.rep(" ", n) @@ -1147,13 +1259,17 @@ end function input:getFocusEvent() object.getFocusEvent(self) - self.frame.fWindow.setCursorPos(1,1) - self.frame.fWindow.setCursorBlink(true) + self.frame:setCursorBlink(true,self.fgcolor) end function input:loseFocusEvent() object.loseFocusEvent(self) - self.frame.fWindow.setCursorBlink(false) + if(self.iType=="number")then + if(tonumber(self.value)==nil)then + self:setValue(0) + end + end + self.frame:setCursorBlink(false) end function frame:addButton(name) @@ -1177,7 +1293,7 @@ function button:drawObject() for line=0,self.h-1 do self.frame.fWindow.setCursorPos(x,y+line) if(line==yOffset)then - self.frame.fWindow.write(getTextHorizontalAlign(self.text, self.w, self.horizontalTextAlign)) + self.frame.fWindow.write(getTextHorizontalAlign(self.value, self.w, self.horizontalTextAlign)) else self.frame.fWindow.write(string.rep(" ", self.w)) end @@ -1186,6 +1302,9 @@ function button:drawObject() end end +function button:setText(text) + return self:setValue(text) +end function frame:addDropdown(name) if(self:getObject(name) == nil)then local obj = dropdown:new() @@ -1197,14 +1316,56 @@ function frame:addDropdown(name) end end -function dropdown:addItem(text,bgcolor,fgcolor) - table.insert(self.items,{text=text,bgcolor=(bgcolor ~= nil and bgcolor or self.bgcolor),fgcolor=(fgcolor ~= nil and fgcolor or self.fgcolor)}) +function dropdown:addItem(text,bgcolor,fgcolor,...) + table.insert(self.items,{text=text,bgcolor=(bgcolor ~= nil and bgcolor or self.bgcolor),fgcolor=(fgcolor ~= nil and fgcolor or self.fgcolor),vars=...}) if(#self.items==1)then self:setValue(self.items[1]) end return self end +function dropdown:removeItem(item) + if(type(item)=="table")then + for k,v in pairs(self.items)do + if(v==item)then + table.remove(self.items,k) + break; + end + end + elseif(type(item)=="number")then + if(self.items[item]~=nil)then + table.remove(self.items,item) + end + end + return self +end + +function dropdown:setActiveItemBackground(color) + self.activeItemBackground = color + self.changed = true + return self +end + +function dropdown:setActiveItemForeground(color) + self.activeItemForeground = color + self.changed = true + return self +end + +function dropdown:setItemColors(...) + self.itemColors = table.pack(...) + self.itemColorIndex = 1 + self.changed = true + return self +end + +function dropdown:setItemTextColors(...) + self.itemTextColors = table.pack(...) + self.itemTextColorIndex = 1 + self.changed = true + return self +end + function dropdown:drawObject() object.drawObject(self) -- Base class if(self.draw)then @@ -1213,12 +1374,40 @@ function dropdown:drawObject() self.frame.fWindow.setTextColor(self.value.fgcolor) self.frame.fWindow.write(getTextHorizontalAlign(self.value.text, self.w, self.horizontalTextAlign)) - if(self:isFocusedElement())then + if(self:isFocusedObject())then if(#self.items>0)then + self.itemColorIndex = 1 + self.itemTextColorIndex = 1 local index = 1 for _,v in ipairs(self.items)do local objx, objy = self:getAnchorPosition() self.frame.fWindow.setBackgroundColor(v.bgcolor) + if(self.itemColors~=nil)then + if(#self.itemColors>0)then + self.frame.fWindow.setBackgroundColor(self.itemColors[self.itemColorIndex]) + self.itemColorIndex = self.itemColorIndex + 1 + if(self.itemColorIndex>#self.itemColors)then + self.itemColorIndex = 1 + end + end + end + if(self.itemTextColors~=nil)then + if(#self.itemTextColors>0)then + self.frame.fWindow.setTextColor(self.itemTextColors[self.itemTextColorIndex]) + self.itemTextColorIndex = self.itemTextColorIndex + 1 + if(self.itemTextColorIndex>#self.itemTextColors)then + self.itemTextColorIndex = 1 + end + end + end + if(v==self.value)then + if(self.activeItemBackground~=nil)then + self.frame.fWindow.setBackgroundColor(self.activeItemBackground) + end + if(self.activeItemForeground~=nil)then + self.frame.fWindow.setTextColor(self.activeItemForeground) + end + end self.frame.fWindow.setTextColor(v.fgcolor) self.frame.fWindow.setCursorPos(objx,objy+index) self.frame.fWindow.write(getTextHorizontalAlign(v.text, self.w, self.horizontalTextAlign)) @@ -1232,7 +1421,7 @@ end function dropdown:mouseEvent(event,typ,x,y) object.mouseEvent(self,event,typ,x,y) - if(self:isFocusedElement())then + if(self:isFocusedObject())then if(#self.items>0)then local dx,dy = self:relativeToAbsolutePosition(self:getAnchorPosition()) local index = 1 @@ -1382,17 +1571,17 @@ function list:setIndex(index) return self end -function list:removeItem(element) - if(type(element)=="table")then +function list:removeItem(item) + if(type(item)=="table")then for k,v in pairs(self.items)do - if(v==element)then + if(v==item)then table.remove(self.items,k) break; end end - elseif(type(element)=="number")then - if(self.items[element]~=nil)then - table.remove(self.items,element) + elseif(type(item)=="number")then + if(self.items[item]~=nil)then + table.remove(self.items,item) end end @@ -1432,7 +1621,7 @@ function frame:addTextfield(name) end function textfield:keyEvent(event,key) - if(self:isFocusedElement())then + if(self:isFocusedObject())then if(self.draw)then local anchX,anchY = self:getAnchorPosition() if(event=="key")then @@ -1576,7 +1765,7 @@ function textfield:mouseEvent(event,typ,x,y) end self.cursorX = anchX+self.textX-self.wIndex self.cursorY = anchY+self.textY-self.hIndex - self.frame.fWindow.setCursorBlink(true) + self.frame:setCursorBlink(true) self.changed = true end end @@ -1621,13 +1810,12 @@ end function textfield:getFocusEvent() object.getFocusEvent(self) - self.frame.fWindow.setCursorPos(1,1) - self.frame.fWindow.setCursorBlink(true) + self.frame:setCursorBlink(true) end function textfield:loseFocusEvent() object.loseFocusEvent(self) - self.frame.fWindow.setCursorBlink(false) + self.frame:setCursorBlink(false) end @@ -1750,10 +1938,164 @@ function scrollbar:setBarType(typ) return self end +local processes = {} +local process = {} +local processId = 0 +function process:new(path,window,...) + local args = table.pack( ... ) + local newP = setmetatable({path=path},{__index = self}) + newP.window = window + newP.processId = processId + newP.coroutine = coroutine.create(function() + os.run({NyoUI=NyoUI}, path, table.unpack(args)) + end) + processes[processId] = newP + processId = processId + 1 + return newP +end +function process:resume(event, ...) + term.redirect(self.window) + local ok, result = coroutine.resume( self.coroutine, event, ... ) + self.window = term.current() + if ok then + self.filter = result + else + NyoUI.debug( result ) + end +end +function process:isDead() + if(self.coroutine~=nil)then + if(coroutine.status(self.coroutine)=="dead")then + table.remove(processes, self.processId) + return true + end + else + return true + end + return false +end +function process:getStatus() + if(self.coroutine~=nil)then + return coroutine.status(self.coroutine) + end + return nil +end + +function process:start() + coroutine.resume(self.coroutine) +end + +function frame:addProgram(name) + if(self:getObject(name) == nil)then + local obj = program:new() + obj.name = name;obj.frame=self; + obj.pWindow = window.create(self.fWindow,obj.x,obj.y,obj.w,obj.h) + self:addObject(obj) + return obj; + else + return nil, "id "..name.." already exists"; + end +end + +function program:show() + object.show(self) + self.pWindow.setBackgroundColor(self.bgcolor) + self.pWindow.setTextColor(self.fgcolor) + self.pWindow.setVisible(true) + return self +end + +function program:hide() + object.hide(self) + self.pWindow.setVisible(false) + return self +end + +function program:setPosition(x,y) + object.setPosition(self,x,y) + self.pWindow.reposition(self.x, self.y) + return self +end + +function program:setSize(w,h) + object.setSize(self,w,h) + self.pWindow.reposition(self.x, self.y, self.w, self.h) + return self +end + +function program:getStatus() + return process:getStatus() +end + +function program:drawObject() + object.drawObject(self) -- Base class + if(self.draw)then + self.pWindow.redraw() + self.changed = false + end +end + +function program:execute(path,...) + self.process = process:new(path, self.pWindow, ...) + self.process:resume() + return self +end + +function program:stop() + if(self.process~=nil)then + if not(self.process:isDead())then + self.process:resume("terminate") + if(self.process:isDead())then + self.pWindow.setCursorBlink(false) + end + end + end + return self +end + +function program:mouseEvent(event,typ,x,y) + if(object.mouseEvent(self,event,typ,x,y))then + if(self.process==nil)then return false end + if not(self.process:isDead())then + local absX,absY = self:relativeToAbsolutePosition(self:getAnchorPosition()) + self.process:resume(event, typ, x-absX+1, y-absY+1) + end + return true + end +end + +function program:keyEvent(event,key) + if(self:isFocusedObject())then + if(self.process==nil)then return false end + if not(self.process:isDead())then + object.keyEvent(event,key) + if(self.draw)then + self.process:resume(event, key) + end + end + end +end + +function program:eventListener(event,p1,p2,p3,p4) + object.eventListener(self,event,p1,p2,p3,p4) + if(self.process==nil)then return end + if not(self.process:isDead())then + if(event~="mouse_click")and(event~="mouse_up")and(event~="mouse_scroll")and(event~="mouse_drag")and(event~="key_up")and(event~="key")and(event~="char")and(event~="terminate")then + self.process:resume(event,p1,p2,p3,p4) + end + if(event=="terminate")and(self:isFocusedObject())then + self.frame.terminatedTime = os.clock() + self.process:resume(event) + self.pWindow.clear() + self.pWindow.setCursorPos(1,1) + self.pWindow.setCursorBlink(false) + end + end +end local function checkTimer(timeObject) for a,b in pairs(activeFrame.objects)do @@ -1806,7 +2148,8 @@ function NyoUI.startUpdate() handleChangedObjectsEvent() NyoUI.updater = true while NyoUI.updater do - local event, p1,p2,p3,p4 = os.pullEvent() + local event, p1,p2,p3,p4 = os.pullEventRaw() + activeFrame:eventListener(event,p1,p2,p3,p4) if(event=="mouse_click")then activeFrame:mouseEvent(event,p1,p2,p3) end