January 16, 2021, 05:55:48 AM

Author Topic: [bb] Improved Dropdown (v2.0) by MadMunky [ 1+ years ago ]  (Read 577 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bb] Improved Dropdown (v2.0) by MadMunky [ 1+ years ago ]
« on: June 29, 2017, 12:28:40 AM »
Title : Improved Dropdown (v2.0)
Author : MadMunky
Posted : 1+ years ago

Description : Yahfree, I hope it's ok with you that I took the liberty of giving your dropdown an overhaul? Anyways, here it is :)
I changed a lot compared to your version. Sorting, key-browsing, scrollmouse, styles, fonts, ... . And you can add an ID+value to each dropdown element now.

Thanks again, Yahfree.


Code :
Code: BlitzBasic
  1. Graphics 800, 600, 0, 2
  2.  
  3. ;----------------------------------
  4. ;             DROPDOWN
  5. ;        By Wishbone/Madmunky
  6. ;    Special thanks to Yahfree ;)
  7. ;
  8. Const DD_UNORDERED = 0, DD_ORDERBYID = 1, DD_ORDERBYVALUE = 2
  9.  
  10. Global dd_CursorX, dd_CursorY, dd_ListLast$, dd_fontheight
  11. Global dd_MouseHold, dd_screenGFX = CreateImage(GraphicsWidth(), GraphicsHeight())
  12.  
  13. Type dd_list
  14.         Field id%
  15.         Field valueRaw$
  16.         Field name$, value$
  17.         Field orderedBy%
  18. End Type
  19.  
  20. Type dd_DropDown
  21.         Field id%
  22.         Field name$, value$
  23.         Field width%, height%
  24.         Field style%
  25.         Field scrolly#, shown#
  26.         Field x%, y%
  27. End Type
  28.  
  29. Function dd_createDropDown$(dd_id, dd_style=0, dd_height=14)
  30.         While MouseDown(1): Wend
  31.        
  32.         dd_fontheight = FontHeight()+4
  33.  
  34.         dd_d.dd_DropDown = New dd_DropDown
  35.         dd_did = dd_id
  36.        
  37.         i = 0: dd_dwidth = 0
  38.         For dd_L.dd_list = Each dd_list
  39.                 If dd_Lid = dd_id
  40.                         i = i+1
  41.                         If dd_dwidth < StringWidth(dd_Lvalue) Then dd_dwidth = StringWidth(dd_Lvalue)
  42.                 EndIf
  43.         Next
  44.         dd_dwidth = dd_dwidth+22
  45.         dd_dheight = dd_height
  46.         dd_heightorig = dd_height
  47.         If dd_dheight > i Or (dd_dheight < i And dd_heightorig > dd_dheight) Then dd_dheight = i
  48.        
  49.         dd_dx = MouseX()
  50.         dd_dy = MouseY()-dd_fontheight+2
  51.         If dd_dx+dd_dwidth > GraphicsWidth() Then dd_dx = GraphicsWidth()-dd_dwidth-1
  52.         If dd_dy+dd_fontheight*(dd_dheight+1) > GraphicsHeight() Then dd_dy = MouseY()-(dd_fontheight*(dd_dheight+1))-1
  53.        
  54.         dd_dscrolly = dd_dy+dd_fontheight
  55.         dd_dstyle = dd_style
  56.         dd_dshown = dd_dy
  57.         dd_d
  58. ame = ""
  59.         dd_dvalue = ""
  60.        
  61.         res$ = dd_drawDropDowns()
  62.         Return res$
  63. End Function
  64.  
  65. Function dd_drawDropDown(dd_d.dd_DropDown, dd_md=False)
  66.         dd_id = dd_did
  67.         dd_scrolly# = dd_dscrolly
  68.         dd_shown# = dd_dshown
  69.         dd_x = dd_dx
  70.         dd_y = dd_dy
  71.         dd_name$ = dd_d
  72. ame$
  73.         dd_value$ = dd_dvalue$
  74.         dd_style = dd_dstyle
  75.         dd_width = dd_dwidth
  76.         dd_height = dd_dheight
  77.         dd_heightorig = dd_dheight
  78.         dd_colR = 0
  79.         dd_colG = 0
  80.         dd_colB = 0
  81.         dd_buttonwidth = 15
  82.         dd_hold = False
  83.        
  84.         If Not(dd_md) Then dd_MouseHold = False
  85.  
  86.         Select dd_style
  87.                 Case 0: c1=255: c2=128
  88.                 Case 1: c1=224: c2=64
  89.         End Select
  90.         Color c1, c1, c1
  91.         Rect dd_x-1, dd_y+dd_fontheight-2, dd_width-dd_buttonwidth+2, dd_height*dd_fontheight+3
  92.        
  93.         Color c2, c2, c2
  94.         Rect dd_x-1, dd_y+dd_fontheight-2, dd_width-dd_buttonwidth+2, dd_height*dd_fontheight+3, False
  95.         Line dd_x, dd_y+(dd_height+1)*dd_fontheight+1, dd_x+dd_width-dd_buttonwidth, dd_y+(dd_height+1)*dd_fontheight+1
  96.        
  97.         Line dd_x+dd_width-dd_buttonwidth+1, dd_y+dd_fontheight-1, dd_x+dd_width-dd_buttonwidth+1, dd_y+(dd_height+1)*dd_fontheight+1
  98.        
  99.         st = -1
  100.         k$=Lower$(Chr$(GetKey()))
  101.         If k$ >= "a" And k$ <= "z"
  102.                 i=0
  103.                 For dd_l.dd_list = Each dd_list
  104.                         If dd_lid=dd_id
  105.                                 i1 = 1
  106.                                 Repeat
  107.                                         k1$=Lower$(Mid$(dd_lvalue, i1, 1))
  108.                                         i1 = i1+1
  109.                                 Until i1 > Len(dd_lvalue) Or (k1$ >= "a" And k1$ <= "z")
  110.                                 If k1$ = k$
  111.                                         st = i*dd_fontheight
  112.                                         Exit
  113.                                 ElseIf k1$ < k$
  114.                                         st = i*dd_fontheight
  115.                                 EndIf
  116.                                 i=i+1
  117.                         EndIf
  118.                 Next
  119.         EndIf
  120.  
  121.         Viewport dd_x, dd_y+dd_fontheight, dd_width-dd_buttonwidth, dd_height*dd_fontheight-1
  122.         i=0
  123.         For dd_l.dd_list = Each dd_list
  124.                 If dd_lid=dd_id
  125.                         i=i+1
  126.                         If RectsOverlap(dd_x, dd_shown+(i*dd_fontheight), dd_width-dd_buttonwidth, dd_fontheight, dd_CursorX, dd_CursorY, 1, 1)
  127.                                 If dd_lvalue<>"s"
  128.                                         If RectsOverlap(dd_x, dd_y+dd_fontheight, dd_width-dd_buttonwidth, dd_height*dd_fontheight-1, dd_CursorX, dd_CursorY, 1, 1)
  129.                                                 Color 0, 0, 128
  130.                                                 Rect dd_x+1, dd_shown+(i*dd_fontheight), dd_width-dd_buttonwidth-2, dd_fontheight
  131.                                                 If dd_MouseHold = False
  132.                                                         If dd_md And MouseDown(2) = False
  133.                                                                 While MouseDown(1): Wend
  134.                                                                 dd_md = False
  135.                                                                 dd_name$=dd_l
  136. ame
  137.                                                                 dd_value$=dd_lvalue
  138.                                                                 dd_shown=dd_y
  139.                                                                 dd_scrolly=dd_y+dd_fontheight
  140.                                                                 Exit
  141.                                                         EndIf
  142.                                                 EndIf
  143.                                                 Color c1, c1, c1
  144.                                         EndIf
  145.                                 EndIf
  146.                         Else
  147.                                 Color dd_colR, dd_colG, dd_colB
  148.                         End If
  149.                         If dd_lvalue="s"
  150.                                 Color 192, 192, 192
  151.                                 Line dd_x+4, dd_shown+((i+0.5)*dd_fontheight), dd_x+dd_width-dd_buttonwidth-5, dd_shown+((i+0.5)*dd_fontheight)
  152.                         Else
  153.                                 t = Instr(dd_lvalue, "  ")
  154.                                 If t > 0
  155.                                         v1$ = Mid$(dd_lvalue, 1, t-1)
  156.                                         v2$ = Mid$(dd_lvalue, t+2)
  157.                                 Else
  158.                                         v1$ = dd_lvalue
  159.                                 EndIf
  160.                                
  161.                                 Text dd_x+4, dd_shown+(i*dd_fontheight)+2, v1$
  162.                                 If t > 0 Then Text dd_x+dd_width-dd_buttonwidth-StringWidth(v2$)-4, dd_shown+(i*dd_fontheight)+2, v2$
  163.                         EndIf
  164.                 End If
  165.         Next
  166.        
  167.         Viewport 0, 0, GraphicsWidth(), GraphicsHeight()
  168.         If i>dd_height
  169.                 mzs = MouseZSpeed(): mz = MouseZ()
  170.                 If mz = 0 And (mzs < -1 Or mzs > 1) Then mzs = 0 ;Stupid Windows bug
  171.  
  172.                 Color c1, c1, c1
  173.                 Rect dd_x+dd_width-dd_buttonwidth, dd_y+dd_fontheight-2, dd_buttonwidth+1, dd_height*dd_fontheight+3, True
  174.                 Color c2, c2, c2
  175.                 Rect dd_x+dd_width-dd_buttonwidth, dd_y+dd_fontheight-2, dd_buttonwidth+1, dd_height*dd_fontheight+3, False
  176.                 Line dd_x+dd_width-dd_buttonwidth, dd_y+(dd_height+1)*dd_fontheight+1, dd_x+dd_width, dd_y+(dd_height+1)*dd_fontheight+1
  177.                 Line dd_x+dd_width+1, dd_y+dd_fontheight-1, dd_x+dd_width+1, dd_y+(dd_height+1)*dd_fontheight+1
  178.                
  179.                 Color 192, 192, 192
  180.                 Rect dd_x+dd_width-dd_buttonwidth+2, dd_scrolly, dd_buttonwidth-3, dd_fontheight-1, True
  181.                 If dd_md
  182.                         If RectsOverlap(dd_x+dd_width-dd_buttonwidth, dd_y+dd_fontheight, dd_buttonwidth, dd_height*dd_fontheight, dd_CursorX, dd_CursorY, 1, 1)
  183.                                 dd_MouseHold = True
  184.                         EndIf
  185.                 EndIf
  186.                 If dd_MouseHold = True Then dd_scrolly = MouseY() - dd_yo
  187.                 dd_scrolly = dd_scrolly-mzs*8
  188.                
  189.                 dd_ScrollbarMax# = dd_y+dd_height*dd_fontheight-dd_y-dd_fontheight
  190.                 dd_ListSize = (i - dd_height) * dd_fontheight
  191.                 If st <> -1
  192.                         dd_shown = dd_y - st
  193.                         dd_ScrollbarPos# = (dd_y - dd_shown) * (dd_scrollbarmax / dd_ListSize) + dd_fontheight
  194.                         dd_scrolly = dd_y + dd_ScrollbarPos
  195.                 EndIf
  196.                 If dd_scrolly < dd_y+dd_fontheight Then dd_scrolly=dd_y+dd_fontheight
  197.                 If dd_scrolly > dd_y+dd_height*dd_fontheight Then dd_scrolly=dd_y+dd_height*dd_fontheight
  198.                 dd_ScrollbarPos# = dd_ScrollY - dd_y - dd_fontheight
  199.                 dd_shown = dd_y - (1.0 * dd_scrollbarpos * dd_ListSize / dd_scrollbarmax)
  200.         End If
  201.        
  202.         dd_dscrolly = dd_scrolly
  203.         dd_dshown = dd_shown
  204.         dd_d
  205. ame$ = dd_name$
  206.         dd_dvalue$ = dd_value$
  207. End Function
  208.  
  209. Function dd_drawDropDowns$()
  210.         While MouseDown(1) Or MouseDown(2): Wend
  211.        
  212.         GrabImage dd_screenGFX, 0, 0
  213.         Repeat
  214.                 DrawBlock dd_screenGFX, 0, 0
  215.                 dd_CursorX = MouseX()
  216.                 dd_CursorY = MouseY()
  217.                 dd_md = (MouseDown(1) Or MouseDown(2))
  218.                 dd_name$ = "~"
  219.                 For dd_d1.dd_DropDown = Each dd_DropDown
  220.                         dd_drawDropDown(dd_d1.dd_DropDown, dd_md)
  221.                         dd_name$ = dd_d1
  222. ame$
  223.                 Next
  224.                 If ((dd_md) And dd_MouseHold = False) Or KeyDown(1) Or (dd_name$ <> "" And dd_name$ <> "~")
  225.                         While MouseDown(1) Or MouseDown(2): Wend
  226.                         FlushMouse: FlushKeys
  227.                         dd_deleteDropDowns()
  228.                 EndIf
  229.                
  230.                 Flip
  231.                 Delay 5
  232.         Until dd_name$<>""
  233.         DrawBlock dd_screenGFX, 0, 0
  234.         If dd_name$ = "~" Then Return "" Else Return dd_name$
  235. End Function
  236.  
  237. Function dd_deleteDropDowns()
  238.         For dd_d1.dd_DropDown = Each dd_DropDown
  239.                 dd_deleteList(dd_d1id)
  240.                 Delete dd_d1
  241.                 Return True
  242.         Next
  243.         Return False
  244. End Function
  245.  
  246. Function dd_getDropDownName$()
  247.         For dd_d1.dd_DropDown = Each dd_DropDown
  248.                 Return dd_d1.dd_DropDown
  249. ame$
  250.         Next
  251.         Return ""
  252. End Function
  253.  
  254. Function dd_getDropDownValue$()
  255.         For dd_d1.dd_DropDown = Each dd_DropDown
  256.                 Return dd_d1.dd_DropDownvalue$
  257.         Next
  258.         Return ""
  259. End Function
  260.  
  261. ;dd_orderedBy
  262. ;0 = unordered
  263. ;1 = name
  264. ;2 = value
  265. Function dd_addToList.dd_list(dd_id, dd_name$, dd_value$, dd_orderedBy=DD_UNORDERED)
  266.         For l1.dd_list = Each dd_list
  267.                 If l1id = dd_id And l1
  268. ame = dd_name Then Return Null
  269.         Next
  270.         l.dd_list = New dd_list
  271.         lid = dd_id
  272.         lorderedBy = dd_orderedBy
  273.         lvalueRaw = dd_value
  274.         l
  275. ame = dd_name
  276.         lvalue = dd_filterString(dd_value)
  277.        
  278.         For l1.dd_list = Each dd_list
  279.                 Select lorderedBy
  280.                         Case 1:
  281.                         If Lower$(l
  282. ame) < Lower$(l1
  283. ame) Then Insert l Before l1: Exit
  284.                         Case 2:
  285.                         If Lower$(lvalueRaw) < Lower$(l1valueRaw) Then Insert l Before l1: Exit
  286.                 End Select
  287.         Next
  288.  
  289.         Return l
  290. End Function
  291.  
  292. Function dd_deleteList(dd_id)
  293.         For l.dd_list = Each dd_list
  294.                 If lid = dd_id Then Delete l
  295.         Next
  296. End Function
  297.  
  298. Function dd_filterString$(s$)
  299.         i=1: While Mid$(s$, i, 1) = "!": i = i+1: Wend
  300.         Return Mid$(s$, i)
  301. End Function
  302. ;
  303. ;         END OF DROPDOWN
  304. ;----------------------------------
  305.  
  306.  
  307. ;----------------------------------
  308. ;          EXAMPLE CODE
  309. ;
  310. SeedRnd MilliSecs()
  311.  
  312. SetBuffer BackBuffer()
  313.  
  314. font = LoadFont("Courier New", 15, True)
  315. font1 = LoadFont("Arial", 14)
  316. font2 = LoadFont("Arial", 24)
  317.  
  318. ClsColor 224, 224, 224
  319.  
  320. While Not KeyHit(1)
  321.         Cls
  322.        
  323.         SetFont font
  324.         Color 0, 0, 0
  325.         Text 65, 50, "Click box to open dropdown #1"
  326.         Text 465, 50, "Click box to open dropdown #2"
  327.         Text 65, 100, "Click box to open dropdown #3"
  328.        
  329.         Color 255, 0, 0
  330.         Rect 50, 50, 12, 12, True
  331.         Rect 450, 50, 12, 12, True
  332.         Rect 50, 100, 12, 12, True
  333.        
  334.         If MouseHit(1)
  335.                
  336.                 ;Dropdown example #1
  337.                 ;The "  " in the dd_addToList makes all following text align to the right.
  338.                 ;The "s" in the dd_addToList generates a line separator.
  339.                 ;The second parameter in the dd_CreateDropDown function is the dropdown style. Only 0 or 1 at the moment.
  340.                 ;The third parameter in the dd_CreateDropDown function is the length of the dropdown.
  341.                 If RectsOverlap(50, 50, 12, 12, MouseX(), MouseY(), 1, 1)
  342.                         dd_addToList(1, "cut", "Cut     (Ctrl+X)")
  343.                         dd_addToList(1, "copy", "Copy   (Ctrl+C)")
  344.                         dd_addToList(1, "paste", "Paste (Ctrl+V)")
  345.                         dd_addToList(1, "", "s")
  346.                         dd_addToList(1, "edit", "Edit   (Ctrl+E)")
  347.                         SetFont font1
  348.                         dd$ = dd_createDropDown(1, 1, 5): dn = 1
  349.                 EndIf
  350.  
  351.                 ;Dropdown example #2
  352.                 If RectsOverlap(450, 50, 12, 12, MouseX(), MouseY(), 1, 1)
  353.                         For i = 1 To 100
  354.                                 dd_addToList(2, i, "Item #"+i)
  355.                         Next
  356.                         SetFont font1
  357.                         dd$ = dd_createDropDown(2, 0, 8): dn = 2
  358.                 EndIf
  359.                
  360.                 ;Dropdown example #3
  361.                 ;The fourth parameter in the dd_addToList makes it order by the IDs of the list (in this case; A, B, C, etc...)
  362.                 If RectsOverlap(50, 100, 12, 12, MouseX(), MouseY(), 1, 1)
  363.                         dd_addToList(3, "D", "1 Daisy", DD_ORDERBYID)
  364.                         dd_addToList(3, "B", "2 Bert", DD_ORDERBYID)
  365.                         dd_addToList(3, "C", "3 Charlotte", DD_ORDERBYID)
  366.                         dd_addToList(3, "A", "4 Artie", DD_ORDERBYID)
  367.                         dd_addToList(3, "E", "5 Edward", DD_ORDERBYID)
  368.                         SetFont font2
  369.                         dd$ = dd_createDropDown(3): dn = 3
  370.                 EndIf
  371.        
  372.         EndIf
  373.         If dd$ <> ""
  374.                 SetFont font
  375.                 Color 255, 0, 0
  376.                 Text 400, 300, "The selected ID is '"+dd$+"' from dropdown #"+dn, True, True
  377.         EndIf
  378.         Flip
  379. Wend
  380. ;
  381. ;        END OF EXAMPLE CODE
  382. ;----------------------------------


Comments :


chwaga(Posted 1+ years ago)

 nice


Yahfree(Posted 1+ years ago)

 interesting...No problem with the building off mine


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal