A layout that can be used for filtering.
capi
:callback-object |
The argument for the callbacks. If it is nil the top-level-interface of the layout is used. |
:change-callback |
A function of one argument (the callback-object). |
:callback |
A function of one argument (the callback-object). |
:gesture-callbacks |
Additional gesture-callbacks to the text-input-pane inside the layout. |
:text |
A string specifying the initial text of the filter, or nil. |
:matches-title |
A string, t or nil. |
:help-string |
A string, t or nil. |
:added-filters | |
:label-style | :short, :medium or :long. |
filtering-layout-statefiltering-layout-matches-text
The class filtering-layout can be used to display a filter pane for some other pane, such as a list-panel.
The main part of a filtering layout is a text-input-pane which allows the user to enter a string, which is intended to be used for filtering. The user can control how it is used by a menu (or special keystroke) that allows her to specify whether:
Control+R).Control+E).Control+C).
The filtering layout defines the parameters to use, and calls the callbacks to perform the filtering. It does not do any filtering itself.
change-callback is called whenever the text in the filter changes. Also if callback is not supplied, then change-callback is called instead.
callback is called whenever there is any change in the state of the filter: the user presses Return, makes a selection from the menu, clicks the Confirm button or changes the selection in any of the added filters. If callback is not supplied, then change-callback is called instead.
To actually do the filtering, the using code needs to call filtering-layout-match-object-and-exclude-p, which returns as multiple values a precompiled regexp and a flag specifying whether to exclude matches. The regexp should be used to perform the filtering, typically by using lispworks:find-regexp-in-string. Note that filtering-layout-match-object-and-exclude-p returns nil when there is no string in the text-input-pane, and that even when the filter is set to plain match it returns a regexp (which matches a plain string).
You supply a filtering-layout amongst the panes of your interface definition (not its layouts). The description of a filtering-layout is set by the initialize-instance method of the class, and therefore the description cannot be passed as an initarg and should not be manipulated.
filtering-layout-state returns a "state" object which can be used later to set the state of any filtering-layout by (setf capi:filtering-layout-state). When setting the state, the value can also be a string or nil. A string means setting the filter string to it and making the filtering state be plain string, includes matches, and case-insensitive. nil means the same as the empty string.
matches-title controls whether the filtering-layout contains a display-pane (the "matches pane") showing the number of matches. If matches-title is a string, it provides the title of the matches pane. If matches-title is t the title is Matches:. Note that the actual text in the matches pane must be set by the caller by (setf capi:filtering-layout-matches-text).
If help-string is non-nil then the filter has a Help button which raises a default help text if help-string is t, or the text of help-string if it is a string.
If label-style is :short the filter menu has a short title. For example if the filter is set for case-sensitive plain inclusive matching the short label is PMC. If label-style is :medium then this label would be Filter:C. Any other value of label-style would make a long label Plain Match Cased.
When added-filters is non-nil, it adds panes (check-button or option-pane) to the filtering-layout. Each element of added-filters must be one of:
| A cons of a string and some object. | |
| This specifies a check-button, with the string as its text, plus an associated object. | |
| A list of conses, where each cons is a cons of a string and some object. | |
| This specifies an option-pane, where the string of each cons specifies the text of an item in the option-pane, plus an associated object for the item. | |
The check-button and option-pane panes are displayed in the same row as the filter.
The third return value of filtering-layout-match-object-and-exclude-p contains the associated objects from each selected check-button (but not from any unselected check-button) and from the selected item of each option-pane.
A filtering-layout is used when a list-panel is made with the :filter initarg.
(defvar *things* (list "Foo" "Bar" "Baz" 'car 'cdr))
(capi:define-interface my-interface ()
((things :reader my-things
:initform *things*))
(:panes
(my-things-list-panel
capi:list-panel
:reader my-interface-list-panel
:items things
:visible-min-height `(:character ,(length *things*)))
(my-filtering
capi:filtering-layout
:change-callback 'update-my-interface
:reader my-interface-filtering))
(:layouts
(a-layout
capi:column-layout
'(my-filtering my-things-list-panel)))
(:default-initargs :title "Filtering example")
)
(defun update-my-interface (my-interface)
(let* ((things (my-things my-interface))
(filtered-things
(multiple-value-bind (regexp excludep)
(capi:filtering-layout-match-object-and-exclude-p
(my-interface-filtering my-interface)
nil)
(if regexp
(loop for thing in things
when (if (find-regexp-in-string
regexp
(string thing))
(not excludep)
excludep)
collect thing)
things))))
(setf (capi:collection-items
(my-interface-list-panel my-interface))
filtered-things)))
CAPI User Guide and Reference Manual (Windows version) - 01 Dec 2021 19:33:57