September 20, 2021, 05:48:40

Author Topic: [bmx] [maxgui] Custom Image Button by Beaker [ 1+ years ago ]  (Read 659 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
Title : [maxgui] Custom Image Button
Author : Beaker
Posted : 1+ years ago

Description : Image Button needs some images which you can get from here:
1 23 4 5

Demonstrates the use of hooks and gadget extending.

Thanks to Mark Tiffany.


Code :
Code: BlitzMax
  1. ' Custom Image Button
  2. ' ===================
  3. ' A custom "gadget" that can be used like web gadgets,
  4. ' i.e. showing an alternate image on mouseover, and
  5. ' on single click cycling through a series of options.
  6. '
  7. ' Originally created by Beaker
  8. ' Improved upon by Mark Tiffany
  9.  
  10. Strict
  11. Type TApplet
  12.  
  13.         Method OnEvent(Event:TEvent) Abstract
  14.  
  15.         Method New()
  16.                 AddHook EmitEventHook,eventhook,Self
  17.         End Method
  18.  
  19.         Function eventhook:Object(id,data:Object,context:Object)
  20.                 Local   event:TEvent
  21.                 Local   app:TApplet
  22.                 event=TEvent(data)
  23.                 If Not event Then Return
  24.                 app=TApplet(context)
  25.                 app.OnEvent event      
  26.                 Return data
  27.         End Function
  28.  
  29. End Type
  30.  
  31.  
  32. Type TImageButton Extends TApplet
  33.         Field index
  34.         Field lastind
  35.         Field depressed
  36.         Field mouseover
  37.  
  38.         Field pix:TPixmap[]
  39.         Field rollpix:TPixmap[]
  40.         Field pan:TGadget
  41.                
  42.         Method OnEvent(Event:TEvent)
  43.                 'make sure this was intended for us!
  44.                 If event.source<>pan Then Return
  45.                
  46.                 Select event.id
  47.                         Case EVENT_MOUSEDOWN
  48.                                 If event.data=1
  49.                                         Local i:Int=(index + 1) Mod lastind
  50.                                         ' set the image to the new image or rollover image
  51.                                         If rollpix[i]=Null Then
  52.                                                 SetPanelPixmap pan,pix[i]      
  53.                                         Else
  54.                                                 SetPanelPixmap pan,rollpix[i]                                                                  
  55.                                         End If
  56.                                         depressed=True                                 
  57.                                 EndIf
  58.                
  59.                         Case EVENT_MOUSEUP
  60.                                 If event.data=1 And depressed And mouseover Then
  61.                                         index = (index + 1) Mod lastind
  62.                                         ' set the image to the new image or rollover image
  63.                                         If rollpix[index]=Null Or event.x<0 Or event.x>pan.width Or event.y<0 Or event.y>pan.height Then
  64.                                                 SetPanelPixmap pan,pix[index]  
  65.                                         Else
  66.                                                 SetPanelPixmap pan,rollpix[index]                                                                      
  67.                                         End If
  68.                                        
  69.                                         'and emit an event for someone else to catch
  70.                                         Local ev:TEvent = New TEvent.Create(EVENT_GADGETACTION,Self,index,event.mods,event.x,event.y)
  71.                                         ev.Emit
  72.                                 EndIf
  73.                                
  74.                         Case EVENT_MOUSEENTER
  75.                                 If rollpix[index] <> Null
  76.                                         SetPanelPixmap pan,rollpix[index]
  77.                                 EndIf
  78.                                 mouseover=True
  79.                                
  80.                         Case EVENT_MOUSELEAVE
  81.                                 SetPanelPixmap pan,pix[index]                          
  82.                                 mouseover=False
  83.                                
  84.                 End Select
  85.                 ' Print event.tostring() ' for debugging
  86.         End Method
  87.  
  88.         Method Create:TImageButton(images$[],rollover$[],x,y,w,h,group:TGadget,style=0)
  89.                 index = 0
  90.                 lastind = images.length
  91.                 pix = New TPixmap[lastind]
  92.                 For Local f = 0 Until lastind
  93.                         pix[f] = LoadPixmap(images[f])
  94.                         ' if load fails, then give up on creating the gadget
  95.                         If pix[f]=Null Then Return Null
  96.                 Next
  97.                 pan = CreatePanel(x,y,w,h,group,style|PANEL_ACTIVE)
  98.                 SetPanelPixmap pan,pix[0]      
  99.  
  100.                 rollpix = New TPixmap[lastind]
  101.                 If rollover <> Null
  102.                         For Local f = 0 Until rollover.length
  103.                                 rollpix[f] = LoadPixmap(rollover[f])
  104.                                 ' if load fails, then give up on creating the gadget
  105.                                 If rollpix[f]=Null Then Return Null
  106.                         Next
  107.                 EndIf
  108.                 Return Self
  109.         End Method
  110.        
  111. End Type
  112.  
  113. Function CreateImageButton:TImageButton(image$[],rollover$[],x,y,w,h,group:TGadget,style=0)
  114.         Return New TImageButton.Create(image$,rollover$,x,y,w,h,group,style)
  115. End Function
  116.  
  117. ' create test GUI
  118. Local window:TGadget = CreateWindow("My Window",40,40,320,240)
  119.  
  120. Local lbl1:TGadget = CreateLabel("This gadget cycles on single click through 3 values.",30,10,250,15,window)
  121. Local butt1:TImageButton = CreateImageButton(["test1.png","test2.png","test3.png"],["","",""],30,30,28,28,window,PANEL_BORDER)
  122.  
  123. Local lbl2:TGadget = CreateLabel("This gadget is highlighted on mouse over.",30,60,250,15,window)
  124. Local butt2:TImageButton = CreateImageButton(["test1.png","test2.png"],["test1h.png","test2h.png"],30,80,26,26,window)
  125. Local txt2:TGadget = CreateTextField(100,80,60,30,window)
  126. SetGadgetText txt2,0
  127.  
  128. ' main loop
  129. While True
  130.         WaitEvent()
  131.         Select EventID()
  132.                 Case EVENT_WINDOWCLOSE
  133.                         End
  134.                 Case EVENT_GADGETACTION
  135.                         Select EventSource()
  136.                                 Case butt2 ; SetGadgetText txt2,EventData()
  137.                         End Select
  138.         End Select
  139. Wend
  140.  
  141. End


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal