| 
							
								 | 
							
							from PyQt6.QtWidgets import QWidget, QVBoxLayout, QPushButton, QLabel, QProgressBar, QHBoxLayout | 
						
						
						
						
							 | 
							
								 | 
							
							from PyQt6.QtCore import Qt, pyqtSignal, QSize | 
						
						
						
						
							 | 
							
								 | 
							
							import qtawesome as qta | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							class MainInterface(QWidget): | 
						
						
						
						
							 | 
							
								 | 
							
							    """Основной интерфейс приложения с кнопками и drop-областями""" | 
						
						
						
						
							 | 
							
								 | 
							
							    button_clicked = pyqtSignal(int) | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							    def __init__(self, parent=None): | 
						
						
						
						
							 | 
							
								 | 
							
							        super().__init__(parent) | 
						
						
						
						
							 | 
							
								 | 
							
							        self.parent = parent | 
						
						
						
						
							 | 
							
								 | 
							
							        self.setup_ui() | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							    def setup_ui(self): | 
						
						
						
						
							 | 
							
								 | 
							
							        """Настраивает основной интерфейс""" | 
						
						
						
						
							 | 
							
								 | 
							
							        self.setObjectName("MainInterface") | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							        self.main_layout = QVBoxLayout(self) | 
						
						
						
						
							 | 
							
								 | 
							
							        self.main_layout.setContentsMargins(8, 4, 8, 8) | 
						
						
						
						
							 | 
							
								 | 
							
							        self.main_layout.setSpacing(1) | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							        # Прогресс-бар | 
						
						
						
						
							 | 
							
								 | 
							
							        self.progress_bar = QProgressBar() | 
						
						
						
						
							 | 
							
								 | 
							
							        self.progress_bar.setVisible(False) | 
						
						
						
						
							 | 
							
								 | 
							
							        self.progress_bar.setStyleSheet(""" | 
						
						
						
						
							 | 
							
								 | 
							
							            QProgressBar { | 
						
						
						
						
							 | 
							
								 | 
							
							                border-radius: 4px; | 
						
						
						
						
							 | 
							
								 | 
							
							                background-color: rgba(180, 180, 180, 100); | 
						
						
						
						
							 | 
							
								 | 
							
							                font-size: 1px; | 
						
						
						
						
							 | 
							
								 | 
							
							                margin: 0px 3px; | 
						
						
						
						
							 | 
							
								 | 
							
							            } | 
						
						
						
						
							 | 
							
								 | 
							
							            QProgressBar::chunk { | 
						
						
						
						
							 | 
							
								 | 
							
							                background-color: rgba(255, 255, 255, 250); | 
						
						
						
						
							 | 
							
								 | 
							
							                border-radius: 4px; | 
						
						
						
						
							 | 
							
								 | 
							
							            } | 
						
						
						
						
							 | 
							
								 | 
							
							        """) | 
						
						
						
						
							 | 
							
								 | 
							
							        self.main_layout.addWidget(self.progress_bar) | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							        # Кнопки основного интерфейса | 
						
						
						
						
							 | 
							
								 | 
							
							        button_texts = [ | 
						
						
						
						
							 | 
							
								 | 
							
							            " Копировать жалобы", #mdi6.text-box-edit | 
						
						
						
						
							 | 
							
								 | 
							
							            " Копировать анамнез", #mdi6.text-box | 
						
						
						
						
							 | 
							
								 | 
							
							            " ЛОР-Статус", #mdi.ear-hearing | 
						
						
						
						
							 | 
							
								 | 
							
							            " Заключение ИИ", #mdi.robot-excited | 
						
						
						
						
							 | 
							
								 | 
							
							            " Новый случай" #mdi.refresh-circle | 
						
						
						
						
							 | 
							
								 | 
							
							        ] | 
						
						
						
						
							 | 
							
								 | 
							
							        button_names = [ | 
						
						
						
						
							 | 
							
								 | 
							
							            "complaints", | 
						
						
						
						
							 | 
							
								 | 
							
							            "history", | 
						
						
						
						
							 | 
							
								 | 
							
							            "ent_status", | 
						
						
						
						
							 | 
							
								 | 
							
							            "ai_conclusion", | 
						
						
						
						
							 | 
							
								 | 
							
							            "refresh" | 
						
						
						
						
							 | 
							
								 | 
							
							        ] | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							        button_default_icns = [ | 
						
						
						
						
							 | 
							
								 | 
							
							            "mdi6.text-box-edit", | 
						
						
						
						
							 | 
							
								 | 
							
							            "mdi6.text-box", | 
						
						
						
						
							 | 
							
								 | 
							
							            "mdi.ear-hearing", | 
						
						
						
						
							 | 
							
								 | 
							
							            "mdi.robot-excited", | 
						
						
						
						
							 | 
							
								 | 
							
							            "mdi.refresh-circle" | 
						
						
						
						
							 | 
							
								 | 
							
							        ] | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							        self.buttons = [] | 
						
						
						
						
							 | 
							
								 | 
							
							        for i, text in enumerate(button_texts): | 
						
						
						
						
							 | 
							
								 | 
							
							            icn = qta.icon(button_default_icns[i], color=('#FFFFFF', 255)) | 
						
						
						
						
							 | 
							
								 | 
							
							            button = QPushButton(icn, text) | 
						
						
						
						
							 | 
							
								 | 
							
							            button.setIconSize(QSize(25, 25)) | 
						
						
						
						
							 | 
							
								 | 
							
							            button.setObjectName(button_names[i]) | 
						
						
						
						
							 | 
							
								 | 
							
							            button.setStyleSheet(""" | 
						
						
						
						
							 | 
							
								 | 
							
							                QPushButton { | 
						
						
						
						
							 | 
							
								 | 
							
							                    color: #FFFFFF; | 
						
						
						
						
							 | 
							
								 | 
							
							                    background-color: rgba(0, 0, 0, 0); | 
						
						
						
						
							 | 
							
								 | 
							
							                    padding: 8px 8px; | 
						
						
						
						
							 | 
							
								 | 
							
							                    border-radius: 5px; | 
						
						
						
						
							 | 
							
								 | 
							
							                    font-size: 14px; | 
						
						
						
						
							 | 
							
								 | 
							
							                    font-weight: 650; | 
						
						
						
						
							 | 
							
								 | 
							
							                    margin: 0px 3px; | 
						
						
						
						
							 | 
							
								 | 
							
							                    text-align: left; | 
						
						
						
						
							 | 
							
								 | 
							
							                } | 
						
						
						
						
							 | 
							
								 | 
							
							                QPushButton:hover { | 
						
						
						
						
							 | 
							
								 | 
							
							                    background-color: rgba(0, 0, 0, 100); | 
						
						
						
						
							 | 
							
								 | 
							
							                } | 
						
						
						
						
							 | 
							
								 | 
							
							                QPushButton:pressed { | 
						
						
						
						
							 | 
							
								 | 
							
							                    background-color: rgba(0, 0, 0, 220); | 
						
						
						
						
							 | 
							
								 | 
							
							                } | 
						
						
						
						
							 | 
							
								 | 
							
							                QPushButton:disabled { | 
						
						
						
						
							 | 
							
								 | 
							
							                    color: #888888; | 
						
						
						
						
							 | 
							
								 | 
							
							                } | 
						
						
						
						
							 | 
							
								 | 
							
							            """) | 
						
						
						
						
							 | 
							
								 | 
							
							            button.clicked.connect(lambda checked, idx=i: self.button_clicked.emit(idx)) | 
						
						
						
						
							 | 
							
								 | 
							
							            self.buttons.append(button) | 
						
						
						
						
							 | 
							
								 | 
							
							            self.main_layout.addWidget(button) | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							        # Drop области | 
						
						
						
						
							 | 
							
								 | 
							
							        self.setup_drop_areas() | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							        # Изначально скрываем кнопки и показываем compact область | 
						
						
						
						
							 | 
							
								 | 
							
							        self.hide_buttons() | 
						
						
						
						
							 | 
							
								 | 
							
							        self.show_compact_drop_area() | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							    def setup_drop_areas(self): | 
						
						
						
						
							 | 
							
								 | 
							
							        """Настраивает области для drag-n-drop""" | 
						
						
						
						
							 | 
							
								 | 
							
							        # Основная drop область для изображений | 
						
						
						
						
							 | 
							
								 | 
							
							        self.image_drop_area = QLabel("🖼️ Перетащите\nснимки сюда") | 
						
						
						
						
							 | 
							
								 | 
							
							        self.image_drop_area.setAlignment(Qt.AlignmentFlag.AlignCenter) | 
						
						
						
						
							 | 
							
								 | 
							
							        # self.image_drop_area.setMinimumHeight(120) | 
						
						
						
						
							 | 
							
								 | 
							
							        self.image_drop_area.setStyleSheet(""" | 
						
						
						
						
							 | 
							
								 | 
							
							            QLabel { | 
						
						
						
						
							 | 
							
								 | 
							
							                background-color: rgba(200, 200, 200, 100); | 
						
						
						
						
							 | 
							
								 | 
							
							                border: 2px dashed rgba(180, 180, 180, 150); | 
						
						
						
						
							 | 
							
								 | 
							
							                border-radius: 8px; | 
						
						
						
						
							 | 
							
								 | 
							
							                padding: 0px; | 
						
						
						
						
							 | 
							
								 | 
							
							                margin: 7px; | 
						
						
						
						
							 | 
							
								 | 
							
							                font-size: 11px; | 
						
						
						
						
							 | 
							
								 | 
							
							                color: #ffffff; | 
						
						
						
						
							 | 
							
								 | 
							
							                font-weight: 600; | 
						
						
						
						
							 | 
							
								 | 
							
							            } | 
						
						
						
						
							 | 
							
								 | 
							
							            QLabel:hover { | 
						
						
						
						
							 | 
							
								 | 
							
							                background-color: rgba(200, 200, 200, 150); | 
						
						
						
						
							 | 
							
								 | 
							
							                border: 2px dashed rgb(180, 180, 180); | 
						
						
						
						
							 | 
							
								 | 
							
							            } | 
						
						
						
						
							 | 
							
								 | 
							
							        """) | 
						
						
						
						
							 | 
							
								 | 
							
							        self.image_drop_area.hide() | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							        # Drop области для текста | 
						
						
						
						
							 | 
							
								 | 
							
							        self.text_drop_layout = QVBoxLayout() | 
						
						
						
						
							 | 
							
								 | 
							
							        self.text_drop_layout.setSpacing(5) | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							        self.complaints_drop_area = QLabel("📝 Перетащите текст\nжалоб сюда") | 
						
						
						
						
							 | 
							
								 | 
							
							        self.complaints_drop_area.setAlignment(Qt.AlignmentFlag.AlignCenter) | 
						
						
						
						
							 | 
							
								 | 
							
							        # self.complaints_drop_area.setMinimumHeight(60) | 
						
						
						
						
							 | 
							
								 | 
							
							        self.complaints_drop_area.setStyleSheet(""" | 
						
						
						
						
							 | 
							
								 | 
							
							            QLabel { | 
						
						
						
						
							 | 
							
								 | 
							
							                background-color: rgba(200, 200, 200, 100); | 
						
						
						
						
							 | 
							
								 | 
							
							                border: 2px dashed rgba(180, 180, 180, 150); | 
						
						
						
						
							 | 
							
								 | 
							
							                border-radius: 8px; | 
						
						
						
						
							 | 
							
								 | 
							
							                padding: 0px; | 
						
						
						
						
							 | 
							
								 | 
							
							                font-size: 11px; | 
						
						
						
						
							 | 
							
								 | 
							
							                color: #ffffff; | 
						
						
						
						
							 | 
							
								 | 
							
							                font-weight: 600; | 
						
						
						
						
							 | 
							
								 | 
							
							            } | 
						
						
						
						
							 | 
							
								 | 
							
							            QLabel:hover { | 
						
						
						
						
							 | 
							
								 | 
							
							                background-color: rgba(200, 200, 200, 150); | 
						
						
						
						
							 | 
							
								 | 
							
							                border: 2px dashed rgb(180, 180, 180); | 
						
						
						
						
							 | 
							
								 | 
							
							            } | 
						
						
						
						
							 | 
							
								 | 
							
							        """) | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							        self.history_drop_area = QLabel("📋 Перетащите текст\nанамнеза сюда") | 
						
						
						
						
							 | 
							
								 | 
							
							        self.history_drop_area.setAlignment(Qt.AlignmentFlag.AlignCenter) | 
						
						
						
						
							 | 
							
								 | 
							
							        # self.history_drop_area.setMinimumHeight(60) | 
						
						
						
						
							 | 
							
								 | 
							
							        self.history_drop_area.setStyleSheet(""" | 
						
						
						
						
							 | 
							
								 | 
							
							            QLabel { | 
						
						
						
						
							 | 
							
								 | 
							
							                background-color: rgba(200, 200, 200, 100); | 
						
						
						
						
							 | 
							
								 | 
							
							                border: 2px dashed rgba(180, 180, 180, 150); | 
						
						
						
						
							 | 
							
								 | 
							
							                border-radius: 8px; | 
						
						
						
						
							 | 
							
								 | 
							
							                padding: 0px; | 
						
						
						
						
							 | 
							
								 | 
							
							                font-size: 11px; | 
						
						
						
						
							 | 
							
								 | 
							
							                color: #ffffff; | 
						
						
						
						
							 | 
							
								 | 
							
							                font-weight: 600; | 
						
						
						
						
							 | 
							
								 | 
							
							            } | 
						
						
						
						
							 | 
							
								 | 
							
							            QLabel:hover { | 
						
						
						
						
							 | 
							
								 | 
							
							                background-color: rgba(200, 200, 200, 150); | 
						
						
						
						
							 | 
							
								 | 
							
							                border: 2px dashed rgb(180, 180, 180); | 
						
						
						
						
							 | 
							
								 | 
							
							            } | 
						
						
						
						
							 | 
							
								 | 
							
							        """) | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							        self.text_drop_layout.addWidget(self.complaints_drop_area) | 
						
						
						
						
							 | 
							
								 | 
							
							        self.text_drop_layout.addWidget(self.history_drop_area) | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							        self.text_drop_widget = QWidget() | 
						
						
						
						
							 | 
							
								 | 
							
							        self.text_drop_widget.setLayout(self.text_drop_layout) | 
						
						
						
						
							 | 
							
								 | 
							
							        self.text_drop_widget.hide() | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							    def show_compact_drop_area(self): | 
						
						
						
						
							 | 
							
								 | 
							
							        """Показывает компактную drop область""" | 
						
						
						
						
							 | 
							
								 | 
							
							        self.hide_all_drop_areas() | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							        if hasattr(self, 'compact_drop_widget'): | 
						
						
						
						
							 | 
							
								 | 
							
							            self.main_layout.removeWidget(self.compact_drop_widget) | 
						
						
						
						
							 | 
							
								 | 
							
							            self.compact_drop_widget.deleteLater() | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							        compact_drop_label = QLabel("📁 Перетащите снимки\nили текст сюда") | 
						
						
						
						
							 | 
							
								 | 
							
							        compact_drop_label.setAlignment(Qt.AlignmentFlag.AlignCenter) | 
						
						
						
						
							 | 
							
								 | 
							
							        # compact_drop_label.setMinimumHeight(80) | 
						
						
						
						
							 | 
							
								 | 
							
							        compact_drop_label.setStyleSheet(""" | 
						
						
						
						
							 | 
							
								 | 
							
							            QLabel { | 
						
						
						
						
							 | 
							
								 | 
							
							                background-color: rgba(200, 200, 200, 100); | 
						
						
						
						
							 | 
							
								 | 
							
							                border: 2px dashed rgba(180, 180, 180, 150); | 
						
						
						
						
							 | 
							
								 | 
							
							                border-radius: 8px; | 
						
						
						
						
							 | 
							
								 | 
							
							                padding: 0px; | 
						
						
						
						
							 | 
							
								 | 
							
							                margin: 7px; | 
						
						
						
						
							 | 
							
								 | 
							
							                font-size: 11px; | 
						
						
						
						
							 | 
							
								 | 
							
							                color: #ffffff; | 
						
						
						
						
							 | 
							
								 | 
							
							                font-weight: 600; | 
						
						
						
						
							 | 
							
								 | 
							
							            } | 
						
						
						
						
							 | 
							
								 | 
							
							        """) | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							        self.compact_drop_widget = compact_drop_label | 
						
						
						
						
							 | 
							
								 | 
							
							        self.main_layout.insertWidget(0, self.compact_drop_widget) | 
						
						
						
						
							 | 
							
								 | 
							
							        self.compact_drop_widget.show() | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							    def show_image_drop_interface(self): | 
						
						
						
						
							 | 
							
								 | 
							
							        """Показывает интерфейс для перетаскивания изображений""" | 
						
						
						
						
							 | 
							
								 | 
							
							        self.hide_all_drop_areas() | 
						
						
						
						
							 | 
							
								 | 
							
							        if self.image_drop_area not in [self.main_layout.itemAt(i).widget() for i in range(self.main_layout.count())]: | 
						
						
						
						
							 | 
							
								 | 
							
							            self.main_layout.insertWidget(0, self.image_drop_area) | 
						
						
						
						
							 | 
							
								 | 
							
							        self.image_drop_area.show() | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							    def show_text_drop_interface(self): | 
						
						
						
						
							 | 
							
								 | 
							
							        """Показывает интерфейс для перетаскивания текста""" | 
						
						
						
						
							 | 
							
								 | 
							
							        self.hide_all_drop_areas() | 
						
						
						
						
							 | 
							
								 | 
							
							        if self.text_drop_widget not in [self.main_layout.itemAt(i).widget() for i in range(self.main_layout.count())]: | 
						
						
						
						
							 | 
							
								 | 
							
							            self.main_layout.insertWidget(0, self.text_drop_widget) | 
						
						
						
						
							 | 
							
								 | 
							
							        self.text_drop_widget.show() | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							    def hide_all_drop_areas(self): | 
						
						
						
						
							 | 
							
								 | 
							
							        """Скрывает все drop области""" | 
						
						
						
						
							 | 
							
								 | 
							
							        self.image_drop_area.hide() | 
						
						
						
						
							 | 
							
								 | 
							
							        self.text_drop_widget.hide() | 
						
						
						
						
							 | 
							
								 | 
							
							        if hasattr(self, 'compact_drop_widget'): | 
						
						
						
						
							 | 
							
								 | 
							
							            self.compact_drop_widget.hide() | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							    def show_buttons(self): | 
						
						
						
						
							 | 
							
								 | 
							
							        """Показывает все кнопки""" | 
						
						
						
						
							 | 
							
								 | 
							
							        for button in self.buttons: | 
						
						
						
						
							 | 
							
								 | 
							
							            button.show() | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							    def hide_buttons(self): | 
						
						
						
						
							 | 
							
								 | 
							
							        """Скрывает все кнопки""" | 
						
						
						
						
							 | 
							
								 | 
							
							        for button in self.buttons: | 
						
						
						
						
							 | 
							
								 | 
							
							            button.hide() | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							    def set_processing_state(self, processing): | 
						
						
						
						
							 | 
							
								 | 
							
							        """Устанавливает состояние обработки""" | 
						
						
						
						
							 | 
							
								 | 
							
							        self.progress_bar.setVisible(processing) | 
						
						
						
						
							 | 
							
								 | 
							
							        if processing: | 
						
						
						
						
							 | 
							
								 | 
							
							            self.progress_bar.setRange(0, 0) | 
						
						
						
						
							 | 
							
								 | 
							
							        else: | 
						
						
						
						
							 | 
							
								 | 
							
							            self.progress_bar.setRange(0, 100) | 
						
						
						
						
							 | 
							
								 | 
							
							 | 
						
						
						
						
							 | 
							
								 | 
							
							    def set_buttons_enabled(self, enabled): | 
						
						
						
						
							 | 
							
								 | 
							
							        """Включает/выключает кнопки""" | 
						
						
						
						
							 | 
							
								 | 
							
							        for button in self.buttons: | 
						
						
						
						
							 | 
							
								 | 
							
							            if button.objectName() != "🔄 Новый случай": | 
						
						
						
						
							 | 
							
								 | 
							
							                button.setEnabled(enabled) |