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:
parent
6b570ee776
commit
e4156ca096
100
MyTimeline.py
100
MyTimeline.py
@ -79,7 +79,6 @@ CLICKABLE_AREA_HEIGHT = 30
|
||||
|
||||
# UI Constants
|
||||
YEAR_LABEL_WIDTH = 100
|
||||
EXPANDED_HEIGHT = 120
|
||||
TOOLTIP_DELAY = 500 # milliseconds
|
||||
|
||||
# Event type categories and color mapping
|
||||
@ -239,7 +238,7 @@ class MyTimelineView(NavigationView):
|
||||
|
||||
# Current family handle
|
||||
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
|
||||
self.scrolledwindow = None
|
||||
@ -254,7 +253,6 @@ class MyTimelineView(NavigationView):
|
||||
self.hovered_event_index = None
|
||||
self.tooltip_timeout_id = None
|
||||
self.tooltip_window = None
|
||||
self.expanded_event_index = None
|
||||
self.selected_person_handle = None
|
||||
self.mouse_x = 0
|
||||
self.mouse_y = 0
|
||||
@ -414,7 +412,6 @@ class MyTimelineView(NavigationView):
|
||||
return
|
||||
|
||||
self.active_family_handle = handle
|
||||
self.expanded_event_index = None
|
||||
self.collect_events()
|
||||
if self.drawing_area:
|
||||
self.drawing_area.queue_draw()
|
||||
@ -449,7 +446,6 @@ class MyTimelineView(NavigationView):
|
||||
event,
|
||||
None, # No person for family events
|
||||
event_type,
|
||||
False, # expanded
|
||||
0, # y_pos (will be calculated during draw)
|
||||
)
|
||||
)
|
||||
@ -477,7 +473,6 @@ class MyTimelineView(NavigationView):
|
||||
event,
|
||||
person_obj,
|
||||
event_type,
|
||||
False, # expanded
|
||||
0, # y_pos
|
||||
)
|
||||
)
|
||||
@ -541,7 +536,7 @@ class MyTimelineView(NavigationView):
|
||||
if self.drawing_area:
|
||||
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."""
|
||||
date_str = get_date(event)
|
||||
event_type_str = str(event_type)
|
||||
@ -564,10 +559,10 @@ class MyTimelineView(NavigationView):
|
||||
adjusted_events = []
|
||||
|
||||
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
|
||||
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)
|
||||
text_width, text_height = layout.get_pixel_size()
|
||||
label_height = text_height + LABEL_PADDING
|
||||
@ -575,7 +570,7 @@ class MyTimelineView(NavigationView):
|
||||
# Check for overlap with previous events
|
||||
adjusted_y = y_pos
|
||||
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
|
||||
if abs(adjusted_y - prev_y_pos) < MIN_LABEL_SPACING:
|
||||
# Adjust downward
|
||||
@ -585,7 +580,7 @@ class MyTimelineView(NavigationView):
|
||||
adjusted_y = max(timeline_y_start, min(adjusted_y, timeline_y_end))
|
||||
|
||||
# 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
|
||||
|
||||
@ -662,16 +657,9 @@ class MyTimelineView(NavigationView):
|
||||
# Convert mouse coordinates to drawing coordinates (account for zoom)
|
||||
scaled_x = event.x / self.zoom_level
|
||||
|
||||
date_sort, date_obj, clicked_event, clicked_person, event_type, expanded, _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
|
||||
date_sort, date_obj, clicked_event, clicked_person, event_type, _y_pos = self.events[clicked_index]
|
||||
|
||||
# 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:
|
||||
person_handle = clicked_person.get_handle()
|
||||
if self.selected_person_handle == person_handle:
|
||||
@ -757,11 +745,11 @@ class MyTimelineView(NavigationView):
|
||||
# Calculate initial Y positions
|
||||
events_with_y_pos = []
|
||||
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 + (
|
||||
(date_sort - min_date) / date_range
|
||||
) * (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
|
||||
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
|
||||
|
||||
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)
|
||||
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):
|
||||
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 person:
|
||||
@ -828,7 +816,7 @@ class MyTimelineView(NavigationView):
|
||||
# Find all events for this person
|
||||
person_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:
|
||||
person_events.append((evt_date_sort, evt_date_obj, evt_event, evt_event_type))
|
||||
|
||||
@ -976,28 +964,22 @@ class MyTimelineView(NavigationView):
|
||||
|
||||
# Draw events
|
||||
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_expanded = (i == self.expanded_event_index)
|
||||
|
||||
# Check if this event belongs to selected person
|
||||
is_selected = (self.selected_person_handle is not None and
|
||||
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
|
||||
self.draw_event_marker(context, timeline_x, y_pos, event_type, is_hovered, is_selected)
|
||||
|
||||
# Draw event label
|
||||
label_x = timeline_x + 25
|
||||
label_x = timeline_x + LABEL_X_OFFSET
|
||||
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
|
||||
@ -1103,7 +1085,7 @@ class MyTimelineView(NavigationView):
|
||||
context.line_to(px, py)
|
||||
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."""
|
||||
context.save()
|
||||
|
||||
@ -1117,46 +1099,13 @@ class MyTimelineView(NavigationView):
|
||||
layout.set_font_description(font_desc)
|
||||
|
||||
# Build label text using centralized method
|
||||
base_text = self._get_event_label_text(event, person, event_type, is_expanded)
|
||||
|
||||
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
|
||||
label_text = self._get_event_label_text(event, person, event_type)
|
||||
|
||||
layout.set_markup(label_text, -1)
|
||||
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
|
||||
if is_expanded or is_hovered:
|
||||
# Draw background for hovered events
|
||||
if is_hovered:
|
||||
text_width, text_height = layout.get_pixel_size()
|
||||
padding = 8
|
||||
|
||||
@ -1175,10 +1124,7 @@ class MyTimelineView(NavigationView):
|
||||
context.close_path()
|
||||
|
||||
# Fill with semi-transparent background
|
||||
if is_expanded:
|
||||
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.set_source_rgba(1.0, 1.0, 1.0, 0.8)
|
||||
context.fill()
|
||||
|
||||
# Draw border
|
||||
@ -1200,7 +1146,7 @@ class MyTimelineView(NavigationView):
|
||||
# Find min and max years from events
|
||||
min_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:
|
||||
year = date_obj.get_year()
|
||||
if year and year != 0:
|
||||
@ -1270,7 +1216,7 @@ class MyTimelineView(NavigationView):
|
||||
# Find all events for the selected person
|
||||
person_events = []
|
||||
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:
|
||||
person_events.append((y_pos, event_data))
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user