mirror of
https://invent.kde.org/system/dolphin
synced 2024-09-12 12:54:29 +00:00
Don't block unmounting when terminal panel's cwd is the mountpoint
When unmounting a removable media Dolphin checks if there are some files open on the device before performing the unmount. If the terminal window in dolphin is open and the to be unmounted path is open, the unmount process will be blocked. This patch sets the terminal window current path to the home directory upon unmount request if the terminal directory is set to the mount path. The unmount request could came from two sources: The user could hit right click on the media in the dolphin's places panel and hit unmount. The user could request an unmount from the indicator applet This patch was originally written by Arjun AK for the kdelibs4 version of Dolphin: https://git.reviewboard.kde.org/r/121613/ BUG: 158264 FIXED-IN: 17.11.80 Differential Revision: https://phabricator.kde.org/D7847
This commit is contained in:
parent
1ad3b7775e
commit
bd47eb2e6d
|
@ -99,7 +99,10 @@ DolphinMainWindow::DolphinMainWindow() :
|
||||||
m_settingsDialog(),
|
m_settingsDialog(),
|
||||||
m_controlButton(0),
|
m_controlButton(0),
|
||||||
m_updateToolBarTimer(0),
|
m_updateToolBarTimer(0),
|
||||||
m_lastHandleUrlStatJob(0)
|
m_lastHandleUrlStatJob(0),
|
||||||
|
m_terminalPanel(0),
|
||||||
|
m_placesPanel(0),
|
||||||
|
m_tearDownFromPlacesRequested(false)
|
||||||
{
|
{
|
||||||
Q_INIT_RESOURCE(dolphin);
|
Q_INIT_RESOURCE(dolphin);
|
||||||
|
|
||||||
|
@ -247,6 +250,11 @@ void DolphinMainWindow::changeUrl(const QUrl &url)
|
||||||
|
|
||||||
void DolphinMainWindow::slotTerminalDirectoryChanged(const QUrl& url)
|
void DolphinMainWindow::slotTerminalDirectoryChanged(const QUrl& url)
|
||||||
{
|
{
|
||||||
|
if (m_tearDownFromPlacesRequested && url == QUrl::fromLocalFile(QDir::homePath())) {
|
||||||
|
m_placesPanel->proceedWithTearDown();
|
||||||
|
m_tearDownFromPlacesRequested = false;
|
||||||
|
}
|
||||||
|
|
||||||
m_activeViewContainer->setAutoGrabFocus(false);
|
m_activeViewContainer->setAutoGrabFocus(false);
|
||||||
changeUrl(url);
|
changeUrl(url);
|
||||||
m_activeViewContainer->setAutoGrabFocus(true);
|
m_activeViewContainer->setAutoGrabFocus(true);
|
||||||
|
@ -994,6 +1002,25 @@ void DolphinMainWindow::setUrlAsCaption(const QUrl& url)
|
||||||
setWindowTitle(schemePrefix + fileName);
|
setWindowTitle(schemePrefix + fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DolphinMainWindow::slotStorageTearDownFromPlacesRequested(const QString& mountPath)
|
||||||
|
{
|
||||||
|
if (m_terminalPanel->currentWorkingDirectory().startsWith(mountPath)) {
|
||||||
|
m_tearDownFromPlacesRequested = true;
|
||||||
|
m_terminalPanel->goHome();
|
||||||
|
// m_placesPanel->proceedWithTearDown() will be called in slotTerminalDirectoryChanged
|
||||||
|
} else {
|
||||||
|
m_placesPanel->proceedWithTearDown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DolphinMainWindow::slotStorageTearDownExternallyRequested(const QString& mountPath)
|
||||||
|
{
|
||||||
|
if (m_terminalPanel->currentWorkingDirectory().startsWith(mountPath)) {
|
||||||
|
m_tearDownFromPlacesRequested = false;
|
||||||
|
m_terminalPanel->goHome();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void DolphinMainWindow::setupActions()
|
void DolphinMainWindow::setupActions()
|
||||||
{
|
{
|
||||||
// setup 'File' menu
|
// setup 'File' menu
|
||||||
|
@ -1246,21 +1273,21 @@ void DolphinMainWindow::setupDockWidgets()
|
||||||
terminalDock->setLocked(lock);
|
terminalDock->setLocked(lock);
|
||||||
terminalDock->setObjectName(QStringLiteral("terminalDock"));
|
terminalDock->setObjectName(QStringLiteral("terminalDock"));
|
||||||
terminalDock->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
|
terminalDock->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
|
||||||
TerminalPanel* terminalPanel = new TerminalPanel(terminalDock);
|
m_terminalPanel = new TerminalPanel(terminalDock);
|
||||||
terminalPanel->setCustomContextMenuActions({lockLayoutAction});
|
m_terminalPanel->setCustomContextMenuActions({lockLayoutAction});
|
||||||
terminalDock->setWidget(terminalPanel);
|
terminalDock->setWidget(m_terminalPanel);
|
||||||
|
|
||||||
connect(terminalPanel, &TerminalPanel::hideTerminalPanel, terminalDock, &DolphinDockWidget::hide);
|
connect(m_terminalPanel, &TerminalPanel::hideTerminalPanel, terminalDock, &DolphinDockWidget::hide);
|
||||||
connect(terminalPanel, &TerminalPanel::changeUrl, this, &DolphinMainWindow::slotTerminalDirectoryChanged);
|
connect(m_terminalPanel, &TerminalPanel::changeUrl, this, &DolphinMainWindow::slotTerminalDirectoryChanged);
|
||||||
connect(terminalDock, &DolphinDockWidget::visibilityChanged,
|
connect(terminalDock, &DolphinDockWidget::visibilityChanged,
|
||||||
terminalPanel, &TerminalPanel::dockVisibilityChanged);
|
m_terminalPanel, &TerminalPanel::dockVisibilityChanged);
|
||||||
|
|
||||||
QAction* terminalAction = terminalDock->toggleViewAction();
|
QAction* terminalAction = terminalDock->toggleViewAction();
|
||||||
createPanelAction(QIcon::fromTheme(QStringLiteral("utilities-terminal")), Qt::Key_F4, terminalAction, QStringLiteral("show_terminal_panel"));
|
createPanelAction(QIcon::fromTheme(QStringLiteral("utilities-terminal")), Qt::Key_F4, terminalAction, QStringLiteral("show_terminal_panel"));
|
||||||
|
|
||||||
addDockWidget(Qt::BottomDockWidgetArea, terminalDock);
|
addDockWidget(Qt::BottomDockWidgetArea, terminalDock);
|
||||||
connect(this, &DolphinMainWindow::urlChanged,
|
connect(this, &DolphinMainWindow::urlChanged,
|
||||||
terminalPanel, &TerminalPanel::setUrl);
|
m_terminalPanel, &TerminalPanel::setUrl);
|
||||||
|
|
||||||
if (GeneralSettings::version() < 200) {
|
if (GeneralSettings::version() < 200) {
|
||||||
terminalDock->hide();
|
terminalDock->hide();
|
||||||
|
@ -1279,28 +1306,31 @@ void DolphinMainWindow::setupDockWidgets()
|
||||||
placesDock->setObjectName(QStringLiteral("placesDock"));
|
placesDock->setObjectName(QStringLiteral("placesDock"));
|
||||||
placesDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
|
placesDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
|
||||||
|
|
||||||
PlacesPanel* placesPanel = new PlacesPanel(placesDock);
|
m_placesPanel = new PlacesPanel(placesDock);
|
||||||
placesPanel->setCustomContextMenuActions({lockLayoutAction});
|
m_placesPanel->setCustomContextMenuActions({lockLayoutAction});
|
||||||
placesDock->setWidget(placesPanel);
|
placesDock->setWidget(m_placesPanel);
|
||||||
|
|
||||||
QAction* placesAction = placesDock->toggleViewAction();
|
QAction *placesAction = placesDock->toggleViewAction();
|
||||||
createPanelAction(QIcon::fromTheme(QStringLiteral("bookmarks")), Qt::Key_F9, placesAction, QStringLiteral("show_places_panel"));
|
createPanelAction(QIcon::fromTheme(QStringLiteral("bookmarks")), Qt::Key_F9, placesAction, QStringLiteral("show_places_panel"));
|
||||||
|
|
||||||
addDockWidget(Qt::LeftDockWidgetArea, placesDock);
|
addDockWidget(Qt::LeftDockWidgetArea, placesDock);
|
||||||
connect(placesPanel, &PlacesPanel::placeActivated,
|
connect(m_placesPanel, &PlacesPanel::placeActivated,
|
||||||
this, &DolphinMainWindow::slotPlaceActivated);
|
this, &DolphinMainWindow::slotPlaceActivated);
|
||||||
connect(placesPanel, &PlacesPanel::placeMiddleClicked,
|
connect(m_placesPanel, &PlacesPanel::placeMiddleClicked,
|
||||||
this, &DolphinMainWindow::openNewTab);
|
this, &DolphinMainWindow::openNewTab);
|
||||||
connect(placesPanel, &PlacesPanel::errorMessage,
|
connect(m_placesPanel, &PlacesPanel::errorMessage,
|
||||||
this, &DolphinMainWindow::showErrorMessage);
|
this, &DolphinMainWindow::showErrorMessage);
|
||||||
connect(this, &DolphinMainWindow::urlChanged,
|
connect(this, &DolphinMainWindow::urlChanged,
|
||||||
placesPanel, &PlacesPanel::setUrl);
|
m_placesPanel, &PlacesPanel::setUrl);
|
||||||
connect(placesDock, &DolphinDockWidget::visibilityChanged,
|
connect(placesDock, &DolphinDockWidget::visibilityChanged,
|
||||||
m_tabWidget, &DolphinTabWidget::slotPlacesPanelVisibilityChanged);
|
m_tabWidget, &DolphinTabWidget::slotPlacesPanelVisibilityChanged);
|
||||||
connect(this, &DolphinMainWindow::settingsChanged,
|
connect(this, &DolphinMainWindow::settingsChanged,
|
||||||
placesPanel, &PlacesPanel::readSettings);
|
m_placesPanel, &PlacesPanel::readSettings);
|
||||||
|
connect(m_placesPanel, &PlacesPanel::storageTearDownRequested,
|
||||||
m_tabWidget->slotPlacesPanelVisibilityChanged(placesPanel->isVisible());
|
this, &DolphinMainWindow::slotStorageTearDownFromPlacesRequested);
|
||||||
|
connect(m_placesPanel, &PlacesPanel::storageTearDownExternallyRequested,
|
||||||
|
this, &DolphinMainWindow::slotStorageTearDownExternallyRequested);
|
||||||
|
m_tabWidget->slotPlacesPanelVisibilityChanged(m_placesPanel->isVisible());
|
||||||
|
|
||||||
// Add actions into the "Panels" menu
|
// Add actions into the "Panels" menu
|
||||||
KActionMenu* panelsMenu = new KActionMenu(i18nc("@action:inmenu View", "Panels"), this);
|
KActionMenu* panelsMenu = new KActionMenu(i18nc("@action:inmenu View", "Panels"), this);
|
||||||
|
|
|
@ -46,6 +46,8 @@ class KJob;
|
||||||
class KNewFileMenu;
|
class KNewFileMenu;
|
||||||
class QToolButton;
|
class QToolButton;
|
||||||
class QIcon;
|
class QIcon;
|
||||||
|
class PlacesPanel;
|
||||||
|
class TerminalPanel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @short Main window for Dolphin.
|
* @short Main window for Dolphin.
|
||||||
|
@ -90,6 +92,8 @@ public:
|
||||||
*/
|
*/
|
||||||
KNewFileMenu* newFileMenu() const;
|
KNewFileMenu* newFileMenu() const;
|
||||||
|
|
||||||
|
void setTabsToHomeIfMountPathOpen(const QString& mountPath);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
/**
|
/**
|
||||||
* Pastes the clipboard data into the currently selected folder
|
* Pastes the clipboard data into the currently selected folder
|
||||||
|
@ -409,6 +413,21 @@ private slots:
|
||||||
*/
|
*/
|
||||||
void setUrlAsCaption(const QUrl& url);
|
void setUrlAsCaption(const QUrl& url);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This slot is called when the user requested to unmount a removable media
|
||||||
|
* from the places menu
|
||||||
|
*/
|
||||||
|
void slotStorageTearDownFromPlacesRequested(const QString& mountPath);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This slot is called when the user requested to unmount a removable media
|
||||||
|
* _not_ from the dolphin's places menu (from the notification area for e.g.)
|
||||||
|
* This slot is basically connected to each removable device's
|
||||||
|
* Solid::StorageAccess::teardownRequested(const QString & udi)
|
||||||
|
* signal through the places panel.
|
||||||
|
*/
|
||||||
|
void slotStorageTearDownExternallyRequested(const QString& mountPath);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is called when the view has finished loading the directory.
|
* Is called when the view has finished loading the directory.
|
||||||
*/
|
*/
|
||||||
|
@ -496,6 +515,10 @@ private:
|
||||||
QTimer* m_updateToolBarTimer;
|
QTimer* m_updateToolBarTimer;
|
||||||
|
|
||||||
KIO::Job* m_lastHandleUrlStatJob;
|
KIO::Job* m_lastHandleUrlStatJob;
|
||||||
|
|
||||||
|
TerminalPanel* m_terminalPanel;
|
||||||
|
PlacesPanel* m_placesPanel;
|
||||||
|
bool m_tearDownFromPlacesRequested;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline DolphinViewContainer* DolphinMainWindow::activeViewContainer() const
|
inline DolphinViewContainer* DolphinMainWindow::activeViewContainer() const
|
||||||
|
|
|
@ -272,6 +272,8 @@ void PlacesItem::initializeDevice(const QString& udi)
|
||||||
setUrl(QUrl::fromLocalFile(m_access->filePath()));
|
setUrl(QUrl::fromLocalFile(m_access->filePath()));
|
||||||
QObject::connect(m_access.data(), &Solid::StorageAccess::accessibilityChanged,
|
QObject::connect(m_access.data(), &Solid::StorageAccess::accessibilityChanged,
|
||||||
m_signalHandler.data(), &PlacesItemSignalHandler::onAccessibilityChanged);
|
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) {
|
} else if (m_disc && (m_disc->availableContent() & Solid::OpticalDisc::Audio) != 0) {
|
||||||
Solid::Block *block = m_device.as<Solid::Block>();
|
Solid::Block *block = m_device.as<Solid::Block>();
|
||||||
if (block) {
|
if (block) {
|
||||||
|
@ -335,3 +337,8 @@ QString PlacesItem::generateNewId()
|
||||||
return QString::number(QDateTime::currentDateTimeUtc().toTime_t()) +
|
return QString::number(QDateTime::currentDateTimeUtc().toTime_t()) +
|
||||||
'/' + QString::number(count++) + " (V2)";
|
'/' + QString::number(count++) + " (V2)";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PlacesItemSignalHandler *PlacesItem::signalHandler() const
|
||||||
|
{
|
||||||
|
return m_signalHandler.data();
|
||||||
|
}
|
||||||
|
|
|
@ -79,6 +79,8 @@ public:
|
||||||
static KBookmark createDeviceBookmark(KBookmarkManager* manager,
|
static KBookmark createDeviceBookmark(KBookmarkManager* manager,
|
||||||
const QString& udi);
|
const QString& udi);
|
||||||
|
|
||||||
|
PlacesItemSignalHandler* signalHandler() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void onDataValueChanged(const QByteArray& role,
|
virtual void onDataValueChanged(const QByteArray& role,
|
||||||
const QVariant& current,
|
const QVariant& current,
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
#include "placesitemmodel.h"
|
#include "placesitemmodel.h"
|
||||||
|
#include "placesitemsignalhandler.h"
|
||||||
|
|
||||||
#include "dolphin_generalsettings.h"
|
#include "dolphin_generalsettings.h"
|
||||||
|
|
||||||
|
@ -77,6 +78,7 @@ PlacesItemModel::PlacesItemModel(QObject* parent) :
|
||||||
m_systemBookmarksIndexes(),
|
m_systemBookmarksIndexes(),
|
||||||
m_bookmarkedItems(),
|
m_bookmarkedItems(),
|
||||||
m_hiddenItemToRemove(-1),
|
m_hiddenItemToRemove(-1),
|
||||||
|
m_deviceToTearDown(0),
|
||||||
m_updateBookmarksTimer(0),
|
m_updateBookmarksTimer(0),
|
||||||
m_storageSetupInProgress()
|
m_storageSetupInProgress()
|
||||||
{
|
{
|
||||||
|
@ -306,7 +308,7 @@ void PlacesItemModel::requestEject(int index)
|
||||||
Solid::OpticalDrive* drive = item->device().parent().as<Solid::OpticalDrive>();
|
Solid::OpticalDrive* drive = item->device().parent().as<Solid::OpticalDrive>();
|
||||||
if (drive) {
|
if (drive) {
|
||||||
connect(drive, &Solid::OpticalDrive::ejectDone,
|
connect(drive, &Solid::OpticalDrive::ejectDone,
|
||||||
this, &PlacesItemModel::slotStorageTeardownDone);
|
this, &PlacesItemModel::slotStorageTearDownDone);
|
||||||
drive->eject();
|
drive->eject();
|
||||||
} else {
|
} else {
|
||||||
const QString label = item->text();
|
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);
|
const PlacesItem* item = placesItem(index);
|
||||||
if (item) {
|
if (item) {
|
||||||
Solid::StorageAccess* access = item->device().as<Solid::StorageAccess>();
|
Solid::StorageAccess *tmp = item->device().as<Solid::StorageAccess>();
|
||||||
if (access) {
|
if (tmp) {
|
||||||
connect(access, &Solid::StorageAccess::teardownDone,
|
m_deviceToTearDown = tmp;
|
||||||
this, &PlacesItemModel::slotStorageTeardownDone);
|
// disconnect the Solid::StorageAccess::teardownRequested
|
||||||
access->teardown();
|
// 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;
|
m_availableDevices << udi;
|
||||||
const KBookmark bookmark = PlacesItem::createDeviceBookmark(m_bookmarkManager, 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)
|
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()) {
|
if (error && errorData.isValid()) {
|
||||||
emit errorMessage(errorData.toString());
|
emit errorMessage(errorData.toString());
|
||||||
}
|
}
|
||||||
|
m_deviceToTearDown->disconnect();
|
||||||
|
m_deviceToTearDown = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlacesItemModel::slotStorageSetupDone(Solid::ErrorType error,
|
void PlacesItemModel::slotStorageSetupDone(Solid::ErrorType error,
|
||||||
|
@ -786,7 +798,10 @@ void PlacesItemModel::loadBookmarks()
|
||||||
devicesItems.reserve(devicesItems.count() + devices.count());
|
devicesItems.reserve(devicesItems.count() + devices.count());
|
||||||
foreach (const QString& udi, devices) {
|
foreach (const QString& udi, devices) {
|
||||||
const KBookmark bookmark = PlacesItem::createDeviceBookmark(m_bookmarkManager, udi);
|
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;
|
QList<PlacesItem*> items;
|
||||||
|
@ -940,6 +955,15 @@ void PlacesItemModel::clear() {
|
||||||
KStandardItemModel::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()
|
void PlacesItemModel::initializeAvailableDevices()
|
||||||
{
|
{
|
||||||
QString predicate(QStringLiteral("[[[[ StorageVolume.ignored == false AND [ StorageVolume.usage == 'FileSystem' OR StorageVolume.usage == 'Encrypted' ]]"
|
QString predicate(QStringLiteral("[[[[ StorageVolume.ignored == false AND [ StorageVolume.usage == 'FileSystem' OR StorageVolume.usage == 'Encrypted' ]]"
|
||||||
|
|
|
@ -102,7 +102,7 @@ public:
|
||||||
QAction* teardownAction(int index) const;
|
QAction* teardownAction(int index) const;
|
||||||
|
|
||||||
void requestEject(int index);
|
void requestEject(int index);
|
||||||
void requestTeardown(int index);
|
void requestTearDown(int index);
|
||||||
|
|
||||||
bool storageSetupNeeded(int index) const;
|
bool storageSetupNeeded(int index) const;
|
||||||
void requestStorageSetup(int index);
|
void requestStorageSetup(int index);
|
||||||
|
@ -123,6 +123,8 @@ public:
|
||||||
|
|
||||||
virtual void clear() Q_DECL_OVERRIDE;
|
virtual void clear() Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
|
void proceedWithTearDown();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Saves the bookmarks and indicates to other applications that the
|
* Saves the bookmarks and indicates to other applications that the
|
||||||
* state of the bookmarks has been changed. Is only called by the
|
* state of the bookmarks has been changed. Is only called by the
|
||||||
|
@ -133,6 +135,8 @@ public:
|
||||||
signals:
|
signals:
|
||||||
void errorMessage(const QString& message);
|
void errorMessage(const QString& message);
|
||||||
void storageSetupDone(int index, bool success);
|
void storageSetupDone(int index, bool success);
|
||||||
|
void storageTearDownRequested(const QString& mountPath);
|
||||||
|
void storageTearDownExternallyRequested(const QString& mountPath);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void onItemInserted(int index) Q_DECL_OVERRIDE;
|
virtual void onItemInserted(int index) Q_DECL_OVERRIDE;
|
||||||
|
@ -142,7 +146,7 @@ protected:
|
||||||
private slots:
|
private slots:
|
||||||
void slotDeviceAdded(const QString& udi);
|
void slotDeviceAdded(const QString& udi);
|
||||||
void slotDeviceRemoved(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 slotStorageSetupDone(Solid::ErrorType error, const QVariant& errorData, const QString& udi);
|
||||||
void hideItem();
|
void hideItem();
|
||||||
|
|
||||||
|
@ -281,6 +285,8 @@ private:
|
||||||
// removing an item is not allowed.
|
// removing an item is not allowed.
|
||||||
int m_hiddenItemToRemove;
|
int m_hiddenItemToRemove;
|
||||||
|
|
||||||
|
Solid::StorageAccess *m_deviceToTearDown;
|
||||||
|
|
||||||
QTimer* m_updateBookmarksTimer;
|
QTimer* m_updateBookmarksTimer;
|
||||||
|
|
||||||
QHash<QObject*, int> m_storageSetupInProgress;
|
QHash<QObject*, int> m_storageSetupInProgress;
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -61,6 +61,11 @@ public slots:
|
||||||
*/
|
*/
|
||||||
void onTrashDirListerCompleted();
|
void onTrashDirListerCompleted();
|
||||||
|
|
||||||
|
void onTearDownRequested(const QString& udi);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void tearDownExternallyRequested(const QString& udi);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
PlacesItem* m_item;
|
PlacesItem* m_item;
|
||||||
};
|
};
|
||||||
|
|
|
@ -72,6 +72,11 @@ PlacesPanel::~PlacesPanel()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PlacesPanel::proceedWithTearDown()
|
||||||
|
{
|
||||||
|
m_model->proceedWithTearDown();
|
||||||
|
}
|
||||||
|
|
||||||
bool PlacesPanel::urlChanged()
|
bool PlacesPanel::urlChanged()
|
||||||
{
|
{
|
||||||
if (!url().isValid() || url().scheme().contains(QStringLiteral("search"))) {
|
if (!url().isValid() || url().scheme().contains(QStringLiteral("search"))) {
|
||||||
|
@ -110,6 +115,10 @@ void PlacesPanel::showEvent(QShowEvent* event)
|
||||||
m_model->setGroupedSorting(true);
|
m_model->setGroupedSorting(true);
|
||||||
connect(m_model, &PlacesItemModel::errorMessage,
|
connect(m_model, &PlacesItemModel::errorMessage,
|
||||||
this, &PlacesPanel::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 = new PlacesView();
|
||||||
m_view->setWidgetCreator(new KItemListWidgetCreator<PlacesItemListWidget>());
|
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.
|
// emit the slotItemMiddleClicked signal, because of Qt::MiddleButton.
|
||||||
triggerItem(index, Qt::MiddleButton);
|
triggerItem(index, Qt::MiddleButton);
|
||||||
} else if (action == teardownAction) {
|
} else if (action == teardownAction) {
|
||||||
m_model->requestTeardown(index);
|
m_model->requestTearDown(index);
|
||||||
} else if (action == ejectAction) {
|
} else if (action == ejectAction) {
|
||||||
m_model->requestEject(index);
|
m_model->requestEject(index);
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,11 +41,14 @@ class PlacesPanel : public Panel
|
||||||
public:
|
public:
|
||||||
PlacesPanel(QWidget* parent);
|
PlacesPanel(QWidget* parent);
|
||||||
virtual ~PlacesPanel();
|
virtual ~PlacesPanel();
|
||||||
|
void proceedWithTearDown();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void placeActivated(const QUrl& url);
|
void placeActivated(const QUrl& url);
|
||||||
void placeMiddleClicked(const QUrl& url);
|
void placeMiddleClicked(const QUrl& url);
|
||||||
void errorMessage(const QString& error);
|
void errorMessage(const QString& error);
|
||||||
|
void storageTearDownRequested(const QString& mountPath);
|
||||||
|
void storageTearDownExternallyRequested(const QString& mountPath);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool urlChanged() Q_DECL_OVERRIDE;
|
virtual bool urlChanged() Q_DECL_OVERRIDE;
|
||||||
|
|
|
@ -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()
|
void TerminalPanel::terminalExited()
|
||||||
{
|
{
|
||||||
m_terminal = 0;
|
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) {
|
if (dir == m_konsolePartCurrentDirectory) {
|
||||||
m_clearTerminal = false;
|
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
|
// 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
|
// user entered in the panel. Therefore, we have to remember 'dir'. Note that it could also be
|
||||||
// a symbolic link -> remember the 'canonical' path.
|
// 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) {
|
if (m_clearTerminal) {
|
||||||
m_terminal->sendInput(QStringLiteral(" clear\n"));
|
m_terminal->sendInput(QStringLiteral(" clear\n"));
|
||||||
|
|
|
@ -48,6 +48,13 @@ public:
|
||||||
TerminalPanel(QWidget* parent = 0);
|
TerminalPanel(QWidget* parent = 0);
|
||||||
virtual ~TerminalPanel();
|
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:
|
public slots:
|
||||||
void terminalExited();
|
void terminalExited();
|
||||||
void dockVisibilityChanged();
|
void dockVisibilityChanged();
|
||||||
|
@ -70,8 +77,13 @@ private slots:
|
||||||
void slotKonsolePartCurrentDirectoryChanged(const QString& dir);
|
void slotKonsolePartCurrentDirectoryChanged(const QString& dir);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
enum class HistoryPolicy {
|
||||||
|
AddToHistory,
|
||||||
|
SkipHistory
|
||||||
|
};
|
||||||
|
|
||||||
void changeDir(const QUrl& url);
|
void changeDir(const QUrl& url);
|
||||||
void sendCdToTerminal(const QString& path);
|
void sendCdToTerminal(const QString& path, HistoryPolicy addToHistory = HistoryPolicy::AddToHistory);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool m_clearTerminal;
|
bool m_clearTerminal;
|
||||||
|
|
Loading…
Reference in a new issue