diff options
Diffstat (limited to 'src/panels')
| -rw-r--r-- | src/panels/places/placesitem.cpp | 7 | ||||
| -rw-r--r-- | src/panels/places/placesitem.h | 2 | ||||
| -rw-r--r-- | src/panels/places/placesitemmodel.cpp | 44 | ||||
| -rw-r--r-- | src/panels/places/placesitemmodel.h | 10 | ||||
| -rw-r--r-- | src/panels/places/placesitemsignalhandler.cpp | 12 | ||||
| -rw-r--r-- | src/panels/places/placesitemsignalhandler.h | 5 | ||||
| -rw-r--r-- | src/panels/places/placespanel.cpp | 11 | ||||
| -rw-r--r-- | src/panels/places/placespanel.h | 3 | ||||
| -rw-r--r-- | src/panels/terminal/terminalpanel.cpp | 18 | ||||
| -rw-r--r-- | src/panels/terminal/terminalpanel.h | 14 |
10 files changed, 110 insertions, 16 deletions
diff --git a/src/panels/places/placesitem.cpp b/src/panels/places/placesitem.cpp index 4ba1217f0..5b8e5dbef 100644 --- a/src/panels/places/placesitem.cpp +++ b/src/panels/places/placesitem.cpp @@ -272,6 +272,8 @@ void PlacesItem::initializeDevice(const QString& udi) setUrl(QUrl::fromLocalFile(m_access->filePath())); QObject::connect(m_access.data(), &Solid::StorageAccess::accessibilityChanged, m_signalHandler.data(), &PlacesItemSignalHandler::onAccessibilityChanged); + QObject::connect(m_access.data(), &Solid::StorageAccess::teardownRequested, + m_signalHandler.data(), &PlacesItemSignalHandler::onTearDownRequested); } else if (m_disc && (m_disc->availableContent() & Solid::OpticalDisc::Audio) != 0) { Solid::Block *block = m_device.as<Solid::Block>(); if (block) { @@ -335,3 +337,8 @@ QString PlacesItem::generateNewId() return QString::number(QDateTime::currentDateTimeUtc().toTime_t()) + '/' + QString::number(count++) + " (V2)"; } + +PlacesItemSignalHandler *PlacesItem::signalHandler() const +{ + return m_signalHandler.data(); +} diff --git a/src/panels/places/placesitem.h b/src/panels/places/placesitem.h index 4ae4fd677..d1b5b5d96 100644 --- a/src/panels/places/placesitem.h +++ b/src/panels/places/placesitem.h @@ -79,6 +79,8 @@ public: static KBookmark createDeviceBookmark(KBookmarkManager* manager, const QString& udi); + PlacesItemSignalHandler* signalHandler() const; + protected: virtual void onDataValueChanged(const QByteArray& role, const QVariant& current, diff --git a/src/panels/places/placesitemmodel.cpp b/src/panels/places/placesitemmodel.cpp index 04dac81b7..abd6bc925 100644 --- a/src/panels/places/placesitemmodel.cpp +++ b/src/panels/places/placesitemmodel.cpp @@ -22,6 +22,7 @@ ***************************************************************************/ #include "placesitemmodel.h" +#include "placesitemsignalhandler.h" #include "dolphin_generalsettings.h" @@ -77,6 +78,7 @@ PlacesItemModel::PlacesItemModel(QObject* parent) : m_systemBookmarksIndexes(), m_bookmarkedItems(), m_hiddenItemToRemove(-1), + m_deviceToTearDown(0), m_updateBookmarksTimer(0), m_storageSetupInProgress() { @@ -306,7 +308,7 @@ void PlacesItemModel::requestEject(int index) Solid::OpticalDrive* drive = item->device().parent().as<Solid::OpticalDrive>(); if (drive) { connect(drive, &Solid::OpticalDrive::ejectDone, - this, &PlacesItemModel::slotStorageTeardownDone); + this, &PlacesItemModel::slotStorageTearDownDone); drive->eject(); } else { const QString label = item->text(); @@ -316,15 +318,19 @@ void PlacesItemModel::requestEject(int index) } } -void PlacesItemModel::requestTeardown(int index) +void PlacesItemModel::requestTearDown(int index) { const PlacesItem* item = placesItem(index); if (item) { - Solid::StorageAccess* access = item->device().as<Solid::StorageAccess>(); - if (access) { - connect(access, &Solid::StorageAccess::teardownDone, - this, &PlacesItemModel::slotStorageTeardownDone); - access->teardown(); + Solid::StorageAccess *tmp = item->device().as<Solid::StorageAccess>(); + if (tmp) { + m_deviceToTearDown = tmp; + // disconnect the Solid::StorageAccess::teardownRequested + // to prevent emitting PlacesItemModel::storageTearDownExternallyRequested + // after we have emitted PlacesItemModel::storageTearDownRequested + disconnect(tmp, &Solid::StorageAccess::teardownRequested, + item->signalHandler(), &PlacesItemSignalHandler::onTearDownRequested); + emit storageTearDownRequested(tmp->filePath()); } } } @@ -550,7 +556,11 @@ void PlacesItemModel::slotDeviceAdded(const QString& udi) m_availableDevices << udi; const KBookmark bookmark = PlacesItem::createDeviceBookmark(m_bookmarkManager, udi); - appendItem(new PlacesItem(bookmark)); + + PlacesItem *item = new PlacesItem(bookmark); + appendItem(item); + connect(item->signalHandler(), &PlacesItemSignalHandler::tearDownExternallyRequested, + this, &PlacesItemModel::storageTearDownExternallyRequested); } void PlacesItemModel::slotDeviceRemoved(const QString& udi) @@ -576,11 +586,13 @@ void PlacesItemModel::slotDeviceRemoved(const QString& udi) } } -void PlacesItemModel::slotStorageTeardownDone(Solid::ErrorType error, const QVariant& errorData) +void PlacesItemModel::slotStorageTearDownDone(Solid::ErrorType error, const QVariant& errorData) { if (error && errorData.isValid()) { emit errorMessage(errorData.toString()); } + m_deviceToTearDown->disconnect(); + m_deviceToTearDown = nullptr; } void PlacesItemModel::slotStorageSetupDone(Solid::ErrorType error, @@ -786,7 +798,10 @@ void PlacesItemModel::loadBookmarks() devicesItems.reserve(devicesItems.count() + devices.count()); foreach (const QString& udi, devices) { const KBookmark bookmark = PlacesItem::createDeviceBookmark(m_bookmarkManager, udi); - devicesItems.append(new PlacesItem(bookmark)); + PlacesItem *item = new PlacesItem(bookmark); + devicesItems.append(item); + connect(item->signalHandler(), &PlacesItemSignalHandler::tearDownExternallyRequested, + this, &PlacesItemModel::storageTearDownExternallyRequested); } QList<PlacesItem*> items; @@ -940,6 +955,15 @@ void PlacesItemModel::clear() { KStandardItemModel::clear(); } +void PlacesItemModel::proceedWithTearDown() +{ + Q_ASSERT(m_deviceToTearDown); + + connect(m_deviceToTearDown, &Solid::StorageAccess::teardownDone, + this, &PlacesItemModel::slotStorageTearDownDone); + m_deviceToTearDown->teardown(); +} + void PlacesItemModel::initializeAvailableDevices() { QString predicate(QStringLiteral("[[[[ StorageVolume.ignored == false AND [ StorageVolume.usage == 'FileSystem' OR StorageVolume.usage == 'Encrypted' ]]" diff --git a/src/panels/places/placesitemmodel.h b/src/panels/places/placesitemmodel.h index aa8bb16fe..dcc9759e6 100644 --- a/src/panels/places/placesitemmodel.h +++ b/src/panels/places/placesitemmodel.h @@ -102,7 +102,7 @@ public: QAction* teardownAction(int index) const; void requestEject(int index); - void requestTeardown(int index); + void requestTearDown(int index); bool storageSetupNeeded(int index) const; void requestStorageSetup(int index); @@ -123,6 +123,8 @@ public: virtual void clear() Q_DECL_OVERRIDE; + void proceedWithTearDown(); + /** * Saves the bookmarks and indicates to other applications that the * state of the bookmarks has been changed. Is only called by the @@ -133,6 +135,8 @@ public: signals: void errorMessage(const QString& message); void storageSetupDone(int index, bool success); + void storageTearDownRequested(const QString& mountPath); + void storageTearDownExternallyRequested(const QString& mountPath); protected: virtual void onItemInserted(int index) Q_DECL_OVERRIDE; @@ -142,7 +146,7 @@ protected: private slots: void slotDeviceAdded(const QString& udi); void slotDeviceRemoved(const QString& udi); - void slotStorageTeardownDone(Solid::ErrorType error, const QVariant& errorData); + void slotStorageTearDownDone(Solid::ErrorType error, const QVariant& errorData); void slotStorageSetupDone(Solid::ErrorType error, const QVariant& errorData, const QString& udi); void hideItem(); @@ -281,6 +285,8 @@ private: // removing an item is not allowed. int m_hiddenItemToRemove; + Solid::StorageAccess *m_deviceToTearDown; + QTimer* m_updateBookmarksTimer; QHash<QObject*, int> m_storageSetupInProgress; diff --git a/src/panels/places/placesitemsignalhandler.cpp b/src/panels/places/placesitemsignalhandler.cpp index c9bc0db3f..bd3fc9f72 100644 --- a/src/panels/places/placesitemsignalhandler.cpp +++ b/src/panels/places/placesitemsignalhandler.cpp @@ -47,3 +47,15 @@ void PlacesItemSignalHandler::onTrashDirListerCompleted() } } +void PlacesItemSignalHandler::onTearDownRequested(const QString& udi) +{ + Q_UNUSED(udi) + if (m_item) { + Solid::StorageAccess *tmp = m_item->device().as<Solid::StorageAccess>(); + if (tmp) { + QString mountPath = tmp->filePath(); + emit tearDownExternallyRequested(mountPath); + } + } +} + diff --git a/src/panels/places/placesitemsignalhandler.h b/src/panels/places/placesitemsignalhandler.h index af66568ad..f65b57fe1 100644 --- a/src/panels/places/placesitemsignalhandler.h +++ b/src/panels/places/placesitemsignalhandler.h @@ -61,6 +61,11 @@ public slots: */ void onTrashDirListerCompleted(); + void onTearDownRequested(const QString& udi); + +signals: + void tearDownExternallyRequested(const QString& udi); + private: PlacesItem* m_item; }; diff --git a/src/panels/places/placespanel.cpp b/src/panels/places/placespanel.cpp index 19a17be08..0ce6d69a5 100644 --- a/src/panels/places/placespanel.cpp +++ b/src/panels/places/placespanel.cpp @@ -72,6 +72,11 @@ PlacesPanel::~PlacesPanel() { } +void PlacesPanel::proceedWithTearDown() +{ + m_model->proceedWithTearDown(); +} + bool PlacesPanel::urlChanged() { if (!url().isValid() || url().scheme().contains(QStringLiteral("search"))) { @@ -110,6 +115,10 @@ void PlacesPanel::showEvent(QShowEvent* event) m_model->setGroupedSorting(true); connect(m_model, &PlacesItemModel::errorMessage, this, &PlacesPanel::errorMessage); + connect(m_model, &PlacesItemModel::storageTearDownRequested, + this, &PlacesPanel::storageTearDownRequested); + connect(m_model, &PlacesItemModel::storageTearDownExternallyRequested, + this, &PlacesPanel::storageTearDownExternallyRequested); m_view = new PlacesView(); m_view->setWidgetCreator(new KItemListWidgetCreator<PlacesItemListWidget>()); @@ -241,7 +250,7 @@ void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos) // emit the slotItemMiddleClicked signal, because of Qt::MiddleButton. triggerItem(index, Qt::MiddleButton); } else if (action == teardownAction) { - m_model->requestTeardown(index); + m_model->requestTearDown(index); } else if (action == ejectAction) { m_model->requestEject(index); } diff --git a/src/panels/places/placespanel.h b/src/panels/places/placespanel.h index 0c8b5f7f2..13a38df2d 100644 --- a/src/panels/places/placespanel.h +++ b/src/panels/places/placespanel.h @@ -41,11 +41,14 @@ class PlacesPanel : public Panel public: PlacesPanel(QWidget* parent); virtual ~PlacesPanel(); + void proceedWithTearDown(); signals: void placeActivated(const QUrl& url); void placeMiddleClicked(const QUrl& url); void errorMessage(const QString& error); + void storageTearDownRequested(const QString& mountPath); + void storageTearDownExternallyRequested(const QString& mountPath); protected: virtual bool urlChanged() Q_DECL_OVERRIDE; diff --git a/src/panels/terminal/terminalpanel.cpp b/src/panels/terminal/terminalpanel.cpp index e952f23a0..b7d3605aa 100644 --- a/src/panels/terminal/terminalpanel.cpp +++ b/src/panels/terminal/terminalpanel.cpp @@ -54,6 +54,19 @@ TerminalPanel::~TerminalPanel() { } +void TerminalPanel::goHome() +{ + sendCdToTerminal(QDir::homePath(), HistoryPolicy::SkipHistory); +} + +QString TerminalPanel::currentWorkingDirectory() +{ + if (m_terminal) { + return m_terminal->currentWorkingDirectory(); + } + return QString(); +} + void TerminalPanel::terminalExited() { m_terminal = 0; @@ -144,7 +157,7 @@ void TerminalPanel::changeDir(const QUrl& url) } } -void TerminalPanel::sendCdToTerminal(const QString& dir) +void TerminalPanel::sendCdToTerminal(const QString& dir, HistoryPolicy addToHistory) { if (dir == m_konsolePartCurrentDirectory) { m_clearTerminal = false; @@ -168,7 +181,8 @@ void TerminalPanel::sendCdToTerminal(const QString& dir) // the directory change, because this directory change is not caused by a "cd" command that the // user entered in the panel. Therefore, we have to remember 'dir'. Note that it could also be // a symbolic link -> remember the 'canonical' path. - m_sendCdToTerminalHistory.enqueue(QDir(dir).canonicalPath()); + if (addToHistory == HistoryPolicy::AddToHistory) + m_sendCdToTerminalHistory.enqueue(QDir(dir).canonicalPath()); if (m_clearTerminal) { m_terminal->sendInput(QStringLiteral(" clear\n")); diff --git a/src/panels/terminal/terminalpanel.h b/src/panels/terminal/terminalpanel.h index 75e198e1a..3de3b6d30 100644 --- a/src/panels/terminal/terminalpanel.h +++ b/src/panels/terminal/terminalpanel.h @@ -48,6 +48,13 @@ public: TerminalPanel(QWidget* parent = 0); virtual ~TerminalPanel(); + /** + * @brief This function is used to set the terminal panels's cwd to + * home when an unmounting request is receieved. + */ + void goHome(); + QString currentWorkingDirectory(); + public slots: void terminalExited(); void dockVisibilityChanged(); @@ -70,8 +77,13 @@ private slots: void slotKonsolePartCurrentDirectoryChanged(const QString& dir); private: + enum class HistoryPolicy { + AddToHistory, + SkipHistory + }; + void changeDir(const QUrl& url); - void sendCdToTerminal(const QString& path); + void sendCdToTerminal(const QString& path, HistoryPolicy addToHistory = HistoryPolicy::AddToHistory); private: bool m_clearTerminal; |
