add notification
This commit is contained in:
		
							parent
							
								
									e8427ceb5d
								
							
						
					
					
						commit
						d72239b3ab
					
				@ -64,6 +64,7 @@ class YobbleHomeView(QWidget):
 | 
			
		||||
 | 
			
		||||
        # --- Боковое меню и оверлей ---
 | 
			
		||||
        self.setup_side_menu()
 | 
			
		||||
        self._setup_notification_widget()
 | 
			
		||||
 | 
			
		||||
        self.update_styles()
 | 
			
		||||
        theme_manager.theme_changed.connect(self.update_styles)
 | 
			
		||||
@ -107,6 +108,81 @@ class YobbleHomeView(QWidget):
 | 
			
		||||
        if self.is_menu_closing:
 | 
			
		||||
            self.overlay.hide()
 | 
			
		||||
 | 
			
		||||
    def _setup_notification_widget(self):
 | 
			
		||||
        """Настраивает виджет для всплывающих уведомлений."""
 | 
			
		||||
        self.notification_widget = QFrame(self)
 | 
			
		||||
        self.notification_widget.setObjectName("NotificationWidget")
 | 
			
		||||
        
 | 
			
		||||
        # Тень
 | 
			
		||||
        shadow = QGraphicsDropShadowEffect(self)
 | 
			
		||||
        shadow.setBlurRadius(20)
 | 
			
		||||
        shadow.setColor(QColor(0, 0, 0, 80))
 | 
			
		||||
        shadow.setOffset(0, 3)
 | 
			
		||||
        self.notification_widget.setGraphicsEffect(shadow)
 | 
			
		||||
        self.notification_widget.hide()
 | 
			
		||||
 | 
			
		||||
        layout = QHBoxLayout(self.notification_widget)
 | 
			
		||||
        layout.setContentsMargins(15, 10, 15, 10)
 | 
			
		||||
        self.notification_label = QLabel()
 | 
			
		||||
        self.notification_label.setObjectName("NotificationLabel")
 | 
			
		||||
        layout.addWidget(self.notification_label)
 | 
			
		||||
 | 
			
		||||
        # Эффект прозрачности для анимации
 | 
			
		||||
        self.notification_opacity_effect = QGraphicsOpacityEffect(self.notification_widget)
 | 
			
		||||
        self.notification_widget.setGraphicsEffect(self.notification_opacity_effect)
 | 
			
		||||
 | 
			
		||||
        self.notification_animation = QPropertyAnimation(self.notification_opacity_effect, b"opacity")
 | 
			
		||||
        self.notification_animation.setDuration(300) # мс на появление/исчезание
 | 
			
		||||
 | 
			
		||||
        self.notification_timer = QTimer(self)
 | 
			
		||||
        self.notification_timer.setSingleShot(True)
 | 
			
		||||
        self.notification_timer.timeout.connect(self.hide_notification)
 | 
			
		||||
 | 
			
		||||
    def show_notification(self, message, is_error=True, duration=3000):
 | 
			
		||||
        """Показывает всплывающее уведомление."""
 | 
			
		||||
        self.notification_label.setText(message)
 | 
			
		||||
        
 | 
			
		||||
        self.notification_widget.setProperty("is_error", is_error)
 | 
			
		||||
        
 | 
			
		||||
        self.notification_widget.style().unpolish(self.notification_widget)
 | 
			
		||||
        self.notification_widget.style().polish(self.notification_widget)
 | 
			
		||||
 | 
			
		||||
        # Позиционирование
 | 
			
		||||
        self.notification_widget.adjustSize()
 | 
			
		||||
        x = (self.width() - self.notification_widget.width()) / 2
 | 
			
		||||
        y = 30 # Отступ сверху
 | 
			
		||||
        self.notification_widget.move(int(x), y)
 | 
			
		||||
        
 | 
			
		||||
        self.notification_widget.show()
 | 
			
		||||
        self.notification_widget.raise_() # Поднять поверх всех
 | 
			
		||||
 | 
			
		||||
        # Анимация появления
 | 
			
		||||
        self.notification_animation.stop()
 | 
			
		||||
        self.notification_animation.setStartValue(0.0)
 | 
			
		||||
        self.notification_animation.setEndValue(1.0)
 | 
			
		||||
        self.notification_animation.start()
 | 
			
		||||
 | 
			
		||||
        # Таймер на скрытие
 | 
			
		||||
        self.notification_timer.start(duration)
 | 
			
		||||
 | 
			
		||||
    def hide_notification(self):
 | 
			
		||||
        """Плавно скрывает уведомление."""
 | 
			
		||||
        self.notification_animation.stop()
 | 
			
		||||
        self.notification_animation.setStartValue(self.notification_opacity_effect.opacity())
 | 
			
		||||
        self.notification_animation.setEndValue(0.0)
 | 
			
		||||
        self.notification_animation.start()
 | 
			
		||||
        
 | 
			
		||||
        # Прячем виджет только после завершения анимации
 | 
			
		||||
        def on_finished():
 | 
			
		||||
            self.notification_widget.hide()
 | 
			
		||||
            # Отключаем, чтобы не вызывался многократно
 | 
			
		||||
            try:
 | 
			
		||||
                self.notification_animation.finished.disconnect(on_finished)
 | 
			
		||||
            except (TypeError, RuntimeError):
 | 
			
		||||
                pass # Уже отключен
 | 
			
		||||
        
 | 
			
		||||
        self.notification_animation.finished.connect(on_finished)
 | 
			
		||||
 | 
			
		||||
    def toggle_side_menu(self):
 | 
			
		||||
        """Показывает или скрывает боковое меню с анимацией."""
 | 
			
		||||
        # Останавливаем текущие анимации, чтобы избежать конфликтов
 | 
			
		||||
