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 @@
-
+
+
+
+
+
+
+
@@ -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