LOTS of Icons and Listboxes

BlitzMax Forums/BlitzMax Beginners Area/LOTS of Icons and Listboxes

Grisu(Posted 2006) [#1]
Hi!

Is there a way to load icons for listboxentries via single files for each icon used?

Is it possible to use icons bigger than 16x16 pixel?

I can't create a-mile-long image with all icons inside and load them via "LoadIconStrip". :(

Thanks, Grisu


tonyg(Posted 2006) [#2]
The number of icons in an iconstrip is determined by dividing the image width by its height.

Tried it with 384*32 and it loads icons as 32*32.
Basically, they have to be in one line image.
What error are you getting?
Can't find a way to load icons from seperate files.


Grisu(Posted 2006) [#3]
The problem is that depending on your graphics card the images may get corrupted. I made the same experience with BlitzPlus...

Also directx itself has some maximum image size limit.

Edit:
And I'd like to be able to change certain icons during runtime.


Jay Kyburz(Posted 2006) [#4]
oh.. and its a pain to work in a very long image in photoshop.


skidracer(Posted 2006) [#5]
LoadIconStrip uses pixmaps not images so there should be no theoretical limits.

If there is it needs fixing so pls send me an example png/bmp that breaks LoadIconStrip.

If you want more flexibility you could create the pixmap yourself and then use loadpixmap and pixmap.paste to add / modify individual icons, calling LoadIconStrip(pixmap) and SetGadgetIconStrip after to refresh your gadgets.


Grisu(Posted 2006) [#6]
Thanks for the help skidracer.

Though I'm not 100% how to do this in bmx. :(

First, I create a full but empty iconstrip pixmap
Global Fullpixmap:TPixmap=CreatePixmap((MAXGADGETS*32),32,PF_RGBA8888)

In a for i=0 to MAXGADGETS-1 loop I then...
1. Load the images into a temp pixmap
tmppixmap=LoadPixmap("Incbin::./Media/"+i+".jpg")

2. Size the image down to the needed icon size (e.g. 32x32):
ResizePixmap(tmppixmap,32,32)

3. But how do I paste / copy this tmp pixmap into the full one? At the position I need (i.e. i*32 as x value)

fullpixmap.paste(tmppixmap,0,0) is not right...

At the end I load the full iconpixmap and set it to the lsitbox gadget:

Local IconStrip:TIconStrip=LoadIconStrip(fullpixmap)
SetGadgetIconStrip(ListBox, IconStrip)

Finally I can add gadgets to the listbox displaying the icons:

For Local i=0 To MAXFGADGETS-1
AddGadgetItem ListBox, i,0,i
Next


assari(Posted 2006) [#7]
Grisu,
You can also use good old fashion read, writepixels. If you need some code there's one here Making a MaxGUI Application: StripAnimMakerLite Part 7b - Capturing Image to AnimStrip


Grisu(Posted 2006) [#8]
Isn't read/writepixel really SLOW?

I need to get 300 images+... so simply drawing/copying the icon image into the strip should be much faster!


tonyg(Posted 2006) [#9]
target_pixmap.paste(source_pixmap,x,y)

P.S. Bmax read/writepixel is pretty fast.
<edit> Quick and dirty (obviously you can do it all in a single loop).
Graphics 640,480
Const maxgadgets=4
pix_target:TPixmap=CreatePixmap((maxgadgets)*32,32,PF_RGBA8888)
Local pix_source:TPixmap[4]
pix_source[0]=LoadPixmap("pix1.png")
pix_source[1]=LoadPixmap("pix2.png")
pix_source[2]=LoadPixmap("pix3.png")
pix_source[3]=LoadPixmap("pix4.png")
For x = 0 To maxgadgets-1
	pix_target.paste(pix_source[x],x*32,0)
Next
DrawPixmap pix_target,0,0
For x = 0 To maxgadgets-1
	DrawPixmap pix_source[x],x*32,32
Next

Flip
WaitKey()
Local MyWindow:TGadget=CreateWindow("ListBox Example", 200,200,320,240)
Local ListBox:TGadget=CreateListBox(10,10,200,100,MyWindow)

Local IconStrip:TIconStrip=LoadIconStrip(pix_target)
SetGadgetIconStrip(ListBox, IconStrip)

AddGadgetItem ListBox, "This is my first list item",0,1
AddGadgetItem ListBox, "This is my second list item",0,3

Repeat
  WaitEvent()
  Select EventID()
  Case EVENT_WINDOWCLOSE
     End
   End Select
Forever




Grisu(Posted 2006) [#10]
Thanks TonyG... works now... at last....

And is fast enough for my needs... :))))))))))))))))