GEPS 041: New Selector
What should be part of the Selector?
What is the need?
- Select one record (object) via the Graphical User Interface
- Display main data, for letting the user make the selection
- Usability and consistency
- Search and filter features
Usage, goal and Usability
- Filtering for selecting a group of records (objects)
- Navigation, history and active objects
- Runtime and performance
- Selection expected by the user, marked and tagged objects
There are two ways to find data in Gramps: Search and Filter.
- The Search will only match what is visible.
- Filters are not limited to what you see on the screen, but looks at the actual data.
See some filters for more details.
The current design of the Search bar lets us find visible data on active column. The Search Bar is often available on selectors.
Set of filter rules
For now, some selectors, on reports and on Family Editor, provide a fast filter, by default.
The Search bar is disabled and an additional Show all button is available at the bottom of the dialog.
These windows are trying to provide a quick and common selection of people.
e.g., filtered by gender on Family Editor, or bookmarked people on reports.
For limiting a gtk issue on Search field, gramps42 has it own interactive search widget.
Just write the first letters of the word on the dialog, and the cursor will try to find this word.
Like the Find shortcut box, available with CTRL+F or CMND+F.
Limits on current selectors
- Time for search
- Few fast filter rules, by default
- Consistency, mixup of features and widgets
Note, there was a Gtk SearchEntry bug (latency and collapsed seizure) limiting a good search match: max_length(3).
Fixed since gramps 4.2.0, see bug report 1450.
|Selector||Columns and search keys||Interactive Search key|
|Person||Name, ID, Gender, Birth Date, Birth Place, Death Date, Death Place, Spouse, Last Change||Name|
|Family||ID, Father, Mother, Last Change||ID|
|Event||Type, Main Participants, Date, Place, Description, ID, Last Change||Type|
|Place||Name, ID, Type, Title, Last Change||Name|
|Source||Title, Author, ID, Last Change||Title|
|Citation||Source: Title or Citation: Volume/Page, ID, Last Change||Source: Title|
|Repository||Title, ID, Last Change||Title|
|Media||Title, ID, Type, Last Change||Title|
|Note||Preview, ID, Type, Tags, Last Change||Preview|
|Selector||Columns||Interactive Search key||Search keys with regex support|
|Person||Name, ID, Gender, Birth Date, Birth Place, Death Date, Death Place, Spouse, Last Change||Name||Name, ID, Gender, Birth Date, Birth Place, Death Date, Death Place, Spouse|
|Family||ID, Father, Mother, Last Change||ID||ID, Father, Mother|
|Event||Type, Main Participants, Date, Place, Description, ID, Last Change||Type||Type, Main Participants, Date, Place, Description, ID|
|Place||Name, ID, Type, Title, Last Change||Name||Name, ID, Type, Title|
|Source||Title, Author, ID, Last Change||Title||Title, Author, ID|
|Citation||Source: Title or Citation: Volume/Page, ID, Last Change||Source: Title||Source: Title or Citation: Volume/Page, ID|
|Repository||Title, ID, Last Change||Title||Title, ID|
|Media||Title, ID, Type, Last Change||Title||Title, ID, Type|
|Note||Preview, ID, Type, Tags, Last Change||Preview||Preview, ID, Type, Tags|
Fast filter by default
Ability to have a fast filter with the last active objects and bookmarked objects.
Some experimentations have been made on feature request 5024.
Current selector ecosystem already provides this ability.
On gramps 4.2.2, there was a bug 9315 on the Show all/Search load.
Clever search for each selector
See selector and query on gramps-connect.
Ability to also use one search field matching on multiple columns (names, ID, dates, etc ...)
See also search on filter rules editor
Interface for handling and selecting custom filters on selectors
- Replace the Show all check box at the bottom by a Switcher at the top of the dialog.
- Provide dynamic groups of objects based on the date of the last edition.
- via API
time = object.get_change_time()
last = today group1 = from today to 1 week back group2 = from today to 2 weeks back group3 = from today to 1 month back group4 = from today to 6 months back group5 = more than 6 months back
- via Filter
sfilter.add_rule(rules.event.ChangedSince(["Today date", ""]))
where "Today date" uses ISO-date format.
- Displayed items can be sorted by change time
- 9837: More than 10 items in 'Latest Change' Gramplet list
- 9814: Expanded Place tree when selecting existing place
Need ability to search alternate place names when selecting place
- 8762: Last Used places in the Select Place window
- 8743: Search for place needs more options
- 7342: Show "Main Participants" with events
- 6558: Optimize the use of citations
- 6332: Move home person to bookmark menu
- 5142: Keep selected the last selected source
- 5037: [Reports] More names listed in the person/family selector box
- 5024: By default, to display [Last Recent Used] and [bookmarked] objects on selectors
- 3655: "last modified" timestamp changes everytime a tree is accessed
- 9738: Select person dialog opens always expanded
- 9700: Select Place search & Source/Citation hierarchy should NOT automatically open
[Regression]: filter set by default on selector is ignored on load (_init_)
Two selectors on Places report can generate a confusion
Find is broken when used in the Family selector
Events model does not have 8 columns
Searching on Listviews is VEEERYYY slow and typing echo is scrambled
Only Event and Family Editors are checking if data_has_changed on save()
Report selection logic
Manage Family Trees Window shows as 'last modified' the time stamp of generating the tree
Incremental Gtk Search is broken on View
Some experimentations are available on a forked branch.
Based on gramps master branch, a new major branch with many changes.
For tests, need to focus on Selector features
Download a copy, unzip the archive and run:
$ cd gramps_cryptic_rebase-gep-041-new-selector $ python3 Gramps.py -d "gui.selector"
create a new family tree, and import a copy of your data.
|Test Code||People (1)||Families (2)||Events (3)||Places (4)||Sources (5)||Citations (6)||Repositories (7)||Media (8)||Notes (9)|
|id0||17565 individuals - 3918 surnames|
|id1||4009 individuals - 1031 surnames||1633||9426||1043||1376||2870||38||1542||924|
|Hardware Code||Gramps version||Processor||Clock||RAM||Storage||OS||User|
|H01||4.2.3||AMD FX-4100 quad||3.6 GHz||8 GB||SSD||..||Chris|
|H02||4.2.5||AMD FX-4100 quad||3.6 GHz||8 GB||SSD||..||Chris|
|H03||GEP041||AMD FX-4100 quad||3.6 GHz||8 GB||SSD||..||Chris|
|H04||4.2.5||Intel Pentium 4 HT||2.8 GHz||512 MB||HDD||Ubuntu 14.04 based||User:Romjerome|
|H05||GEP041||Intel Pentium 4 HT||2.8 GHz||512 MB||HDD||Ubuntu 14.04 based||User:Romjerome|
|H06||5.0.0-alpha (5099b42)||Intel Pentium 4 HT||2.8 GHz||512 MB||HDD||Ubuntu 14.04 based||User:Romjerome|
Tests table legend
|Test Code||Test Description|
|T01||Time to open the Person Selector, no search yet|
|T01_a||Time to find the person from Association tab on Person Editor|
|T01_b||Time to find the person from Selector on Reports, pre-selection|
|T01_c||Time to find one parent from Family Editor, pre-selection|
|T01_d||Time to find one child from Family Editor, pre-selection|
|T01_e||Time to open the active person from Form addon, no need search time|
|T01_f||Time to find the non-active person from Form addon|
|T02||Time to find the Family from Selector|
|T03||Time to find the Event from Selector|
|T04||Time to find the Place from Selector|
|T05||Time to find the Source from Selector|
|T06||Time to find the Citation from Selector|
|T07||Time to find the Repository from Selector|
|T08||Time to find the Media from Selector|
|T09||Time to find the Note from Selector|
You can add print statements, like:
import time one = time.clock() two = time.clock() print(two-one)
then run gramps via console
|Config||data||T01 (no search, build model)||T01_a (raw find and search)||T01_b (filter by user data)||T01_c (filter by sex)||T01_d (filter, skip list)||T01_e (no search, has_focus)||T01_f (alternative focus)||comments|
|H01||id0||2.5s||-||-||-||-||2.5s||-||expands only surname of person selected|
|H02||id0||18s||-||-||-||-||18s||-||expands all surnames|
|H03||id0||5s||-||-||-||-||5s||-||expands all surnames|
|H04||id1||4s<t<12s||7s<t<15s||>3s||<3s||6s||4s||7s||Sometimes, BaseSelector.__init__can take 2/3 of time|
|H05||id1||4s||~5s||~3s||~3s||~5s||4s||~6s||if filter does right, then few seconds for matching, else ~+3 seconds for finding|
|H06||id1||4s||~7s||~4s||~3s||~6s||5s||~7s||Do not have problem. Need ~+3 seconds for finding. Time close to GEP041 (~+1s).|
Tests could be on BaseSelector as some objects do not have own _init_().
|H04||id1||<1s||<1s||<1s||1s||<1s||<1s||<1s||<1s||very fast: +/- 3 seconds for matching, searching, finding.|
|H05||id1||<3s||<3s||<3s||<4s||<3s||<3s||<3s||<3s||fast: filter rules provide a user selection (last edited, last used, bookmarked, related, active), else, +/- 3 seconds for matching, searching, finding.|
|Config||data||T01 (no search)||T01_a (raw find and search)||T01_b (filter by user data)||T01_c (filter by gender)||T01_d (filter)||T01_e (no search, has_focus)||T01_f (alternative focus)||comments|
Tests could be on BaseSelector as some objects do not have own _init_().