File indexing completed on 2024-10-06 04:35:41

0001 /*
0002     The network search widget dock widget
0003 
0004     SPDX-FileCopyrightText: 2018-2023 Alexander Reinholdt <alexander.reinholdt@kdemail.net>
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 // application specific includes
0009 #include "smb4ksharesviewdockwidget.h"
0010 #include "core/smb4khardwareinterface.h"
0011 #include "core/smb4kmounter.h"
0012 #include "core/smb4ksettings.h"
0013 #include "core/smb4kshare.h"
0014 #include "core/smb4ksynchronizer.h"
0015 #include "smb4kbookmarkdialog.h"
0016 #include "smb4kcustomsettingseditor.h"
0017 #include "smb4kpassworddialog.h"
0018 #include "smb4ksharesview.h"
0019 #include "smb4ksharesviewitem.h"
0020 #include "smb4ksynchronizationdialog.h"
0021 #include "smb4ktooltip.h"
0022 
0023 #if defined(Q_OS_LINUX)
0024 #include "smb4kmountsettings_linux.h"
0025 #elif defined(Q_OS_FREEBSD) || defined(Q_OS_NETBSD)
0026 #include "smb4kmountsettings_bsd.h"
0027 #endif
0028 
0029 // Qt includes
0030 #include <QActionGroup>
0031 #include <QApplication>
0032 #include <QDropEvent>
0033 #include <QMenu>
0034 #include <QPointer>
0035 
0036 // KDE includes
0037 #include <KIO/DropJob>
0038 #include <KIconLoader>
0039 #include <KJobUiDelegate>
0040 #include <KJobWidgets>
0041 #include <KLocalizedString>
0042 #include <KMessageBox>
0043 
0044 Smb4KSharesViewDockWidget::Smb4KSharesViewDockWidget(const QString &title, QWidget *parent)
0045     : QDockWidget(title, parent)
0046 {
0047     m_sharesView = new Smb4KSharesView(this);
0048     setWidget(m_sharesView);
0049 
0050     m_actionCollection = new KActionCollection(this);
0051     m_contextMenu = new KActionMenu(this);
0052 
0053     setupActions();
0054     loadSettings();
0055 
0056     connect(m_sharesView, &Smb4KSharesView::customContextMenuRequested, this, &Smb4KSharesViewDockWidget::slotContextMenuRequested);
0057     connect(m_sharesView, &Smb4KSharesView::itemActivated, this, &Smb4KSharesViewDockWidget::slotItemActivated);
0058     connect(m_sharesView, &Smb4KSharesView::itemSelectionChanged, this, &Smb4KSharesViewDockWidget::slotItemSelectionChanged);
0059     connect(m_sharesView, &Smb4KSharesView::acceptedDropEvent, this, &Smb4KSharesViewDockWidget::slotDropEvent);
0060 
0061     connect(Smb4KMounter::self(), &Smb4KMounter::mounted, this, &Smb4KSharesViewDockWidget::slotShareMounted);
0062     connect(Smb4KMounter::self(), &Smb4KMounter::unmounted, this, &Smb4KSharesViewDockWidget::slotShareUnmounted);
0063     connect(Smb4KMounter::self(), &Smb4KMounter::updated, this, &Smb4KSharesViewDockWidget::slotShareUpdated);
0064 }
0065 
0066 Smb4KSharesViewDockWidget::~Smb4KSharesViewDockWidget()
0067 {
0068 }
0069 
0070 void Smb4KSharesViewDockWidget::loadSettings()
0071 {
0072     //
0073     // Adjust the view according to the setting chosen
0074     //
0075     switch (Smb4KSettings::sharesViewMode()) {
0076     case Smb4KSettings::EnumSharesViewMode::IconView: {
0077         m_sharesView->setViewMode(Smb4KSharesView::IconMode, Smb4KSettings::sharesViewIconSizeIconView());
0078         break;
0079     }
0080     case Smb4KSettings::EnumSharesViewMode::ListView: {
0081         m_sharesView->setViewMode(Smb4KSharesView::ListMode, Smb4KSettings::sharesViewIconSizeListView());
0082         break;
0083     }
0084     default: {
0085         break;
0086     }
0087     }
0088 
0089     //
0090     // Adjust the unmount actions if needed
0091     //
0092     if (!m_sharesView->selectedItems().isEmpty()) {
0093         QList<QListWidgetItem *> selectedItems = m_sharesView->selectedItems();
0094 
0095         if (selectedItems.size() == 1) {
0096             Smb4KSharesViewItem *item = static_cast<Smb4KSharesViewItem *>(selectedItems.first());
0097             m_actionCollection->action(QStringLiteral("unmount_action"))
0098                 ->setEnabled((!item->shareItem()->isForeign() || Smb4KMountSettings::unmountForeignShares()));
0099         } else if (selectedItems.size() > 1) {
0100             int foreign = 0;
0101 
0102             for (QListWidgetItem *selectedItem : qAsConst(selectedItems)) {
0103                 Smb4KSharesViewItem *item = static_cast<Smb4KSharesViewItem *>(selectedItem);
0104 
0105                 if (item && item->shareItem()->isForeign()) {
0106                     foreign++;
0107                 }
0108             }
0109 
0110             m_actionCollection->action(QStringLiteral("unmount_action"))
0111                 ->setEnabled(((selectedItems.size() > foreign) || Smb4KMountSettings::unmountForeignShares()));
0112         }
0113     }
0114 
0115     actionCollection()
0116         ->action(QStringLiteral("unmount_all_action"))
0117         ->setEnabled(((!onlyForeignMountedShares() || Smb4KMountSettings::unmountForeignShares()) && m_sharesView->count() != 0));
0118 }
0119 
0120 void Smb4KSharesViewDockWidget::saveSettings()
0121 {
0122     //
0123     // Not used at the moment
0124     //
0125 }
0126 
0127 KActionCollection *Smb4KSharesViewDockWidget::actionCollection()
0128 {
0129     return m_actionCollection;
0130 }
0131 
0132 void Smb4KSharesViewDockWidget::setupActions()
0133 {
0134     //
0135     // The 'View Modes' submenu and the respective actions
0136     //
0137     KActionMenu *viewModesMenu = new KActionMenu(KDE::icon(QStringLiteral("view-choose")), i18n("View Modes"), this);
0138 
0139     QActionGroup *viewModesGroup = new QActionGroup(this);
0140     viewModesGroup->setExclusive(true);
0141     connect(viewModesGroup, &QActionGroup::triggered, this, &Smb4KSharesViewDockWidget::slotViewModeChanged);
0142 
0143     QAction *iconViewAction = new QAction(KDE::icon(QStringLiteral("view-list-icons")), i18n("Icon View"), this);
0144     iconViewAction->setObjectName(QStringLiteral("icon_view_action"));
0145     iconViewAction->setCheckable(true);
0146     viewModesGroup->addAction(iconViewAction);
0147     viewModesMenu->addAction(iconViewAction);
0148 
0149     QAction *listViewAction = new QAction(KDE::icon(QStringLiteral("view-list-details")), i18n("List View"), this);
0150     listViewAction->setObjectName(QStringLiteral("list_view_action"));
0151     listViewAction->setCheckable(true);
0152     viewModesGroup->addAction(listViewAction);
0153     viewModesMenu->addAction(listViewAction);
0154 
0155     switch (Smb4KSettings::sharesViewMode()) {
0156     case Smb4KSettings::EnumSharesViewMode::IconView: {
0157         iconViewAction->setChecked(true);
0158         break;
0159     }
0160     case Smb4KSettings::EnumSharesViewMode::ListView: {
0161         listViewAction->setChecked(true);
0162         break;
0163     }
0164     default: {
0165         break;
0166     }
0167     }
0168 
0169     m_actionCollection->addAction(QStringLiteral("shares_view_modes"), viewModesMenu);
0170 
0171     //
0172     // First separator
0173     //
0174     QAction *separator1 = new QAction(this);
0175     separator1->setSeparator(true);
0176 
0177     m_actionCollection->addAction(QStringLiteral("shares_separator1"), separator1);
0178 
0179     //
0180     // The Unmount action
0181     //
0182     QAction *unmountAction = new QAction(KDE::icon(QStringLiteral("media-eject")), i18n("&Unmount"), this);
0183     unmountAction->setEnabled(false);
0184     connect(unmountAction, &QAction::triggered, this, &Smb4KSharesViewDockWidget::slotUnmountActionTriggered);
0185 
0186     m_actionCollection->addAction(QStringLiteral("unmount_action"), unmountAction);
0187     m_actionCollection->setDefaultShortcut(unmountAction, QKeySequence(i18n("Ctrl+U")));
0188 
0189     //
0190     // The Unmount All action
0191     //
0192     QAction *unmountAllAction = new QAction(KDE::icon(QStringLiteral("system-run")), i18n("U&nmount All"), this);
0193     unmountAllAction->setEnabled(false);
0194     connect(unmountAllAction, &QAction::triggered, this, &Smb4KSharesViewDockWidget::slotUnmountAllActionTriggered);
0195 
0196     m_actionCollection->addAction(QStringLiteral("unmount_all_action"), unmountAllAction);
0197     m_actionCollection->setDefaultShortcut(unmountAllAction, QKeySequence(i18n("Ctrl+N")));
0198 
0199     //
0200     // Second separator
0201     //
0202     QAction *separator2 = new QAction(this);
0203     separator2->setSeparator(true);
0204 
0205     m_actionCollection->addAction(QStringLiteral("shares_separator2"), separator2);
0206 
0207     //
0208     // The Add Bookmark action
0209     //
0210     QAction *bookmarkAction = new QAction(KDE::icon(QStringLiteral("bookmark-new")), i18n("Add &Bookmark"), this);
0211     bookmarkAction->setEnabled(false);
0212     connect(bookmarkAction, &QAction::triggered, this, &Smb4KSharesViewDockWidget::slotBookmarkActionTriggered);
0213 
0214     m_actionCollection->addAction(QStringLiteral("bookmark_action"), bookmarkAction);
0215     m_actionCollection->setDefaultShortcut(bookmarkAction, QKeySequence(i18n("Ctrl+B")));
0216 
0217     //
0218     // Add custom options action
0219     //
0220     QAction *customAction = new QAction(KDE::icon(QStringLiteral("settings-configure")), i18n("Add &Custom Settings"), this);
0221     customAction->setEnabled(false);
0222     connect(customAction, &QAction::triggered, this, &Smb4KSharesViewDockWidget::slotAddCustomSettingsTriggered);
0223 
0224     m_actionCollection->addAction(QStringLiteral("custom_action"), customAction);
0225     m_actionCollection->setDefaultShortcut(customAction, QKeySequence(i18n("Ctrl+C")));
0226 
0227     //
0228     // The Synchronize action
0229     //
0230     QAction *synchronizeAction = new QAction(KDE::icon(QStringLiteral("folder-sync")), i18n("S&ynchronize"), this);
0231     synchronizeAction->setEnabled(false);
0232     connect(synchronizeAction, &QAction::triggered, this, &Smb4KSharesViewDockWidget::slotSynchronizeActionTriggered);
0233 
0234     m_actionCollection->addAction(QStringLiteral("synchronize_action"), synchronizeAction);
0235     m_actionCollection->setDefaultShortcut(synchronizeAction, QKeySequence(i18n("Ctrl+Y")));
0236 
0237     //
0238     // Third separator
0239     //
0240     QAction *separator3 = new QAction(this);
0241     separator3->setSeparator(true);
0242 
0243     m_actionCollection->addAction(QStringLiteral("shares_separator3"), separator3);
0244 
0245     //
0246     // The Open with Konsole action
0247     //
0248     QAction *konsoleAction = new QAction(KDE::icon(QStringLiteral("utilities-terminal")), i18n("Open with Konso&le"), this);
0249     konsoleAction->setEnabled(false);
0250     connect(konsoleAction, &QAction::triggered, this, &Smb4KSharesViewDockWidget::slotKonsoleActionTriggered);
0251 
0252     m_actionCollection->addAction(QStringLiteral("konsole_action"), konsoleAction);
0253     m_actionCollection->setDefaultShortcut(konsoleAction, QKeySequence(i18n("Ctrl+L")));
0254 
0255     QAction *filemanagerAction = new QAction(KDE::icon(QStringLiteral("system-file-manager")), i18n("Open with F&ile Manager"), this);
0256     filemanagerAction->setEnabled(false);
0257     connect(filemanagerAction, &QAction::triggered, this, &Smb4KSharesViewDockWidget::slotFileManagerActionTriggered);
0258 
0259     m_actionCollection->addAction(QStringLiteral("filemanager_action"), filemanagerAction);
0260     m_actionCollection->setDefaultShortcut(filemanagerAction, QKeySequence(i18n("Ctrl+I")));
0261 
0262     //
0263     // Plug the actions into the context menu
0264     //
0265     QList<QAction *> actionsList = m_actionCollection->actions();
0266 
0267     for (QAction *action : qAsConst(actionsList)) {
0268         m_contextMenu->addAction(action);
0269     }
0270 }
0271 
0272 void Smb4KSharesViewDockWidget::slotContextMenuRequested(const QPoint &pos)
0273 {
0274     m_contextMenu->menu()->popup(m_sharesView->viewport()->mapToGlobal(pos));
0275 }
0276 
0277 void Smb4KSharesViewDockWidget::slotItemActivated(QListWidgetItem * /*item*/)
0278 {
0279     //
0280     // Do not execute the item when keyboard modifiers were pressed
0281     // or the mouse button is not the left one.
0282     //
0283     if (QApplication::keyboardModifiers() == Qt::NoModifier) {
0284         slotFileManagerActionTriggered(false);
0285     }
0286 }
0287 
0288 void Smb4KSharesViewDockWidget::slotItemSelectionChanged()
0289 {
0290     QList<QListWidgetItem *> selectedItems = m_sharesView->selectedItems();
0291 
0292     if (selectedItems.size() == 1) {
0293         Smb4KSharesViewItem *item = static_cast<Smb4KSharesViewItem *>(selectedItems.first());
0294         bool syncRunning = Smb4KSynchronizer::self()->isRunning(QUrl::fromLocalFile(item->shareItem()->path()));
0295 
0296         m_actionCollection->action(QStringLiteral("unmount_action"))
0297             ->setEnabled((!item->shareItem()->isForeign() || Smb4KMountSettings::unmountForeignShares()));
0298         m_actionCollection->action(QStringLiteral("bookmark_action"))->setEnabled(true);
0299         m_actionCollection->action(QStringLiteral("custom_action"))->setEnabled(true);
0300 
0301         if (!item->shareItem()->isInaccessible()) {
0302             m_actionCollection->action(QStringLiteral("synchronize_action"))
0303                 ->setEnabled(!QStandardPaths::findExecutable(QStringLiteral("rsync")).isEmpty() && !syncRunning);
0304             m_actionCollection->action(QStringLiteral("konsole_action"))->setEnabled(!QStandardPaths::findExecutable(QStringLiteral("konsole")).isEmpty());
0305             m_actionCollection->action(QStringLiteral("filemanager_action"))->setEnabled(true);
0306         } else {
0307             m_actionCollection->action(QStringLiteral("synchronize_action"))->setEnabled(false);
0308             m_actionCollection->action(QStringLiteral("konsole_action"))->setEnabled(false);
0309             m_actionCollection->action(QStringLiteral("filemanager_action"))->setEnabled(false);
0310         }
0311     } else if (selectedItems.size() > 1) {
0312         int syncsRunning = 0;
0313         int inaccessible = 0;
0314         int foreign = 0;
0315 
0316         for (QListWidgetItem *selectedItem : qAsConst(selectedItems)) {
0317             Smb4KSharesViewItem *item = static_cast<Smb4KSharesViewItem *>(selectedItem);
0318 
0319             if (item) {
0320                 // Is the share synchronized at the moment?
0321                 if (Smb4KSynchronizer::self()->isRunning(QUrl::fromLocalFile(item->shareItem()->path()))) {
0322                     syncsRunning += 1;
0323                 }
0324 
0325                 // Is the share inaccessible at the moment?
0326                 if (item->shareItem()->isInaccessible()) {
0327                     inaccessible += 1;
0328                 }
0329 
0330                 // Was the share being mounted by another user?
0331                 if (item->shareItem()->isForeign()) {
0332                     foreign += 1;
0333                 }
0334             }
0335         }
0336 
0337         m_actionCollection->action(QStringLiteral("unmount_action"))
0338             ->setEnabled(((selectedItems.size() > foreign) || Smb4KMountSettings::unmountForeignShares()));
0339         m_actionCollection->action(QStringLiteral("bookmark_action"))->setEnabled(true);
0340         m_actionCollection->action(QStringLiteral("custom_action"))->setEnabled(true);
0341 
0342         if (selectedItems.size() > inaccessible) {
0343             m_actionCollection->action(QStringLiteral("synchronize_action"))
0344                 ->setEnabled(!QStandardPaths::findExecutable(QStringLiteral("rsync")).isEmpty() && (selectedItems.size() > syncsRunning));
0345             m_actionCollection->action(QStringLiteral("konsole_action"))->setEnabled(!QStandardPaths::findExecutable(QStringLiteral("konsole")).isEmpty());
0346             m_actionCollection->action(QStringLiteral("filemanager_action"))->setEnabled(true);
0347         } else {
0348             m_actionCollection->action(QStringLiteral("synchronize_action"))->setEnabled(false);
0349             m_actionCollection->action(QStringLiteral("konsole_action"))->setEnabled(false);
0350             m_actionCollection->action(QStringLiteral("filemanager_action"))->setEnabled(false);
0351         }
0352     } else {
0353         m_actionCollection->action(QStringLiteral("unmount_action"))->setEnabled(false);
0354         m_actionCollection->action(QStringLiteral("bookmark_action"))->setEnabled(false);
0355         m_actionCollection->action(QStringLiteral("custom_action"))->setEnabled(false);
0356         m_actionCollection->action(QStringLiteral("synchronize_action"))->setEnabled(false);
0357         m_actionCollection->action(QStringLiteral("konsole_action"))->setEnabled(false);
0358         m_actionCollection->action(QStringLiteral("filemanager_action"))->setEnabled(false);
0359     }
0360 }
0361 
0362 void Smb4KSharesViewDockWidget::slotDropEvent(Smb4KSharesViewItem *item, QDropEvent *e)
0363 {
0364     if (item && e) {
0365         if (e->mimeData()->hasUrls()) {
0366             if (Smb4KHardwareInterface::self()->isOnline()) {
0367                 QUrl dest = QUrl::fromLocalFile(item->shareItem()->path());
0368                 KIO::DropJob *job = KIO::drop(e, dest, KIO::DefaultFlags);
0369                 KJobWidgets::setWindow(job, m_sharesView->viewport());
0370                 job->uiDelegate()->setAutoErrorHandlingEnabled(true);
0371                 job->uiDelegate()->setAutoWarningHandlingEnabled(true);
0372             } else {
0373                 KMessageBox::error(
0374                     m_sharesView,
0375                     i18n("<qt>There is no active connection to the share <b>%1</b>! You cannot drop any files here.</qt>", item->shareItem()->displayString()));
0376             }
0377         }
0378     }
0379 }
0380 
0381 void Smb4KSharesViewDockWidget::slotViewModeChanged(QAction *action)
0382 {
0383     //
0384     // Set the new view mode
0385     //
0386     if (action->objectName() == QStringLiteral("icon_view_action")) {
0387         Smb4KSettings::setSharesViewMode(Smb4KSettings::EnumSharesViewMode::IconView);
0388     } else if (action->objectName() == QStringLiteral("list_view_action")) {
0389         Smb4KSettings::setSharesViewMode(Smb4KSettings::EnumSharesViewMode::ListView);
0390     }
0391 
0392     //
0393     // Save settings
0394     //
0395     Smb4KSettings::self()->save();
0396 
0397     //
0398     // Load the settings
0399     //
0400     loadSettings();
0401 }
0402 
0403 void Smb4KSharesViewDockWidget::slotShareMounted(const SharePtr &share)
0404 {
0405     //
0406     // Add the share to the shares view
0407     //
0408     if (share) {
0409         // Add the item
0410         (void)new Smb4KSharesViewItem(m_sharesView, share);
0411 
0412         // Sort the view
0413         m_sharesView->sortItems(Qt::AscendingOrder);
0414 
0415         // Enable/disable the 'Unmount All' action
0416         actionCollection()
0417             ->action(QStringLiteral("unmount_all_action"))
0418             ->setEnabled(((!onlyForeignMountedShares() || Smb4KMountSettings::unmountForeignShares()) && m_sharesView->count() != 0));
0419     }
0420 }
0421 
0422 void Smb4KSharesViewDockWidget::slotShareUnmounted(const SharePtr &share)
0423 {
0424     //
0425     // Remove the share from the shares view
0426     //
0427     if (share) {
0428         // Get the item and delete it. Take care of the current item, if necessary.
0429         for (int i = 0; i < m_sharesView->count(); ++i) {
0430             Smb4KSharesViewItem *item = static_cast<Smb4KSharesViewItem *>(m_sharesView->item(i));
0431 
0432             if (item && (item->shareItem()->path() == share->path() || item->shareItem()->canonicalPath() == share->canonicalPath())) {
0433                 if (item == m_sharesView->currentItem()) {
0434                     m_sharesView->setCurrentItem(nullptr);
0435                 }
0436 
0437                 delete m_sharesView->takeItem(i);
0438                 break;
0439             } else {
0440                 continue;
0441             }
0442         }
0443 
0444         // Enable/disable the 'Unmount All' action
0445         actionCollection()
0446             ->action(QStringLiteral("unmount_all_action"))
0447             ->setEnabled(((!onlyForeignMountedShares() || Smb4KMountSettings::unmountForeignShares()) && m_sharesView->count() != 0));
0448     }
0449 }
0450 
0451 void Smb4KSharesViewDockWidget::slotShareUpdated(const SharePtr &share)
0452 {
0453     if (share) {
0454         m_sharesView->toolTip()->update();
0455 
0456         for (int i = 0; i < m_sharesView->count(); ++i) {
0457             Smb4KSharesViewItem *item = static_cast<Smb4KSharesViewItem *>(m_sharesView->item(i));
0458 
0459             if (item && (item->shareItem()->path() == share->path() || item->shareItem()->canonicalPath() == share->canonicalPath())) {
0460                 item->update();
0461                 break;
0462             } else {
0463                 continue;
0464             }
0465         }
0466     }
0467 }
0468 
0469 void Smb4KSharesViewDockWidget::slotUnmountActionTriggered(bool checked)
0470 {
0471     Q_UNUSED(checked);
0472 
0473     QList<QListWidgetItem *> selectedItems = m_sharesView->selectedItems();
0474     QList<SharePtr> shares;
0475 
0476     for (QListWidgetItem *selectedItem : qAsConst(selectedItems)) {
0477         Smb4KSharesViewItem *item = static_cast<Smb4KSharesViewItem *>(selectedItem);
0478 
0479         if (item) {
0480             shares << item->shareItem();
0481         }
0482     }
0483 
0484     Smb4KMounter::self()->unmountShares(shares, false);
0485 }
0486 
0487 void Smb4KSharesViewDockWidget::slotUnmountAllActionTriggered(bool checked)
0488 {
0489     Q_UNUSED(checked);
0490 
0491     Smb4KMounter::self()->unmountAllShares(false);
0492 }
0493 
0494 void Smb4KSharesViewDockWidget::slotBookmarkActionTriggered(bool checked)
0495 {
0496     Q_UNUSED(checked);
0497 
0498     QList<QListWidgetItem *> selectedItems = m_sharesView->selectedItems();
0499     QList<SharePtr> shares;
0500 
0501     for (QListWidgetItem *selectedItem : qAsConst(selectedItems)) {
0502         Smb4KSharesViewItem *item = static_cast<Smb4KSharesViewItem *>(selectedItem);
0503         shares << item->shareItem();
0504     }
0505 
0506     QPointer<Smb4KBookmarkDialog> bookmarkDialog = new Smb4KBookmarkDialog(this);
0507 
0508     if (bookmarkDialog->setShares(shares)) {
0509         bookmarkDialog->open();
0510     } else {
0511         delete bookmarkDialog;
0512     }
0513 }
0514 
0515 void Smb4KSharesViewDockWidget::slotAddCustomSettingsTriggered(bool checked)
0516 {
0517     Q_UNUSED(checked);
0518 
0519     QList<QListWidgetItem *> selectedItems = m_sharesView->selectedItems();
0520 
0521     for (QListWidgetItem *selectedItem : qAsConst(selectedItems)) {
0522         Smb4KSharesViewItem *item = static_cast<Smb4KSharesViewItem *>(selectedItem);
0523 
0524         QPointer<Smb4KCustomSettingsEditor> customSettingsEditor = new Smb4KCustomSettingsEditor(this);
0525         if (customSettingsEditor->setNetworkItem(item->shareItem())) {
0526             customSettingsEditor->show();
0527         } else {
0528             delete customSettingsEditor;
0529         }
0530     }
0531 }
0532 
0533 void Smb4KSharesViewDockWidget::slotSynchronizeActionTriggered(bool checked)
0534 {
0535     Q_UNUSED(checked);
0536 
0537     QList<QListWidgetItem *> selectedItems = m_sharesView->selectedItems();
0538 
0539     for (QListWidgetItem *selectedItem : qAsConst(selectedItems)) {
0540         Smb4KSharesViewItem *item = static_cast<Smb4KSharesViewItem *>(selectedItem);
0541 
0542         if (item && !item->shareItem()->isInaccessible() && !Smb4KSynchronizer::self()->isRunning(QUrl::fromLocalFile(item->shareItem()->path()))) {
0543             QPointer<Smb4KSynchronizationDialog> synchronizationDialog = new Smb4KSynchronizationDialog(this);
0544             if (synchronizationDialog->setShare(item->shareItem())) {
0545                 synchronizationDialog->show();
0546             } else {
0547                 delete synchronizationDialog;
0548             }
0549         }
0550     }
0551 }
0552 
0553 void Smb4KSharesViewDockWidget::slotKonsoleActionTriggered(bool checked)
0554 {
0555     Q_UNUSED(checked);
0556 
0557     QList<QListWidgetItem *> selectedItems = m_sharesView->selectedItems();
0558 
0559     for (QListWidgetItem *selectedItem : qAsConst(selectedItems)) {
0560         Smb4KSharesViewItem *item = static_cast<Smb4KSharesViewItem *>(selectedItem);
0561 
0562         if (item && !item->shareItem()->isInaccessible()) {
0563             openShare(item->shareItem(), Konsole);
0564         }
0565     }
0566 }
0567 
0568 void Smb4KSharesViewDockWidget::slotFileManagerActionTriggered(bool checked)
0569 {
0570     Q_UNUSED(checked);
0571 
0572     QList<QListWidgetItem *> selectedItems = m_sharesView->selectedItems();
0573 
0574     for (QListWidgetItem *selectedItem : qAsConst(selectedItems)) {
0575         Smb4KSharesViewItem *item = static_cast<Smb4KSharesViewItem *>(selectedItem);
0576 
0577         if (item && !item->shareItem()->isInaccessible()) {
0578             openShare(item->shareItem(), FileManager);
0579         }
0580     }
0581 }