251 lines
9.4 KiB
Python
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) |