|
|
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) |