From: Peter Penz Date: Thu, 7 Jun 2012 20:59:16 +0000 (+0200) Subject: Setup storage device if needed X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/c214b3751fe6a09a298d5904b62628caeff3bc56 Setup storage device if needed BUG: 301071 FIXED-IN: 4.9.0 --- diff --git a/src/panels/places/placesitem.cpp b/src/panels/places/placesitem.cpp index 191f8b277..10bebc231 100644 --- a/src/panels/places/placesitem.cpp +++ b/src/panels/places/placesitem.cpp @@ -180,6 +180,11 @@ PlacesItem::GroupType PlacesItem::groupType() const return DevicesType; } +bool PlacesItem::storageSetupNeeded() const +{ + return m_access ? !m_access->isAccessible() : false; +} + KBookmark PlacesItem::createBookmark(KBookmarkManager* manager, const QString& text, const KUrl& url, diff --git a/src/panels/places/placesitem.h b/src/panels/places/placesitem.h index 1d221170c..5a24a5268 100644 --- a/src/panels/places/placesitem.h +++ b/src/panels/places/placesitem.h @@ -69,6 +69,8 @@ public: GroupType groupType() const; + bool storageSetupNeeded() const; + static KBookmark createBookmark(KBookmarkManager* manager, const QString& text, const KUrl& url, diff --git a/src/panels/places/placesitemmodel.cpp b/src/panels/places/placesitemmodel.cpp index 1138f1378..8530b92f5 100644 --- a/src/panels/places/placesitemmodel.cpp +++ b/src/panels/places/placesitemmodel.cpp @@ -83,7 +83,8 @@ PlacesItemModel::PlacesItemModel(QObject* parent) : m_bookmarkedItems(), m_hiddenItemToRemove(-1), m_saveBookmarksTimer(0), - m_updateBookmarksTimer(0) + m_updateBookmarksTimer(0), + m_storageSetupInProgress() { #ifdef HAVE_NEPOMUK m_nepomukRunning = (Nepomuk::ResourceManager::instance()->initialized()); @@ -338,6 +339,35 @@ void PlacesItemModel::requestTeardown(int index) } } +bool PlacesItemModel::storageSetupNeeded(int index) const +{ + const PlacesItem* item = placesItem(index); + return item ? item->storageSetupNeeded() : false; +} + +void PlacesItemModel::requestStorageSetup(int index) +{ + const PlacesItem* item = placesItem(index); + if (!item) { + return; + } + + Solid::Device device = item->device(); + const bool setup = device.is() + && !m_storageSetupInProgress.contains(device.as()) + && !device.as()->isAccessible(); + if (setup) { + Solid::StorageAccess* access = device.as(); + + m_storageSetupInProgress[access] = index; + + connect(access, SIGNAL(setupDone(Solid::ErrorType,QVariant,QString)), + this, SLOT(slotStorageSetupDone(Solid::ErrorType,QVariant,QString))); + + access->setup(); + } +} + QMimeData* PlacesItemModel::createMimeData(const QSet& indexes) const { KUrl::List urls; @@ -552,6 +582,37 @@ void PlacesItemModel::slotStorageTeardownDone(Solid::ErrorType error, const QVar } } +void PlacesItemModel::slotStorageSetupDone(Solid::ErrorType error, + const QVariant& errorData, + const QString& udi) +{ + Q_UNUSED(udi); + + const int index = m_storageSetupInProgress.take(sender()); + const PlacesItem* item = placesItem(index); + if (!item) { + return; + } + + if (error) { + // TODO: Request message-freeze exception + if (errorData.isValid()) { + // emit errorMessage(i18nc("@info", "An error occurred while accessing '%1', the system responded: %2", + // item->text(), + // errorData.toString())); + emit errorMessage(QString("An error occurred while accessing '%1', the system responded: %2") + .arg(item->text()).arg(errorData.toString())); + } else { + // emit errorMessage(i18nc("@info", "An error occurred while accessing '%1'", + // item->text())); + emit errorMessage(QString("An error occurred while accessing '%1'").arg(item->text())); + } + emit storageSetupDone(index, false); + } else { + emit storageSetupDone(index, true); + } +} + void PlacesItemModel::hideItem() { hideItem(m_hiddenItemToRemove); @@ -565,7 +626,7 @@ void PlacesItemModel::updateBookmarks() KBookmarkGroup root = m_bookmarkManager->root(); KBookmark newBookmark = root.first(); while (!newBookmark.isNull()) { - if (acceptBookmark(newBookmark)) { + if (acceptBookmark(newBookmark, m_availableDevices)) { bool found = false; int modelIndex = 0; for (int i = 0; i < m_bookmarkedItems.count(); ++i) { @@ -663,7 +724,7 @@ void PlacesItemModel::loadBookmarks() QList devicesItems; while (!bookmark.isNull()) { - if (acceptBookmark(bookmark)) { + if (acceptBookmark(bookmark, devices)) { PlacesItem* item = new PlacesItem(bookmark); if (item->groupType() == PlacesItem::DevicesType) { devices.remove(item->udi()); @@ -736,12 +797,13 @@ void PlacesItemModel::loadBookmarks() #endif } -bool PlacesItemModel::acceptBookmark(const KBookmark& bookmark) const +bool PlacesItemModel::acceptBookmark(const KBookmark& bookmark, + const QSet& availableDevices) const { const QString udi = bookmark.metaDataItem("UDI"); const KUrl url = bookmark.url(); const QString appName = bookmark.metaDataItem("OnlyInApp"); - const bool deviceAvailable = m_availableDevices.contains(udi); + const bool deviceAvailable = availableDevices.contains(udi); const bool allowedHere = (appName.isEmpty() || appName == KGlobal::mainComponent().componentName() diff --git a/src/panels/places/placesitemmodel.h b/src/panels/places/placesitemmodel.h index 89a111730..b0f66d652 100644 --- a/src/panels/places/placesitemmodel.h +++ b/src/panels/places/placesitemmodel.h @@ -114,6 +114,9 @@ public: void requestEject(int index); void requestTeardown(int index); + bool storageSetupNeeded(int index) const; + void requestStorageSetup(int index); + /** @reimp */ virtual QMimeData* createMimeData(const QSet& indexes) const; @@ -129,6 +132,7 @@ public: signals: void errorMessage(const QString& message); + void storageSetupDone(int index, bool success); protected: virtual void onItemInserted(int index); @@ -139,6 +143,7 @@ private slots: void slotDeviceAdded(const QString& udi); void slotDeviceRemoved(const QString& udi); void slotStorageTeardownDone(Solid::ErrorType error, const QVariant& errorData); + void slotStorageSetupDone(Solid::ErrorType error, const QVariant& errorData, const QString& udi); void hideItem(); /** @@ -169,7 +174,8 @@ private: * current application (e.g. bookmarks from other applications * will be ignored). */ - bool acceptBookmark(const KBookmark& bookmark) const; + bool acceptBookmark(const KBookmark& bookmark, + const QSet& availableDevices) const; /** * Creates a PlacesItem for a system-bookmark: @@ -290,6 +296,8 @@ private: QTimer* m_saveBookmarksTimer; QTimer* m_updateBookmarksTimer; + + QHash m_storageSetupInProgress; }; #endif diff --git a/src/panels/places/placespanel.cpp b/src/panels/places/placespanel.cpp index 7016b039d..64de516fa 100644 --- a/src/panels/places/placespanel.cpp +++ b/src/panels/places/placespanel.cpp @@ -50,7 +50,9 @@ PlacesPanel::PlacesPanel(QWidget* parent) : Panel(parent), m_controller(0), - m_model(0) + m_model(0), + m_storageSetupFailedUrl(), + m_triggerStorageSetupButton() { } @@ -107,18 +109,12 @@ void PlacesPanel::showEvent(QShowEvent* event) void PlacesPanel::slotItemActivated(int index) { - const KUrl url = m_model->data(index).value("url").value(); - if (!url.isEmpty()) { - emit placeActivated(PlacesItemModel::convertedUrl(url)); - } + triggerItem(index, Qt::LeftButton); } void PlacesPanel::slotItemMiddleClicked(int index) { - const KUrl url = m_model->data(index).value("url").value(); - if (!url.isEmpty()) { - emit placeMiddleClicked(PlacesItemModel::convertedUrl(url)); - } + triggerItem(index, Qt::MiddleButton); } void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos) @@ -278,6 +274,25 @@ void PlacesPanel::slotTrashUpdated(KJob* job) org::kde::KDirNotify::emitFilesAdded("trash:/"); } +void PlacesPanel::slotStorageSetupDone(int index, bool success) +{ + disconnect(m_model, SIGNAL(storageSetupDone(int,bool)), + this, SLOT(slotStorageSetupDone(int,bool))); + + if (m_triggerStorageSetupButton == Qt::NoButton) { + return; + } + + if (success) { + Q_ASSERT(!m_model->storageSetupNeeded(index)); + triggerItem(index, m_triggerStorageSetupButton); + m_triggerStorageSetupButton = Qt::NoButton; + } else { + setUrl(m_storageSetupFailedUrl); + m_storageSetupFailedUrl = KUrl(); + } +} + void PlacesPanel::emptyTrash() { const QString text = i18nc("@info", "Do you really want to empty the Trash? All items will be deleted."); @@ -346,4 +361,34 @@ void PlacesPanel::selectClosestItem() selectionManager->setSelected(index); } +void PlacesPanel::triggerItem(int index, Qt::MouseButton button) +{ + const PlacesItem* item = m_model->placesItem(index); + if (!item) { + return; + } + + if (m_model->storageSetupNeeded(index)) { + m_triggerStorageSetupButton = button; + m_storageSetupFailedUrl = url(); + + connect(m_model, SIGNAL(storageSetupDone(int,bool)), + this, SLOT(slotStorageSetupDone(int,bool))); + + m_model->requestStorageSetup(index); + } else { + m_triggerStorageSetupButton = Qt::NoButton; + + const KUrl url = m_model->data(index).value("url").value(); + if (!url.isEmpty()) { + if (button == Qt::MiddleButton) { + emit placeMiddleClicked(PlacesItemModel::convertedUrl(url)); + } else { + emit placeActivated(PlacesItemModel::convertedUrl(url)); + } + } + } +} + + #include "placespanel.moc" diff --git a/src/panels/places/placespanel.h b/src/panels/places/placespanel.h index d78b4ba61..427b01248 100644 --- a/src/panels/places/placespanel.h +++ b/src/panels/places/placespanel.h @@ -58,6 +58,7 @@ private slots: void slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* event); void slotUrlsDropped(const KUrl& dest, QDropEvent* event, QWidget* parent); void slotTrashUpdated(KJob* job); + void slotStorageSetupDone(int index, bool success); private: void emptyTrash(); @@ -70,9 +71,14 @@ private: */ void selectClosestItem(); + void triggerItem(int index, Qt::MouseButton button); + private: KItemListController* m_controller; PlacesItemModel* m_model; + + KUrl m_storageSetupFailedUrl; + Qt::MouseButton m_triggerStorageSetupButton; }; #endif // PLACESPANEL_H