Support mount devices
This commit is contained in:
parent
d6da7fe02c
commit
358926370b
7 changed files with 147 additions and 9 deletions
|
@ -174,6 +174,9 @@ QString FolderModel::url() const
|
||||||
|
|
||||||
void FolderModel::setUrl(const QString &url)
|
void FolderModel::setUrl(const QString &url)
|
||||||
{
|
{
|
||||||
|
if (url.isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
const QUrl &resolvedNewUrl = resolve(url);
|
const QUrl &resolvedNewUrl = resolve(url);
|
||||||
|
|
||||||
// Refresh this directory.
|
// Refresh this directory.
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "pathbarmodel.h"
|
#include "pathbarmodel.h"
|
||||||
|
#include<QDebug>
|
||||||
|
|
||||||
PathBarModel::PathBarModel(QObject *parent)
|
PathBarModel::PathBarModel(QObject *parent)
|
||||||
: QAbstractItemModel(parent)
|
: QAbstractItemModel(parent)
|
||||||
|
@ -33,7 +34,7 @@ QString PathBarModel::url() const
|
||||||
{
|
{
|
||||||
return m_url;
|
return m_url;
|
||||||
}
|
}
|
||||||
#include<QDebug>
|
|
||||||
void PathBarModel::setUrl(const QString &url)
|
void PathBarModel::setUrl(const QString &url)
|
||||||
{
|
{
|
||||||
if (m_url != url) {
|
if (m_url != url) {
|
||||||
|
|
|
@ -26,6 +26,7 @@ PlacesItem::PlacesItem(const QString &displayName,
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
, m_displayName(displayName)
|
, m_displayName(displayName)
|
||||||
, m_url(url)
|
, m_url(url)
|
||||||
|
, m_isAccessible(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,6 +62,9 @@ void PlacesItem::setIconPath(const QString &path)
|
||||||
|
|
||||||
QUrl PlacesItem::url() const
|
QUrl PlacesItem::url() const
|
||||||
{
|
{
|
||||||
|
if (m_access)
|
||||||
|
return QUrl::fromLocalFile(m_access->filePath());
|
||||||
|
|
||||||
return m_url;
|
return m_url;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,4 +86,48 @@ QString PlacesItem::udi() const
|
||||||
void PlacesItem::setUdi(const QString &udi)
|
void PlacesItem::setUdi(const QString &udi)
|
||||||
{
|
{
|
||||||
m_udi = udi;
|
m_udi = udi;
|
||||||
|
updateDeviceInfo(m_udi);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PlacesItem::isDevice()
|
||||||
|
{
|
||||||
|
return !m_udi.isEmpty() && m_device.isValid();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PlacesItem::setupNeeded()
|
||||||
|
{
|
||||||
|
if (m_access) {
|
||||||
|
return !m_isAccessible;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PlacesItem::updateDeviceInfo(const QString &udi)
|
||||||
|
{
|
||||||
|
m_device = Solid::Device(udi);
|
||||||
|
|
||||||
|
if (m_access)
|
||||||
|
m_access->disconnect(this);
|
||||||
|
|
||||||
|
if (m_device.isValid()) {
|
||||||
|
m_access = m_device.as<Solid::StorageAccess>();
|
||||||
|
m_iconName = m_device.icon();
|
||||||
|
m_displayName = m_device.displayName();
|
||||||
|
|
||||||
|
if (m_access) {
|
||||||
|
// m_url = m_access->filePath();
|
||||||
|
connect(m_access.data(), &Solid::StorageAccess::accessibilityChanged, this, &PlacesItem::onAccessibilityChanged);
|
||||||
|
onAccessibilityChanged(m_access->isAccessible());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
m_access = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PlacesItem::onAccessibilityChanged(bool isAccessible)
|
||||||
|
{
|
||||||
|
m_isAccessible = isAccessible;
|
||||||
|
|
||||||
|
emit itemChanged(this);
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,8 +21,12 @@
|
||||||
#define PLACESITEM_H
|
#define PLACESITEM_H
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
#include <QPointer>
|
||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
|
|
||||||
|
#include <Solid/Device>
|
||||||
|
#include <Solid/StorageAccess>
|
||||||
|
|
||||||
class PlacesItem : public QObject
|
class PlacesItem : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
@ -49,12 +53,27 @@ public:
|
||||||
QString udi() const;
|
QString udi() const;
|
||||||
void setUdi(const QString &udi);
|
void setUdi(const QString &udi);
|
||||||
|
|
||||||
|
bool isDevice();
|
||||||
|
bool setupNeeded();
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void itemChanged(PlacesItem *);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void updateDeviceInfo(const QString &udi);
|
||||||
|
void onAccessibilityChanged(bool isAccessible);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString m_displayName;
|
QString m_displayName;
|
||||||
QString m_iconName;
|
QString m_iconName;
|
||||||
QString m_iconPath;
|
QString m_iconPath;
|
||||||
QString m_udi;
|
QString m_udi;
|
||||||
QUrl m_url;
|
QUrl m_url;
|
||||||
|
|
||||||
|
bool m_isAccessible;
|
||||||
|
|
||||||
|
Solid::Device m_device;
|
||||||
|
QPointer<Solid::StorageAccess> m_access;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // PLACESITEM_H
|
#endif // PLACESITEM_H
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include <Solid/StorageDrive>
|
#include <Solid/StorageDrive>
|
||||||
#include <Solid/StorageAccess>
|
#include <Solid/StorageAccess>
|
||||||
#include <Solid/Predicate>
|
#include <Solid/Predicate>
|
||||||
|
#include <Solid/OpticalDrive>
|
||||||
|
|
||||||
PlacesModel::PlacesModel(QObject *parent)
|
PlacesModel::PlacesModel(QObject *parent)
|
||||||
: QAbstractItemModel(parent)
|
: QAbstractItemModel(parent)
|
||||||
|
@ -98,12 +99,14 @@ PlacesModel::PlacesModel(QObject *parent)
|
||||||
predicate = Solid::Predicate::fromString(predicateStr);
|
predicate = Solid::Predicate::fromString(predicateStr);
|
||||||
|
|
||||||
Solid::DeviceNotifier *notifier = Solid::DeviceNotifier::instance();
|
Solid::DeviceNotifier *notifier = Solid::DeviceNotifier::instance();
|
||||||
|
connect(notifier, &Solid::DeviceNotifier::deviceAdded, this, &PlacesModel::onDeviceAdded);
|
||||||
|
connect(notifier, &Solid::DeviceNotifier::deviceRemoved, this, &PlacesModel::onDeviceRemoved);
|
||||||
|
|
||||||
|
// Init devices
|
||||||
const QList<Solid::Device> &deviceList = Solid::Device::listFromQuery(predicate);
|
const QList<Solid::Device> &deviceList = Solid::Device::listFromQuery(predicate);
|
||||||
|
|
||||||
for (const Solid::Device &device : deviceList) {
|
for (const Solid::Device &device : deviceList) {
|
||||||
qDebug() << device.udi();
|
PlacesItem *deviceItem = new PlacesItem;
|
||||||
|
deviceItem->setUdi(device.udi());
|
||||||
PlacesItem *deviceItem = new PlacesItem(device.udi());
|
|
||||||
m_items.append(deviceItem);
|
m_items.append(deviceItem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -120,6 +123,8 @@ QHash<int, QByteArray> PlacesModel::roleNames() const
|
||||||
roleNames[PlacesModel::IconPathRole] = "iconPath";
|
roleNames[PlacesModel::IconPathRole] = "iconPath";
|
||||||
roleNames[PlacesModel::UrlRole] = "url";
|
roleNames[PlacesModel::UrlRole] = "url";
|
||||||
roleNames[PlacesModel::PathRole] = "path";
|
roleNames[PlacesModel::PathRole] = "path";
|
||||||
|
roleNames[PlacesModel::IsDeviceRole] = "isDevice";
|
||||||
|
roleNames[PlacesModel::setupNeededRole] = "setupNeeded";
|
||||||
return roleNames;
|
return roleNames;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -160,6 +165,12 @@ QVariant PlacesModel::data(const QModelIndex &index, int role) const
|
||||||
case PlacesModel::PathRole:
|
case PlacesModel::PathRole:
|
||||||
return item->path();
|
return item->path();
|
||||||
break;
|
break;
|
||||||
|
case PlacesModel::IsDeviceRole:
|
||||||
|
return item->isDevice();
|
||||||
|
break;
|
||||||
|
case PlacesModel::setupNeededRole:
|
||||||
|
return item->setupNeeded();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -202,3 +213,47 @@ QVariantMap PlacesModel::get(const int &index) const
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PlacesModel::requestSetup(const int &index)
|
||||||
|
{
|
||||||
|
PlacesItem *item = m_items.at(index);
|
||||||
|
if (!item->udi().isEmpty()) {
|
||||||
|
Solid::Device device = Solid::Device(item->udi());
|
||||||
|
Solid::StorageAccess *access = device.as<Solid::StorageAccess>();
|
||||||
|
access->setup();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PlacesModel::requestEject(const int &index)
|
||||||
|
{
|
||||||
|
PlacesItem *item = m_items.at(index);
|
||||||
|
if (!item->udi().isEmpty()) {
|
||||||
|
Solid::Device device = Solid::Device(item->udi());
|
||||||
|
Solid::OpticalDrive *drive = device.parent().as<Solid::OpticalDrive>();
|
||||||
|
|
||||||
|
if (drive) {
|
||||||
|
drive->eject();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PlacesModel::onDeviceAdded(const QString &udi)
|
||||||
|
{
|
||||||
|
beginInsertRows(QModelIndex(), rowCount(), rowCount());
|
||||||
|
PlacesItem *deviceItem = new PlacesItem;
|
||||||
|
deviceItem->setUdi(udi);
|
||||||
|
m_items.append(deviceItem);
|
||||||
|
endInsertRows();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PlacesModel::onDeviceRemoved(const QString &udi)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < m_items.size(); ++i) {
|
||||||
|
if (m_items.at(i)->udi() == udi) {
|
||||||
|
beginRemoveRows(QModelIndex(), i, i);
|
||||||
|
PlacesItem *item = m_items.at(i);
|
||||||
|
m_items.removeOne(item);
|
||||||
|
endRemoveRows();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -33,7 +33,9 @@ public:
|
||||||
IconNameRole,
|
IconNameRole,
|
||||||
IconPathRole,
|
IconPathRole,
|
||||||
UrlRole,
|
UrlRole,
|
||||||
PathRole
|
PathRole,
|
||||||
|
IsDeviceRole,
|
||||||
|
setupNeededRole
|
||||||
};
|
};
|
||||||
Q_ENUMS(DataRole);
|
Q_ENUMS(DataRole);
|
||||||
|
|
||||||
|
@ -50,6 +52,12 @@ public:
|
||||||
QModelIndex parent(const QModelIndex &child) const override;
|
QModelIndex parent(const QModelIndex &child) const override;
|
||||||
|
|
||||||
Q_INVOKABLE QVariantMap get(const int &index) const;
|
Q_INVOKABLE QVariantMap get(const int &index) const;
|
||||||
|
Q_INVOKABLE void requestSetup(const int &index);
|
||||||
|
Q_INVOKABLE void requestEject(const int &index);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void onDeviceAdded(const QString &udi);
|
||||||
|
void onDeviceRemoved(const QString &udi);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QList<PlacesItem *> m_items;
|
QList<PlacesItem *> m_items;
|
||||||
|
|
|
@ -47,8 +47,11 @@ ListView {
|
||||||
hoverEnabled: true
|
hoverEnabled: true
|
||||||
acceptedButtons: Qt.LeftButton
|
acceptedButtons: Qt.LeftButton
|
||||||
onClicked: {
|
onClicked: {
|
||||||
sideBar.currentIndex = index
|
if (model.isDevice && model.setupNeeded)
|
||||||
sideBar.clicked(model.path)
|
placesModel.requestSetup(index)
|
||||||
|
|
||||||
|
// sideBar.currentIndex = index
|
||||||
|
sideBar.clicked(model.path ? model.path : model.url)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,7 +97,8 @@ ListView {
|
||||||
sideBar.currentIndex = -1
|
sideBar.currentIndex = -1
|
||||||
|
|
||||||
for (var i = 0; i < sideBar.count; ++i) {
|
for (var i = 0; i < sideBar.count; ++i) {
|
||||||
if (path === sideBar.model.get(i).path) {
|
if (path === sideBar.model.get(i).path ||
|
||||||
|
path === sideBar.model.get(i).url) {
|
||||||
sideBar.currentIndex = i
|
sideBar.currentIndex = i
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue