File indexing completed on 2023-12-03 05:04:22

0001 /*
0002  *  Bookmark dialog
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 "smb4kbookmarkdialog.h"
0010 #include "core/smb4kbookmark.h"
0011 #include "core/smb4kbookmarkhandler.h"
0012 #include "core/smb4ksettings.h"
0013 
0014 // Qt includes
0015 #include <QDialogButtonBox>
0016 #include <QGridLayout>
0017 #include <QLabel>
0018 #include <QMouseEvent>
0019 #include <QVBoxLayout>
0020 #include <QWindow>
0021 
0022 // KDE includes
0023 #include <KConfigGroup>
0024 #include <KIconLoader>
0025 #include <KLocalizedString>
0026 #include <KWindowConfig>
0027 
0028 Smb4KBookmarkDialog::Smb4KBookmarkDialog(QWidget *parent)
0029     : QDialog(parent)
0030 {
0031     setWindowTitle(i18n("Bookmark Shares"));
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     descriptionWidgetLayout->setContentsMargins(0, 0, 0, 0);
0039 
0040     QLabel *descriptionPixmap = new QLabel(descriptionWidget);
0041     descriptionPixmap->setPixmap(KDE::icon(QStringLiteral("bookmark-new")).pixmap(KIconLoader::SizeHuge));
0042     descriptionPixmap->setAlignment(Qt::AlignBottom);
0043     descriptionPixmap->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
0044 
0045     descriptionWidgetLayout->addWidget(descriptionPixmap);
0046 
0047     QLabel *descriptionText = new QLabel(this);
0048     descriptionText->setText(i18n("All listed shares will be bookmarked. To add a label or category, double-click the respective bookmark entry."));
0049     descriptionText->setWordWrap(true);
0050     descriptionText->setAlignment(Qt::AlignBottom);
0051     descriptionText->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
0052 
0053     descriptionWidgetLayout->addWidget(descriptionText);
0054 
0055     layout->addWidget(descriptionWidget);
0056 
0057     m_listWidget = new QListWidget(this);
0058     m_listWidget->setSelectionMode(QListWidget::SingleSelection);
0059     m_listWidget->viewport()->installEventFilter(this);
0060 
0061     connect(m_listWidget, &QListWidget::itemDoubleClicked, this, &Smb4KBookmarkDialog::slotItemDoubleClicked);
0062     connect(m_listWidget, &QListWidget::itemSelectionChanged, this, &Smb4KBookmarkDialog::slotItemSelectionChanged);
0063 
0064     layout->addWidget(m_listWidget);
0065 
0066     m_editorWidget = new QWidget(this);
0067     m_editorWidget->setVisible(false);
0068 
0069     QGridLayout *editorWidgetLayout = new QGridLayout(m_editorWidget);
0070     editorWidgetLayout->setContentsMargins(0, 0, 0, 0);
0071 
0072     QLabel *labelLabel = new QLabel(i18n("Label:"), m_editorWidget);
0073     m_labelEdit = new KLineEdit(m_editorWidget);
0074     m_labelEdit->setClearButtonEnabled(true);
0075     m_labelEdit->setCompletionMode(KCompletion::CompletionPopupAuto);
0076 
0077     connect(m_labelEdit, &KLineEdit::editingFinished, this, &Smb4KBookmarkDialog::slotLabelEdited);
0078 
0079     QLabel *categoryLabel = new QLabel(i18n("Category:"), m_editorWidget);
0080     m_categoryEdit = new KComboBox(m_editorWidget);
0081     m_categoryEdit->setEditable(true);
0082     m_categoryEdit->lineEdit()->setClearButtonEnabled(true);
0083     m_categoryEdit->setCompletionMode(KCompletion::CompletionPopupAuto);
0084 
0085     QStringList categories = Smb4KBookmarkHandler::self()->categoryList();
0086 
0087     if (!categories.contains(QStringLiteral(""))) {
0088         categories << QStringLiteral("");
0089     }
0090 
0091     m_categoryEdit->addItems(categories);
0092     m_categoryEdit->setCurrentText(QStringLiteral(""));
0093 
0094     connect(m_categoryEdit->lineEdit(), &KLineEdit::editingFinished, this, &Smb4KBookmarkDialog::slotCategoryEdited);
0095 
0096     editorWidgetLayout->addWidget(labelLabel, 0, 0);
0097     editorWidgetLayout->addWidget(m_labelEdit, 0, 1);
0098     editorWidgetLayout->addWidget(categoryLabel, 1, 0);
0099     editorWidgetLayout->addWidget(m_categoryEdit, 1, 1);
0100 
0101     layout->addWidget(m_editorWidget);
0102 
0103     QDialogButtonBox *buttonBox = new QDialogButtonBox(this);
0104     m_saveButton = buttonBox->addButton(QDialogButtonBox::Save);
0105     m_saveButton->setShortcut(QKeySequence::Save);
0106     m_cancelButton = buttonBox->addButton(QDialogButtonBox::Cancel);
0107     m_cancelButton->setShortcut(QKeySequence::Cancel);
0108     m_cancelButton->setDefault(true);
0109 
0110     connect(m_saveButton, &QPushButton::clicked, this, &Smb4KBookmarkDialog::slotSaveBookmarks);
0111     connect(m_cancelButton, &QPushButton::clicked, this, &Smb4KBookmarkDialog::reject);
0112 
0113     layout->addWidget(buttonBox);
0114 
0115     setMinimumWidth(sizeHint().width() > 350 ? sizeHint().width() : 350);
0116 
0117     create();
0118 
0119     KConfigGroup dialogGroup(Smb4KSettings::self()->config(), "BookmarkDialog");
0120     QSize dialogSize;
0121 
0122     if (dialogGroup.exists()) {
0123         KWindowConfig::restoreWindowSize(windowHandle(), dialogGroup);
0124         dialogSize = windowHandle()->size();
0125     } else {
0126         dialogSize = sizeHint();
0127     }
0128 
0129     resize(dialogSize); // workaround for QTBUG-40584
0130 
0131     KConfigGroup completionGroup(Smb4KSettings::self()->config(), "CompletionItems");
0132 
0133     if (completionGroup.exists()) {
0134         m_labelEdit->completionObject()->setItems(completionGroup.readEntry("LabelCompletion", QStringList()));
0135         m_categoryEdit->completionObject()->setItems(completionGroup.readEntry("CategoryCompletion", Smb4KBookmarkHandler::self()->categoryList()));
0136     }
0137 }
0138 
0139 Smb4KBookmarkDialog::~Smb4KBookmarkDialog()
0140 {
0141 }
0142 
0143 bool Smb4KBookmarkDialog::setShares(const QList<SharePtr> &shares)
0144 {
0145     bool bookmarksSet = false;
0146 
0147     for (const SharePtr &share : qAsConst(shares)) {
0148         if (Smb4KBookmarkHandler::self()->isBookmarked(share)) {
0149             continue;
0150         }
0151 
0152         Smb4KBookmark bookmark;
0153         bookmark.setShare(share.data());
0154 
0155         QVariant variant = QVariant::fromValue(bookmark);
0156 
0157         QListWidgetItem *bookmarkItem = new QListWidgetItem(m_listWidget);
0158         bookmarkItem->setText(bookmark.displayString());
0159         bookmarkItem->setIcon(bookmark.icon());
0160         bookmarkItem->setData(Qt::UserRole, variant);
0161 
0162         bookmarksSet = true;
0163     }
0164 
0165     return bookmarksSet;
0166 }
0167 
0168 bool Smb4KBookmarkDialog::eventFilter(QObject *object, QEvent *event)
0169 {
0170     if (object == m_listWidget->viewport()) {
0171         if (event->type() == QEvent::MouseButtonPress) {
0172             QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
0173 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
0174             QPointF pos = m_listWidget->viewport()->mapFromGlobal(mouseEvent->globalPosition());
0175             QListWidgetItem *item = m_listWidget->itemAt(pos.toPoint());
0176 #else
0177             QPoint pos = m_listWidget->viewport()->mapFromGlobal(mouseEvent->globalPos());
0178             QListWidgetItem *item = m_listWidget->itemAt(pos);
0179 #endif
0180             if (!item) {
0181                 m_listWidget->clearSelection();
0182             }
0183         }
0184     }
0185 
0186     return QObject::eventFilter(object, event);
0187 }
0188 
0189 void Smb4KBookmarkDialog::slotItemDoubleClicked(QListWidgetItem *item)
0190 {
0191     Q_UNUSED(item);
0192 
0193     Smb4KBookmark bookmark = item->data(Qt::UserRole).value<Smb4KBookmark>();
0194 
0195     m_labelEdit->setText(bookmark.label());
0196     m_categoryEdit->setCurrentText(bookmark.categoryName());
0197 
0198     m_editorWidget->setVisible(true);
0199 }
0200 
0201 void Smb4KBookmarkDialog::slotItemSelectionChanged()
0202 {
0203     if (m_editorWidget->isVisible()) {
0204         m_editorWidget->setVisible(false);
0205         m_labelEdit->clear();
0206         m_categoryEdit->lineEdit()->clear();
0207     }
0208 }
0209 
0210 void Smb4KBookmarkDialog::slotLabelEdited()
0211 {
0212     if (m_listWidget->currentItem() && m_editorWidget->isVisible()) {
0213         Smb4KBookmark bookmark = m_listWidget->currentItem()->data(Qt::UserRole).value<Smb4KBookmark>();
0214         bookmark.setLabel(m_labelEdit->text());
0215 
0216         QVariant variant = QVariant::fromValue(bookmark);
0217         m_listWidget->currentItem()->setData(Qt::UserRole, variant);
0218 
0219         m_labelEdit->completionObject()->addItem(m_labelEdit->text());
0220     }
0221 }
0222 
0223 void Smb4KBookmarkDialog::slotCategoryEdited()
0224 {
0225     if (m_listWidget->currentItem() && m_editorWidget->isVisible()) {
0226         Smb4KBookmark bookmark = m_listWidget->currentItem()->data(Qt::UserRole).value<Smb4KBookmark>();
0227         bookmark.setCategoryName(m_categoryEdit->currentText());
0228 
0229         QVariant variant = QVariant::fromValue(bookmark);
0230         m_listWidget->currentItem()->setData(Qt::UserRole, variant);
0231 
0232         if (!m_categoryEdit->contains(m_categoryEdit->currentText())) {
0233             m_categoryEdit->addItem(m_categoryEdit->currentText());
0234         }
0235 
0236         m_categoryEdit->completionObject()->addItem(m_categoryEdit->currentText());
0237     }
0238 }
0239 
0240 void Smb4KBookmarkDialog::slotSaveBookmarks()
0241 {
0242     if (m_editorWidget->isVisible()) {
0243         Smb4KBookmark bookmark = m_listWidget->currentItem()->data(Qt::UserRole).value<Smb4KBookmark>();
0244 
0245         bookmark.setLabel(m_labelEdit->text());
0246         bookmark.setCategoryName(m_categoryEdit->currentText());
0247     }
0248 
0249     QList<BookmarkPtr> bookmarks;
0250 
0251     for (int i = 0; i < m_listWidget->count(); ++i) {
0252         Smb4KBookmark bookmark = m_listWidget->item(i)->data(Qt::UserRole).value<Smb4KBookmark>();
0253         bookmarks << BookmarkPtr(new Smb4KBookmark(bookmark));
0254     }
0255 
0256     Smb4KBookmarkHandler::self()->addBookmarks(bookmarks);
0257 
0258     KConfigGroup dialogGroup(Smb4KSettings::self()->config(), "BookmarkEditor");
0259     KWindowConfig::saveWindowSize(windowHandle(), dialogGroup);
0260 
0261     KConfigGroup completionGroup(Smb4KSettings::self()->config(), "CompletionItems");
0262     completionGroup.writeEntry("LabelCompletion", m_labelEdit->completionObject()->items());
0263     completionGroup.writeEntry("CategoryCompletion", m_categoryEdit->completionObject()->items());
0264 
0265     accept();
0266 }