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)