Ooops
November 28, 2020, 01:12:42 PM

Author Topic: [bmx] CheckListBox by degac [ 1+ years ago ]  (Read 540 times)

Offline BlitzBot

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

Description : This gadget creates a listbox with 'checkboxese'. It uses standard MaxGUI commands and interface, it should works well on every platform.




Supported 'commands':

AddGadgetItem (the FLAGS=1 means Checked)
ModifyGadgetItem
ClearGadgetItems
SelectedGadgetItems
CountGadgetItems
Disable/EnableGadget
Setgadgetcolor
GadgetItemText
GadgetItemExtra
RemoveGadgetItem
SetGadgetIconStrip
SelectGadgetItem *
DeselectGadgetItem *
ToggleGadgetItem *

* Index= -1 means select all the items

It supports now Pixmaps/Iconstrip

Edit: 15-08-2010

You can grab all the 'extra gadgets' from <a href="http://www.graphio.net/download/maxgui_extragadget.zip" target="_blank">here[/url]
This zip file contains:
- a calendar
- a datepicker
- a listboxmanager
- a checklist
- a new progressbar


Code :
Code: BlitzMax
  1. Rem
  2.         checklistbox
  3.        
  4.         version 2.0 - degac
  5.        
  6.         18 agosto 2009
  7.        
  8.         2.1
  9.                 + added IconStrip support
  10.                 + added RemoveGadgetItem
  11.                 + added SelectGadgetItem (-1 as index means ALL the items)
  12.                 + added DeselectGadgetItem (-1 as index means ALL the items)
  13.                 + added ToggleGadgetItem (-1 as index means ALL the items)
  14.  
  15.                
  16.        
  17. End Rem
  18.  
  19. SuperStrict
  20. Import maxgui.drivers
  21.  
  22.  
  23.         Local window:tgadget=CreateWindow("test 2",100,100,350,340,,WINDOW_TITLEBAR|WINDOW_CENTER)
  24.        
  25.         Local list1:tgadget=CreateCheckListBox( 10,10,150,200,window)
  26.         Local list2:tgadget=CreateCheckListBox(180,10,150,200,window)
  27.        
  28.         Local but1:tgadget      =CreateButton("Clear all"       ,10,220,100,25,window)
  29.         Local but2:tgadget      =CreateButton("Copy"            ,10,250,100,25,window)
  30.         Local but3:tgadget      =CreateButton("Destroy" ,120,220,100,25,window)
  31.         Local but4:tgadget      =CreateButton("Enable"  ,120,250,100,25,window)
  32.         Local but5:tgadget      =CreateButton("Disable" ,230,250,100,25,window)
  33.         Local but6:tgadget      =CreateButton("Check all"       , 10,280,100,25,window)
  34.         Local but7:tgadget      =CreateButton("UnCheck all"     ,120,280,100,25,window)
  35.         Local but8:tgadget      =CreateButton("Toggle all"      ,230,280,100,25,window)
  36.        
  37.         Local ic:ticonstrip=LoadIconStrip("D:\_BlitzMaxMaxGUI_extra     oolbar.png")
  38.        
  39.         SetGadgetIconStrip list1,ic
  40.         SetGadgetIconStrip list2,ic
  41.         SetGadgetColor list1,200,100,90
  42.  
  43.         For Local ii:Int=1 To 20
  44.                 AddGadgetItem list1,"Item "+ii,Rand(0,1),(ii Mod 11),"Tip "+ii
  45.         Next
  46.  
  47.         Print "Item in List1: "+CountGadgetItems(list1)
  48.        
  49.         ModifyGadgetItem list1,3,"---New 4",1,8,"This is new..."
  50.         RemoveGadgetItem list1,4 ' it's the 5th items in the list (starting from 0...)
  51.        
  52.         Print GadgetItemText(list1,3)
  53.  
  54.         'DisableGadget list1
  55.         'DeselectGadgetItem list1,-1
  56.         'ToggleGadgetItem list1,1
  57.         SelectGadgetItem list1,22
  58.        
  59.        
  60.         While True
  61.         WaitEvent
  62.         'Print CurrentEvent.ToString()
  63.         Select EventID()
  64.                 Case EVENT_GADGETACTION
  65.                         Select EventSource()
  66.                                 Case but6 'check all
  67.                                         SelectGadgetItem(list1,-1)
  68.                                 Case but7 'uncheck all
  69.                                         DeselectGadgetItem(list1,-1)   
  70.                                 Case but8 'toggle item
  71.                                         ToggleGadgetItem(list1,-1)                     
  72.                        
  73.                                 Case but1
  74.                                         ClearGadgetItems list1
  75.                                 Case but2
  76.                                        
  77.                                         ClearGadgetItems list2
  78.                                         Local result:Int[]=SelectedGadgetItems(list1)
  79.                                         For Local i:Int=EachIn result
  80.                                                         AddGadgetItem list2,GadgetItemText(list1,i),list1.ItemState(i),list1.ItemIcon(i),list1.ItemTip(i),GadgetItemExtra(list1,i)
  81.                                         Next
  82.  
  83.                                 Case but3
  84.                                         FreeGadget list1
  85.                                        
  86.                                 Case but5
  87.                                         DisableGadget list1
  88.                                 Case but4
  89.                                         EnableGadget list1
  90.                                
  91.                                        
  92.                                
  93.                         End Select
  94.        
  95.                 Case EVENT_WINDOWCLOSE
  96.                         End
  97.         End Select
  98. Wend
  99.  
  100. End
  101.  
  102.  
  103. Function CreateCheckListBox:Tchecklistbox (x:Int , y:Int , w:Int , h:Int , win:tgadget , style:Int = 0)
  104.         Return Tchecklistbox .Create(x , y , w , h , win ,  style)
  105. End Function
  106.  
  107.  
  108. Type SingleItem
  109.         Field panel:tgadget
  110.         Field check:tgadget
  111.         Field label:tgadget
  112.         Field icon:tgadget
  113.         Field iconNumber:Int
  114.         Field parent:tchecklistbox
  115.        
  116.        
  117.                
  118.         Function Create:SingleItem(parent:tchecklistbox,txt$,tip$="",icon:Int=-1,state:Int=0)
  119.                 Local ss:singleItem=New singleItem
  120.                 Local yy:Int=parent.it.length*20-20
  121.                        
  122.                 ss.panel=CreatePanel(0,yy,ClientWidth(parent.panel),20,parent.panel,PANEL_ACTIVE)
  123.                 ss.check=CreateButton("",5,0,16,19,ss.panel,BUTTON_CHECKBOX)
  124.                 ss.label=CreateLabel(txt,40,2,ClientWidth(ss.PANEL),20,SS.PANEL)
  125.                 ss.icon=CreatePanel(20,1,18,18,ss.panel)
  126.                
  127.                 ss.parent=parent
  128.                
  129.                 SetGadgetToolTip ss.label,tip
  130.                 SetButtonState ss.check,state
  131.                 Return SS
  132.         End Function
  133.        
  134.         Method Change(txt$,tip$,_iconNumber:Int=-1,state:Int=-1)
  135.        
  136.                 SetGadgetText label,txt
  137.                 SetGadgetToolTip label,tip
  138.                 If _iconNumber>-1
  139.                                 Local px:TPixmap=PixmapFromIconStrip(parent.myiconstrip, _iconNumber)
  140.                                 SetGadgetPixmap icon,px,PANELPIXMAP_CENTER
  141.                                 iconNumber=_iconNumber
  142.                                
  143.                 End If
  144.  
  145.                
  146.                 If state<>-1 SetButtonState check,state
  147.        
  148.         End Method
  149.        
  150.         Method Clear()
  151.                 If label FreeGadget label
  152.                 If check FreeGadget check
  153.                 If panel FreeGadget panel
  154.                 If icon FreeGadget icon
  155.                
  156.                 icon=Null
  157.                 label=Null
  158.                 check=Null
  159.                 panel=Null     
  160.         End Method
  161.  
  162.         Method SetEnabled(status:Int=True)
  163.                
  164.                 If status=True
  165.                         EnableGadget label
  166.                         EnableGadget check
  167.                         EnableGadget panel
  168.                         EnableGadget icon
  169.                 Else
  170.                         DisableGadget label
  171.                         DisableGadget check
  172.                         DisableGadget panel
  173.                         DisableGadget icon
  174.  
  175.                 End If
  176.        
  177.         End Method
  178.        
  179. End Type
  180.  
  181.  
  182. Type Tchecklistbox Extends TProxyGadget
  183.  
  184.         Global list_checklistbox:TList
  185.  
  186.         Field myiconstrip:ticonstrip
  187.         Field panel:tgadget
  188.         Field slider:tgadget
  189.         Field style:Int
  190.         Field current_position:Int,visible:Int
  191.         Field panel_width:Int
  192.         Field it:singleItem[]
  193.        
  194.         Method InsertItem(index:Int,text:String,tip:String,icon:Int,extra:Object,flags:Int)
  195.                
  196.                 ?debug
  197.                 If index<0 Or index>it.length Throw "Index out of range"
  198.                 ?      
  199.                 it=it[..it.length+1]
  200.                 For Local i:Int=it.length-2 To index Step -1
  201.                         it[i+1]=it[i]
  202.                 Next
  203.                 If it[index]<>Null
  204.                                 SetGadgetText it[index].label,text
  205.                                 SetGadgetExtra it[index].label,extra
  206.                                 If icon>-1
  207.                                         Local px:TPixmap=PixmapFromIconStrip(myiconstrip, icon)
  208.                                         SetGadgetPixmap it[index].icon,px,PANELPIXMAP_CENTER
  209.                                         it[index].iconNumber=icon
  210.                                 End If
  211.                 Else
  212.                         it[index]=SingleItem.Create(Self,text$,tip$,icon,flags)
  213.                         it[index].label.Extra=Extra
  214.                         If icon>-1
  215.                                 Local px:TPixmap=PixmapFromIconStrip(myiconstrip, icon)
  216.                                 SetGadgetPixmap it[index].icon,px,PANELPIXMAP_CENTER
  217.                                 it[index].iconNumber=icon
  218.                         End If
  219.                 End If
  220.                
  221.                 Local num:Int = it.length - visible + 1
  222.                 If slider SetSliderRange slider , 0 , num
  223.  
  224.                
  225.         End Method
  226.        
  227.         Method SetIconStrip(_iconstrip:ticonStrip)
  228.                 myiconstrip=_iconStrip
  229.         End Method
  230.        
  231.         Method SelectItem(index:Int=-1,op:Int=1)
  232.                 Rem
  233.                         if index=-1 SELECT ALL the items
  234.                        
  235.                         OP = 1  set CHECKED
  236.                         OP = 0  set UNCHEKED
  237.                         OP = 2  TOGGLE
  238.                 End Rem
  239.                
  240.                 If index=-1
  241.                         If op=0 Or op=1
  242.                                 For Local ss:singleitem=EachIn it
  243.                                         If ss   SetButtonState(ss.check,OP)
  244.                                 Next
  245.                         Else
  246.                                 For Local ss:singleitem=EachIn it
  247.                                         If ss   SetButtonState(ss.check,1-ButtonState(ss.check))
  248.                                 Next
  249.                        
  250.                         End If
  251.                 Else
  252.                        
  253.                         If index<it.length
  254.                                 If OP=0 Or OP=1
  255.                                         SetButtonState(it[index].check,OP)
  256.                                 Else
  257.                                         SetButtonState(it[index].check,1-ButtonState(it[index].check))
  258.  
  259.                                 End If
  260.                         End If
  261.                        
  262.                 End If
  263.                                        
  264.                
  265.        
  266.         End Method
  267.        
  268.        
  269.        
  270.         Method SetEnabled(status:Int=True)
  271.        
  272.                 For Local ss:singleitem=EachIn it
  273.                         ss.SetEnabled(status)
  274.                 Next
  275.  
  276.                 If status=True
  277.                         EnableGadget slider
  278.                         EnableGadget panel
  279.                 Else
  280.                         DisableGadget slider
  281.                         DisableGadget panel
  282.                 End If
  283.         End Method
  284.        
  285.         Method ItemCount:Int()
  286.                 Return it.length
  287.         End Method
  288.        
  289.         Method RemoveItem:Int(index:Int)
  290.                 ?debug
  291.                 If index<0 Or index>it.length Throw "Index out of range"
  292.                 ?      
  293.                
  294.                 it[index].Clear()
  295.                 it[index]=Null
  296.                
  297.                 For Local t:Int=index+1 Until it.length
  298.                         it[t-1]=it[t]
  299.                
  300.                 Next
  301.                 it=it[..it.length-1]
  302.                
  303.                 'Replace position
  304.  
  305.                 For Local t:Int=index Until it.length
  306.                         SetGadgetShape it[t].panel , 0 , t * 20, panel_width , 20
  307.                 Next
  308.                 If slider SetSliderRange slider , 0 , it.length - visible + 1
  309.  
  310.  
  311.         End Method
  312.        
  313.         Method SetItem(index:Int,text:String,tip:String,icon:Int,extra:Object,flags:Int)
  314.                 ?debug
  315.                 If index<0 Or index>it.length Throw "Index out of range"
  316.                 ?      
  317.                 it[index].Change(text,tip,icon,flags)  
  318.         End Method
  319.        
  320.         Method ItemText:String(index:Int)
  321.                 ?debug
  322.                 If index<0 Or index>it.length Throw "Index out of range"
  323.                 ?
  324.                 Return GadgetText(it[index].label)
  325.         End Method
  326.        
  327.         Method ItemTip:String(index:Int)
  328.                 ?debug
  329.                 If index<0 Or index>it.length Throw "Index out of range"
  330.                 ?
  331.                 Return it[index].label.GetTooltip()
  332.         End Method
  333.        
  334.         Method ItemExtra:Object(index:Int)
  335.                 ?debug
  336.                 If index<0 Or index>it.length Throw "Index out of range"
  337.                 ?
  338.                 Return GadgetExtra(it[index].label)
  339.  
  340.         End Method
  341.        
  342.         Method ItemIcon:Int(index:Int)
  343.                 ?debug
  344.                                 If index<0 Or index>=it.length Throw "Index out of range"
  345.                 ?
  346.                 Return it[index].iconNumber
  347.         End Method
  348.        
  349.         Method ItemState:Int(index:Int)
  350.                 ?debug
  351.                 If index<0 Or index>it.length Throw "Index out of range"
  352.                 ?
  353.                 Return ButtonState(it[index].check)
  354.         End Method
  355.        
  356.         Method Clear()
  357.                 For Local ss:singleItem=EachIn it
  358.                         ss.clear()
  359.                         ss=Null
  360.                 Next
  361.                 it=Null
  362.                
  363.         End Method
  364.        
  365.         Method SetColor(r:Int,g:Int,b:Int)
  366.                 SetGadgetColor panel,r,g,b
  367.                 For Local si:singleitem=EachIn it
  368.                         SetGadgetColor si.panel,r,g,b
  369.                         SetGadgetColor si.label,r,g,b
  370.                         SetGadgetColor si.check,r,g,b
  371.                 Next   
  372.         End Method
  373.        
  374.         Method SelectedItems:Int[]()
  375.                 'SELECED (=CHECKED) ITEMS
  376.                 Local count:Int,i:Int,array:Int[it.length]
  377.                 For i=0 Until it.length
  378.                         If it[i]
  379.                                 If ButtonState(it[i].check)=True
  380.                                         array[count]=i
  381.                                         count:+1
  382.                                 End If
  383.                         End If
  384.                 Next
  385.                 If count>0 Return array[..count]       
  386.  
  387.         End Method
  388.        
  389.         Method CleanUp()
  390.                 Clear()
  391.                 If slider FreeGadget slider
  392.                 If panel FreeGadget panel
  393.                
  394.                 list_checklistbox.remove(Self)
  395.                
  396.        
  397.         End Method
  398.        
  399.         Method Free()
  400.                
  401.                 ClearList list_checklistbox
  402.                 list_checklistbox=Null
  403.         End Method
  404.        
  405.  
  406.  
  407.         Function Create:Tchecklistbox ( x:Int, y:Int, w:Int, h:Int, group:TGadget,style:Int=0 )
  408.                 Local mb:Tchecklistbox =New Tchecklistbox
  409.                 mb.panel = CreatePanel(x , y , w-20 , h , group , PANEL_ACTIVE)
  410.                 mb.style = style
  411.                 mb.slider=CreateSlider(x+w-20,y,20,h,group,SLIDER_SCROLLBAR|SLIDER_VERTICAL)
  412.                 SetGadgetColor mb.panel,255,255,255
  413.                 ActivateGadget mb.panel
  414.                 AddHook EmitEventHook,_Hook,mb
  415.                 mb.setproxy(mb.panel)
  416.                 If list_checklistbox=Null list_checklistbox=New TList
  417.                 list_checklistbox.addlast mb
  418.                
  419.                 mb.panel_width=ClientWidth(mb.panel)
  420.                 mb.visible=Int(h/20)
  421.                
  422.                 Return mb
  423.         EndFunction
  424.  
  425.         Function _Hook:Object( id:Int, data:Object, context:Object )
  426.                 Local mb:Tchecklistbox
  427.                 Local event:TEvent
  428.                 event=TEvent(data)
  429.                 If event
  430.                         mb=Tchecklistbox (context)     
  431.                         If mb Return mb.HandleEvents(event)
  432.                 EndIf
  433.                 Return data
  434.         EndFunction
  435.        
  436.         Method HandleEvents:TEvent( event:TEvent )
  437.                 Local what:Tchecklistbox
  438.                 Local con:Int = 0
  439.                 Local datamove:Int
  440.                
  441.                
  442.                 Select event.id
  443.                         'mouse_wheel for changing position?
  444.                                                                        
  445.                         Case EVENT_GADGETACTION
  446.                                                        
  447.                                 If EventSource() = slider
  448.                                
  449.                                         current_position = SliderValue(slider)'EventData()
  450.                                        
  451.                                         If current_position < 0 current_position = 0
  452.                                         If current_position > it.length current_position=it.length
  453.                                         Local con:Int=0
  454.                                         For Local what:singleitem=EachIn it
  455.                                                 SetGadgetShape what.panel , 0 , con * 20 - current_position* 20 , panel_width , 20
  456.                                                 con:+1
  457.                                         Next
  458.  
  459.                                
  460.                                 End If
  461.                                
  462.                 EndSelect
  463.         Return event
  464.         EndMethod
  465.  
  466. End Type


Comments :


Ked(Posted 1+ years ago)

 The scrollbars are awfully thick...


degac(Posted 1+ years ago)

 Yes I know, but I dont' know to determine these 'GUI-items-dimensions' (I make it 20pixel wider..)And I think a standard ListBox has more or less the same scrollbar wide.Also I found a bug (???) in my example: make a CreateCheckListBox() with 100 or more items and try to scroll it. On Windows I noticed a 'slowness' in the drawing, while under Linux there isn't.Misteries of windows...


degac(Posted 1+ years ago)

 15-08-2010: see update in the main post


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal