From 39abeb239df947eebfd93bbf02b560a9b9490a79 Mon Sep 17 00:00:00 2001 From: Floris Bos Date: Fri, 3 Jul 2020 21:16:49 +0200 Subject: [PATCH] Improve drive listing - Show write protected SD cards greyed out. Show message if user select one of those. Closes #59 - Do show virtual drive types on Windows. Do keep them hidden on Mac OS X as that seems to cover .dmg file and timemachine stuff. Closes #79 --- drivelistitem.cpp | 4 ++-- drivelistitem.h | 4 +++- drivelistmodel.cpp | 14 ++++++------ drivelistmodel.h | 2 +- main.qml | 54 ++++++++++++++++++++++++++-------------------- 5 files changed, 45 insertions(+), 33 deletions(-) diff --git a/drivelistitem.cpp b/drivelistitem.cpp index 5256d97..31211fe 100644 --- a/drivelistitem.cpp +++ b/drivelistitem.cpp @@ -5,8 +5,8 @@ #include "drivelistitem.h" -DriveListItem::DriveListItem(QString device, QString description, quint64 size, bool isUsb, bool isScsi, QStringList mountpoints, QObject *parent) - : QObject(parent), _device(device), _description(description), _mountpoints(mountpoints), _size(size), _isUsb(isUsb), _isScsi(isScsi) +DriveListItem::DriveListItem(QString device, QString description, quint64 size, bool isUsb, bool isScsi, bool readOnly, QStringList mountpoints, QObject *parent) + : QObject(parent), _device(device), _description(description), _mountpoints(mountpoints), _size(size), _isUsb(isUsb), _isScsi(isScsi), _isReadOnly(readOnly) { } diff --git a/drivelistitem.h b/drivelistitem.h index 1dc6567..8e7e889 100644 --- a/drivelistitem.h +++ b/drivelistitem.h @@ -13,7 +13,7 @@ class DriveListItem : public QObject { Q_OBJECT public: - explicit DriveListItem(QString device, QString description, quint64 size, bool isUsb = false, bool isScsi = false, QStringList mountpoints = QStringList(), QObject *parent = nullptr); + explicit DriveListItem(QString device, QString description, quint64 size, bool isUsb = false, bool isScsi = false, bool readOnly = false, QStringList mountpoints = QStringList(), QObject *parent = nullptr); Q_PROPERTY(QString device MEMBER _device CONSTANT) Q_PROPERTY(QString description MEMBER _description CONSTANT) @@ -21,6 +21,7 @@ public: Q_PROPERTY(QStringList mountpoints MEMBER _mountpoints CONSTANT) Q_PROPERTY(bool isUsb MEMBER _isUsb CONSTANT) Q_PROPERTY(bool isScsi MEMBER _isScsi CONSTANT) + Q_PROPERTY(bool isReadOnly MEMBER _isReadOnly CONSTANT) Q_INVOKABLE int sizeInGb(); signals: @@ -34,6 +35,7 @@ protected: quint64 _size; bool _isUsb; bool _isScsi; + bool _isReadOnly; }; #endif // DRIVELISTITEM_H diff --git a/drivelistmodel.cpp b/drivelistmodel.cpp index 55a2d8b..9c314db 100644 --- a/drivelistmodel.cpp +++ b/drivelistmodel.cpp @@ -18,6 +18,7 @@ DriveListModel::DriveListModel(QObject *parent) {sizeRole, "size"}, {isUsbRole, "isUsb"}, {isScsiRole, "isScsi"}, + {isReadOnlyRole, "isReadOnly"}, {mountpointsRole, "mountpoints"} }; @@ -65,7 +66,7 @@ void DriveListModel::processDriveList(std::vector l if (filterSystemDrives) { - if (i.isSystem || i.isReadOnly) + if (i.isSystem) continue; // Should already be caught by isSystem variable, but just in case... @@ -73,17 +74,18 @@ void DriveListModel::processDriveList(std::vector l continue; } - // Skip zero-sized and virtual devices - if (i.size == 0 || i.isVirtual) + // Skip zero-sized devices + if (i.size == 0) continue; #ifdef Q_OS_DARWIN - // Skip time machine backup. FIXME: is this best way to detect them? - if (i.mountpointLabels.size() && i.mountpointLabels.front() == "Time Machine Backups") + if (i.isVirtual) continue; #endif QString deviceNamePlusSize = QString::fromStdString(i.device)+":"+QString::number(i.size); + if (i.isReadOnly) + deviceNamePlusSize += "ro"; drivesInNewList.insert(deviceNamePlusSize); if (!_drivelist.contains(deviceNamePlusSize)) @@ -95,7 +97,7 @@ void DriveListModel::processDriveList(std::vector l changes = true; } - _drivelist[deviceNamePlusSize] = new DriveListItem(QString::fromStdString(i.device), QString::fromStdString(i.description), i.size, i.isUSB, i.isSCSI, mountpoints, this); + _drivelist[deviceNamePlusSize] = new DriveListItem(QString::fromStdString(i.device), QString::fromStdString(i.description), i.size, i.isUSB, i.isSCSI, i.isReadOnly, mountpoints, this); } } diff --git a/drivelistmodel.h b/drivelistmodel.h index b8e1b46..8216503 100644 --- a/drivelistmodel.h +++ b/drivelistmodel.h @@ -24,7 +24,7 @@ public: void stopPolling(); enum driveListRoles { - deviceRole = Qt::UserRole + 1, descriptionRole, sizeRole, isUsbRole, isScsiRole, mountpointsRole + deviceRole = Qt::UserRole + 1, descriptionRole, sizeRole, isUsbRole, isScsiRole, isReadOnlyRole, mountpointsRole }; public slots: diff --git a/main.qml b/main.qml index 5a6573d..880c9a0 100644 --- a/main.qml +++ b/main.qml @@ -615,24 +615,12 @@ ApplicationWindow { Keys.onSpacePressed: { if (currentIndex == -1) return - - dstpopup.close() - imageWriter.setDst(currentItem.device, currentItem.size) - dstbutton.text = currentItem.description - if (imageWriter.readyToWrite()) { - writebutton.enabled = true - } + selectDstItem(currentItem) } Accessible.onPressAction: { if (currentIndex == -1) return - - dstpopup.close() - imageWriter.setDst(currentItem.device, currentItem.size) - dstbutton.text = currentItem.description - if (imageWriter.readyToWrite()) { - writebutton.enabled = true - } + selectDstItem(currentItem) } } } @@ -694,9 +682,20 @@ ApplicationWindow { verticalAlignment: Text.AlignVCenter font.family: roboto.name text: { - var txt = "

