Page 8 of 17

Re: Gspöt - formerly Yet another stateful GUI

Posted: Fri Nov 30, 2012 10:18 am
by trubblegum
You could override input.focus()
Out of the box, the inherited focus() function (in Gspot.util) is :

Code: Select all

element.focus = function(this)
    this.Gspot:setfocus(this)
end
.. so you could override that right after you include the lib, or use something like:

Code: Select all

myfocusfunc = function(this)
    this.Gspot.util.focus(this)
    // do stuff
end

input.focus = myfocusfunc
I don't see why this wouldn't work :

Code: Select all

input = gui:input()
input:focus()
if gui.focus == input then ... end
essentially, element:focus() passes a reference to itself over to the gui container using Gspot:setfocus(this) which does this.focus = element, so that Gspot.focus == element.

Re: Gspöt - retained GUI lib

Posted: Fri Nov 30, 2012 11:22 pm
by Karai17
Thanks for the reply! I'll take a look at your examples and see if I can get something working. :)

In the mean time, I have found another issue I am a bit confused by. I have a screen/gamestate system set up. When I switch to the next screen, the gui stays persistant and doesn't go away. You have a mention of doing something like mainmenu = gui() but I don't really understand how that is supposed to help :\

Could you explain in a little more detail how Gspot works with gamestates? Thanks!

Re: Gspöt - retained GUI lib

Posted: Sat Dec 01, 2012 12:32 am
by trubblegum
Well, there are at least a couple of ways you can work it.
One, which I recommend, is to create a new instance for each gamestate. I used something like state[currentstate].gui:update(dt) and state[currentstate].gui:draw()
The key here is to only update and draw the relevant GUI.
Another way to go about it would be to create a root gamestate container for each gamestate (like gui:group("mainmenu") etc), and toggle visibility for each one along with the corresponding gamestate.
Advantages with the first method are that it reduces load by keeping unused elements out of the current gamestate, and may be easier to organize elements with. Any Gspot instance which is not currently in use will retain its state while inactive, so you may have to reconstruct a GUI when you enter its relevant gamestate, to ensure consistency.
A disadvantage is that you could end up with a bit of a bulky structure :

Code: Select all

game{
    states{
        menu{
            gui{}
            ...
        }
        ...
    }
    ...
}

Re: Gspöt - retained GUI lib

Posted: Sat Dec 01, 2012 12:37 am
by Karai17
Hrm... Here is the code I am currently working with: https://github.com/karai17/love-tanks/t ... ter/client

Which method would you suggest that would work best with my gamestate (screen) controller?

Edit: Are you suggesting somethign like this:

Code: Select all

-- main controller
gui = require 'Gspot'

--[[ CONTROLLER MAGIC ]] --




-- some gamestate file
local function load(self)
    self.gui = gui()
end

local function update(self, dt)
    self.gui:update(dt)
end

local function draw(self)
    self.gui:draw()
end
OH HEY THAT WORKED! :O

Thanks for the help, it is much appreciated! :)

Re: Gspöt - retained GUI lib

