File indexing completed on 2024-04-14 05:39:30

0001 // SPDX-FileCopyrightText: 2020 Simon Persson <simon.persson@mykolab.com>
0002 //
0003 // SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0004 
0005 #include "dirselector.h"
0006 
0007 #include <KDirLister>
0008 #include <KDirModel>
0009 #include <KLocalizedString>
0010 #include <KMessageBox>
0011 #include <KFileUtils>
0012 
0013 #include <QDir>
0014 #include <QInputDialog>
0015 
0016 DirSelector::DirSelector(QWidget *pParent) : QTreeView(pParent) {
0017     mDirModel = new KDirModel(this);
0018     mDirModel->dirLister()->setDirOnlyMode(true);
0019     setModel(mDirModel);
0020     for (int i = 1; i < mDirModel->columnCount(); ++i) {
0021         hideColumn(i);
0022     }
0023     setHeaderHidden(true);
0024     connect(mDirModel, SIGNAL(expand(QModelIndex)), SLOT(expand(QModelIndex)));
0025     connect(mDirModel, SIGNAL(expand(QModelIndex)), SLOT(selectEntry(QModelIndex)));
0026 }
0027 
0028 QUrl DirSelector::url() const {
0029     const KFileItem lFileItem = mDirModel->itemForIndex(currentIndex());
0030     return !lFileItem.isNull() ? lFileItem.url() : QUrl();
0031 }
0032 
0033 void DirSelector::createNewFolder() {
0034     bool lUserAccepted;
0035     QString lNameSuggestion = xi18nc("default folder name when creating a new folder", "New Folder");
0036     if(QFileInfo::exists(url().adjusted(QUrl::StripTrailingSlash).path() + '/' + lNameSuggestion)) {
0037         lNameSuggestion = KFileUtils::suggestName(url(), lNameSuggestion);
0038     }
0039 
0040     QString lSelectedName = QInputDialog::getText(this, xi18nc("@title:window", "New Folder" ),
0041                                                   xi18nc("@label:textbox", "Create new folder in:\n%1", url().path()),
0042                                                   QLineEdit::Normal, lNameSuggestion, &lUserAccepted);
0043     if (!lUserAccepted)
0044         return;
0045 
0046     QUrl lPartialUrl(url());
0047     const QStringList lDirectories = lSelectedName.split(QLatin1Char('/'), Qt::SkipEmptyParts);
0048     foreach(QString lSubDirectory, lDirectories) {
0049         QDir lDir(lPartialUrl.path());
0050         if(lDir.exists(lSubDirectory)) {
0051             lPartialUrl = lPartialUrl.adjusted(QUrl::StripTrailingSlash);
0052             lPartialUrl.setPath(lPartialUrl.path() + '/' + (lSubDirectory));
0053             KMessageBox::error(this, i18n("A folder named %1 already exists.", lPartialUrl.path()));
0054             return;
0055         }
0056         if(!lDir.mkdir(lSubDirectory)) {
0057             lPartialUrl = lPartialUrl.adjusted(QUrl::StripTrailingSlash);
0058             lPartialUrl.setPath(lPartialUrl.path() + '/' + (lSubDirectory));
0059             KMessageBox::error(this, i18n("You do not have permission to create %1.", lPartialUrl.path()));
0060             return;
0061         }
0062         lPartialUrl = lPartialUrl.adjusted(QUrl::StripTrailingSlash);
0063         lPartialUrl.setPath(lPartialUrl.path() + '/' + (lSubDirectory));
0064     }
0065     mDirModel->expandToUrl(lPartialUrl);
0066 }
0067 
0068 void DirSelector::selectEntry(QModelIndex pIndex) {
0069     selectionModel()->clearSelection();
0070     selectionModel()->setCurrentIndex(pIndex, QItemSelectionModel::SelectCurrent);
0071     scrollTo(pIndex);
0072 }
0073 
0074 void DirSelector::expandToUrl(const QUrl &pUrl) {
0075     mDirModel->expandToUrl(pUrl);
0076 }
0077 
0078 void DirSelector::setRootUrl(const QUrl &pUrl) {
0079     mDirModel->dirLister()->openUrl(pUrl);
0080 }
0081