diff --git a/MyTimeline.py b/MyTimeline.py index 1c92db6..7c3a811 100644 --- a/MyTimeline.py +++ b/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"{date_str} - {event_type_str}\n{person_name}" - else: - label_text = f"{date_str} - {event_type_str}" - - # 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))