Quick and dirty no-API way to sort ListIconGadget

Share your advanced PureBasic knowledge/code with the community.
killfreak
New User
New User
Posts: 7
Joined: Fri May 12, 2006 3:27 pm

Quick and dirty no-API way to sort ListIconGadget

Post by killfreak »

Code updated for 5.20+

I wanted a quick and simple no-API, no-Callback way to sort my ListIconGadget by a particular column in PB4, and didn't want to use a large library like Gnozal's PureLVSORT library. So I came up with the following.

Uses quicksort by swapping rows instead of array elements. The SwapRows is kinda silly, but it works (for me) haha. Hope somebody finds it as useful as it was for me.

Code: Select all

; Sort a ListIconGadget by column alphabetically
; - Quick and easy way (not sure how fast it is though)
; - No API/Callback needed
; - based on geoff's quicksort algorithm found on:
;       http://www.purebasic.fr/english/viewtopic.php?t=5742&highlight=quicksort
; - Tested on PB 4.0
; - Syntax:
;       SortListIconGadget(theListIconGadget, columnToSortBy, TotalColumns)
; - Important:
;       - You may need To adapt SwapRows() To your specification
;       - If two rows have the same value in the particular column,
;           the order of those two rows will not always be the same.
;           Compile and run, then click the sort button multiple times
;           to see what i mean.

Enumeration
  #listMyListIcon
  #btnSort
EndEnumeration


; ************************** SORTING FUNCTIONS ***********************

Procedure SwapRows(i,j, theListIconGadget, TotalColumns)
  ; *** you probably need to alter this procedure to fit your ListIconGadget
  ; *** just do whatever it takes to swap "Row i" and "Row j" in theListIconGadget :-)
  ; *** probably slows the sorting down
  
  ; copy all the data in row i into temporary array
  Dim tempArrayi.s(TotalColumns + 1)
  For k = 0 To TotalColumns - 1
    tempArrayi(k) = GetGadgetItemText(theListIconGadget, i, k)
  Next
  tempArrayi(TotalColumns) = Str(GetGadgetItemData(theListIconGadget, i))
  
  ; copy row j into row i
  For m = 0 To TotalColumns - 1
    SetGadgetItemText(theListIconGadget, i, GetGadgetItemText(theListIconGadget, j, m), m)
  Next
  SetGadgetItemData(theListIconGadget, i, GetGadgetItemData(theListIconGadget, j))
  
  ; copy the temp row into row j
  For n = 0 To TotalColumns - 1
    SetGadgetItemText(theListIconGadget, j, tempArrayi(n), n)
  Next
  SetGadgetItemData(theListIconGadget, j, Val(tempArrayi(TotalColumns)))
EndProcedure

Procedure ListIconQuickSort(s,e, theListIconGadget, columnnumber, TotalColumns)
  i=s
  j=e
  pivot.s = GetGadgetItemText(theListIconGadget, (i+j)/2, columnnumber)
  Repeat
    a = i+j
    While GetGadgetItemText(theListIconGadget, i, columnnumber) < pivot
      i = i+1
    Wend
    a = i+j
    While GetGadgetItemText(theListIconGadget, j, columnnumber) > pivot
      j = j-1
    Wend
    If i <= j
      SwapRows(i,j, theListIconGadget,TotalColumns)
      i = i+1
      j = j-1
    EndIf
  Until i > j
  If j > s  :  ListIconQuickSort(s,j,theListIconGadget,columnnumber,TotalColumns) : EndIf
  If i < e  :  ListIconQuickSort(i,e,theListIconGadget,columnnumber,TotalColumns) : EndIf
EndProcedure

Procedure SortListIconGadget(theListIconGadget, columnToSortBy, TotalColumns)
  ListIconQuickSort(0, CountGadgetItems(theListIconGadget) - 1, theListIconGadget, columnToSortBy, TotalColumns)
EndProcedure



; ************************** PROGRAM CODE ***********************

OpenWindow(0, 100, 100, 300, 420, "SortListIconGadget", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar )
ListIconGadget = ListIconGadget(#listMyListIcon, 10, 80, 260, 230, "Column0", 100)
AddGadgetColumn(#listMyListIcon, 1, "Column1", 100)
ButtonGadget(#btnSort, 210, 320, 50, 30, "sort")

For x = 0 To 600
  somestring$ = Chr(Random(25) + 97) + Chr(Random(25) + 97) ; random string
  somestring2$ = Chr(Random(25) + 97) + Chr(Random(25) + 97); random string
  AddGadgetItem(#listMyListIcon, -1, somestring$ + Chr(10) + somestring2$)
Next

Repeat
  event = WaitWindowEvent()
  Select event
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #btnSort : SortListIconGadget(#listMyListIcon, 0, 2)
      EndSelect
  EndSelect
  
Until event=#PB_Event_CloseWindow