You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

251 lines
9.4 KiB

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)