Remove expand/collapse functionality from plugin

- Remove expanded_event_index variable and all related logic
- Remove is_expanded parameters from methods
- Remove expanded field from event tuples (now 6 elements instead of 7)
- Remove EXPANDED_HEIGHT constant
- Remove expanded text display logic from draw_event_label
- Simplify event structure: (date_sort, date_obj, event, person, event_type, y_pos)
- Events now always show single-line text
- Clicking events only selects person (no expansion)

Result: Cleaner code, simpler behavior, reduced file size (49KB from 52KB)
This commit is contained in:
Daniel Viegas 2025-11-29 00:09:52 +01:00
parent 6b570ee776
commit e4156ca096

View File

@ -79,7 +79,6 @@ CLICKABLE_AREA_HEIGHT = 30
# UI Constants # UI Constants
YEAR_LABEL_WIDTH = 100 YEAR_LABEL_WIDTH = 100
EXPANDED_HEIGHT = 120
TOOLTIP_DELAY = 500 # milliseconds TOOLTIP_DELAY = 500 # milliseconds
# Event type categories and color mapping # Event type categories and color mapping
@ -239,7 +238,7 @@ class MyTimelineView(NavigationView):
# Current family handle # Current family handle
self.active_family_handle = None self.active_family_handle = None
self.events = [] # List of (date_sort, date_obj, event, person, event_type, expanded, y_pos) self.events = [] # List of (date_sort, date_obj, event, person, event_type, y_pos)
# UI components # UI components
self.scrolledwindow = None self.scrolledwindow = None
@ -254,7 +253,6 @@ class MyTimelineView(NavigationView):
self.hovered_event_index = None self.hovered_event_index = None
self.tooltip_timeout_id = None self.tooltip_timeout_id = None
self.tooltip_window = None self.tooltip_window = None
self.expanded_event_index = None
self.selected_person_handle = None self.selected_person_handle = None
self.mouse_x = 0 self.mouse_x = 0
self.mouse_y = 0 self.mouse_y = 0
@ -414,7 +412,6 @@ class MyTimelineView(NavigationView):
return return
self.active_family_handle = handle self.active_family_handle = handle
self.expanded_event_index = None
self.collect_events() self.collect_events()
if self.drawing_area: if self.drawing_area:
self.drawing_area.queue_draw() self.drawing_area.queue_draw()
@ -449,7 +446,6 @@ class MyTimelineView(NavigationView):
event, event,
None, # No person for family events None, # No person for family events
event_type, event_type,
False, # expanded
0, # y_pos (will be calculated during draw) 0, # y_pos (will be calculated during draw)
) )
) )
@ -477,7 +473,6 @@ class MyTimelineView(NavigationView):
event, event,
person_obj, person_obj,
event_type, event_type,
False, # expanded
0, # y_pos 0, # y_pos
) )
) )
@ -541,7 +536,7 @@ class MyTimelineView(NavigationView):
if self.drawing_area: if self.drawing_area:
self.drawing_area.set_size_request(800, self.timeline_height) self.drawing_area.set_size_request(800, self.timeline_height)
def _get_event_label_text(self, event, person, event_type, is_expanded=False): def _get_event_label_text(self, event, person, event_type):
"""Generate label text for an event. Centralized logic.""" """Generate label text for an event. Centralized logic."""
date_str = get_date(event) date_str = get_date(event)
event_type_str = str(event_type) event_type_str = str(event_type)
@ -564,10 +559,10 @@ class MyTimelineView(NavigationView):
adjusted_events = [] adjusted_events = []
for event_data in events_with_y_pos: for event_data in events_with_y_pos:
date_sort, date_obj, event, person, event_type, expanded, y_pos = event_data date_sort, date_obj, event, person, event_type, y_pos = event_data
# Calculate label height using centralized text generation # Calculate label height using centralized text generation
label_text = self._get_event_label_text(event, person, event_type, expanded) label_text = self._get_event_label_text(event, person, event_type)
layout.set_text(label_text, -1) layout.set_text(label_text, -1)
text_width, text_height = layout.get_pixel_size() text_width, text_height = layout.get_pixel_size()
label_height = text_height + LABEL_PADDING label_height = text_height + LABEL_PADDING
@ -575,7 +570,7 @@ class MyTimelineView(NavigationView):
# Check for overlap with previous events # Check for overlap with previous events
adjusted_y = y_pos adjusted_y = y_pos
for prev_data in adjusted_events: for prev_data in adjusted_events:
prev_y_pos = prev_data[6] # Get y_pos from previous event prev_y_pos = prev_data[5] # Get y_pos from previous event (index 5 now)
# Check if labels would overlap # Check if labels would overlap
if abs(adjusted_y - prev_y_pos) < MIN_LABEL_SPACING: if abs(adjusted_y - prev_y_pos) < MIN_LABEL_SPACING:
# Adjust downward # Adjust downward
@ -585,7 +580,7 @@ class MyTimelineView(NavigationView):
adjusted_y = max(timeline_y_start, min(adjusted_y, timeline_y_end)) adjusted_y = max(timeline_y_start, min(adjusted_y, timeline_y_end))
# Create new event data with adjusted Y position # Create new event data with adjusted Y position
adjusted_events.append((date_sort, date_obj, event, person, event_type, expanded, adjusted_y)) adjusted_events.append((date_sort, date_obj, event, person, event_type, adjusted_y))
return adjusted_events return adjusted_events
@ -662,16 +657,9 @@ class MyTimelineView(NavigationView):
# Convert mouse coordinates to drawing coordinates (account for zoom) # Convert mouse coordinates to drawing coordinates (account for zoom)
scaled_x = event.x / self.zoom_level scaled_x = event.x / self.zoom_level
date_sort, date_obj, clicked_event, clicked_person, event_type, expanded, _y_pos = self.events[clicked_index] date_sort, date_obj, clicked_event, clicked_person, event_type, _y_pos = self.events[clicked_index]
# Check if click is on marker area (left side) or label area (right side)
timeline_x = TIMELINE_MARGIN_LEFT
marker_area_width = EVENT_MARKER_SIZE + 20
# Clicking anywhere on the event line selects the person (like selecting the event) # Clicking anywhere on the event line selects the person (like selecting the event)
# Always collapse any expanded event when selecting
self.expanded_event_index = None
if clicked_person: if clicked_person:
person_handle = clicked_person.get_handle() person_handle = clicked_person.get_handle()
if self.selected_person_handle == person_handle: if self.selected_person_handle == person_handle:
@ -757,11 +745,11 @@ class MyTimelineView(NavigationView):
# Calculate initial Y positions # Calculate initial Y positions
events_with_y_pos = [] events_with_y_pos = []
for event_data in self.events: for event_data in self.events:
date_sort, date_obj, event, person, event_type, expanded, _ = event_data date_sort, date_obj, event, person, event_type, _ = event_data
y_pos = timeline_y_start + ( y_pos = timeline_y_start + (
(date_sort - min_date) / date_range (date_sort - min_date) / date_range
) * (timeline_y_end - timeline_y_start) ) * (timeline_y_end - timeline_y_start)
events_with_y_pos.append((date_sort, date_obj, event, person, event_type, expanded, y_pos)) events_with_y_pos.append((date_sort, date_obj, event, person, event_type, y_pos))
# Apply collision detection using shared method # Apply collision detection using shared method
adjusted_events = self._calculate_adjusted_positions(context, events_with_y_pos, timeline_y_start, timeline_y_end) adjusted_events = self._calculate_adjusted_positions(context, events_with_y_pos, timeline_y_start, timeline_y_end)
@ -803,7 +791,7 @@ class MyTimelineView(NavigationView):
label_x = timeline_x + LABEL_X_OFFSET label_x = timeline_x + LABEL_X_OFFSET
for i, event_data in enumerate(adjusted_events): for i, event_data in enumerate(adjusted_events):
date_sort, date_obj, event, person, event_type, expanded, adjusted_y = event_data date_sort, date_obj, event, person, event_type, adjusted_y = event_data
# Check if click is in the event's area (marker + label) # Check if click is in the event's area (marker + label)
if (scaled_x >= timeline_x - marker_size - MARKER_CLICK_PADDING and if (scaled_x >= timeline_x - marker_size - MARKER_CLICK_PADDING and
@ -818,7 +806,7 @@ class MyTimelineView(NavigationView):
if event_index is None or event_index >= len(self.events): if event_index is None or event_index >= len(self.events):
return False return False
date_sort, date_obj, event, person, event_type, expanded, y_pos = self.events[event_index] date_sort, date_obj, event, person, event_type, y_pos = self.events[event_index]
# If event has a person, show all events for that person # If event has a person, show all events for that person
if person: if person:
@ -828,7 +816,7 @@ class MyTimelineView(NavigationView):
# Find all events for this person # Find all events for this person
person_events = [] person_events = []
for evt_data in self.events: for evt_data in self.events:
evt_date_sort, evt_date_obj, evt_event, evt_person, evt_event_type, evt_expanded, evt_y_pos = evt_data evt_date_sort, evt_date_obj, evt_event, evt_person, evt_event_type, evt_y_pos = evt_data
if evt_person and evt_person.get_handle() == person_handle: if evt_person and evt_person.get_handle() == person_handle:
person_events.append((evt_date_sort, evt_date_obj, evt_event, evt_event_type)) person_events.append((evt_date_sort, evt_date_obj, evt_event, evt_event_type))
@ -976,28 +964,22 @@ class MyTimelineView(NavigationView):
# Draw events # Draw events
for i, event_data in enumerate(events_with_y_pos): for i, event_data in enumerate(events_with_y_pos):
date_sort, date_obj, event, person, event_type, expanded, y_pos = event_data date_sort, date_obj, event, person, event_type, y_pos = event_data
# Check if this event is hovered or expanded # Check if this event is hovered
is_hovered = (i == self.hovered_event_index) is_hovered = (i == self.hovered_event_index)
is_expanded = (i == self.expanded_event_index)
# Check if this event belongs to selected person # Check if this event belongs to selected person
is_selected = (self.selected_person_handle is not None and is_selected = (self.selected_person_handle is not None and
person and person.get_handle() == self.selected_person_handle) person and person.get_handle() == self.selected_person_handle)
# Selected events should not show expanded (multi-line) text
# Only show expanded text if explicitly expanded AND not selected
if is_selected:
is_expanded = False
# Draw event marker with modern styling # Draw event marker with modern styling
self.draw_event_marker(context, timeline_x, y_pos, event_type, is_hovered, is_selected) self.draw_event_marker(context, timeline_x, y_pos, event_type, is_hovered, is_selected)
# Draw event label # Draw event label
label_x = timeline_x + 25 label_x = timeline_x + LABEL_X_OFFSET
self.draw_event_label( self.draw_event_label(
context, label_x, y_pos, date_obj, event, person, event_type, is_hovered, is_expanded context, label_x, y_pos, date_obj, event, person, event_type, is_hovered
) )
# Draw visual connections for selected person # Draw visual connections for selected person
@ -1103,7 +1085,7 @@ class MyTimelineView(NavigationView):
context.line_to(px, py) context.line_to(px, py)
context.close_path() context.close_path()
def draw_event_label(self, context, x, y, date_obj, event, person, event_type, is_hovered=False, is_expanded=False): def draw_event_label(self, context, x, y, date_obj, event, person, event_type, is_hovered=False):
"""Draw the label for an event with modern styling.""" """Draw the label for an event with modern styling."""
context.save() context.save()
@ -1117,46 +1099,13 @@ class MyTimelineView(NavigationView):
layout.set_font_description(font_desc) layout.set_font_description(font_desc)
# Build label text using centralized method # Build label text using centralized method
base_text = self._get_event_label_text(event, person, event_type, is_expanded) label_text = self._get_event_label_text(event, person, event_type)
if is_expanded:
# Format as expanded with markup
date_str = get_date(event)
event_type_str = str(event_type)
if person:
person_name = name_displayer.display(person)
label_text = f"<b>{date_str}</b> - <b>{event_type_str}</b>\n{person_name}"
else:
label_text = f"<b>{date_str}</b> - <b>{event_type_str}</b>"
# Add place
place_handle = event.get_place_handle()
if place_handle:
try:
place = self.dbstate.db.get_place_from_handle(place_handle)
if place:
place_name = place.get_title()
label_text += f"\n📍 {place_name}"
except Exception:
# Skip if place handle is invalid
pass
# Add description
description = event.get_description()
if description:
label_text += f"\n{description}"
else:
label_text = base_text
layout.set_markup(label_text, -1) layout.set_markup(label_text, -1)
layout.set_width(-1) # No width limit layout.set_width(-1) # No width limit
if is_expanded:
layout.set_width(500 * Pango.SCALE) # Limit width for expanded view
layout.set_wrap(Pango.WrapMode.WORD)
# Draw background for expanded/hovered events # Draw background for hovered events
if is_expanded or is_hovered: if is_hovered:
text_width, text_height = layout.get_pixel_size() text_width, text_height = layout.get_pixel_size()
padding = 8 padding = 8
@ -1175,10 +1124,7 @@ class MyTimelineView(NavigationView):
context.close_path() context.close_path()
# Fill with semi-transparent background # Fill with semi-transparent background
if is_expanded: context.set_source_rgba(1.0, 1.0, 1.0, 0.8)
context.set_source_rgba(1.0, 1.0, 1.0, 0.95)
else:
context.set_source_rgba(1.0, 1.0, 1.0, 0.8)
context.fill() context.fill()
# Draw border # Draw border
@ -1200,7 +1146,7 @@ class MyTimelineView(NavigationView):
# Find min and max years from events # Find min and max years from events
min_year = None min_year = None
max_year = None max_year = None
for date_sort, date_obj, event, person, event_type, expanded, y_pos in self.events: for date_sort, date_obj, event, person, event_type, y_pos in self.events:
try: try:
year = date_obj.get_year() year = date_obj.get_year()
if year and year != 0: if year and year != 0:
@ -1270,7 +1216,7 @@ class MyTimelineView(NavigationView):
# Find all events for the selected person # Find all events for the selected person
person_events = [] person_events = []
for event_data in events_with_y_pos: for event_data in events_with_y_pos:
date_sort, date_obj, event, person, event_type, expanded, y_pos = event_data date_sort, date_obj, event, person, event_type, y_pos = event_data
if person and person.get_handle() == self.selected_person_handle: if person and person.get_handle() == self.selected_person_handle:
person_events.append((y_pos, event_data)) person_events.append((y_pos, event_data))