Page 3 of 17
Re: Gspöt - formerly Yet another stateful GUI
Posted: Sat Mar 10, 2012 6:43 pm
by trubblegum
Update : added element:update(dt)
Re: Gspöt - formerly Yet another stateful GUI
Posted: Sat Mar 10, 2012 7:41 pm
by Gravy
Hey trubblegum, thanks for this.
I want to use an image as a button label, and I see that this functionality exists but 'img' isn't included in the button constructor. Am I just misunderstanding how to use images here?
Re: Gspöt - formerly Yet another stateful GUI
Posted: Sat Mar 10, 2012 11:47 pm
by trubblegum
There are two ways to add an image, mostly because I haven't decided on what's the best way to do it yet.
The first is to make a button using id = gui:button() and then assign the image using gui:element(id).img = imgdata
The second is with gui:image(label, pos, img, optional parent) but at the moment this doesn't display label (that's why it's not in the examples, and it will be fixed in the next update)
In either case (at least for now) the image must be an imagedata such as is loaded by love using love.graphics.newImage()
I'm building in a shortcut for image buttons now, so check back soon.
Re: Gspöt - formerly Yet another stateful GUI
Posted: Sun Mar 11, 2012 12:45 am
by trubblegum
Update :
- image(this, label, pos, img, parent) resizes the element to fit the image, and displays the image with no background, and a centered label below
- imgbutton(this, label, pos, img, parent) does not resize the element, centers the image, and displays with default interactive background behind the image, and label centered just below the top of the element
Both accept imageData as arg 4, or will do img = assert(love.graphics.newImage(img)) if type(img) == 'string'
Keep 'em coming
Re: Gspöt - formerly Yet another stateful GUI
Posted: Sun Mar 11, 2012 12:51 am
by Gravy
That makes sense. I've been playing with this library all afternoon (my RPG has so many buttons now!), and I have one question and one suggestion:
Question: Is there a way for me to assign functions that are called when an element gains or loses focus? I think this would be easy for me to add but I just want to make sure it's not already there.
Suggestion: I think backspace should continue to delete things when held down for more than a half second (or some other fraction). People would have to add a gui:isdown() call, but it seems like a small price to pay.
Re: Gspöt - formerly Yet another stateful GUI
Posted: Sun Mar 11, 2012 12:59 am
by trubblegum
there is a element:update(dt), which is called every update.
In very simplistic terms, you're probably looking at something like :
Code: Select all
gui:element(id).update = fuction(this, dt)
if love.keyboard.isdown('backspace') then
this.value = this.value:sub(1, this.value:len())
end
end
Of course, you will want to provide for timing, which is why the gui passes dt along to the element.
Do you think it might be worth adding element.updateinterval to signal how often to call the behaviour?
I'm considering it.
Re: Gspöt - formerly Yet another stateful GUI
Posted: Sun Mar 11, 2012 1:18 am
by trubblegum
Doh! The first question ..
Elements have focus at different levels, so I'm not sure how I'd go about adding start and stop events for each one, but I can give it some thought.
The "states" which the gui tracks are :
- gui.mousein - id of the topmost element under the pointer
- gui.mouseover - id of the topmost element under the pointer and the element being dragged. only not nil if an element is being dragged over another element.
- gui.focus - id of an input element which has focus
You can of course simulate mouseEnter and mouseLeave events with something like :
Code: Select all
element = gui:element(id)
element.hasfocus = false
element.enter = function(this) print("I'm In!") end
element.leave = function(this) print("I'm Out!") end
element.update = function(this, dt)
if this.id == this.Gspot.mousein then
if not this.hasfocus then
this:enter()
this.hasfocus = true
end
else
if this.hasfocus then
this:leave()
this.hasfocus = false
end
end
end
Come to think of it, it would be fairly straightforward to implement, but something for tomorrow, I think - glad you brought it up.
Come to think of it more, it is my job to provide that functionality for you
but still a job for tomorrow
Re: Gspöt - formerly Yet another stateful GUI
Posted: Sun Mar 11, 2012 1:27 am
by Gravy
Great!
I'm not sure the updateinterval would be used enough to warrant its own per-element setting, especially since there would almost always be an alternate solution using dt.
However, I do think that every element should have an optional font override. Otherwise someone will have to make a GUI for every font (I think). It would just require you to add something like:
Code: Select all
if element.font then
love.graphics.setFont(element.font)
else
love.graphics.setFont(this.font)
end
Re: Gspöt - formerly Yet another stateful GUI
Posted: Sun Mar 11, 2012 1:36 am
by Kingdaro
God I love the names of these libraries. Firstly we have Löve, even. and then there's:
LUBE
AnAL
HUMP
SECS
HardonCollider
i love you people
Re: Gspöt - formerly Yet another stateful GUI
Posted: Sun Mar 11, 2012 2:02 am
by trubblegum
Gravy wrote:every element should have an optional font override
Colour too!
More for the ToDo list
Kingdaro wrote:
LUBE
AnAL
HUMP
SECS
HardonCollider
It's good to smile while you work
Löve you too, man