/
Ruden161
/
player
Обзор
Документация
Войти
/
Ruden161
/
player
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/ui/folder_browser.py
240 строк
9 KB
Ruden161
Проводник видео, горячие клавиши, YouTube-style панель
01 мар 2026, 19:16
01 мар 2026, 19:16
816ee8b
Код
Авторство
О чём код?
""" Диалог выбора папки с видео """ from PyQt6.QtWidgets import (QDialog, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QListWidget, QFileDialog, QMessageBox, QListWidgetItem) from PyQt6.QtCore import Qt from PyQt6.QtGui import QFont import os from src.utils.config import Config class FolderBrowserDialog(QDialog): """Диалог выбора папки с видео""" def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle("Выберите папку с видео") self.setMinimumSize(600, 500) self.setWindowModality(Qt.WindowModality.WindowModal) # Последняя открытая папка self.last_folder = Config.get_last_video_folder() # Видео файлы self.video_files = [] self.video_extensions = ['.mp4', '.mkv', '.avi', '.mov', '.wmv', '.flv', '.webm', '.m4v'] self._init_ui() self._load_folder(self.last_folder) def _init_ui(self): layout = QVBoxLayout(self) layout.setContentsMargins(20, 20, 20, 20) layout.setSpacing(15) # Заголовок title = QLabel("📁 Выберите папку с видео") title.setFont(QFont("Segoe UI", 16, QFont.Weight.Bold)) title.setStyleSheet("color: #ffffff; padding: 10px;") layout.addWidget(title) # Панель управления control_layout = QHBoxLayout() control_layout.setSpacing(10) # Кнопка выбора папки self.btn_select_folder = QPushButton("📂 Выбрать папку") self.btn_select_folder.setFixedSize(150, 40) self.btn_select_folder.setStyleSheet(""" QPushButton { background-color: #0078D4; color: white; border: none; border-radius: 6px; font-weight: bold; font-size: 13px; } QPushButton:hover { background-color: #1084D8; } QPushButton:pressed { background-color: #006CBE; } """) self.btn_select_folder.clicked.connect(self._select_folder) control_layout.addWidget(self.btn_select_folder) # Метка текущей папки self.lbl_current_folder = QLabel("Папка не выбрана") self.lbl_current_folder.setStyleSheet("color: #aaaaaa; font-size: 12px; padding: 5px;") self.lbl_current_folder.setWordWrap(True) control_layout.addWidget(self.lbl_current_folder) layout.addLayout(control_layout) # Список видео self.video_list = QListWidget() self.video_list.setStyleSheet(""" QListWidget { background-color: #1e1e1e; border: 1px solid #333333; border-radius: 6px; color: #ffffff; font-size: 13px; padding: 5px; } QListWidget::item { padding: 8px; border-radius: 4px; border-bottom: 1px solid #2a2a2a; } QListWidget::item:selected { background-color: #0078D4; } QListWidget::item:hover { background-color: #2a2a2a; } """) self.video_list.itemDoubleClicked.connect(self._on_item_double_click) layout.addWidget(self.video_list) # Статистика self.lbl_count = QLabel("Видео: 0") self.lbl_count.setStyleSheet("color: #888888; font-size: 12px;") layout.addWidget(self.lbl_count) # Кнопки button_layout = QHBoxLayout() button_layout.setSpacing(10) self.btn_open = QPushButton("▶️ Открыть выбранное") self.btn_open.setFixedSize(180, 40) self.btn_open.setStyleSheet(""" QPushButton { background-color: #28a745; color: white; border: none; border-radius: 6px; font-weight: bold; font-size: 14px; } QPushButton:hover { background-color: #34ce57; } QPushButton:pressed { background-color: #218838; } QPushButton:disabled { background-color: #555555; } """) self.btn_open.clicked.connect(self._open_selected) self.btn_open.setEnabled(False) button_layout.addWidget(self.btn_open) button_layout.addStretch() self.btn_cancel = QPushButton("Отмена") self.btn_cancel.setFixedSize(120, 40) self.btn_cancel.setStyleSheet(""" QPushButton { background-color: #6c757d; color: white; border: none; border-radius: 6px; font-weight: bold; font-size: 13px; } QPushButton:hover { background-color: #7c858d; } """) self.btn_cancel.clicked.connect(self.reject) button_layout.addWidget(self.btn_cancel) layout.addLayout(button_layout) # Соединение для выделения self.video_list.itemSelectionChanged.connect(self._on_selection_changed) def _select_folder(self): """Выбор папки""" folder = QFileDialog.getExistingDirectory( self, "Выберите папку с видео", self.last_folder, QFileDialog.Option.ShowDirsOnly ) if folder: self.last_folder = folder Config.save_last_video_folder(folder) self._load_folder(folder) def _load_folder(self, folder_path: str): """Загрузка видео из папки""" self.video_list.clear() self.video_files = [] if not folder_path or not os.path.isdir(folder_path): self.lbl_current_folder.setText("Папка не выбрана") self.lbl_count.setText("Видео: 0") return self.lbl_current_folder.setText(f"📁 {folder_path}") # Сканируем папку try: for filename in os.listdir(folder_path): ext = os.path.splitext(filename)[1].lower() if ext in self.video_extensions: self.video_files.append(os.path.join(folder_path, filename)) # Сортируем по имени self.video_files.sort(key=lambda x: os.path.basename(x).lower()) # Добавляем в список for video_path in self.video_files: filename = os.path.basename(video_path) item = QListWidgetItem(f"🎬 {filename}") item.setData(Qt.ItemDataRole.UserRole, video_path) self.video_list.addItem(item) self.lbl_count.setText(f"🎬 Видео: {len(self.video_files)}") except Exception as e: QMessageBox.warning(self, "Ошибка", f"Не удалось загрузить папку:\n{e}") self.lbl_count.setText("Видео: 0") def _on_selection_changed(self): """Изменение выделения""" self.btn_open.setEnabled(self.video_list.currentRow() >= 0) def _on_item_double_click(self, item): """Двойной клик по элементу""" self._open_selected() def _open_selected(self): """Открытие выбранного видео""" current_item = self.video_list.currentItem() if current_item: video_path = current_item.data(Qt.ItemDataRole.UserRole) self.accept() # Сигнал о выборе if hasattr(self, 'parent') and hasattr(self.parent(), 'video_selected'): self.parent().video_selected.emit(video_path) else: # Возвращаем путь через атрибут self.selected_video = video_path def get_selected_video(self) -> str: """Получить выбранный видео файл""" current_item = self.video_list.currentItem() if current_item: return current_item.data(Qt.ItemDataRole.UserRole) return "" def get_all_videos(self) -> list: """Получить список всех видео""" return self.video_files.copy()