From 0c139d2a3b0b4b2ffb7ff8d2f0f92e893fe98d1c Mon Sep 17 00:00:00 2001 From: Pavel Baksy Date: Wed, 24 Dec 2025 13:13:04 +0100 Subject: [PATCH] Fix history expander button functionality - set both min and max content heights --- src/widgets/history-item.ui | 140 ++++++++++++++++++++++++++++++------ src/widgets/history_item.py | 83 ++++++++++++++++++--- src/window.py | 3 + 3 files changed, 193 insertions(+), 33 deletions(-) diff --git a/src/widgets/history-item.ui b/src/widgets/history-item.ui index 3ac9ef8..6710bf8 100644 --- a/src/widgets/history-item.ui +++ b/src/widgets/history-item.ui @@ -8,7 +8,7 @@ - + horizontal 12 12 @@ -61,6 +61,13 @@ + + + + + + + @@ -104,15 +111,63 @@ + - - Body... - 0 - True - True - word-char + + 6 + 60 + 60 + True + + + False + True + 6 + 6 + 6 + 6 + word-char + + + + + + + + + + fill + 3 + + + + horizontal + 6 + center + + + True + + + + + Show full request + + + + + + True + + + + @@ -143,15 +198,63 @@ + - - Body... - 0 - True - True - word-char + + 6 + 60 + 60 + True + + + False + True + 6 + 6 + 6 + 6 + word-char + + + + + + + + + + fill + 3 + + + + horizontal + 6 + center + + + True + + + + + Show full response + + + + + + True + + + + @@ -172,12 +275,5 @@ - - - - - - - diff --git a/src/widgets/history_item.py b/src/widgets/history_item.py index 60ddb25..83ae9ac 100644 --- a/src/widgets/history_item.py +++ b/src/widgets/history_item.py @@ -34,9 +34,15 @@ class HistoryItem(Gtk.Box): timestamp_label = Gtk.Template.Child() status_label = Gtk.Template.Child() request_headers_label = Gtk.Template.Child() - request_body_label = Gtk.Template.Child() + request_body_scroll = Gtk.Template.Child() + request_body_text = Gtk.Template.Child() + request_expander = Gtk.Template.Child() + request_expander_label = Gtk.Template.Child() response_headers_label = Gtk.Template.Child() - response_body_label = Gtk.Template.Child() + response_body_scroll = Gtk.Template.Child() + response_body_text = Gtk.Template.Child() + response_expander = Gtk.Template.Child() + response_expander_label = Gtk.Template.Child() load_button = Gtk.Template.Child() __gsignals__ = { @@ -47,6 +53,8 @@ class HistoryItem(Gtk.Box): super().__init__() self.entry = entry self.expanded = False + self.request_expanded = False + self.response_expanded = False self._populate_ui() def _populate_ui(self): @@ -79,23 +87,34 @@ class HistoryItem(Gtk.Box): # Details - Request body body_str = self.entry.request.body if self.entry.request.body else "(empty)" - # Truncate long bodies - if len(body_str) > 200: - body_str = body_str[:200] + "..." - self.request_body_label.set_text(body_str) + self.request_body_text.get_buffer().set_text(body_str) + + # Count lines to determine if we need the expander + num_lines = body_str.count('\n') + 1 + # Show expander if content is longer than ~3 lines (60px) + needs_expander = num_lines > 3 or len(body_str) > 150 + self.request_expander.set_visible(needs_expander) # Details - Response if self.entry.response: self.response_headers_label.set_text(self.entry.response.headers) response_body = self.entry.response.body if self.entry.response.body else "(empty)" - # Truncate long bodies - if len(response_body) > 200: - response_body = response_body[:200] + "..." - self.response_body_label.set_text(response_body) + self.response_body_text.get_buffer().set_text(response_body) + + # Count lines to determine if we need the expander + num_lines = response_body.count('\n') + 1 + needs_expander = num_lines > 3 or len(response_body) > 150 + self.response_expander.set_visible(needs_expander) elif self.entry.error: self.response_headers_label.set_text("(error)") - self.response_body_label.set_text(self.entry.error) + error_text = self.entry.error + self.response_body_text.get_buffer().set_text(error_text) + + # Show expander for long errors + num_lines = error_text.count('\n') + 1 + needs_expander = num_lines > 3 or len(error_text) > 150 + self.response_expander.set_visible(needs_expander) @Gtk.Template.Callback() def on_clicked(self, gesture, n_press, x, y): @@ -107,6 +126,48 @@ class HistoryItem(Gtk.Box): """Emit load signal when load button clicked.""" self.emit('load-requested') + @Gtk.Template.Callback() + def on_request_expander_clicked(self, button): + """Toggle request body expansion.""" + print(f"DEBUG: Request expander clicked! Current state: {self.request_expanded}") + self.request_expanded = not self.request_expanded + + if self.request_expanded: + # Expand to show full scrollable content + self.request_body_scroll.set_min_content_height(300) + self.request_body_scroll.set_max_content_height(300) + self.request_expander_label.set_text("Collapse request") + print("DEBUG: Expanded request to 300px") + else: + # Collapse to show only few lines + self.request_body_scroll.set_min_content_height(60) + self.request_body_scroll.set_max_content_height(60) + self.request_expander_label.set_text("Show full request") + print("DEBUG: Collapsed request to 60px") + + return True # Consume the event + + @Gtk.Template.Callback() + def on_response_expander_clicked(self, button): + """Toggle response body expansion.""" + print(f"DEBUG: Response expander clicked! Current state: {self.response_expanded}") + self.response_expanded = not self.response_expanded + + if self.response_expanded: + # Expand to show full scrollable content + self.response_body_scroll.set_min_content_height(300) + self.response_body_scroll.set_max_content_height(300) + self.response_expander_label.set_text("Collapse response") + print("DEBUG: Expanded response to 300px") + else: + # Collapse to show only few lines + self.response_body_scroll.set_min_content_height(60) + self.response_body_scroll.set_max_content_height(60) + self.response_expander_label.set_text("Show full response") + print("DEBUG: Collapsed response to 60px") + + return True # Consume the event + def toggle_expanded(self): """Toggle between collapsed and expanded view.""" self.expanded = not self.expanded diff --git a/src/window.py b/src/window.py index 978177d..c0ea580 100644 --- a/src/window.py +++ b/src/window.py @@ -417,6 +417,9 @@ class RosterWindow(Adw.ApplicationWindow): ) self.history_manager.add_entry(entry) + # Refresh history panel to show new entry + self._load_history() + self.http_client.execute_request_async(request, callback, None) # History and Project Management