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

0001 /*
0002     The configuration page for bookmarks
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 "smb4kconfigpagebookmarks.h"
0010 #include "core/smb4kbookmarkhandler.h"
0011 
0012 // Qt includes
0013 #include <QDialogButtonBox>
0014 #include <QGridLayout>
0015 #include <QHBoxLayout>
0016 #include <QHostAddress>
0017 #include <QKeyEvent>
0018 #include <QMouseEvent>
0019 #include <QTimer>
0020 #include <QUrl>
0021 #include <QVBoxLayout>
0022 
0023 // KF includes
0024 #include <KIconLoader>
0025 #include <KLocalizedString>
0026 
0027 Smb4KConfigPageBookmarks::Smb4KConfigPageBookmarks(QWidget *parent)
0028     : QWidget(parent)
0029 {
0030     m_bookmarksChanged = false;
0031     m_savingBookmarks = false;
0032 
0033     QHBoxLayout *layout = new QHBoxLayout(this);
0034     QVBoxLayout *leftLayout = new QVBoxLayout();
0035 
0036     m_treeWidget = new QTreeWidget(this);
0037     m_treeWidget->headerItem()->setHidden(true);
0038     m_treeWidget->setColumnCount(1);
0039     m_treeWidget->setRootIsDecorated(false);
0040     m_treeWidget->setSelectionMode(QTreeWidget::SingleSelection);
0041     m_treeWidget->setItemsExpandable(false);
0042     m_treeWidget->setDragEnabled(true);
0043     m_treeWidget->setDragDropMode(QTreeWidget::InternalMove);
0044     m_treeWidget->setDropIndicatorShown(true);
0045     m_treeWidget->installEventFilter(this);
0046     m_treeWidget->viewport()->installEventFilter(this);
0047 
0048     connect(m_treeWidget, &QTreeWidget::currentItemChanged, this, &Smb4KConfigPageBookmarks::slotCurrentItemChanged);
0049     connect(m_treeWidget, &QTreeWidget::itemSelectionChanged, this, &Smb4KConfigPageBookmarks::slotItemSelectionChanged);
0050     connect(m_treeWidget, &QTreeWidget::itemDoubleClicked, this, &Smb4KConfigPageBookmarks::slotItemDoubleClicked);
0051 
0052     m_editorWidget = new QWidget(this);
0053     m_editorWidget->setVisible(false);
0054 
0055     QGridLayout *editorWidgetLayout = new QGridLayout(m_editorWidget);
0056     editorWidgetLayout->setContentsMargins(0, 0, 0, 0);
0057 
0058     m_labelLabel = new QLabel(i18n("Label:"), m_editorWidget);
0059     m_labelEdit = new KLineEdit(m_editorWidget);
0060     m_labelEdit->setClearButtonEnabled(true);
0061     m_labelEdit->setCompletionMode(KCompletion::CompletionNone);
0062 
0063     connect(m_labelEdit, &KLineEdit::textChanged, this, &Smb4KConfigPageBookmarks::slotLabelChanged);
0064     connect(m_labelEdit, &KLineEdit::editingFinished, this, &Smb4KConfigPageBookmarks::slotLabelEdited);
0065 
0066     m_categoryLabel = new QLabel(i18n("Category:"), m_editorWidget);
0067     m_categoryEdit = new KComboBox(m_editorWidget);
0068     m_categoryEdit->setEditable(true);
0069     m_categoryEdit->lineEdit()->setClearButtonEnabled(true);
0070     m_categoryEdit->setCompletionMode(KCompletion::CompletionNone);
0071 
0072     connect(m_categoryEdit->lineEdit(), &KLineEdit::textChanged, this, &Smb4KConfigPageBookmarks::slotCategoryChanged);
0073     connect(m_categoryEdit->lineEdit(), &QLineEdit::editingFinished, this, &Smb4KConfigPageBookmarks::slotCategoryEdited);
0074 
0075     m_userNameLabel = new QLabel(i18n("Username:"), m_editorWidget);
0076     m_userNameEdit = new KLineEdit(m_editorWidget);
0077     m_userNameEdit->setObjectName(QStringLiteral("UserNameEdit"));
0078     m_userNameEdit->setClearButtonEnabled(true);
0079     m_userNameEdit->setCompletionMode(KCompletion::CompletionNone);
0080 
0081     connect(m_userNameEdit, &KLineEdit::textChanged, this, &Smb4KConfigPageBookmarks::slotUserNameChanged);
0082     connect(m_userNameEdit, &KLineEdit::editingFinished, this, &Smb4KConfigPageBookmarks::slotUserNameEdited);
0083 
0084     m_workgroupLabel = new QLabel(i18n("Workgroup:"), m_editorWidget);
0085     m_workgroupEdit = new KLineEdit(m_editorWidget);
0086     m_workgroupEdit->setClearButtonEnabled(true);
0087     m_workgroupEdit->setCompletionMode(KCompletion::CompletionNone);
0088 
0089     connect(m_workgroupEdit, &KLineEdit::textChanged, this, &Smb4KConfigPageBookmarks::slotWorkgroupChanged);
0090     connect(m_workgroupEdit, &KLineEdit::editingFinished, this, &Smb4KConfigPageBookmarks::slotWorkgroupEdited);
0091 
0092     m_ipAddressLabel = new QLabel(i18n("IP Address:"), m_editorWidget);
0093     m_ipAddressEdit = new KLineEdit(m_editorWidget);
0094     m_ipAddressEdit->setClearButtonEnabled(true);
0095     m_ipAddressEdit->setCompletionMode(KCompletion::CompletionNone);
0096     // FIXME: Do we need an input mask?
0097 
0098     connect(m_ipAddressEdit, &KLineEdit::textChanged, this, &Smb4KConfigPageBookmarks::slotIpAddressChanged);
0099     connect(m_ipAddressEdit, &KLineEdit::editingFinished, this, &Smb4KConfigPageBookmarks::slotIpAddressEdited);
0100 
0101     editorWidgetLayout->addWidget(m_labelLabel, 0, 0);
0102     editorWidgetLayout->addWidget(m_labelEdit, 0, 1);
0103     editorWidgetLayout->addWidget(m_categoryLabel, 1, 0);
0104     editorWidgetLayout->addWidget(m_categoryEdit, 1, 1);
0105     editorWidgetLayout->addWidget(m_userNameLabel, 2, 0);
0106     editorWidgetLayout->addWidget(m_userNameEdit, 2, 1);
0107     editorWidgetLayout->addWidget(m_workgroupLabel, 3, 0);
0108     editorWidgetLayout->addWidget(m_workgroupEdit, 3, 1);
0109     editorWidgetLayout->addWidget(m_ipAddressLabel, 4, 0);
0110     editorWidgetLayout->addWidget(m_ipAddressEdit, 4, 1);
0111 
0112     leftLayout->addWidget(m_treeWidget);
0113     leftLayout->addWidget(m_editorWidget);
0114 
0115     layout->addLayout(leftLayout);
0116 
0117     QDialogButtonBox *buttonBox = new QDialogButtonBox(Qt::Vertical, this);
0118 
0119     m_resetButton = buttonBox->addButton(QDialogButtonBox::Reset);
0120     m_resetButton->setEnabled(false);
0121     m_resetButton->setObjectName(QStringLiteral("ResetButton"));
0122 
0123     connect(m_resetButton, &QPushButton::clicked, this, &Smb4KConfigPageBookmarks::slotResetButtonClicked);
0124 
0125     m_editButton = buttonBox->addButton(i18n("Edit"), QDialogButtonBox::ActionRole);
0126     m_editButton->setIcon(KDE::icon(QStringLiteral("bookmark-edit")));
0127     m_editButton->setEnabled(false);
0128 
0129     connect(m_editButton, &QPushButton::clicked, this, &Smb4KConfigPageBookmarks::slotEditButtonClicked);
0130 
0131     m_addCategoryButton = buttonBox->addButton(i18n("Add Category"), QDialogButtonBox::ActionRole);
0132     m_addCategoryButton->setIcon(KDE::icon(QStringLiteral("bookmark-add-folder")));
0133     m_addCategoryButton->setEnabled(!Smb4KBookmarkHandler::self()->bookmarkList().isEmpty());
0134 
0135     connect(m_addCategoryButton, &QPushButton::clicked, this, &Smb4KConfigPageBookmarks::slotAddCategoryButtonClicked);
0136 
0137     m_removeButton = buttonBox->addButton(i18n("Remove"), QDialogButtonBox::ActionRole);
0138     m_removeButton->setIcon(KDE::icon(QStringLiteral("bookmark-remove")));
0139     m_removeButton->setEnabled(false);
0140 
0141     connect(m_removeButton, &QPushButton::clicked, this, &Smb4KConfigPageBookmarks::slotRemoveButtonClicked);
0142 
0143     m_clearButton = buttonBox->addButton(i18n("Clear List"), QDialogButtonBox::ActionRole);
0144     m_clearButton->setIcon(KDE::icon(QStringLiteral("edit-clear")));
0145     m_clearButton->setEnabled(!Smb4KBookmarkHandler::self()->bookmarkList().isEmpty());
0146 
0147     connect(m_clearButton, &QPushButton::clicked, this, &Smb4KConfigPageBookmarks::slotClearButtonClicked);
0148 
0149     layout->addWidget(buttonBox);
0150 
0151     loadBookmarks();
0152 
0153     connect(this, &Smb4KConfigPageBookmarks::bookmarksModified, this, &Smb4KConfigPageBookmarks::slotEnableButtons);
0154     connect(Smb4KBookmarkHandler::self(), &Smb4KBookmarkHandler::updated, this, &Smb4KConfigPageBookmarks::loadBookmarks);
0155     connect(KIconLoader::global(), &KIconLoader::iconChanged, this, &Smb4KConfigPageBookmarks::slotIconSizeChanged);
0156 }
0157 
0158 Smb4KConfigPageBookmarks::~Smb4KConfigPageBookmarks()
0159 {
0160 }
0161 
0162 void Smb4KConfigPageBookmarks::loadBookmarks()
0163 {
0164     if (m_savingBookmarks) {
0165         return;
0166     }
0167 
0168     if (m_treeWidget->topLevelItemCount() != 0) {
0169         m_treeWidget->clear();
0170     }
0171 
0172     QStringList categories = Smb4KBookmarkHandler::self()->categoryList();
0173     m_categoryEdit->addItems(categories);
0174 
0175     if (!m_categoryEdit->contains(QStringLiteral(""))) {
0176         m_categoryEdit->addItem(QStringLiteral(""));
0177     }
0178 
0179     for (const QString &category : qAsConst(categories)) {
0180         QList<BookmarkPtr> bookmarks = Smb4KBookmarkHandler::self()->bookmarkList(category);
0181         QTreeWidgetItem *categoryItem = nullptr;
0182 
0183         if (!category.isEmpty() && !bookmarks.isEmpty()) {
0184             categoryItem = addCategoryItem(category);
0185         }
0186 
0187         if (!bookmarks.isEmpty()) {
0188             for (const BookmarkPtr &bookmark : qAsConst(bookmarks)) {
0189                 QVariant variant = QVariant::fromValue(*bookmark.data());
0190                 QTreeWidgetItem *bookmarkItem = nullptr;
0191 
0192                 if (categoryItem) {
0193                     bookmarkItem = new QTreeWidgetItem(categoryItem);
0194                 } else {
0195                     bookmarkItem = new QTreeWidgetItem(m_treeWidget);
0196                 }
0197 
0198                 bookmarkItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled);
0199                 bookmarkItem->setText(0, bookmark->displayString());
0200                 bookmarkItem->setIcon(0, bookmark->icon());
0201                 bookmarkItem->setData(0, TypeRole, BookmarkType);
0202                 bookmarkItem->setData(0, DataRole, variant);
0203             }
0204         }
0205     }
0206 
0207     sortItems();
0208 
0209     for (int i = 0; i < m_treeWidget->topLevelItemCount(); ++i) {
0210         QTreeWidgetItem *item = m_treeWidget->topLevelItem(i);
0211 
0212         if (item->childCount() > 0) {
0213             item->setExpanded(true);
0214         }
0215     }
0216 
0217     m_bookmarksChanged = false;
0218     Q_EMIT bookmarksModified();
0219 }
0220 
0221 void Smb4KConfigPageBookmarks::saveBookmarks()
0222 {
0223     if (m_bookmarksChanged) {
0224         QTreeWidgetItemIterator it(m_treeWidget, QTreeWidgetItemIterator::NoChildren);
0225         QList<BookmarkPtr> bookmarksList;
0226 
0227         while (*it) {
0228             if ((*it)->data(0, TypeRole).toInt() == BookmarkType) {
0229                 BookmarkPtr bookmarkPtr = BookmarkPtr(new Smb4KBookmark((*it)->data(0, DataRole).value<Smb4KBookmark>()));
0230 
0231                 if (bookmarkPtr) {
0232                     bookmarksList << bookmarkPtr;
0233                 }
0234             }
0235             ++it;
0236         }
0237 
0238         m_savingBookmarks = true;
0239         Smb4KBookmarkHandler::self()->addBookmarks(bookmarksList, true);
0240         m_savingBookmarks = false;
0241 
0242         m_bookmarksChanged = false;
0243         Q_EMIT bookmarksModified();
0244     }
0245 }
0246 
0247 void Smb4KConfigPageBookmarks::setCompletionItems(const QMap<QString, QStringList> &items)
0248 {
0249     m_labelEdit->setCompletionMode(KCompletion::CompletionPopupAuto);
0250     m_labelEdit->completionObject()->setItems(items[QStringLiteral("LabelCompletion")]);
0251 
0252     m_categoryEdit->setCompletionMode(KCompletion::CompletionPopupAuto);
0253     m_categoryEdit->completionObject()->setItems(items[QStringLiteral("CategoryCompletion")]);
0254 
0255     m_userNameEdit->setCompletionMode(KCompletion::CompletionPopupAuto);
0256     m_userNameEdit->completionObject()->setItems(items[QStringLiteral("LoginCompletion")]);
0257 
0258     m_ipAddressEdit->setCompletionMode(KCompletion::CompletionPopupAuto);
0259     m_ipAddressEdit->completionObject()->setItems(items[QStringLiteral("IpAddressCompletion")]);
0260 
0261     m_workgroupEdit->setCompletionMode(KCompletion::CompletionPopupAuto);
0262     m_workgroupEdit->completionObject()->setItems(items[QStringLiteral("WorkgroupCompletion")]);
0263 }
0264 
0265 QMap<QString, QStringList> Smb4KConfigPageBookmarks::completionItems() const
0266 {
0267     QMap<QString, QStringList> items;
0268 
0269     if (m_labelEdit->completionMode() != KCompletion::CompletionNone) {
0270         items[QStringLiteral("LabelCompletion")] = m_labelEdit->completionObject()->items();
0271     }
0272 
0273     if (m_categoryEdit->completionMode() != KCompletion::CompletionNone) {
0274         items[QStringLiteral("CategoryCompletion")] = m_categoryEdit->completionObject()->items();
0275     }
0276 
0277     if (m_userNameEdit->completionMode() != KCompletion::CompletionNone) {
0278         items[QStringLiteral("LoginCompletion")] = m_userNameEdit->completionObject()->items();
0279     }
0280 
0281     if (m_ipAddressEdit->completionMode() != KCompletion::CompletionNone) {
0282         items[QStringLiteral("IpAddressCompletion")] = m_ipAddressEdit->completionObject()->items();
0283     }
0284 
0285     if (m_workgroupEdit->completionMode() != KCompletion::CompletionNone) {
0286         items[QStringLiteral("WorkgroupCompletion")] = m_workgroupEdit->completionObject()->items();
0287     }
0288 
0289     return items;
0290 }
0291 
0292 bool Smb4KConfigPageBookmarks::bookmarksChanged() const
0293 {
0294     return m_bookmarksChanged;
0295 }
0296 
0297 QTreeWidgetItem *Smb4KConfigPageBookmarks::addCategoryItem(const QString &text)
0298 {
0299     QTreeWidgetItem *categoryItem = new QTreeWidgetItem(m_treeWidget, QTreeWidgetItem::UserType);
0300     categoryItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDropEnabled | Qt::ItemIsEnabled);
0301     categoryItem->setText(0, text);
0302     categoryItem->setIcon(0, KDE::icon(QStringLiteral("folder-favorites")));
0303     categoryItem->setData(0, TypeRole, CategoryType);
0304     categoryItem->setData(0, DataRole, text);
0305     QFont font = categoryItem->font(0);
0306     font.setBold(true);
0307     categoryItem->setFont(0, font);
0308     categoryItem->setExpanded(true);
0309 
0310     return categoryItem;
0311 }
0312 
0313 void Smb4KConfigPageBookmarks::startEditingCategoryItem(QTreeWidgetItem *item)
0314 {
0315     m_treeWidget->setCurrentItem(item);
0316     m_treeWidget->openPersistentEditor(item, 0);
0317     m_treeWidget->setFocus();
0318 }
0319 
0320 void Smb4KConfigPageBookmarks::endEditingCategoryItem(QTreeWidgetItem *item)
0321 {
0322     if (m_treeWidget->isPersistentEditorOpen(item, 0)) {
0323         m_treeWidget->closePersistentEditor(item, 0);
0324         item->setData(0, DataRole, item->text(0));
0325 
0326         if (item->childCount() != 0) {
0327             for (int i = 0; i < item->childCount(); ++i) {
0328                 Smb4KBookmark bookmark = item->child(i)->data(0, DataRole).value<Smb4KBookmark>();
0329                 bookmark.setCategoryName(item->text(0));
0330 
0331                 QVariant variant = QVariant::fromValue(bookmark);
0332                 item->child(i)->setData(0, DataRole, variant);
0333             }
0334 
0335             m_bookmarksChanged = true;
0336         }
0337 
0338         m_categoryEdit->addItem(item->text(0));
0339         m_categoryEdit->completionObject()->addItem(item->text(0));
0340 
0341         Q_EMIT bookmarksModified();
0342     }
0343 }
0344 
0345 void Smb4KConfigPageBookmarks::checkValues()
0346 {
0347     if (m_treeWidget->currentItem() && m_treeWidget->currentItem()->data(0, TypeRole).toInt() == BookmarkType && m_editorWidget->isVisible()) {
0348         Smb4KBookmark bookmark = m_treeWidget->currentItem()->data(0, DataRole).value<Smb4KBookmark>();
0349 
0350         if (bookmark.label() != m_labelEdit->text()) {
0351             m_bookmarksChanged = true;
0352             Q_EMIT bookmarksModified();
0353             return;
0354         }
0355 
0356         if (bookmark.categoryName() != m_categoryEdit->currentText()) {
0357             m_bookmarksChanged = true;
0358             Q_EMIT bookmarksModified();
0359             return;
0360         }
0361 
0362         if (bookmark.userName() != m_userNameEdit->text()) {
0363             m_bookmarksChanged = true;
0364             Q_EMIT bookmarksModified();
0365             return;
0366         }
0367 
0368         if (bookmark.workgroupName() != m_workgroupEdit->text()) {
0369             m_bookmarksChanged = true;
0370             Q_EMIT bookmarksModified();
0371             return;
0372         }
0373 
0374         if (bookmark.hostIpAddress() != m_ipAddressEdit->text()) {
0375             m_bookmarksChanged = true;
0376             Q_EMIT bookmarksModified();
0377             return;
0378         }
0379 
0380         Q_EMIT bookmarksModified();
0381     }
0382 }
0383 
0384 bool Smb4KConfigPageBookmarks::eventFilter(QObject *obj, QEvent *e)
0385 {
0386     if (obj == m_treeWidget->viewport()) {
0387         if (e->type() == QEvent::MouseButtonPress) {
0388             QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(e);
0389 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
0390             QPointF pos = m_treeWidget->viewport()->mapFromGlobal(mouseEvent->globalPosition());
0391             QTreeWidgetItem *item = m_treeWidget->itemAt(pos.toPoint());
0392 #else
0393             QPoint pos = m_treeWidget->viewport()->mapFromGlobal(mouseEvent->globalPos());
0394             QTreeWidgetItem *item = m_treeWidget->itemAt(pos);
0395 #endif
0396             m_editButton->setEnabled(item != nullptr);
0397             m_removeButton->setEnabled(item != nullptr);
0398 
0399             if (!item) {
0400                 m_treeWidget->clearSelection();
0401             }
0402 
0403             if (m_treeWidget->isPersistentEditorOpen(m_treeWidget->currentItem(), 0)) {
0404                 endEditingCategoryItem(m_treeWidget->currentItem());
0405             }
0406         }
0407     } else if (obj == m_treeWidget) {
0408         if (e->type() == QEvent::KeyPress) {
0409             QKeyEvent *keyEvent = static_cast<QKeyEvent *>(e);
0410 
0411             if (keyEvent->key() == Qt::Key_Return) {
0412                 if (m_treeWidget->isPersistentEditorOpen(m_treeWidget->currentItem(), 0)) {
0413                     endEditingCategoryItem(m_treeWidget->currentItem());
0414                     return true;
0415                 }
0416             }
0417         } else if (e->type() == QEvent::ChildRemoved) {
0418             // NOTE: Occurs after a drop event on the viewport if an item was moved.
0419             // We use it to get the categories right.
0420             QTreeWidgetItemIterator it(m_treeWidget);
0421 
0422             while (*it) {
0423                 if ((*it)->data(0, TypeRole).toInt() == BookmarkType) {
0424                     Smb4KBookmark bookmark = (*it)->data(0, DataRole).value<Smb4KBookmark>();
0425 
0426                     if ((*it)->parent()) {
0427                         bookmark.setCategoryName((*it)->parent()->data(0, DataRole).toString());
0428                     } else {
0429                         bookmark.setCategoryName(QStringLiteral(""));
0430                     }
0431 
0432                     QVariant variant = QVariant::fromValue(bookmark);
0433                     (*it)->setData(0, DataRole, variant);
0434                 }
0435 
0436                 ++it;
0437             }
0438         }
0439     }
0440 
0441     return QObject::eventFilter(obj, e);
0442 }
0443 
0444 void Smb4KConfigPageBookmarks::slotResetButtonClicked(bool checked)
0445 {
0446     Q_UNUSED(checked);
0447     m_treeWidget->clear();
0448     loadBookmarks();
0449 }
0450 
0451 void Smb4KConfigPageBookmarks::slotEditButtonClicked(bool checked)
0452 {
0453     Q_UNUSED(checked);
0454 
0455     if (m_treeWidget->currentItem()) {
0456         slotItemDoubleClicked(m_treeWidget->currentItem(), 0);
0457     }
0458 }
0459 
0460 void Smb4KConfigPageBookmarks::slotAddCategoryButtonClicked(bool checked)
0461 {
0462     Q_UNUSED(checked)
0463     QTreeWidgetItem *item = addCategoryItem(i18n("New Category"));
0464     startEditingCategoryItem(item);
0465 }
0466 
0467 void Smb4KConfigPageBookmarks::slotRemoveButtonClicked(bool checked)
0468 {
0469     Q_UNUSED(checked);
0470 
0471     if (m_treeWidget->currentItem()) {
0472         QTreeWidgetItem *parentItem = nullptr;
0473 
0474         if (m_treeWidget->currentItem()->data(0, TypeRole).toInt() == BookmarkType) {
0475             parentItem = m_treeWidget->currentItem()->parent();
0476         }
0477 
0478         delete m_treeWidget->currentItem();
0479         m_treeWidget->setCurrentItem(nullptr);
0480 
0481         if (parentItem && parentItem->childCount() == 0) {
0482             delete parentItem;
0483         }
0484 
0485         m_bookmarksChanged = true;
0486         Q_EMIT bookmarksModified();
0487     }
0488 }
0489 
0490 void Smb4KConfigPageBookmarks::slotClearButtonClicked(bool checked)
0491 {
0492     Q_UNUSED(checked);
0493     m_treeWidget->clear();
0494     m_bookmarksChanged = true;
0495     Q_EMIT bookmarksModified();
0496 }
0497 
0498 void Smb4KConfigPageBookmarks::slotCurrentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
0499 {
0500     Q_UNUSED(current);
0501 
0502     if (m_treeWidget->isPersistentEditorOpen(previous)) {
0503         endEditingCategoryItem(previous);
0504     }
0505 }
0506 
0507 void Smb4KConfigPageBookmarks::slotItemSelectionChanged()
0508 {
0509     bool enableButtons = !m_treeWidget->selectedItems().isEmpty();
0510 
0511     m_editButton->setEnabled(enableButtons);
0512     m_removeButton->setEnabled(enableButtons);
0513 
0514     if (m_editorWidget->isVisible()) {
0515         m_editorWidget->setVisible(false);
0516         m_labelEdit->clear();
0517         m_categoryEdit->lineEdit()->clear();
0518         m_userNameEdit->clear();
0519         m_workgroupEdit->clear();
0520         m_ipAddressEdit->clear();
0521     }
0522 }
0523 
0524 void Smb4KConfigPageBookmarks::slotItemDoubleClicked(QTreeWidgetItem *item, int column)
0525 {
0526     Q_UNUSED(column);
0527 
0528     if (item->data(0, TypeRole).toInt() == BookmarkType) {
0529         QString label = item->data(0, DataRole).value<Smb4KBookmark>().label();
0530         m_labelEdit->setText(label);
0531 
0532         if (!m_labelEdit->completionObject()->items().contains(label)) {
0533             m_labelEdit->completionObject()->addItem(label);
0534         }
0535 
0536         QString categoryName = item->data(0, DataRole).value<Smb4KBookmark>().categoryName();
0537         m_categoryEdit->setCurrentItem(categoryName, true);
0538 
0539         if (!m_categoryEdit->completionObject()->items().contains(categoryName)) {
0540             m_categoryEdit->completionObject()->addItem(categoryName);
0541         }
0542 
0543         QString userName = item->data(0, DataRole).value<Smb4KBookmark>().userName();
0544         m_userNameEdit->setText(userName);
0545 
0546         if (!m_userNameEdit->completionObject()->items().contains(userName)) {
0547             m_userNameEdit->completionObject()->addItem(userName);
0548         }
0549 
0550         QString workgroupName = item->data(0, DataRole).value<Smb4KBookmark>().workgroupName();
0551         m_workgroupEdit->setText(workgroupName);
0552 
0553         if (!m_workgroupEdit->completionObject()->items().contains(workgroupName)) {
0554             m_workgroupEdit->completionObject()->addItem(workgroupName);
0555         }
0556 
0557         QString hostIpAddress = item->data(0, DataRole).value<Smb4KBookmark>().hostIpAddress();
0558         m_ipAddressEdit->setText(hostIpAddress);
0559 
0560         if (!m_ipAddressEdit->completionObject()->items().contains(hostIpAddress)) {
0561             m_ipAddressEdit->completionObject()->addItem(hostIpAddress);
0562         }
0563 
0564         m_editorWidget->setVisible(true);
0565     } else {
0566         startEditingCategoryItem(item);
0567     }
0568 }
0569 
0570 void Smb4KConfigPageBookmarks::slotLabelChanged(const QString &text)
0571 {
0572     Q_UNUSED(text);
0573     checkValues();
0574 }
0575 
0576 void Smb4KConfigPageBookmarks::slotLabelEdited()
0577 {
0578     if (m_treeWidget->currentItem() && m_editorWidget->isVisible()) {
0579         if (m_treeWidget->currentItem()->data(0, TypeRole).toInt() == BookmarkType) {
0580             Smb4KBookmark bookmark = m_treeWidget->currentItem()->data(0, DataRole).value<Smb4KBookmark>();
0581             bookmark.setLabel(m_labelEdit->text());
0582 
0583             QVariant variant = QVariant::fromValue(bookmark);
0584             m_treeWidget->currentItem()->setData(0, DataRole, variant);
0585 
0586             if (m_labelEdit->completionMode() != KCompletion::CompletionNone) {
0587                 m_labelEdit->completionObject()->addItem(m_labelEdit->text());
0588             }
0589         }
0590     }
0591 }
0592 
0593 void Smb4KConfigPageBookmarks::slotCategoryChanged(const QString &text)
0594 {
0595     Q_UNUSED(text);
0596     checkValues();
0597 }
0598 
0599 void Smb4KConfigPageBookmarks::slotCategoryEdited()
0600 {
0601     if (m_treeWidget->currentItem() && m_editorWidget->isVisible()) {
0602         if (m_treeWidget->currentItem()->data(0, TypeRole).toInt() == BookmarkType) {
0603             Smb4KBookmark bookmark = m_treeWidget->currentItem()->data(0, DataRole).value<Smb4KBookmark>();
0604             bookmark.setCategoryName(m_categoryEdit->currentText());
0605 
0606             QVariant variant = QVariant::fromValue(bookmark);
0607             m_treeWidget->currentItem()->setData(0, DataRole, variant);
0608 
0609             QTreeWidgetItem *categoryItem = nullptr;
0610 
0611             for (int i = 0; i < m_treeWidget->topLevelItemCount(); ++i) {
0612                 QTreeWidgetItem *item = m_treeWidget->topLevelItem(i);
0613 
0614                 if (item->data(0, TypeRole).toInt() == CategoryType) {
0615                     if (item->data(0, DataRole).toString() == bookmark.categoryName()) {
0616                         categoryItem = item;
0617                         break;
0618                     }
0619                 }
0620             }
0621 
0622             if (!categoryItem) {
0623                 categoryItem = addCategoryItem(bookmark.categoryName());
0624             }
0625 
0626             if (categoryItem != m_treeWidget->currentItem()->parent()) {
0627                 QTreeWidgetItem *itemToMove = m_treeWidget->currentItem();
0628                 QTreeWidgetItem *parentItem = nullptr;
0629 
0630                 if (!itemToMove->parent()) {
0631                     parentItem = m_treeWidget->invisibleRootItem();
0632                 } else {
0633                     parentItem = itemToMove->parent();
0634                 }
0635 
0636                 parentItem->removeChild(itemToMove);
0637                 categoryItem->addChild(itemToMove);
0638             }
0639 
0640             if (!m_categoryEdit->contains(m_categoryEdit->currentText())) {
0641                 m_categoryEdit->addItem(m_categoryEdit->currentText());
0642             }
0643 
0644             if (m_categoryEdit->completionMode() != KCompletion::CompletionNone) {
0645                 m_categoryEdit->completionObject()->addItem(m_categoryEdit->currentText());
0646             }
0647 
0648             sortItems();
0649         }
0650     }
0651 }
0652 
0653 void Smb4KConfigPageBookmarks::slotUserNameChanged(const QString &text)
0654 {
0655     Q_UNUSED(text);
0656     checkValues();
0657 }
0658 
0659 void Smb4KConfigPageBookmarks::slotUserNameEdited()
0660 {
0661     if (m_treeWidget->currentItem() && m_editorWidget->isVisible()) {
0662         if (m_treeWidget->currentItem()->data(0, TypeRole).toInt() == BookmarkType) {
0663             Smb4KBookmark bookmark = m_treeWidget->currentItem()->data(0, DataRole).value<Smb4KBookmark>();
0664             bookmark.setUserName(m_userNameEdit->text());
0665 
0666             QVariant variant = QVariant::fromValue(bookmark);
0667             m_treeWidget->currentItem()->setData(0, DataRole, variant);
0668 
0669             if (m_userNameEdit->completionMode() != KCompletion::CompletionNone) {
0670                 m_userNameEdit->completionObject()->addItem(m_userNameEdit->text());
0671             }
0672         }
0673     }
0674 }
0675 
0676 void Smb4KConfigPageBookmarks::slotWorkgroupChanged(const QString &text)
0677 {
0678     Q_UNUSED(text);
0679     checkValues();
0680 }
0681 
0682 void Smb4KConfigPageBookmarks::slotWorkgroupEdited()
0683 {
0684     if (m_treeWidget->currentItem() && m_editorWidget->isVisible()) {
0685         if (m_treeWidget->currentItem()->data(0, TypeRole).toInt() == BookmarkType) {
0686             Smb4KBookmark bookmark = m_treeWidget->currentItem()->data(0, DataRole).value<Smb4KBookmark>();
0687             bookmark.setWorkgroupName(m_workgroupEdit->text());
0688 
0689             QVariant variant = QVariant::fromValue(bookmark);
0690             m_treeWidget->currentItem()->setData(0, DataRole, variant);
0691 
0692             if (m_workgroupEdit->completionMode() != KCompletion::CompletionNone) {
0693                 m_workgroupEdit->completionObject()->addItem(m_workgroupEdit->text());
0694             }
0695         }
0696     }
0697 }
0698 
0699 void Smb4KConfigPageBookmarks::slotIpAddressChanged(const QString &text)
0700 {
0701     Q_UNUSED(text);
0702     checkValues();
0703 }
0704 
0705 void Smb4KConfigPageBookmarks::slotIpAddressEdited()
0706 {
0707     if (m_treeWidget->currentItem() && m_editorWidget->isVisible()) {
0708         if (m_treeWidget->currentItem()->data(0, TypeRole).toInt() == BookmarkType) {
0709             if (QHostAddress(m_ipAddressEdit->text()).protocol() == QAbstractSocket::UnknownNetworkLayerProtocol) {
0710                 return;
0711             }
0712 
0713             Smb4KBookmark bookmark = m_treeWidget->currentItem()->data(0, DataRole).value<Smb4KBookmark>();
0714             bookmark.setHostIpAddress(m_ipAddressEdit->text());
0715 
0716             QVariant variant = QVariant::fromValue(bookmark);
0717             m_treeWidget->currentItem()->setData(0, DataRole, variant);
0718 
0719             if (m_ipAddressEdit->completionMode() != KCompletion::CompletionNone) {
0720                 m_ipAddressEdit->completionObject()->addItem(m_ipAddressEdit->text());
0721             }
0722 
0723             m_bookmarksChanged = true;
0724             Q_EMIT bookmarksModified();
0725         }
0726     }
0727 }
0728 
0729 void Smb4KConfigPageBookmarks::slotEnableButtons()
0730 {
0731     m_resetButton->setEnabled(m_bookmarksChanged);
0732     m_clearButton->setEnabled(m_treeWidget->topLevelItemCount() != 0);
0733     m_addCategoryButton->setEnabled(m_treeWidget->topLevelItemCount() != 0);
0734 }
0735 
0736 void Smb4KConfigPageBookmarks::slotIconSizeChanged(int group)
0737 {
0738     switch (group) {
0739     case KIconLoader::Small: {
0740         int iconSize = KIconLoader::global()->currentSize(KIconLoader::Small);
0741         m_treeWidget->setIconSize(QSize(iconSize, iconSize));
0742         break;
0743     }
0744     default: {
0745         break;
0746     }
0747     }
0748 }
0749 
0750 void Smb4KConfigPageBookmarks::sortItems()
0751 {
0752     QMap<QString, QTreeWidgetItem *> itemMap;
0753 
0754     while (m_treeWidget->topLevelItemCount() > 0) {
0755         QTreeWidgetItem *item = m_treeWidget->takeTopLevelItem(0);
0756 
0757         if (item->data(0, TypeRole).toInt() == CategoryType) {
0758             item->sortChildren(0, Qt::AscendingOrder);
0759             itemMap[QStringLiteral("00_") + item->data(0, DataRole).toString()] = item;
0760         } else {
0761             itemMap[QStringLiteral("01_") + item->data(0, DataRole).value<Smb4KBookmark>().displayString()] = item;
0762         }
0763     }
0764 
0765     QMapIterator<QString, QTreeWidgetItem *> it(itemMap);
0766 
0767     while (it.hasNext()) {
0768         it.next();
0769         m_treeWidget->addTopLevelItem(it.value());
0770 
0771         if (it.value()->childCount() != 0) {
0772             it.value()->setExpanded(true);
0773         }
0774     }
0775 }