@ -143,6 +219,11 @@ class YobbleHomeView(QWidget):
 | 
			
		||||
            self.side_menu.move(-self.side_menu.width(), 0)
 | 
			
		||||
        self.side_menu.setFixedHeight(self.height())
 | 
			
		||||
 | 
			
		||||
        if hasattr(self, 'notification_widget') and self.notification_widget.isVisible():
 | 
			
		||||
            self.notification_widget.adjustSize()
 | 
			
		||||
            x = (self.width() - self.notification_widget.width()) / 2
 | 
			
		||||
            self.notification_widget.move(int(x), 30)
 | 
			
		||||
 | 
			
		||||
    def update_styles(self):
 | 
			
		||||
        """Обновляет стили компонента при смене темы."""
 | 
			
		||||
        self.setStyleSheet(self.get_stylesheet())
 | 
			
		||||
@ -182,6 +263,16 @@ class YobbleHomeView(QWidget):
 | 
			
		||||
        top_bar_layout.addWidget(self.notification_button)
 | 
			
		||||
        self.notification_button.clicked.connect(self.handle_notification_click)
 | 
			
		||||
 | 
			
		||||
        # --- Временные кнопки для теста ---
 | 
			
		||||
        # self.test_ok_button = QPushButton("Test OK")
 | 
			
		||||
        # self.test_ok_button.clicked.connect(lambda: self.show_notification("Операция прошла успешно", is_error=False))
 | 
			
		||||
        # top_bar_layout.addWidget(self.test_ok_button)
 | 
			
		||||
 | 
			
		||||
        # self.test_err_button = QPushButton("Test Error")
 | 
			
		||||
        # self.test_err_button.clicked.connect(lambda: self.show_notification("Произошла ошибка при обновлении", is_error=True))
 | 
			
		||||
        # top_bar_layout.addWidget(self.test_err_button)
 | 
			
		||||
        # --- Конец временного кода ---
 | 
			
		||||
 | 
			
		||||
        return top_bar_widget
 | 
			
		||||
 | 
			
		||||
    def create_bottom_bar(self):
 | 
			
		||||
@ -377,13 +468,8 @@ class YobbleHomeView(QWidget):
 | 
			
		||||
        self.title_label.setText(titles[index])
 | 
			
		||||
 | 
			
		||||
    def show_error_message(self, message):
 | 
			
		||||
        """Показывает диалоговое окно с сообщением об ошибке."""
 | 
			
		||||
        show_themed_messagebox(
 | 
			
		||||
            self,
 | 
			
		||||
            QMessageBox.Warning,
 | 
			
		||||
            localizer.translate("Ошибка доступа"),
 | 
			
		||||
            message
 | 
			
		||||
        )
 | 
			
		||||
        """Показывает всплывающее уведомление об ошибке."""
 | 
			
		||||
        self.show_notification(message, is_error=True)
 | 
			
		||||
 | 
			
		||||
    def update_tab_selection(self, selected_index):
 | 
			
		||||
        if not hasattr(self, 'bottom_bar'):
 | 
			
		||||
@ -470,6 +556,27 @@ class YobbleHomeView(QWidget):
 | 
			
		||||
                background-color: {overlay_color};
 | 
			
		||||
            }}
 | 
			
		||||
 | 
			
		||||
            /* --- Уведомления --- */
 | 
			
		||||
            #NotificationWidget {{
 | 
			
		||||
                border-radius: 12px;
 | 
			
		||||
                background-color: {"#333" if is_dark else "#FFF"};
 | 
			
		||||
                border: 1px solid {"#444" if is_dark else "#E0E0E0"};
 | 
			
		||||
            }}
 | 
			
		||||
            #NotificationWidget[is_error="true"] {{
 | 
			
		||||
                background-color: {"#D32F2F" if is_dark else "#f44336"};
 | 
			
		||||
                border: 1px solid {"#C62828" if is_dark else "#E53935"};
 | 
			
		||||
            }}
 | 
			
		||||
            #NotificationWidget[is_error="false"] {{
 | 
			
		||||
                background-color: {"#388E3C" if is_dark else "#4CAF50"};
 | 
			
		||||
                border: 1px solid {"#2E7D32" if is_dark else "#43A047"};
 | 
			
		||||
            }}
 | 
			
		||||
            #NotificationLabel {{
 | 
			
		||||
                color: white;
 | 
			
		||||
                font-size: 14px;
 | 
			
		||||
                background: transparent;
 | 
			
		||||
            }}
 | 
			
		||||
            /* --- Конец Уведомлений --- */
 | 
			
		||||
 | 
			
		||||
            /* Глобально для кнопок */
 | 
			
		||||
            QPushButton {{
 | 
			
		||||
                background: transparent;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user