+void ClipManager::listRemovableVolumes()
+{
+ QList<SolidVolumeInfo> volumes;
+ m_removableVolumes.clear();
+
+ QList<Solid::Device> devices = Solid::Device::listFromType(Solid::DeviceInterface::StorageAccess);
+
+ foreach(const Solid::Device &accessDevice, devices)
+ {
+ // check for StorageAccess
+ if (!accessDevice.is<Solid::StorageAccess>())
+ continue;
+
+ const Solid::StorageAccess *access = accessDevice.as<Solid::StorageAccess>();
+
+ if (!access->isAccessible())
+ continue;
+
+ // check for StorageDrive
+ Solid::Device driveDevice;
+ for (Solid::Device currentDevice = accessDevice; currentDevice.isValid(); currentDevice = currentDevice.parent())
+ {
+ if (currentDevice.is<Solid::StorageDrive>())
+ {
+ driveDevice = currentDevice;
+ break;
+ }
+ }
+ if (!driveDevice.isValid())
+ continue;
+
+ Solid::StorageDrive *drive = driveDevice.as<Solid::StorageDrive>();
+ if (!drive->isRemovable()) continue;
+
+ // check for StorageVolume
+ Solid::Device volumeDevice;
+ for (Solid::Device currentDevice = accessDevice; currentDevice.isValid(); currentDevice = currentDevice.parent())
+ {
+ if (currentDevice.is<Solid::StorageVolume>())
+ {
+ volumeDevice = currentDevice;
+ break;
+ }
+ }
+ if (!volumeDevice.isValid())
+ continue;
+
+ Solid::StorageVolume *volume = volumeDevice.as<Solid::StorageVolume>();
+
+ SolidVolumeInfo info;
+ info.path = access->filePath();
+ info.isMounted = access->isAccessible();
+ if (!info.path.isEmpty() && !info.path.endsWith('/'))
+ info.path += '/';
+ info.uuid = volume->uuid();
+ info.label = volume->label();
+ info.isRemovable = drive->isRemovable();
+ m_removableVolumes << info;
+ }
+}
+
+bool ClipManager::isOnRemovableDevice(const KUrl &url)
+{
+ SolidVolumeInfo volume;
+ QString path = url.path(KUrl::RemoveTrailingSlash);
+ int volumeMatch = 0;
+
+ //FIXME: Network shares! Here we get only the volume of the mount path...
+ // This is probably not really clean. But Solid does not help us.
+ foreach (const SolidVolumeInfo &v, m_removableVolumes)
+ {
+ if (v.isMounted && !v.path.isEmpty() && path.startsWith(v.path))
+ {
+ int length = v.path.length();
+ if (length > volumeMatch)
+ {
+ volumeMatch = v.path.length();
+ volume = v;
+ }
+ }
+ }
+
+ return volumeMatch;
+}
+
+void ClipManager::projectTreeThumbReady(const QString &id, int frame, const QImage &img, int type)
+{
+ switch (type) {
+ case 2:
+ emit gotClipPropertyThumbnail(id, img);
+ break;
+ default:
+ emit thumbReady(id, frame, img);
+ }
+}
+
+
+#include "clipmanager.moc"