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 }