Ooops
October 28, 2020, 05:26:46 AM

Author Topic: [bmx] MaxGUI: Imagebutton by CS_TBL [ 1+ years ago ]  (Read 1189 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bmx] MaxGUI: Imagebutton by CS_TBL [ 1+ years ago ]
« on: June 29, 2017, 12:28:42 AM »
Title : MaxGUI: Imagebutton
Author : CS_TBL
Posted : 1+ years ago

Description : An imagebutton, complete with added radio-button mechanism. Active state: the image as it is, de-activated state: in greyscale. All automated, eventhooked, it takes a no-brainer to use this. Emits an event and left/right-click is in event.data. Supports keys to double-up mousebuttons (for ppl with finger-RSI or ppl with a tablet/pen with nasty buttons)

grab these for the given example:





Code :
Code: BlitzMax
  1. SuperStrict
  2.  
  3. Const EVENT_IMAGEBUTTONCLICKED:Int=$13370666  ' or any other, less l33t-evil, number :P
  4.  
  5. Type TImagebutton
  6.  
  7. Rem
  8.         Imagebutton and Imagebuttongroup
  9.         by CS_TBL
  10.        
  11.         usage:
  12.        
  13.         Local MyButton:TImagebutton=CreateImagebutton(x,y,imagehandle,parentgadgethandle,state)
  14.        
  15.         By default these are buttons that simply go on and off, if you place buttons like these into an
  16.         Imagebuttongroup, then all buttons in such a group act like radiobuttons, e.g. only one can be
  17.         switched on at one time. Typically you'd have to use a panel in B+/BmaxGUI for this with normal
  18.         buttons.
  19.        
  20.         Local group:TImagebuttongroup=New TImagebuttongroup
  21.        
  22.         and then:
  23.        
  24.         group.Add MyButton1
  25.         group.Add MyButton2
  26.         group.Add MyButton3
  27.         etc.
  28.        
  29.         It's all automated with eventhooks, <*> create it .. and use it! <*>
  30.        
  31.         Buttons are the size of your image. Activated buttons are simply the source-image, de-activated
  32.         buttons are the same.. but grey. A little highlight is shown upon hovering with the mouse.
  33.        
  34.         [Z] and [X] when the mousepointer is on the button, double as leftclick and rightclick. The button
  35.         can accept leftclicks and rightclicks and this can be read out from event.data or EventData().
  36.        
  37. EndRem
  38.  
  39.         Field canvas:TGadget
  40.         Field parent:TGadget
  41.        
  42.         Field state:Int
  43.         Field hoover:Int
  44.        
  45.         Field image:TImage
  46.         Field grey:TImage
  47.        
  48.         Field hooverintensity:Int=24
  49.         Field newevent:TEvent=New TEvent
  50.        
  51.         Function eventhook:Object(id:Int,data:Object,context:Object)
  52.                 If Timagebutton(context) Timagebutton(context).ev TEvent(data);Return data     
  53.         EndFunction
  54.        
  55.         Method New()
  56.                 AddHook EmitEventHook,eventhook,Self
  57.         End Method
  58.        
  59.         Method Free()
  60.                 RemoveHook EmitEventHook,eventhook
  61.                 GCCollect()
  62.         End Method
  63.        
  64.         Method MakeGrey()
  65.                 Local r:Int,g:Int,b:Int,c:Int  
  66.                 Local x:Int,y:Int
  67.                 grey=CreateImage(ImageWidth(image),ImageHeight(image))
  68.                
  69.                 Local pm:TPixmap=LockImage(image)
  70.                 Local pm2:TPixmap=LockImage(grey)
  71.                         For y=0 To ImageHeight(image)-1
  72.                                 For x=0 To ImageWidth(image)-1
  73.                                         c=ReadPixel(pm,x,y)
  74.                                         r=c&255
  75.                                         g=(c/256)&255
  76.                                         b=(c/65536)&255
  77.                                         c=(r+g+b)/3
  78.                                         WritePixel pm2,x,y,c+256*c+65536*c|$ff000000
  79.                                 Next
  80.                         Next
  81.                 UnlockImage image
  82.                 UnlockImage grey
  83.         End Method
  84.        
  85.         Method ev(event:TEvent)
  86.                 If event.source=canvas
  87.                         If event.id=EVENT_GADGETPAINT update
  88.                        
  89.                         If event.id=EVENT_MOUSEENTER
  90.                                 SetPointer POINTER_HAND         ' <- comment out all SetPointer lines if you don't want changing cursors
  91.                                 ActivateGadget canvas
  92.                                 hoover=1
  93.                                 update
  94.                                
  95.                         EndIf
  96.                        
  97.                         If event.id=EVENT_MOUSELEAVE
  98.                                 SetPointer POINTER_DEFAULT
  99.                                 ActivateGadget parent
  100.                                 hoover=0
  101.                                 update
  102.                         EndIf
  103.                        
  104.                         If event.id=EVENT_MOUSEDOWN
  105.                                 Clickbutton event.data
  106.                         EndIf
  107.                        
  108.                         If event.id=EVENT_KEYDOWN
  109.                                 If event.data=90 ' Z
  110.                                         Clickbutton 1
  111.                                 EndIf
  112.                                 If event.data=88 ' X
  113.                                         Clickbutton 2
  114.                                 EndIf
  115.                         EndIf
  116.                 EndIf
  117.                
  118.         End Method
  119.        
  120.         Method Clickbutton(data:Int=1)
  121.                 If data=1
  122.                         newevent.data=1
  123.                 EndIf
  124.                 If data=2
  125.                         newevent.data=2
  126.                 EndIf
  127.                 state:+1
  128.                 state:Mod 2
  129.                 update
  130.                
  131.                 newevent.source=Self
  132.                 newevent.id=EVENT_IMAGEBUTTONCLICKED
  133.                
  134.                 EmitEvent newevent     
  135.         End Method
  136.        
  137.         Method update()
  138.                 SetGraphics CanvasGraphics(canvas)
  139.                         SetClsColor 0,0,0;Cls
  140.                         If image
  141.                                 SetBlend MASKBLEND
  142.                                 SetColor 255,255,255
  143.                                
  144.                                 If state
  145.                                         DrawImage image,0,0
  146.                                 Else
  147.                                         DrawImage grey,0,0
  148.                                 EndIf
  149.                                
  150.                                 If hoover
  151.                                         SetColor hooverintensity,hooverintensity,hooverintensity
  152.                                         SetBlend LIGHTBLEND                            
  153.                                         DrawRect 0,0,GadgetWidth(canvas),GadgetHeight(canvas)
  154.                                 EndIf
  155.                                 SetBlend MASKBLEND
  156.                         EndIf
  157.                 Flip
  158.         End Method
  159.        
  160.         Method SetState(st:Int)
  161.                 state=st
  162.                 update
  163.         End Method
  164.        
  165.         Method GetState:Int()
  166.                 Return state
  167.         End Method
  168.        
  169.         Method SetIntensity(i:Int)
  170.                 hooverintensity=i
  171.         End Method
  172. End Type
  173.  
  174. Function CreateImagebutton:TImagebutton(x:Int,y:Int,image:TImage,parent:TGadget,state:Int=0)
  175.         If image=Null RuntimeError "no image given"
  176.         If parent=Null RuntimeError "no parent given"
  177.        
  178.         Local a:TImagebutton=New TImagebutton
  179.         a.image=image
  180.         a.MakeGrey     
  181.         a.canvas=CreateCanvas(x,y,ImageWidth(image),ImageHeight(image),parent)
  182.         a.parent=parent
  183.         a.state=state
  184.         Return a
  185. End Function
  186.  
  187. Type TImagebuttongroup
  188.  
  189.         Field list:TImagebutton[]
  190.         Field amount:Int=0
  191.         Field newevent:TEvent=New TEvent
  192.        
  193.         Function eventhook:Object(id:Int,data:Object,context:Object)
  194.                 If TImagebuttongroup(context) TImagebuttongroup(context).ev TEvent(data);Return data   
  195.         EndFunction
  196.        
  197.         Method New()
  198.                 AddHook EmitEventHook,eventhook,Self
  199.         End Method
  200.        
  201.         Method Free()
  202.                 RemoveHook EmitEventHook,eventhook
  203.                 GCCollect()
  204.         End Method
  205.        
  206.         Method ev(event:TEvent)
  207.                 If event.id=EVENT_IMAGEBUTTONCLICKED
  208.                         Local t:Int
  209.                         Local tt:Int
  210.                         For t=0 To amount-1
  211.                                 If event.source=list[t]
  212.                                         For tt=0 To amount-1
  213.                                                 list[tt].SetState 0
  214.                                         Next
  215.                                         list[t].SetState 1
  216.                                 EndIf
  217.                         Next
  218.                 EndIf
  219.         End Method
  220.        
  221.         Method Add(t:TImagebutton)
  222.                 amount:+1
  223.                 list=list[..amount]
  224.                 list[amount-1]=New TImagebutton
  225.                 list[amount-1]=t
  226.         End Method
  227. End Type
  228.  
  229.  
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237. Rem
  238.  
  239.  EXAMPLE!
  240.  
  241. EndRem
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252. Local window:TGadget=CreateWindow(".",0,0,640,480)
  253.  
  254. ' 4 images
  255. Local im1:TImage=LoadImage("brush.png")
  256. Local im2:TImage=LoadImage("cut.png")
  257. Local im3:TImage=LoadImage("paint.png")
  258. Local im4:TImage=LoadImage("pencil.png")
  259.  
  260. ' 4 buttons that can all be switched on and off
  261. Local MyButton1:TImagebutton=CreateImagebutton(32,32,im1,window,0)
  262. Local MyButton2:TImagebutton=CreateImagebutton(32,80,im2,window,0)
  263. Local MyButton3:TImagebutton=CreateImagebutton(96,32,im3,window,0)
  264. Local MyButton4:TImagebutton=CreateImagebutton(96,80,im4,window,0)
  265.  
  266. ' same stuff again..
  267. Local MyButton5:TImagebutton=CreateImagebutton(232,32,im1,window,1)
  268. Local MyButton6:TImagebutton=CreateImagebutton(232,80,im2,window,0)
  269. Local MyButton7:TImagebutton=CreateImagebutton(232,128,im3,window,0)
  270. Local MyButton8:TImagebutton=CreateImagebutton(232,176,im4,window,0)
  271.  
  272. ' ..but now tucked away into a group so they act as radiobuttons (only one is active)
  273. Local group:TImagebuttongroup=New TImagebuttongroup
  274. group.Add MyButton5
  275. group.Add MyButton6
  276. group.Add MyButton7
  277. group.Add MyButton8
  278.  
  279. Repeat
  280.         WaitEvent()
  281.        
  282.         If EventID()=EVENT_WINDOWCLOSE End
  283.        
  284.         If EventID()=EVENT_IMAGEBUTTONCLICKED
  285.        
  286.                 DebugLog Mid("leftclicked rightclicked",1+(EventData()-1)*12,12)
  287.                
  288.                 Select EventSource()
  289.                         Case MyButton1,MyButton5
  290.                                 DebugLog "brush!"
  291.                         Case MyButton2,MyButton6
  292.                                 DebugLog "cut!"
  293.                         Case MyButton3,MyButton7
  294.                                 DebugLog "paint!"
  295.                         Case MyButton4,MyButton8
  296.                                 DebugLog "pencil!"
  297.                 End Select
  298.  
  299.         EndIf
  300. Forever


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal