utils.filterpicker

Display a dialog box which filters its contents as you type

Prototype

result = utils.filterpicker  (tbl, title, initial_filter, no_sort, filter_function, filter_prepare_function)

Description

This displays a dialog box with a predetermined list of items for the user to choose from, in the form of a multi-column table. If the user cancels the dialog box, or does not make a selection, nil is returned. Otherwise the key of the selected item is returned.

There is a "filter" box, which if you type into, reduces the visible contents of the dialog to whatever matches the filter (not case-sensitive). This could be used to reduce the displayed items to (for example) shops.

More examples, explanations, and screenshots are at:

http://mushclient.com/forum/?id=10618


The calling sequence is:

result = utils.filterpicker (t, title, initial_filter)
The only required arguments is the table of choices (t). Return value = the key of what they selected, or nil if cancelled, or nothing selected.

The first argument is a table of key/value pairs. The value is displayed, however the corresponding key is returned. The values are automatically sorted into ascending alphabetic order.

The third argument is the initial value for the filter box. If empty, no filtering initially takes place.

The fourth argument suppresses sorting of the list, if true.

The fifth argument (filter_function) lets you decide at run-time via a function call whether or not to show each item.

This function is passed the current filter (what is wanted), the key of the item in question, and the value of the item in question.

So, for example, if you wanted the filter field to contain a number which indicated the length of words to be shown, you might write:

function filter_function (wanted, key, value)
  local length = tonumber (wanted)
  if not length then
     return false
  end -- if not number

  return #value == length
end -- filter
Every time the user types something into the "filter" box the filter function is called once for every item in the key/value table (to see if the item should be displayed).

The sixth argument (filter_prepare_function) lets you prepare for filtering. This is called once every time the user types something into the "filter" box. This could be used to do a FTS (full text search) of a database, based on the filter text, to find all matching rows. Then the filter function itself would simply see if a row had been found or not.

For example:

function filter_prepare_function (wanted)
  wanted_rooms = {}
  for row in db:nrows ("SELECT uid FROM rooms WHERE name MATCH '" .. wanted .. "'") do
    wanted_rooms [row.uid] = true
  end
end -- filter_prepare_function



Example of use:

print (utils.filterpicker ({ "apples", "bananas", "peaches", "cream" }, "Foods ..." ))
Possible returned values would be: (Note that peaches would actually be shown 4th in the list as the list is sorted).

To convert from the key back to the value, simply index into your table. Eg.

t = { "apples", "bananas", "peaches", "cream" } 
result = utils.filterpicker (t, "Foods ...")

if result then
  print ("You chose", t [result])
else
  print "Nothing chosen"
end -- if



Keys and values can be either strings or numbers. MUSHclient will distinguish between strings and numbers which are the same (eg. "10" and 10 are considered different keys).

Here is an example of using string keys:

t = { 
    fruit = "apple", 
    vegetable = "potato", 
    spice = "pepper", 
    herb = "parsley",
    } 
result = utils.filterpicker (t, "Foods ...")

if result then
  print ("You chose key", result, "which is", t [result])
else
  print "Nothing chosen"
end -- if




Possible returned values would be: The return value will be one of the following types:

Lua functions

Topics