/*** Olive - Non-Linear Video Editor Copyright (C) 2022 Olive Team Modifications Copyright (C) 2025 mikesolar This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . ***/ #include "filefield.h" #include #include #include #include #include "ui/icons/icons.h" namespace olive { FileField::FileField(QWidget *parent) : QWidget(parent) , directory_mode_(false) { QHBoxLayout *layout = new QHBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); line_edit_ = new QLineEdit(); connect(line_edit_, &QLineEdit::textChanged, this, &FileField::line_edit_changed); connect(line_edit_, &QLineEdit::textEdited, this, &FileField::filename_changed); layout->addWidget(line_edit_); browse_btn_ = new QPushButton(); browse_btn_->setIcon(icon::open); connect(browse_btn_, &QPushButton::clicked, this, &FileField::browse_btn_clicked); layout->addWidget(browse_btn_); } void FileField::browse_btn_clicked() { QString s; if (sidebar_urls_.isEmpty()) { if (directory_mode_) { s = QFileDialog::getExistingDirectory(this, tr("Open Directory")); } else { s = QFileDialog::getOpenFileName(this, tr("Open File"), QString(), name_filter_); } } else { // Sidebar URLs require the non-static dialog API QFileDialog dialog(this, tr("Open File")); dialog.setFileMode(directory_mode_ ? QFileDialog::Directory : QFileDialog::ExistingFile); dialog.setAcceptMode(QFileDialog::AcceptOpen); if (!directory_mode_ && !name_filter_.isEmpty()) { dialog.setNameFilter(name_filter_); } dialog.setSidebarUrls(sidebar_urls_); if (directory_mode_) { dialog.setOption(QFileDialog::ShowDirsOnly, true); } if (dialog.exec() == QDialog::Accepted && !dialog.selectedFiles().isEmpty()) { s = dialog.selectedFiles().first(); } } if (!s.isEmpty()) { line_edit_->setText(s); emit filename_changed(s); } } void FileField::line_edit_changed(const QString &text) { if (QFileInfo::exists(text) || text.isEmpty()) { line_edit_->setStyleSheet(QString()); } else { line_edit_->setStyleSheet(QStringLiteral("QLineEdit {color: red;}")); } } }