File indexing completed on 2024-05-05 05:04:02

0001 /*
0002  *  Dialog to choose a user for a 'homes' share
0003  *
0004  *  SPDX-FileCopyrightText: 2023 Alexander Reinholdt <alexander.reinholdt@kdemail.net>
0005  *  SPDX-License-Identifier: GPL-2.0-or-later
0006  */
0007 
0008 // application specific includes
0009 #include "smb4khomesuserdialog.h"
0010 #include "core/smb4khomesshareshandler.h"
0011 #include "core/smb4ksettings.h"
0012 
0013 // Qt includes
0014 #include <QDialogButtonBox>
0015 #include <QGridLayout>
0016 #include <QIcon>
0017 #include <QLabel>
0018 #include <QVBoxLayout>
0019 #include <QWindow>
0020 
0021 // KDE includes
0022 #include <KConfigGroup>
0023 #include <KIconLoader>
0024 #include <KLineEdit>
0025 #include <KLocalizedString>
0026 #include <KWindowConfig>
0027 
0028 Smb4KHomesUserDialog::Smb4KHomesUserDialog(QWidget *parent)
0029     : QDialog(parent)
0030 {
0031     setWindowTitle(i18n("Specify User"));
0032     setAttribute(Qt::WA_DeleteOnClose);
0033 
0034     QVBoxLayout *layout = new QVBoxLayout(this);
0035 
0036     QWidget *descriptionWidget = new QWidget(this);
0037     QHBoxLayout *descriptionWidgetLayout = new QHBoxLayout(descriptionWidget);
0038 
0039     QLabel *descriptionPixmap = new QLabel(descriptionWidget);
0040     descriptionPixmap->setPixmap(KDE::icon(QStringLiteral("user")).pixmap(KIconLoader::SizeHuge));
0041     descriptionPixmap->setAlignment(Qt::AlignBottom);
0042     descriptionPixmap->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
0043 
0044     descriptionWidgetLayout->addWidget(descriptionPixmap);
0045 
0046     m_descriptionText = new QLabel(this);
0047     m_descriptionText->setText(i18n("Please specify a username."));
0048     m_descriptionText->setWordWrap(true);
0049     m_descriptionText->setAlignment(Qt::AlignBottom);
0050     m_descriptionText->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
0051 
0052     descriptionWidgetLayout->addWidget(m_descriptionText);
0053 
0054     layout->addWidget(descriptionWidget);
0055     layout->addSpacing(layout->spacing());
0056 
0057     QWidget *inputWidget = new QWidget(this);
0058     QGridLayout *inputWidgetLayout = new QGridLayout(inputWidget);
0059     inputWidgetLayout->setContentsMargins(0, 0, 0, 0);
0060     inputWidgetLayout->setColumnStretch(0, 0);
0061     inputWidgetLayout->setColumnStretch(1, 1);
0062 
0063     QLabel *userNameLabel = new QLabel(i18n("Username:"), inputWidget);
0064 
0065     m_userNameInput = new KComboBox(inputWidget);
0066     m_userNameInput->setEditable(true);
0067 
0068     connect(m_userNameInput->lineEdit(), &KLineEdit::editingFinished, this, &Smb4KHomesUserDialog::slotHomesUserNameEntered);
0069     connect(m_userNameInput, &KComboBox::currentTextChanged, this, &Smb4KHomesUserDialog::slotHomesUserNameChanged);
0070 
0071     inputWidgetLayout->addWidget(userNameLabel, 0, 0);
0072     inputWidgetLayout->addWidget(m_userNameInput, 0, 1);
0073 
0074     layout->addWidget(inputWidget);
0075 
0076     QDialogButtonBox *buttonBox = new QDialogButtonBox(this);
0077     m_okButton = buttonBox->addButton(QDialogButtonBox::Ok);
0078     m_okButton->setShortcut(QKeySequence::Save);
0079     m_okButton->setEnabled(false);
0080     m_cancelButton = buttonBox->addButton(QDialogButtonBox::Cancel);
0081     m_cancelButton->setShortcut(QKeySequence::Cancel);
0082     m_cancelButton->setDefault(true);
0083 
0084     connect(m_okButton, &QPushButton::clicked, this, &Smb4KHomesUserDialog::slotOkClicked);
0085     connect(m_cancelButton, &QPushButton::clicked, this, &Smb4KHomesUserDialog::reject);
0086 
0087     layout->addWidget(buttonBox);
0088 
0089     create();
0090 
0091     KConfigGroup dialogGroup(Smb4KSettings::self()->config(), QStringLiteral("HomesUserDialog"));
0092     QSize dialogSize;
0093 
0094     if (dialogGroup.exists()) {
0095         KWindowConfig::restoreWindowSize(windowHandle(), dialogGroup);
0096         dialogSize = windowHandle()->size();
0097     } else {
0098         dialogSize = sizeHint();
0099     }
0100 
0101     resize(dialogSize); // workaround for QTBUG-40584
0102 
0103     KConfigGroup completionGroup(Smb4KSettings::self()->config(), QStringLiteral("CompletionItems"));
0104 
0105     if (completionGroup.exists()) {
0106         m_userNameInput->completionObject()->setItems(completionGroup.readEntry("HomesUsersCompletion", QStringList()));
0107     }
0108 }
0109 
0110 Smb4KHomesUserDialog::~Smb4KHomesUserDialog() noexcept
0111 {
0112 }
0113 
0114 bool Smb4KHomesUserDialog::setShare(SharePtr homesShare)
0115 {
0116     if (!homesShare->isHomesShare()) {
0117         return false;
0118     }
0119 
0120     m_share = homesShare;
0121     m_descriptionText->setText(i18n("Please specify a username for share<br><b>%1</b>.", m_share->displayString()));
0122     m_userNameInput->addItems(Smb4KHomesSharesHandler::self()->homesUsers(m_share));
0123     m_userNameInput->setCurrentItem(QStringLiteral(""));
0124 
0125     return true;
0126 }
0127 
0128 void Smb4KHomesUserDialog::slotHomesUserNameEntered()
0129 {
0130     if (!m_userNameInput->currentText().isEmpty()) {
0131         m_userNameInput->completionObject()->addItem(m_userNameInput->currentText());
0132     }
0133 }
0134 
0135 void Smb4KHomesUserDialog::slotHomesUserNameChanged(const QString &text)
0136 {
0137     m_okButton->setEnabled(!text.isEmpty());
0138 }
0139 
0140 void Smb4KHomesUserDialog::slotOkClicked()
0141 {
0142     QString userName = m_userNameInput->currentText();
0143 
0144     if (!userName.isEmpty()) {
0145         if (!m_share->userName().isEmpty() && m_share->userName() != userName) {
0146             m_share->setPassword(QString());
0147         }
0148 
0149         m_share->setUserName(userName);
0150     }
0151 
0152     QStringList homesUsers;
0153 
0154     for (int i = 0; i < m_userNameInput->count(); ++i) {
0155         homesUsers << m_userNameInput->itemText(i);
0156     }
0157 
0158     if (!homesUsers.contains(m_userNameInput->currentText())) {
0159         homesUsers << m_userNameInput->currentText();
0160     }
0161 
0162     Smb4KHomesSharesHandler::self()->addHomesUsers(m_share, homesUsers);
0163 
0164     KConfigGroup dialogGroup(Smb4KSettings::self()->config(), QStringLiteral("HomesUserDialog"));
0165     KWindowConfig::saveWindowSize(windowHandle(), dialogGroup);
0166 
0167     KConfigGroup completionGroup(Smb4KSettings::self()->config(), QStringLiteral("CompletionItems"));
0168     completionGroup.writeEntry("HomesUsersCompletion", m_userNameInput->completionObject()->items());
0169 
0170     accept();
0171 }