return DevicesType;
}
+bool PlacesItem::storageSetupNeeded() const
+{
+ return m_access ? !m_access->isAccessible() : false;
+}
+
KBookmark PlacesItem::createBookmark(KBookmarkManager* manager,
const QString& text,
const KUrl& url,
GroupType groupType() const;
+ bool storageSetupNeeded() const;
+
static KBookmark createBookmark(KBookmarkManager* manager,
const QString& text,
const KUrl& url,
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());
}
}
+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<Solid::StorageAccess>()
+ && !m_storageSetupInProgress.contains(device.as<Solid::StorageAccess>())
+ && !device.as<Solid::StorageAccess>()->isAccessible();
+ if (setup) {
+ Solid::StorageAccess* access = device.as<Solid::StorageAccess>();
+
+ 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<int>& indexes) const
{
KUrl::List urls;
}
}
+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);
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) {
QList<PlacesItem*> 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());
#endif
}
-bool PlacesItemModel::acceptBookmark(const KBookmark& bookmark) const
+bool PlacesItemModel::acceptBookmark(const KBookmark& bookmark,
+ const QSet<QString>& 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()
void requestEject(int index);
void requestTeardown(int index);
+ bool storageSetupNeeded(int index) const;
+ void requestStorageSetup(int index);
+
/** @reimp */
virtual QMimeData* createMimeData(const QSet<int>& indexes) const;
signals:
void errorMessage(const QString& message);
+ void storageSetupDone(int index, bool success);
protected:
virtual void onItemInserted(int index);
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();
/**
* current application (e.g. bookmarks from other applications
* will be ignored).
*/
- bool acceptBookmark(const KBookmark& bookmark) const;
+ bool acceptBookmark(const KBookmark& bookmark,
+ const QSet<QString>& availableDevices) const;
/**
* Creates a PlacesItem for a system-bookmark:
QTimer* m_saveBookmarksTimer;
QTimer* m_updateBookmarksTimer;
+
+ QHash<QObject*, int> m_storageSetupInProgress;
};
#endif
PlacesPanel::PlacesPanel(QWidget* parent) :
Panel(parent),
m_controller(0),
- m_model(0)
+ m_model(0),
+ m_storageSetupFailedUrl(),
+ m_triggerStorageSetupButton()
{
}
void PlacesPanel::slotItemActivated(int index)
{
- const KUrl url = m_model->data(index).value("url").value<KUrl>();
- 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<KUrl>();
- if (!url.isEmpty()) {
- emit placeMiddleClicked(PlacesItemModel::convertedUrl(url));
- }
+ triggerItem(index, Qt::MiddleButton);
}
void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos)
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.");
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<KUrl>();
+ if (!url.isEmpty()) {
+ if (button == Qt::MiddleButton) {
+ emit placeMiddleClicked(PlacesItemModel::convertedUrl(url));
+ } else {
+ emit placeActivated(PlacesItemModel::convertedUrl(url));
+ }
+ }
+ }
+}
+
+
#include "placespanel.moc"
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();
*/
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