Ooops
November 24, 2020, 05:47:22 AM

Author Topic: [bmx] [MaxGUI] MultiButtonList by degac [ 1+ years ago ]  (Read 951 times)

Offline BlitzBot

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

Description : This is a simple variation of the command CreateListBox, replaced with a checkbox + a label for an item description and tooltips for checkbox and label, with wheelscroll.
Useful to manage different option check for the user.

Main Function

CreateMultiButton(x,y,w,h,window)

It returns a MultiButton object. You can add item (or read from an array).
There are various object-oriented method for the MultiButtonList and for the single items.

v. 1.01 - bug fixed in array control


Code :
Code: BlitzMax
  1. Rem
  2.  
  3.                 test for MyGadget
  4.                 v. 1.01 - bug: check array size
  5. End Rem
  6. Import maxgui.drivers
  7.  
  8. Global wndMain:TGadget = CreateWindow( AppTitle , 100 , 100 , 700 , 400)
  9.  
  10. Local bu1:tgadget,bu2:tgadget,bu3:tgadget,bu4:tgadget
  11. Local bu5:tgadget,bu6:tgadget,bu7:tgadget,bu8:tgadget
  12.  
  13.  
  14. bu1 = CreateButton("Disable" , 10 , 220 , 100 , 20 , wndMain)
  15. bu2 = CreateButton("Enable" , 120 , 220 , 100 , 20 , wndMain)
  16. bu3 = CreateButton("Clear" , 10 , 240 , 100 , 20 , wndMain)
  17. bu4 = CreateButton("Add items" , 120 , 240 , 100 , 20 , wndMain)
  18.  
  19. bu5 = CreateButton("Colors" , 10 , 260 , 100 , 20 , wndMain)
  20. bu6 = CreateButton("Item col" , 120 , 260 , 100 , 20 , wndMain)
  21. bu7 = CreateButton("Extract status" , 10 , 280 , 100 , 20 , wndMain)
  22. bu8 = CreateButton("Invert Status" , 120 , 280 , 100 , 20 , wndMain)
  23.  
  24.  
  25. Global mb1:tmultiButton = CreateMultiButton(10 , 10 , 270 , 200 , wndMain )
  26.  
  27. Global mb2:tmultiButton = CreateMultiButton(300 , 10 , 270 , 200 , wndMain )
  28.  
  29. For Local kk:Int = 0 To 14
  30.         mb1.AddItem("Item " + kk , "Description " + kk , "Tips " + kk , "Tips Description " + kk)
  31. Next
  32.  
  33. For kk:Int = 0 To 14
  34.         mb2.AddItem("Item " + kk , "Description " + kk , "Tips " + kk , "Tips Description " + kk)
  35. Next
  36.  
  37.  
  38. mb1.InvertState()
  39.  
  40. 'mb1.SetItemBackColor(3 , 200 , 10 , 10)
  41. 'mb1.SetItemSelectColor(3 , 200 , 210 , 10)
  42. 'mb1.SetButtonColor(220 , 250 , 20)
  43.  
  44. mb1.SetItemLabelColor(3,255,0,255)
  45. Print mb1.getItemStatus(15)
  46.  
  47. Local tem:Int[]
  48.  
  49.  
  50.  
  51. Repeat
  52.        
  53.         WaitEvent()
  54.        
  55.         SetStatusText wndMain, CurrentEvent.ToString()
  56.        
  57.         Select EventID()
  58.                 Case EVENT_WINDOWCLOSE , EVENT_APPTERMINATE ; GotoEnd()
  59.                
  60.                 Case EVENT_GADGETACTION
  61.                         Select EventSource()
  62.                        
  63.                                 Case bu1
  64.                                         mb1.Disable()
  65.                                 Case bu2
  66.                                         mb1.Enable()
  67.                                 Case bu3
  68.                                         mb1.clearItems()
  69.                                 Case bu4
  70.                                        
  71.                                         For kk:Int = 0 To 14
  72.                                                 mb1.AddItem("Item " + kk , "Description " + kk , "Tips " + kk , "Tips Description " + kk)
  73.                                         Next
  74.  
  75.                                 Case bu5
  76.                                
  77.                                         mb1.SetBackColor(Rnd(255) , Rnd(255) , Rnd(255) )
  78.                                         mb1.SetSelectColor(Rnd(255) , Rnd(255) , Rnd(255) )
  79.                                        
  80.                                 Case bu6
  81.                                
  82.                                         mb1.SetItemBackColor(Rand(mb1.array.length),Rnd(255) , Rnd(255) , Rnd(255) )
  83.  
  84.                                 Case bu7
  85.                                         Print "Extract status..."                              
  86.                                         tem = mb1.ExtractStatus()
  87.                                                 For Local k12:Int = EachIn tem
  88.                                                         Print k12
  89.                                                 Next
  90.                                                 Print "-------------------"
  91.                                                
  92.                                 Case bu8
  93.                                         mb1.InvertState()
  94.                                        
  95.                         End Select
  96.                
  97.         EndSelect
  98.        
  99. Forever
  100.  
  101. Function GotoEnd()
  102.        
  103.         mb1.free()
  104.         End
  105.        
  106.        
  107.        
  108. End Function
  109.                
  110.  
  111. Function CreateMultiButton:tmultibutton(x:Int , y:Int , w:Int , h:Int , win:tgadget , t1$ = "" , t2$ = "" , ti1$ = "" , ti2$ = "" , style:Int = 0)
  112.         Return tmultibutton.Create(x , y , w , h , win , t1 , t2 , t1 , t2 , style)
  113. End Function
  114.  
  115.  
  116. Type TMultiButton Extends TProxyGadget
  117.        
  118.         Field panel:tgadget
  119.         Field button:tgadget
  120.         Field label:tgadget
  121.         Field slider:tgadget
  122.         Field line:tgadget
  123.        
  124.         Field parent:tMultiButton
  125.         Field current_position:Int=1
  126.         Field width:Int,he:Int
  127.         Field visible:Int
  128.        
  129.         Field bcolor:Int[] = [188 , 188 , 188]
  130.         Field scolor:Int[] = [200 , 200 , 200]
  131.         Field tcolor:Int[] = [40 , 40 , 220]
  132.         Field lcolor:Int[] = [0,0,0]
  133.        
  134.         Field counter:Int=0
  135.         Field array:tmultibutton[]
  136.        
  137.         Function Create:TMultiButton( x:Int, y:Int, w:Int, h:Int, group:TGadget, t1$="",t2$="",tip1$="",tip2$="",style:Int=0 )
  138.                 Local mb:TMultiButton=New TMultiButton
  139.                 mb.panel = CreatePanel(x , y , w-20 , h , group , PANEL_ACTIVE)
  140.                 ' mb.button = CreateButton(t1$ , 5 , 1 , w - 5 , 16 , mb.panel , BUTTON_CHECKBOX)
  141.                 'mb.label = CreateLabel(t2,23,18,w-5,16,mb.panel,LABEL_LEFT)
  142.                 mb.style = style
  143.                 mb.slider=CreateSlider(x+w-20,y,20,h,group,SLIDER_SCROLLBAR|SLIDER_VERTICAL)
  144.                 mb.parent = mb
  145.                 mb.width = w - 20
  146.                 mb.he = h
  147.                 mb.visible=Int(h/40)
  148.                 SetGadgetColor mb.panel , mb.bcolor[0],mb.bcolor[1],mb.bcolor[2]
  149.                 ActivateGadget mb.panel
  150.                 AddHook EmitEventHook,MultiButtonHook,mb
  151.                 Return mb
  152.         EndFunction
  153.        
  154.         Method AddItem:tmultibutton(t1$ = "" , t2$ = "" , tp1$ = "" , tp2$ = "",_state:Int=1)
  155.                
  156.                 If t1 = "" Return Null
  157.                 counter:+1
  158.                 array = array[..counter]
  159.                 array[counter - 1] =Self.CreateItem(t1,t2,tp1,tp2,Self,_state)
  160.                 'Print "Counter: "+counter
  161.                
  162.                 Local num:Int = counter - Int(he / 40) + 1
  163.                 If slider SetSliderRange slider,0,num
  164.                
  165.                 Return array[counter-1]
  166.                
  167.         End Method
  168.        
  169.         Method AddFromArray(title$[] , label$[] , state:Int[])
  170.                
  171.                 If label.length <>title.length Or label.length <>state.length Or title.length <>state.length Return 0
  172.                
  173.                 For Local c1:Int = 0 Until title.length
  174.                        
  175.                         AddItem(title[c1],label[c1],"","",state[c1])
  176.                                                
  177.                 Next
  178.                
  179.         End Method
  180.        
  181.         Method SetButtonColor(r:Int = 188 , g:Int = 188 , b:Int = 188)
  182.                 tcolor = [r , g , b]
  183.                 For Local it:tmultibutton = EachIn array
  184.                         it.tcolor = [r , g , b]
  185.                         If it.button SetGadgetColor it.button,r,g,b,False                      
  186.                         If it.panel ActivateGadget it.panel
  187.                 Next
  188.                 ActivateGadget panel
  189.         End Method
  190.        
  191.         Method SetLabelColor(r:Int = 188 , g:Int = 188 , b:Int = 188)
  192.                 tcolor = [r , g , b]
  193.                 For Local it:tmultibutton = EachIn array
  194.                         it.tcolor = [r , g , b]
  195.                         If it.label SetGadgetColor it.label,r,g,b,False                
  196.                         If it.panel ActivateGadget it.panel
  197.                 Next
  198.                 ActivateGadget panel
  199.         End Method
  200.  
  201.        
  202.        
  203.         Method SetBackColor(r:Int = 188 , g:Int = 188 , b:Int = 188)
  204.                 bcolor = [r , g , b]
  205.                
  206.                 For Local it:tmultibutton = EachIn array
  207.                         it.bcolor = [r , g , b]
  208.                         If it.panel ActivateGadget it.panel
  209.                 Next
  210.                 ActivateGadget panel
  211.                
  212.         End Method
  213.        
  214.         Method SetSelectColor(r:Int = 200 , g:Int = 200 , b:Int = 200)
  215.                 scolor = [r , g , b]
  216.                 For Local it:tmultibutton = EachIn array
  217.                         it.scolor = [r , g , b]
  218.                         If it.panel ActivateGadget it.panel
  219.                 Next
  220.                 ActivateGadget panel
  221.  
  222.         End Method
  223.        
  224.         Method SetItemBackColor(item:Int = 0 , r:Int = 188 , g:Int = 188 , b:Int = 188)
  225.                 If array = Null Return
  226.                
  227.                 If item < 0 Or item > array.length Return
  228.                
  229.                 array[item].bColor = [r , g , b]
  230.                
  231.                
  232.                
  233.         End Method
  234.        
  235.         Method SetItemButtonColor(item:Int = 0 , r:Int = 255 , g:Int = 255 , b:Int = 255)
  236.                 If array = Null Return
  237.                
  238.                 If item < 0 Or item > array.length Return
  239.                
  240.                 array[item].tColor = [r , g , b]
  241.                 If array[item].button SetGadgetColor array[item].button,r,g,b,False
  242.  
  243.         End Method      
  244.        
  245.         Method SetItemLabelColor(item:Int = 0 , r:Int = 255 , g:Int = 255 , b:Int = 255)
  246.                 If array = Null Return
  247.                
  248.                 If item < 0 Or item > array.length Return
  249.                
  250.                 array[item].tColor = [r , g , b]
  251.                 If array[item].label SetGadgetColor array[item].label,r,g,b,False
  252.  
  253.         End Method      
  254.        
  255.  
  256.  
  257.        
  258.  
  259.         Method SetItemSelectColor(item:Int = 0 , r:Int = 200 , g:Int = 200 , b:Int = 200)
  260.                 If array = Null Return
  261.                
  262.                 If item < 0 Or item > array.length Return
  263.                
  264.                 array[item].sColor = [r , g , b]
  265.  
  266.         End Method      
  267.        
  268.         Method GetItemStatus:Int(item:Int = 0)
  269.                 If array = Null Return 0
  270.                 If item < 0 Or item > array.length-1 Return 0
  271.                 If array[item].button=Null Return 0
  272.                 Return ButtonState(array[item].button)
  273.         End Method
  274.        
  275.         Method SetItemStatus:Int(item:Int = 0,state:Int=1)
  276.                 If array = Null Return 0
  277.                 If item < 0 Or item > array.length-1 Return 0
  278.                 If array[item].button=Null Return 0
  279.                 Return SetButtonState(array[item].button,state)
  280.         End Method
  281.        
  282.        
  283.         Method ExtractStatus:Int[]()
  284.                 'returns an array of Int of all the checkbox
  285.                 If array = Null Return [0]
  286.                 Local temp:Int[] , con:Int
  287.                 temp=New Int[array.length]
  288.                 For Local what:tmultibutton = EachIn array
  289.                         If what.button
  290.                                 temp[con] = ButtonState(what.button)
  291.                         End If
  292.                         con:+ 1
  293.                 Next
  294.                 Return temp
  295.                
  296.         End Method
  297.        
  298.         Method SetTip(item:Int , tip$ = "",tip2$="")
  299.                 If array = Null Return 0
  300.                 If item < 0 Or item > array.length-1 Return 0
  301.                
  302.                 If array[item].button SetGadgetToolTip array[item].button,tip$
  303.                 If array[item].label SetGadgetToolTip array[item].label , tip2$
  304.                        
  305.         End Method
  306.        
  307.         Method DisableItem(item:Int = 0)
  308.                 If array = Null Return 0
  309.                 If item < 0 Or item > array.length-1 Return 0
  310.                 If array[item].button DisableGadget array[item].button
  311.                 If array[item].label DisableGadget array[item].label
  312.         End Method
  313.        
  314.         Method EnableItem(item:Int = 0)
  315.                 If array = Null Return 0
  316.                 If item < 0 Or item > array.length-1 Return 0
  317.                 If array[item].button EnableGadget array[item].button
  318.                 If array[item].label EnableGadget array[item].label
  319.         End Method
  320.  
  321.        
  322.        
  323.         Method CreateItem:tmultibutton(t1$ = "" , t2$ = "" , tp1$ = "" , tp2$ = "",parent:tmultibutton,_state:Int=1)  
  324.                 If parent=Null Return Null
  325.                 Local w:Int=parent.width       
  326.                 If parent.panel=Null Return Null
  327.                
  328.                 Local h:Int = 40
  329.                
  330.                 Local mb:tmultibutton = New tmultibutton
  331.                 mb.panel = CreatePanel(0 , 40*(counter-1) , w , 40 , parent.panel , PANEL_ACTIVE)
  332.                
  333.                 SetGadgetColor mb.panel , mb.bcolor[0] , mb.bcolor[1] , mb.bcolor[2]
  334.                        
  335.                 mb.button = CreateButton(t1$ , 5 , 1 , w - 5 , 16 , mb.panel , BUTTON_CHECKBOX)
  336.                 mb.label = CreateLabel(t2,23,20,w-5,16,mb.panel,LABEL_LEFT)
  337.                 mb.line  = CreateLabel("",0,39,w+1,1,mb.panel,LABEL_SEPARATOR)
  338.                
  339.                 SetGadgetColor mb.button , mb.tcolor[0] , mb.tcolor[1] , mb.tcolor[2] , False
  340.                 SetGadgetColor mb.label , mb.lcolor[0] , mb.lcolor[1] , mb.lcolor[2] , False
  341.  
  342.                
  343.                 SetGadgetToolTip mb.button , tp1
  344.                 SetGadgetToolTip mb.label , tp2
  345.                 SetButtonState mb.button,_state
  346.                
  347.                
  348.         '       Print "Create item..."+counter
  349.                
  350.                 Return mb
  351.                
  352.         End Method
  353.        
  354.         Method ChangeState(sta:Int = 0)
  355.                 For Local c:tmultibutton = EachIn array
  356.                         If c.button SetButtonState c.button , sta
  357.                 Next
  358.         End Method
  359.        
  360.         Method InvertState(sta:Int = 0)
  361.                 For Local c:tmultibutton = EachIn array
  362.                         If c.button SetButtonState c.button , 1-ButtonState(c.button)
  363.                 Next
  364.         End Method
  365.        
  366.         Method Disable()
  367.                 For Local c:tmultibutton = EachIn array
  368.                         If c.button DisableGadget c.button
  369.                         If c.label DisableGadget c.label
  370.                 Next
  371.  
  372.         End Method
  373.        
  374.         Method Enable()
  375.                 For Local c:tmultibutton = EachIn array
  376.                         If c.button EnableGadget c.button
  377.                         If c.label EnableGadget c.label
  378.                 Next
  379.         End Method
  380.        
  381.         Method ClearItems()
  382.                
  383.                 For Local c:tmultibutton = EachIn array
  384.                         If c.button FreeGadget c.button
  385.                         If c.label FreeGadget c.label
  386.                         If c.line FreeGadget c.line
  387.                         If c.panel FreeGadget c.panel
  388.                        
  389.                 Next
  390.                 array = array[..0]
  391.                 counter=0
  392.                
  393.                 Local num:Int = counter - Int(he / 40) + 1
  394.                 If slider SetSliderRange slider,0,num
  395.  
  396.                
  397.                 If panel ActivateGadget panel
  398.         End Method
  399.        
  400.         Method Free()
  401.                 RemoveHook EmitEventHook,MultiButtonHook,Self
  402.                 'textField is freed in super
  403.                 ClearItems()
  404.                
  405.                 If button FreeGadget button
  406.                 If label FreeGadget label
  407.                 If slider FreeGadget slider
  408.                 If panel FreeGadget panel
  409.                 If line FreeGadget line
  410.                
  411.                 button = Null
  412.                 label = Null
  413.                 slider = Null
  414.                 panel=Null
  415.                 Super.Free
  416.         End Method
  417.  
  418.         Function MultiButtonHook:Object( id:Int, data:Object, context:Object )
  419.                 Local mb:TMultiButton
  420.                 Local event:TEvent
  421.                 event=TEvent(data)
  422.                 If event
  423.                         mb=TMultiButton(context)       
  424.                         If mb Return mb.HandleEvents(event)
  425.                 EndIf
  426.                 Return data
  427.         EndFunction
  428.        
  429.         Method HandleEvents:TEvent( event:TEvent )
  430.                 Local what:tmultibutton
  431.                 Local con:Int = 0
  432.                 Local datamove:Int
  433.                
  434.                
  435.                 Select event.id
  436.                
  437.                         Case EVENT_MOUSEWHEEL
  438.                                 If EventSource()=panel
  439.                                         datamove = EventData()
  440.                        
  441.                                         current_position:+ datamove*-1
  442.                                        
  443.                                         If current_position < 0 current_position = 0
  444.                                         If current_position > array.length-visible current_position=array.length-visible
  445.                                        
  446.                                         For what=EachIn array
  447.                                                 SetGadgetShape what.panel , 0 , con * 40 - current_position * 40 , width , 40
  448.                                                 con:+1
  449.                                         Next
  450.                                        
  451.                                         SetSliderValue slider , current_position
  452.                        
  453.                                 End If
  454.                
  455.                
  456.  
  457.                        
  458.                
  459.                
  460.                         Case EVENT_MOUSELEAVE
  461.                                
  462.        
  463.                                 For what:tmultibutton=EachIn array
  464.                                         SetGadgetColor what.panel , what.bcolor[0] , what.bcolor[1] , what.bcolor[2]
  465.                                
  466.                                         If EventSource() = what.panel
  467.                                                 SetGadgetColor what.panel , what.scolor[0] , what.scolor[1] , what.scolor[2]
  468.                                                 ActivateGadget panel
  469.                                                 Continue
  470.                                         End If
  471.                                 con:+1
  472.  
  473.                                 Next
  474.                                
  475.                         Case EVENT_GADGETACTION
  476.                                
  477.                                 If EventSource() = slider
  478.                                         datamove:Int = EventData()
  479.                                        
  480.                                         For what=EachIn array
  481.                                                 SetGadgetShape what.panel , 0 , con * 40 - datamove * 40 , width , 40
  482.                                                 con:+1
  483.                                         Next
  484.  
  485.                                
  486.                                 End If
  487.                        
  488.                 EndSelect
  489.         Return event
  490.         EndMethod
  491. EndType


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal