Загрузка данных


import sys
from PyQt6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout,
                             QHBoxLayout, QLabel, QLineEdit, QPushButton,
                             QFileDialog, QColorDialog, QGraphicsDropShadowEffect)
from PyQt6.QtGui import (QPixmap, QFont, QColor, QCursor, QPainter, 
                         QPainterPath, QIcon)
from PyQt6.QtCore import Qt, pyqtSignal

class ClickableAvatar(QLabel):
    """Кастомный класс для аватара, который реагирует на клик мышкой"""
    clicked = pyqtSignal()
    def mousePressEvent(self, event):
        if event.button() == Qt.MouseButton.LeftButton:
            self.clicked.emit()

class EspRadarApp(QMainWindow):
    def __init__(self):
        super().__init__()
        # Цвет акцента по умолчанию (используется для логотипа)
        self.accent_color = "#b300ff" # Неоново-фиолетовый
        self.initUI()

    def initUI(self):
        # Настройка главного окна
        self.setWindowTitle("espradar - UI Prototype")
        self.resize(850, 550)
        self.setStyleSheet("background-color: #121212; color: white;")

        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        main_layout = QVBoxLayout(central_widget)
        main_layout.setContentsMargins(40, 40, 40, 40)

        # ================= СТРОКА ЗАГОЛОВКА =================
        header_layout = QHBoxLayout()
        
        # Логотип "espradar"
        self.title_label = QLabel("espradar")
        # Имитация шрифта CS2 (жирный, без засечек, курсив)
        title_font = QFont("Arial Black", 28, QFont.Weight.Bold)
        title_font.setItalic(True)
        self.title_label.setFont(title_font)
        self.title_label.setStyleSheet(f"color: {self.accent_color};")
        header_layout.addWidget(self.title_label)

        header_layout.addStretch()

        # Кнопка смены цвета акцента
        self.btn_color = QPushButton("Изменить цвет акцента")
        self.btn_color.setCursor(QCursor(Qt.CursorShape.PointingHandCursor))
        self.btn_color.setStyleSheet("""
            QPushButton {
                background-color: #1e1e1e;
                border: 1px solid #333;
                border-radius: 8px;
                padding: 8px 16px;
                font-family: 'Segoe UI';
                font-size: 12px;
                font-weight: bold;
                color: #aaa;
            }
            QPushButton:hover {
                background-color: #2a2a2a;
                color: white;
                border: 1px solid #555;
            }
        """)
        self.btn_color.clicked.connect(self.change_accent_color)
        header_layout.addWidget(self.btn_color)

        main_layout.addLayout(header_layout)

        # ================= СЕКЦИЯ ПРОФИЛЯ =================
        profile_layout = QHBoxLayout()
        profile_layout.setContentsMargins(0, 30, 0, 0)
        profile_layout.setSpacing(15)

        # Аватар
        self.avatar = ClickableAvatar()
        self.avatar.setFixedSize(90, 90)
        self.avatar.setCursor(QCursor(Qt.CursorShape.PointingHandCursor))
        self.avatar.setToolTip("Нажмите, чтобы изменить аватар")
        # Стандартный вид аватара (до загрузки картинки)
        self.avatar.setStyleSheet("""
            background-color: #1e1e1e;
            border-radius: 45px;
            border: 2px dashed #333;
        """)
        self.avatar.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.avatar_font = QFont("Segoe UI", 10)
        self.avatar.setFont(self.avatar_font)
        self.avatar.setText("Avatar")
        self.avatar.clicked.connect(self.change_avatar)
        profile_layout.addWidget(self.avatar)

        # Инфо-блок (Никнейм и Статус)
        info_layout = QVBoxLayout()
        info_layout.setAlignment(Qt.AlignmentFlag.AlignVCenter)
        info_layout.setSpacing(2)

        # Никнейм (Поле ввода, замаскированное под текст)
        self.nickname = QLineEdit("Игрок_1337")
        font_nick = QFont("Segoe UI", 18, QFont.Weight.Bold)
        self.nickname.setFont(font_nick)
        self.nickname.setToolTip("Нажмите, чтобы изменить никнейм")
        self.nickname.setStyleSheet("""
            QLineEdit {
                background: transparent;
                border: none;
                color: white;
                padding: 0px;
            }
            QLineEdit:focus {
                background: #1e1e1e;
                border-bottom: 2px solid #555;
            }
        """)
        info_layout.addWidget(self.nickname)

        # Блок статуса
        status_layout = QHBoxLayout()
        status_layout.setAlignment(Qt.AlignmentFlag.AlignLeft)
        status_layout.setSpacing(8)

        # Светящийся зеленый кружок
        self.status_circle = QLabel()
        self.status_circle.setFixedSize(12, 12)
        self.status_circle.setStyleSheet("background-color: #00ff44; border-radius: 6px;")
        
        # Эффект неонового свечения
        glow = QGraphicsDropShadowEffect(self)
        glow.setBlurRadius(20)
        glow.setColor(QColor("#00ff44"))
        glow.setOffset(0, 0)
        self.status_circle.setGraphicsEffect(glow)

        status_layout.addWidget(self.status_circle)

        # Текст статуса
        self.status_text = QLabel("active: lifetime")
        font_status = QFont("Segoe UI", 11, QFont.Weight.Bold)
        self.status_text.setFont(font_status)
        self.status_text.setStyleSheet("color: #00ff44;")
        status_layout.addWidget(self.status_text)

        info_layout.addLayout(status_layout)
        profile_layout.addLayout(info_layout)
        
        # Сдвигаем профиль влево
        profile_layout.addStretch()

        main_layout.addLayout(profile_layout)
        
        # Заполняем оставшееся пространство снизу
        main_layout.addStretch()

    def change_accent_color(self):
        """Открывает палитру для выбора цвета акцента"""
        color = QColorDialog.getColor()
        if color.isValid():
            self.accent_color = color.name()
            # Применяем цвет к заголовку
            self.title_label.setStyleSheet(f"color: {self.accent_color};")

    def change_avatar(self):
        """Загружает картинку и обрезает её в идеальный круг"""
        file_name, _ = QFileDialog.getOpenFileName(
            self, "Выбрать аватар", "", "Images (*.png *.jpg *.jpeg)"
        )
        if file_name:
            pixmap = QPixmap(file_name)
            
            # Масштабируем картинку с сохранением пропорций, заполняя квадрат 90x90
            scaled = pixmap.scaled(
                90, 90, 
                Qt.AspectRatioMode.KeepAspectRatioByExpanding, 
                Qt.TransformationMode.SmoothTransformation
            )
            
            # Создаем прозрачный холст
            rounded = QPixmap(90, 90)
            rounded.fill(Qt.GlobalColor.transparent)
            
            # Рисуем круглое изображение
            painter = QPainter(rounded)
            painter.setRenderHint(QPainter.RenderHint.Antialiasing)
            path = QPainterPath()
            path.addEllipse(0, 0, 90, 90)
            painter.setClipPath(path)
            
            # Центрируем изображение, если оно получилось шире или выше 90x90
            x_offset = (90 - scaled.width()) // 2
            y_offset = (90 - scaled.height()) // 2
            painter.drawPixmap(x_offset, y_offset, scaled)
            painter.end()
            
            # Устанавливаем готовый круглый аватар
            self.avatar.setText("")
            self.avatar.setStyleSheet("background: transparent;")
            self.avatar.setPixmap(rounded)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = EspRadarApp()
    window.show()
    sys.exit(app.exec())