diff --git a/lutris/gui/config/sysinfo_box.py b/lutris/gui/config/sysinfo_box.py index 09bd7f56f..31490f817 100644 --- a/lutris/gui/config/sysinfo_box.py +++ b/lutris/gui/config/sysinfo_box.py @@ -1,11 +1,14 @@ +import os from gettext import gettext as _ from typing import Dict, Iterable, List from gi.repository import Gdk, Gtk from lutris.gui.config.base_config_box import BaseConfigBox +from lutris.gui.widgets.log_text_view import LogTextView from lutris.util import linux, system from lutris.util.linux import gather_system_info_dict +from lutris.util.log import LOG_FILENAME from lutris.util.strings import gtk_safe from lutris.util.wine.wine import is_esync_limit_set, is_fsync_supported, is_installed_systemwide @@ -46,14 +49,41 @@ class SystemBox(BaseConfigBox): sysinfo_frame.add(self.scrolled_window) self.pack_start(sysinfo_frame, True, True, 0) - button_copy = Gtk.Button(_("Copy to Clipboard"), halign=Gtk.Align.START, visible=True) + button_copy = Gtk.Button(_("Copy system info to Clipboard"), halign=Gtk.Align.START, visible=True) button_copy.connect("clicked", self.on_copy_clicked) self.pack_start(button_copy, False, False, 0) + self.pack_start(self.get_section_label(_("Lutris logs")), False, False, 0) + + self.log_scrolled_window = Gtk.ScrolledWindow(visible=True) + self.log_scrolled_window.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + log_frame = Gtk.Frame(visible=True) + log_frame.get_style_context().add_class("info-frame") + log_frame.add(self.log_scrolled_window) + self.pack_start(log_frame, True, True, 0) + + button_log_copy = Gtk.Button(_("Copy logs to Clipboard"), halign=Gtk.Align.START, visible=True) + button_log_copy.connect("clicked", self.on_copy_log_clicked) + + self.pack_start(button_log_copy, False, False, 0) + def populate(self): items = self.get_items() self.scrolled_window.add(self.get_grid(items)) + self.log_scrolled_window.add(self.get_log_view()) + + def get_log_view(self): + log_buffer = Gtk.TextBuffer() + log_buffer.set_text(self.get_log_contents()) + return LogTextView(log_buffer) + + def get_log_contents(self): + if not os.path.exists(LOG_FILENAME): + return "" + with open(LOG_FILENAME, encoding="utf-8") as log_file: + content = log_file.read() + return content def get_items(self) -> list: """Assembles a list of items to display; most items are name-value tuples @@ -127,3 +157,8 @@ class SystemBox(BaseConfigBox): clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) clipboard.set_text(text.strip(), -1) + + def on_copy_log_clicked(self, _widget) -> None: + text = self.get_log_contents() + clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) + clipboard.set_text(text.strip(), -1)