Posted: Sat Dec 01, 2012 1:13 am
by trubblegum
Looks good to me (just that errant quote, but I'm sure you caught it)
All the best

Re: Gspöt - retained GUI lib

Posted: Tue Dec 11, 2012 9:43 am
by SiENcE
Hey trubblegum,

i reported two problems to your bugtracker.

https://github.com/trubblegum/Gspot/issues/3

It seems that love2d is slow as hell when using 'love.graphics.print' and 'love.graphics.printf' :-(.

I want to add text to my scrollbox, so that this text is added at the bottom. Scrollbox should scroll up on line.

My scrollbox code:

Code: Select all

	-- scrollgroup's children, excepting its scrollbar, will scroll
        -- scrollgroup will create its own scrollbar
	self.textbox = self.gspot:scrollgroup(nil, {self.pos.x+60, self.pos.y+286, 352-16, 56}, nil, 'vertical')
        -- scrollgroup.scrollh is the horizontal scrollbar
	self.textbox.scrollv.tip = 'Scroll (mouse or wheel)'
        -- texter itself
	self.texter = self.gspot:text('', {w = self.textbox.pos.w}, self.textbox) 

Code: Select all

-- add some new text to the textbox
function GameGui:addSomeText(text)
	if text and string.len(text) > 0 then
		local newtext = self.texter.label .. text .. '\n'
		-- number of lines
		local lines=0
		for i in newtext:gmatch("\n") do lines=lines+1 end
		self.texter.label = newtext
		if lines > 6 then
			self.textbox.scrollv.values.max = self.textbox.scrollv.values.max+8
			self.textbox.scrollv.values.current = self.textbox.scrollv.values.max
		end
	end
	print(text)
end
Testcode:

Code: Select all

	for i=1, 200 do
		self:addSomeText(i.. " 345678901234567890123456789012345678")
	end 
thx. & cheers

Re: Gspöt - retained GUI lib

Posted: Tue Dec 11, 2012 11:39 am
by trubblegum
It's pretty unclear what the problem is.

Try this?

Code: Select all

scrollgroup.scrollv.values.max = scrollgroup:getmaxh() - scrollgroup.pos.h
Or destroy and replace the text object, or append a new text object using, assuming you may want to add and remove text.
Honestly, scrollgroups are a bit finicky, and it's sometimes better to reconstruct them than try to manipulate them beyond fairly basic stuff.

Not sure about your scaling and framerate issues. Suspect this might be a limitation of scissors.

Re: Gspöt - retained GUI lib

Posted: Tue Dec 11, 2012 3:40 pm
by SiENcE
Thanks i will try this.

My biggest problem is the rendering performance when using 'love.graphics.print' and 'love.graphics.printf'. It's so slow :-/.

Re: Gspöt - retained GUI lib

Posted: Thu Dec 13, 2012 9:34 am
by Karai17
So I think I found a pretty significant bug in Gspot. If you look at the following example, you'll notice I have 3 scrollgroups and 3 buttons. Each button sends text to the appropriate scrollgroup. The problem here is that it looks like you can only have a single scrollgroup at any one time on screen that is functional. It will always be the last one created. All of the ones created prior seem to be completely borked. They do not have scroll bars and children cannot be added to them.

Any ideas on how to fix this? I am working on a chatbox that requires multiple scrollgroups to separate content into channels and currently only the last one works. :(

Code: Select all

gui = require('Gspot')
font = love.graphics.newFont(12)

love.load = function()
	love.graphics.setFont(font)
	sometext = 'Lorem ipsum dolor sit amet.'
	
	scrollgroup		= gui:scrollgroup(nil, {0, gui.style.unit, 128, 128})
	scrollgroup2	= gui:scrollgroup(nil, {150, gui.style.unit, 128, 128})
	scrollgroup3	= gui:scrollgroup(nil, {300, gui.style.unit, 128, 128})
	
	button	= gui:button('text', {x=0, y=192, w=56, h=16})
	button2	= gui:button('text', {x=150, y=192, w=56, h=16})
	button3	= gui:button('text', {x=300, y=192, w=56, h=16})
	
	button.click = function()
		scrollgroup:addchild(gui:text(sometext, {w=128}), 'vertical')
	end
	
	button2.click = function()
		scrollgroup2:addchild(gui:text(sometext, {w=128}), 'vertical')
	end
	
	button3.click = function()
		scrollgroup3:addchild(gui:text(sometext, {w=128}), 'vertical')
	end
end

love.update = function(dt)
	gui:update(dt)
end

love.draw = function()
	gui:draw()
end

love.keypressed = function(key, code)
	gui:keypress(key, code)
end

love.mousepressed = function(x, y, button)
	gui:mousepress(x, y, button)
end
love.mousereleased = function(x, y, button)
	gui:mouserelease(x, y, button)
end
Also, if I may add, if there is a plan to fix the scrollgroup's finickiness, could I request some added features such as:
  • Ability to align text/children in an element (example: right justify or align from bottom)
  • Ability to prepend children instead of appending them
  • Scroll from bottom (think a chat window in virtually every game ever)

Re: Gspöt - retained GUI lib

Posted: Thu Dec 13, 2012 12:29 pm
by trubblegum
I won't be adding to Gspot in the foreseeable future. The scrollgroup bug was a pretty glaring issue, so I fixed it (get the latest from github), but I'm not really working on this any more. I realise that that there are a few thing about it that are less than ideal, and when I get some time (and inclination) to make improvements, I will take suggestions into account, of course. Until then, the stuff you're asking for is pretty easy to do yourself.

See above for scrolling to the bottom of a scrollgroup.