Files
Medical_Input_Helper/main_interface.py
T
2025-11-01 21:03:27 +05:00

251 lines
9.4 KiB
Python

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)