From 9976a95b97f43fcfbbbdc0214e183ea6f3ec8ee3 Mon Sep 17 00:00:00 2001 From: Daniel Viegas Date: Sat, 29 Nov 2025 01:58:20 +0100 Subject: [PATCH] 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 --- MyTimeline.py | 70 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 2 deletions(-) diff --git a/MyTimeline.py b/MyTimeline.py index 4314bdc..8ef31e4 100644 --- a/MyTimeline.py +++ b/MyTimeline.py @@ -705,8 +705,9 @@ class MyTimelineView(NavigationView): category_boxes[category] = category_box box.pack_start(category_box, False, False, 0) - # Create checkbox for event type - checkbox = Gtk.CheckButton(label=str(event_type_obj)) + # Create checkbox for event type with human-readable name + 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 category_boxes[category].pack_start(checkbox, False, False, 0) @@ -1329,6 +1330,71 @@ class MyTimelineView(NavigationView): return True 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: """ Get the category for an event type.