Let me explain you my problem: after switching from cc to oc, I started to write a simple gui program.
I know that there are some programs that do the same stuff but I want to write it myself, like an exercise.
I want to bind multiple instances of windows with custom screens and gpus, but I dont' exactely know how. I read this thread that "introduced" me to undocumented features like term.internal.open() and term.setViewport(), but I am obviously doing something wrong, because it throws this error:
This is the actual library code (I'm sorry, comments are in Italian, I will translate them as soon as possible to let you understand better)
--DOMINIQUE LABS UI -LiteFox_2000require("color")
component=require("component")
term=require("term")
gpu=component.gpu
--ui class--variabili
ui={}
ui.targetGpu=nil
ui.targetScreen=nil
ui.xMax=nil
ui.yMax=nil
ui.window=nil
ui.elements={}
ui.clickables={}
ui.bgColor=color.black
--funzioni
--crea un nuovo oggetto di classe ui
ui.new=function(self, bgColor, targetGpu, targetScreen, resolutionX, resolutionY)--crea l'oggetto e imposta il modello di riferimento su window
object={}
setmetatable(object, self)
self.__index=self
--assegna al nuovo oggetto le proprietà standard
--se il colore di sfondo non è definito, assegna quello standard
self.bgColor=bgColor or self.bgColor
--se la scheda video è definita, controlla se è presente
--se non è presente, genera un errore, altrimenti la assegna
--se non è definta alcuna scheda video, viene assegnata la gpu relativa all'attuale terminale
if(targetGpu)then--sentinella segnalatrice corrispondenza
local a
for address in component.list("gpu")doif(address==targetGpu)then
a=trueendendif(a)thenobject.targetGpu=component.proxy(targetGpu)else
error("Gpu not found",3)endelseself.targetGpu=gpu
end--se lo schermo è definito, controlla se è presente
--se non è presente, genera un errore, altrimenti lo assegna
--se non è definto alcun schermo, viene assegnato la schermo relativo all'attuale terminale
if(targetScreen) then
--sentinella segnalatrice corrispondenza
local a
for address in component.list("screen") do
if(address==targetScreen) then
a=true
end
end
if(a) then
object.targetScreen=targetScreen
else
error("Screen not found", 3)
end
else
self.targetScreen=gpu.getScreen()
end
--creazione terminale interno e assegnazione gpu e schermo
self.window=term.internal.open()
self.window.gpu=self.targetGpu
self.window.screen=self.targetScreen
--se la risoluzione è definita, la imposta
--se è parzialmente definita, assegna solo la parte modificata
--se non è definta alcuna risoluzione, viene assegnata la risoluzione relativa all'attuale terminale
if(resolutionX and resolutionY)thenobject.xMax=resolutionX
object.yMax=resolutionY
elseif(resolutionX andnot resolutionY)thenobject.xMax=resolutionX
_,object.yMax=gpu.getResolution()
elseif(not resolutionX and resolutionY)thenobject.xMax, _=gpu.getResolution()object.yMax=resolutionY
end--ritorna il nuovo oggetto
returnobjectend--crea un nuovo elemento
ui.addElement=function(self, name, typeOf, xPos, yPos, x_Dim, y_Dim, border_LR, border_TB)--controlla che le dimensioni dell'elemento siano ben definite
if(x_Dim<=0 or y_Dim<=0) then
error("Element has negative dimensions", 2)
end
--controlla che l'elemento sia ben definito all'interno della finestra
if((xPos>0 and yPos>0) and ((xPos+x_Dim)<self.xMax and (yPos+y_Dim)<self.yMax)) then
--se l'elemento esiste già lo sovrascrive, altrimenti ne crea uno nuovo
self.elements[name]=self.elements[name]or{}self.elements[name].typeOf=typeOf
self.elements[name].x=xPos
self.elements[name].y=yPos
self.elements[name].xDim=x_Dim
self.elements[name].yDim=y_Dim
self.elements[name].borderLR=border_LR
self.elements[name].borderTB=border_TB
self.elements[name].description={}else
error("Element out of bounds",2)end--se l'elemento è un pulsante, lo aggiunge alla lista dei cliccabili, altrimenti lo rimuove
if(typeOf=="button") then
self.clickables[name]=self.clickables[name] or {}
self.clickables[name].x1=xPos-border_LR
self.clickables[name].y1=yPos-border_TB
self.clickables[name].x2=x_Dim+border_LR
self.clickables[name].y2=y_Dim+border_TB
else
self.clickables[name]=nil
end
end
--elimina un elemento
ui.removeElement=function (self, name)
--controlla se esiste l'elemento nella tavola
if(self.elements[name])then--se è un pulsante, ne elimina il riferimento in clickables
if(self.elements[name].typeOf=="button")thenself.clickables[name]=nilend--elimina l'elemento
self.elements[name]=nil
else
error("Element is not in table", 2)
end
end
--definisce un elemento in base al tipo
ui.setupElement=function (self, name, value, bgColor1, txtColor1, bgColor2, txtColor2, func)
--controlla se esiste l'elemento nella tavola
if(self.elements[name])thenif(self.elements[name].typeOf=="button")thenself.elements[name].description.bgColor1=bgColor1
self.elements[name].description.txtColor1=txtColor1
self.elements[name].description.bgColor2=bgColor2
self.elements[name].description.txtColor2=txtColor2
self.elements[name].description.value=value
self.elements[name].description.func=func
elseif(self.elements[name].typeOf=="banner")thenself.elements[name].description.bgColor1=bgColor1
self.elements[name].description.txtColor1=txtColor1
self.elements[name].description.value=value
elseif(self.elements[name].typeOf=="bar")thenself.elements[name].description.bgColor1=bgColor1
self.elements[name].description.txtColor1=txtColor1
self.elements[name].description.value=value
else
error("Unrecognized type of element",3)endelse
error("Element is not in table",2)endend--renderizza una schermata
ui.render=function(self)self.targetGpu.bind(self.targetScreen,false)self.targetGpu.setResolution(self.xMax,self.yMax)self.targetGpu.setBackground(self.bgColor)--self.window.setViewport(nil,nil,nil,nil,nil,nil, window)--term.drawText(self.targetGpu,false,self.window)self.window.write("hi")end
You can post now and register later.
If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.
Hi all, I'm new to this forum!
Let me explain you my problem: after switching from cc to oc, I started to write a simple gui program.
I know that there are some programs that do the same stuff but I want to write it myself, like an exercise.
I want to bind multiple instances of windows with custom screens and gpus, but I dont' exactely know how. I read this thread that "introduced" me to undocumented features like term.internal.open() and term.setViewport(), but I am obviously doing something wrong, because it throws this error:
<img>http://i.imgur.com/rvzTHyr.png</img>
This is the actual library code (I'm sorry, comments are in Italian, I will translate them as soon as possible to let you understand better)
and this is the test program
I am accepting other suggestions too, because I'm also new to lua and I want to correct my mistakes.
thank you in advance for your help.
Link to post
Share on other sites