┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/panels
diff options
context:
space:
mode:
Diffstat (limited to 'src/panels')
-rw-r--r--src/panels/places/placesitem.cpp7
-rw-r--r--src/panels/places/placesitem.h2
-rw-r--r--src/panels/places/placesitemmodel.cpp44
-rw-r--r--src/panels/places/placesitemmodel.h10
-rw-r--r--src/panels/places/placesitemsignalhandler.cpp12
-rw-r--r--src/panels/places/placesitemsignalhandler.h5
-rw-r--r--src/panels/places/placespanel.cpp11
-rw-r--r--src/panels/places/placespanel.h3
-rw-r--r--src/panels/terminal/terminalpanel.cpp18
-rw-r--r--src/panels/terminal/terminalpanel.h14
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;