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