Add event filtering with collapsible expanders and human-readable event type names

- Add comprehensive event filtering (event types, categories, persons, date range)
- Implement collapsible Gtk.Expander widgets for event type groups
- Add human-readable event type names in filter dialog
- Add EVENT_CATEGORIES mapping for event categorization
- Add filter state management and filter application logic
- Add filter button to toolbar with active state indication
- Support multiple filter types that can be combined
This commit is contained in:
Daniel Viegas 2025-11-29 01:58:20 +01:00
parent 1b6d76583c
commit 9976a95b97

View File

@ -705,8 +705,9 @@ class MyTimelineView(NavigationView):
category_boxes[category] = category_box category_boxes[category] = category_box
box.pack_start(category_box, False, False, 0) box.pack_start(category_box, False, False, 0)
# Create checkbox for event type # Create checkbox for event type with human-readable name
checkbox = Gtk.CheckButton(label=str(event_type_obj)) event_type_name = self._get_event_type_display_name(event_type_obj)
checkbox = Gtk.CheckButton(label=event_type_name)
event_type_checkboxes[event_type_obj] = checkbox event_type_checkboxes[event_type_obj] = checkbox
category_boxes[category].pack_start(checkbox, False, False, 0) category_boxes[category].pack_start(checkbox, False, False, 0)
@ -1329,6 +1330,71 @@ class MyTimelineView(NavigationView):
return True return True
return person_handle in self.person_filter return person_handle in self.person_filter
def _get_event_type_display_name(self, event_type: EventType) -> str:
"""
Get human-readable display name for an event type.
Args:
event_type: The event type (integer or EventType object).
Returns:
str: Human-readable name for the event type.
"""
# Normalize to integer first
event_type_value = self._normalize_event_type(event_type)
# Map EventType integer values to their human-readable names
event_type_names = {
EventType.BIRTH: _("Birth"),
EventType.DEATH: _("Death"),
EventType.BURIAL: _("Burial"),
EventType.CREMATION: _("Cremation"),
EventType.ADOPT: _("Adoption"),
EventType.MARRIAGE: _("Marriage"),
EventType.DIVORCE: _("Divorce"),
EventType.ENGAGEMENT: _("Engagement"),
EventType.MARR_SETTL: _("Marriage Settlement"),
EventType.MARR_LIC: _("Marriage License"),
EventType.MARR_CONTR: _("Marriage Contract"),
EventType.MARR_BANNS: _("Marriage Banns"),
EventType.DIV_FILING: _("Divorce Filing"),
EventType.ANNULMENT: _("Annulment"),
EventType.MARR_ALT: _("Marriage (Alternative)"),
EventType.BAPTISM: _("Baptism"),
EventType.ADULT_CHRISTEN: _("Adult Christening"),
EventType.CONFIRMATION: _("Confirmation"),
EventType.CHRISTEN: _("Christening"),
EventType.FIRST_COMMUN: _("First Communion"),
EventType.BLESS: _("Blessing"),
EventType.BAR_MITZVAH: _("Bar Mitzvah"),
EventType.BAS_MITZVAH: _("Bat Mitzvah"),
EventType.RELIGION: _("Religion"),
EventType.ORDINATION: _("Ordination"),
EventType.OCCUPATION: _("Occupation"),
EventType.RETIREMENT: _("Retirement"),
EventType.ELECTED: _("Elected"),
EventType.MILITARY_SERV: _("Military Service"),
EventType.EDUCATION: _("Education"),
EventType.GRADUATION: _("Graduation"),
EventType.DEGREE: _("Degree"),
EventType.EMIGRATION: _("Emigration"),
EventType.IMMIGRATION: _("Immigration"),
EventType.NATURALIZATION: _("Naturalization"),
EventType.PROBATE: _("Probate"),
EventType.WILL: _("Will"),
EventType.RESIDENCE: _("Residence"),
EventType.CENSUS: _("Census"),
EventType.PROPERTY: _("Property"),
EventType.CAUSE_DEATH: _("Cause of Death"),
EventType.MED_INFO: _("Medical Information"),
EventType.NOB_TITLE: _("Nobility Title"),
EventType.NUM_MARRIAGES: _("Number of Marriages"),
EventType.UNKNOWN: _("Unknown"),
EventType.CUSTOM: _("Custom"),
}
return event_type_names.get(event_type_value, _("Unknown Event"))
def _get_event_category(self, event_type: EventType) -> str: def _get_event_category(self, event_type: EventType) -> str:
""" """
Get the category for an event type. Get the category for an event type.