#include "FolderListSettingCard.h" #include "Layout/VBoxLayout.h" #include "DialogBox/Dialog.h" #include #include FToolButton::FToolButton(FluentIconBase *icon, const QSize &size, const QSize &iconSize, QWidget *parent) : QToolButton(parent), m_isPressed(false), m_icon(icon), m_iconSize(iconSize) { setFixedSize(size); } void FToolButton::mousePressEvent(QMouseEvent *event) { m_isPressed = true; QToolButton::mousePressEvent(event); } void FToolButton::mouseReleaseEvent(QMouseEvent *event) { m_isPressed = false; QToolButton::mouseReleaseEvent(event); } void FToolButton::paintEvent(QPaintEvent *event) { QToolButton::paintEvent(event); QPainter painter(this); painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); if (m_isPressed) { painter.setOpacity(0.63); } else { painter.setOpacity(1); } int w = m_iconSize.width(); int h = m_iconSize.height(); m_icon->render(&painter, QRectF((this->width() - w) / 2, (this->height() - h) / 2, w, h).toRect()); } FPushButton::FPushButton(FluentIconBase *icon, const QString &text, QWidget *parent) : QPushButton(parent), m_isPressed(false), m_icon(icon) { setText(text); } void FPushButton::mousePressEvent(QMouseEvent *event) { m_isPressed = true; QPushButton::mousePressEvent(event); } void FPushButton::mouseReleaseEvent(QMouseEvent *event) { m_isPressed = false; QPushButton::mouseReleaseEvent(event); } void FPushButton::paintEvent(QPaintEvent *event) { QPushButton::paintEvent(event); QPainter painter(this); painter.setRenderHints(QPainter::Antialiasing); if (m_isPressed) { painter.setOpacity(0.63); } else { painter.setOpacity(1); } m_icon->render(&painter, QRectF(12, 8, 16, 16).toRect()); } FolderItem::FolderItem(const QString &folder, QWidget *parent) : QWidget(parent), m_folder(folder) { hBoxLayout = new QHBoxLayout(this); m_folderLabel = new QLabel(folder, this); m_removeButton = new FToolButton(NEWFLICON(FluentIcon, CLOSE), QSize(39, 29), QSize(12, 12), this); setFixedHeight(53); hBoxLayout->setContentsMargins(48, 0, 60, 0); hBoxLayout->addWidget(m_folderLabel, 0, Qt::AlignLeft); hBoxLayout->addSpacing(16); hBoxLayout->addStretch(1); hBoxLayout->addWidget(m_removeButton, 0, Qt::AlignRight); hBoxLayout->setAlignment(Qt::AlignVCenter); connect(m_removeButton, &FToolButton::clicked, [=]() { emit removed(this); }); } QString FolderItem::folder() const { return m_folder; } FolderListSettingCard::FolderListSettingCard(const QVariant &configItem, const QString &title, const QString &content, const QString &directory, QWidget *parent) : ExpandSettingCard(NEWFLICON(FluentIcon, FOLDER_ADD), title, content, parent), m_configItem(configItem), m_dialogDirectory(directory) { m_addFolderButton = new FPushButton(NEWFLICON(FluentIcon, FOLDER_ADD), tr("Add folder"), this); m_folders = m_configItem.toStringList(); initWidget(); } void FolderListSettingCard::initWidget() { addWidget(m_addFolderButton); // initialize layout viewLayout->setSpacing(0); viewLayout->setAlignment(Qt::AlignTop); viewLayout->setContentsMargins(0, 0, 0, 0); for (const auto &f : m_folders) { addFolderItem(f); } connect(m_addFolderButton, &FPushButton::clicked, this, &FolderListSettingCard::showFolderDialog); } void FolderListSettingCard::addFolderItem(const QString &folder) { FolderItem *item = new FolderItem(folder, view()); connect(item, &FolderItem::removed, this, &FolderListSettingCard::showConfirmDialog); viewLayout->addWidget(item); adjustViewSize(); } void FolderListSettingCard::showFolderDialog() { QString folder = QFileDialog::getExistingDirectory(this, tr("Choose folder"), m_dialogDirectory); if (folder.isEmpty() || m_folders.contains(folder)) { return; } addFolderItem(folder); m_folders.append(folder); // qconfig.set(self.configItem, self.folders) emit folderChanged(m_folders); } void FolderListSettingCard::showConfirmDialog(FolderItem *item) { QFileInfo fi(item->folder()); QString name = fi.baseName(); QString title = tr("Are you sure you want to delete the folder?"); QString content = tr("If you delete the ") + name + tr(" folder and remove it from the list, the folder will no " "longer appear in the list, but will not be deleted."); QScopedPointer w(new Dialog(title, content, this->window())); connect(w.data(), &Dialog::yesSignal, [=]() { removeFolder(item); }); w->exec(); } void FolderListSettingCard::removeFolder(FolderItem *item) { if (!m_folders.contains(item->folder())) { return; } m_folders.removeAll(item->folder()); viewLayout->deleteWidget(item); adjustViewSize(); emit folderChanged(m_folders); // qconfig.set(self.configItem, self.folders) }