Files
KKAFIO/app/components/folder_setting_card.py
2024-09-26 00:50:08 +01:00

101 lines
3.3 KiB
Python

import os
import subprocess
from pathlib import Path
from PySide6.QtCore import Qt
from PySide6.QtGui import QIcon
from PySide6.QtWidgets import QFileDialog
from qfluentwidgets import SettingCard, FluentIconBase, FluentIcon, CommandBar, Action, LineEdit, LineEditButton
from typing import Union
from ..common.config import cfg
class FolderLineEdit(LineEdit):
""" Search line edit """
def __init__(self, parent=None):
super().__init__(parent)
self.validButton = LineEditButton(FluentIcon.ACCEPT, self)
self.hBoxLayout.addWidget(self.validButton, 0, Qt.AlignRight)
self.setTextMargins(0, 0, 59, 0)
def setValid(self, value: bool):
if value:
self.validButton._icon = FluentIcon.ACCEPT
else:
self.validButton._icon = FluentIcon.CLOSE
class FolderSettingCard(SettingCard):
def __init__(self, configItem, icon: Union[str, QIcon, FluentIconBase], title, content=None, parent=None):
"""
Parameters
----------
configItem: TimeConfigItem
configuration item operated by the card
icon: str | QIcon | FluentIconBase
the icon to be drawn
title: str
the title of card
content: str
the content of card
parent: QWidget
parent widget
"""
super().__init__(icon, title, content, parent)
self.configItem = configItem
self.lineEdit = FolderLineEdit()
self.lineEdit.setText(configItem.value)
self.__initCommandBar()
self.__initLayout()
self.__connectSignalToSlot()
def __initCommandBar(self):
self.commandBar = CommandBar()
explorerAction = Action(FluentIcon.FOLDER, 'Show in Explorer')
explorerAction.triggered.connect(self.openExplorer)
self.commandBar.addHiddenAction(explorerAction)
browseAction = Action(FluentIcon.EDIT, 'Browse')
browseAction.triggered.connect(self.browse)
self.commandBar.addHiddenAction(browseAction)
def __initLayout(self):
self.setFixedHeight(70)
self.vBoxLayout.addWidget(self.lineEdit)
self.hBoxLayout.setStretch(2, 70)
self.hBoxLayout.addWidget(self.commandBar, 0, Qt.AlignBottom | Qt.AlignmentFlag.AlignRight)
self.hBoxLayout.addSpacing(16)
def __connectSignalToSlot(self):
self.lineEdit.textChanged.connect(self.pathValid)
def pathValid(self, text):
if not text:
cfg.set(self.configItem, "")
self.lineEdit.setValid(True)
return
path = Path(text)
if path.is_absolute() and path.is_dir() and path.exists():
cfg.set(self.configItem, text)
self.lineEdit.setValid(True)
else:
self.lineEdit.setValid(False)
def openExplorer(self):
if self.configItem.value:
file_path = os.path.normpath(self.configItem.value)
subprocess.Popen(f'explorer /select,"{file_path}"')
def browse(self):
""" download folder card clicked slot """
folder = QFileDialog.getExistingDirectory(
self, self.tr("Choose folder"), "./")
if not folder or cfg.get(self.configItem) == folder:
return
self.lineEdit.setText(folder)