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
|
# 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))
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user