83 lines
2.8 KiB
Python
83 lines
2.8 KiB
Python
from PyQt6.QtWidgets import (
|
|
QWidget, QVBoxLayout, QHBoxLayout, QLabel, QFrame,
|
|
QMainWindow
|
|
)
|
|
from PyQt6.QtCore import Qt, pyqtSignal
|
|
|
|
|
|
class ChatBubble(QWidget):
|
|
def __init__(self, author, text, time_str, is_self, on_link_clicked):
|
|
super().__init__()
|
|
layout = QHBoxLayout(self)
|
|
layout.setContentsMargins(5, 2, 5, 2)
|
|
|
|
# Container for the actual bubble
|
|
self.bubble = QFrame()
|
|
self.bubble.setObjectName("bubble")
|
|
|
|
bg_color = "#0084FF" if is_self else "#2a2a2e"
|
|
text_color = "#FFFFFF"
|
|
author_color = "#E1E1E1" if is_self else "#3ea6ff"
|
|
|
|
self.bubble.setStyleSheet(f"""
|
|
#bubble {{
|
|
background-color: {bg_color};
|
|
border-radius: 12px;
|
|
}}
|
|
""")
|
|
|
|
bubble_layout = QVBoxLayout(self.bubble)
|
|
bubble_layout.setContentsMargins(10, 8, 10, 6)
|
|
bubble_layout.setSpacing(2)
|
|
|
|
# Author
|
|
author_lbl = QLabel("You" if is_self else author)
|
|
author_lbl.setStyleSheet(f"color: {author_color}; font-weight: bold; font-size: 11px; background: transparent;")
|
|
bubble_layout.addWidget(author_lbl)
|
|
|
|
# Text
|
|
self.text_lbl = QLabel(text)
|
|
self.text_lbl.setWordWrap(True)
|
|
self.text_lbl.setStyleSheet(f"color: {text_color}; font-size: 13px; border: none; background: transparent;")
|
|
self.text_lbl.setOpenExternalLinks(False)
|
|
self.text_lbl.linkActivated.connect(on_link_clicked)
|
|
bubble_layout.addWidget(self.text_lbl)
|
|
|
|
# Time
|
|
time_lbl = QLabel(time_str)
|
|
time_lbl.setAlignment(Qt.AlignmentFlag.AlignRight)
|
|
time_lbl.setStyleSheet(f"color: {text_color}; font-size: 9px; opacity: 0.6; border: none; background: transparent;")
|
|
bubble_layout.addWidget(time_lbl)
|
|
|
|
if is_self:
|
|
layout.addStretch()
|
|
layout.addWidget(self.bubble)
|
|
else:
|
|
layout.addWidget(self.bubble)
|
|
layout.addStretch()
|
|
|
|
|
|
class SystemMessageWidget(QWidget):
|
|
def __init__(self, text):
|
|
super().__init__()
|
|
layout = QHBoxLayout(self)
|
|
layout.setContentsMargins(0, 5, 0, 5)
|
|
lbl = QLabel(text)
|
|
lbl.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
|
lbl.setWordWrap(True)
|
|
lbl.setStyleSheet("color: #888; font-style: italic; font-size: 11px; background: transparent;")
|
|
layout.addWidget(lbl)
|
|
|
|
|
|
class ChatPopoutWindow(QMainWindow):
|
|
closed = pyqtSignal()
|
|
|
|
def __init__(self, parent=None):
|
|
super().__init__(parent)
|
|
self.setWindowTitle("Live Chat")
|
|
self.resize(350, 600)
|
|
|
|
def closeEvent(self, event):
|
|
self.closed.emit()
|
|
super().closeEvent(event)
|