"+description+" - "+(size/1000000000).toFixed(1)+" GB"+"

" - if (mountpoints.length > 0) { - txt += ""+qsTr("Mounted as %1").arg(mountpoints.join(", "))+"" + var sizeStr = (size/1000000000).toFixed(1)+" GB"; + var txt; + if (isReadOnly) { + txt = "

"+description+" - "+sizeStr+"

" + txt += "" + if (mountpoints.length > 0) { + txt += qsTr("Mounted as %1").arg(mountpoints.join(", "))+" " + } + txt += qsTr("[WRITE PROTECTED]")+"" + } else { + txt = "

"+description+" - "+sizeStr+"

" + if (mountpoints.length > 0) { + txt += ""+qsTr("Mounted as %1").arg(mountpoints.join(", "))+"" + } } return txt; } @@ -718,12 +717,7 @@ ApplicationWindow { } onClicked: { - dstpopup.close() - imageWriter.setDst(device, size) - dstbutton.text = description - if (imageWriter.readyToWrite()) { - writebutton.enabled = true - } + selectDstItem(model) } } } @@ -988,4 +982,18 @@ ApplicationWindow { } } } + + function selectDstItem(d) { + if (d.isReadOnly) { + onError(qsTr("SD card is write protected.
Push the lock switch on the left side of the card upwards, and try again.")) + return + } + + dstpopup.close() + imageWriter.setDst(d.device, d.size) + dstbutton.text = d.description + if (imageWriter.readyToWrite()) { + writebutton.enabled = true + } + } }