You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
BunnySync/log_widget.py

93 lines
3.3 KiB
Python

from PyQt5.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QLineEdit, QTextEdit, QPushButton
from PyQt5.QtGui import QTextCursor, QTextBlockFormat, QTextCharFormat, QColor
from database import add_log_to_db, get_logs_from_db
from datetime import datetime
class LogWidget(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setup_ui()
self.load_logs_from_db()
def setup_ui(self):
layout = QVBoxLayout()
self.setLayout(layout)
self.log_text = QTextEdit()
self.log_text.setReadOnly(True)
layout.addWidget(self.log_text)
self.log_input = QLineEdit()
self.log_input.setPlaceholderText("Enter log message")
layout.addWidget(self.log_input)
buttons_layout = QHBoxLayout()
log_button = QPushButton("Add Log")
log_button.clicked.connect(self.add_uilog)
buttons_layout.addWidget(log_button)
clear_button = QPushButton("Clear Log")
clear_button.clicked.connect(self.clear_log)
buttons_layout.addWidget(clear_button)
buttons_widget = QWidget()
buttons_widget.setLayout(buttons_layout)
layout.addWidget(buttons_widget)
def get_line_count(self):
document = self.log_text.document()
return document.blockCount()
def delete_first_line(self):
cursor = self.log_text.textCursor()
cursor.movePosition(QTextCursor.Start)
cursor.movePosition(QTextCursor.NextBlock, QTextCursor.KeepAnchor)
cursor.removeSelectedText()
self.log_text.setTextCursor(cursor)
def delete_lines(self, n):
cursor = self.log_text.textCursor()
cursor.movePosition(QTextCursor.Start)
for _ in range(n):
if cursor.atEnd():
break
cursor.movePosition(QTextCursor.NextBlock, QTextCursor.KeepAnchor)
cursor.removeSelectedText()
self.log_text.setTextCursor(cursor)
def clear_log(self):
self.log_text.clear()
def update_log(self, message, foreground=QColor("black"), background=QColor("white")):
char_format = QTextCharFormat()
char_format.setForeground(foreground)
char_format.setBackground(background)
block_format = QTextBlockFormat()
block_format.setBackground(background)
self.log_text.moveCursor(QTextCursor.End)
cursor = self.log_text.textCursor()
cursor.insertBlock(block_format)
cursor.insertText(message, char_format)
self.log_text.setTextCursor(cursor)
def add_log(self, message, foreground=QColor("black"), background=QColor("white")):
timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
log_message = f"[{timestamp}] {message}"
self.update_log(log_message, foreground, background)
add_log_to_db(message)
self.log_input.clear()
if 3000 < self.get_line_count():
self.delete_first_line()
def add_uilog(self):
message = self.log_input.text()
self.add_log(message)
def load_logs_from_db(self):
logs = get_logs_from_db()
for timestamp, message in logs:
log_message = f"[{timestamp}] {message}"
self.update_log(log_message, QColor("dark"), QColor("gray"))