From 2797a320c1a36b6b2ca019ffb1df2c5d9ac4c522 Mon Sep 17 00:00:00 2001 From: vesp Date: Wed, 24 Dec 2025 13:49:55 +0100 Subject: [PATCH] Add copy buttons for request and response content in history items --- src/widgets/history-item.ui | 62 ++++++++++++++++++++++++++++++------- src/widgets/history_item.py | 50 +++++++++++++++++++++++++++++- 2 files changed, 99 insertions(+), 13 deletions(-) diff --git a/src/widgets/history-item.ui b/src/widgets/history-item.ui index d71e546..d63ef26 100644 --- a/src/widgets/history-item.ui +++ b/src/widgets/history-item.ui @@ -87,13 +87,32 @@ - - Request: - 0 + + horizontal + 6 6 - + + + Request: + 0 + True + + + + + + edit-copy-symbolic + Copy request to clipboard + center + + + + @@ -172,13 +191,32 @@ - - Response: - 0 + + horizontal + 6 6 - + + + Response: + 0 + True + + + + + + edit-copy-symbolic + Copy response to clipboard + center + + + + diff --git a/src/widgets/history_item.py b/src/widgets/history_item.py index 3bae25c..70158bf 100644 --- a/src/widgets/history_item.py +++ b/src/widgets/history_item.py @@ -17,7 +17,7 @@ # # SPDX-License-Identifier: GPL-3.0-or-later -from gi.repository import Gtk, GObject +from gi.repository import Gtk, GObject, Gdk from datetime import datetime @@ -38,11 +38,13 @@ class HistoryItem(Gtk.Box): request_body_text = Gtk.Template.Child() request_expander = Gtk.Template.Child() request_expander_label = Gtk.Template.Child() + copy_request_button = Gtk.Template.Child() response_headers_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() + copy_response_button = Gtk.Template.Child() load_button = Gtk.Template.Child() __gsignals__ = { @@ -174,6 +176,52 @@ class HistoryItem(Gtk.Box): self.response_body_scroll.set_max_content_height(60) self.response_expander_label.set_text("Show full response") + @Gtk.Template.Callback() + def on_copy_request_clicked(self, button): + """Copy full request to clipboard.""" + # Build full request text + request_text = f"{self.entry.request.method} {self.entry.request.url}\n\n" + + # Add headers + if self.entry.request.headers: + request_text += "Headers:\n" + for key, value in self.entry.request.headers.items(): + request_text += f"{key}: {value}\n" + request_text += "\n" + + # Add body + if self.entry.request.body: + request_text += "Body:\n" + request_text += self.entry.request.body + + # Copy to clipboard + clipboard = Gdk.Display.get_default().get_clipboard() + clipboard.set(request_text) + + @Gtk.Template.Callback() + def on_copy_response_clicked(self, button): + """Copy full response to clipboard.""" + if self.entry.response: + # Build full response text + response_text = f"{self.entry.response.status_code} {self.entry.response.status_text}\n\n" + + # Add headers + if self.entry.response.headers: + response_text += self.entry.response.headers + response_text += "\n\n" + + # Add body + if self.entry.response.body: + response_text += self.entry.response.body + elif self.entry.error: + response_text = f"Error:\n{self.entry.error}" + else: + response_text = "(no response)" + + # Copy to clipboard + clipboard = Gdk.Display.get_default().get_clipboard() + clipboard.set(response_text) + def toggle_expanded(self): """Toggle between collapsed and expanded view.""" self.expanded = not self.expanded