mirror of
https://github.com/cmclark00/retro-imager.git
synced 2025-05-18 07:55:21 +01:00
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
This commit is contained in:
parent
5f42c7d7cb
commit
39abeb239d
5 changed files with 45 additions and 33 deletions
|
@ -5,8 +5,8 @@
|
||||||
|
|
||||||
#include "drivelistitem.h"
|
#include "drivelistitem.h"
|
||||||
|
|
||||||
DriveListItem::DriveListItem(QString device, QString description, quint64 size, bool isUsb, bool isScsi, QStringList mountpoints, QObject *parent)
|
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)
|
: QObject(parent), _device(device), _description(description), _mountpoints(mountpoints), _size(size), _isUsb(isUsb), _isScsi(isScsi), _isReadOnly(readOnly)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@ class DriveListItem : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
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 device MEMBER _device CONSTANT)
|
||||||
Q_PROPERTY(QString description MEMBER _description CONSTANT)
|
Q_PROPERTY(QString description MEMBER _description CONSTANT)
|
||||||
|
@ -21,6 +21,7 @@ public:
|
||||||
Q_PROPERTY(QStringList mountpoints MEMBER _mountpoints CONSTANT)
|
Q_PROPERTY(QStringList mountpoints MEMBER _mountpoints CONSTANT)
|
||||||
Q_PROPERTY(bool isUsb MEMBER _isUsb CONSTANT)
|
Q_PROPERTY(bool isUsb MEMBER _isUsb CONSTANT)
|
||||||
Q_PROPERTY(bool isScsi MEMBER _isScsi CONSTANT)
|
Q_PROPERTY(bool isScsi MEMBER _isScsi CONSTANT)
|
||||||
|
Q_PROPERTY(bool isReadOnly MEMBER _isReadOnly CONSTANT)
|
||||||
Q_INVOKABLE int sizeInGb();
|
Q_INVOKABLE int sizeInGb();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
@ -34,6 +35,7 @@ protected:
|
||||||
quint64 _size;
|
quint64 _size;
|
||||||
bool _isUsb;
|
bool _isUsb;
|
||||||
bool _isScsi;
|
bool _isScsi;
|
||||||
|
bool _isReadOnly;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // DRIVELISTITEM_H
|
#endif // DRIVELISTITEM_H
|
||||||
|
|
|
@ -18,6 +18,7 @@ DriveListModel::DriveListModel(QObject *parent)
|
||||||
{sizeRole, "size"},
|
{sizeRole, "size"},
|
||||||
{isUsbRole, "isUsb"},
|
{isUsbRole, "isUsb"},
|
||||||
{isScsiRole, "isScsi"},
|
{isScsiRole, "isScsi"},
|
||||||
|
{isReadOnlyRole, "isReadOnly"},
|
||||||
{mountpointsRole, "mountpoints"}
|
{mountpointsRole, "mountpoints"}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -65,7 +66,7 @@ void DriveListModel::processDriveList(std::vector<Drivelist::DeviceDescriptor> l
|
||||||
|
|
||||||
if (filterSystemDrives)
|
if (filterSystemDrives)
|
||||||
{
|
{
|
||||||
if (i.isSystem || i.isReadOnly)
|
if (i.isSystem)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Should already be caught by isSystem variable, but just in case...
|
// Should already be caught by isSystem variable, but just in case...
|
||||||
|
@ -73,17 +74,18 @@ void DriveListModel::processDriveList(std::vector<Drivelist::DeviceDescriptor> l
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Skip zero-sized and virtual devices
|
// Skip zero-sized devices
|
||||||
if (i.size == 0 || i.isVirtual)
|
if (i.size == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
#ifdef Q_OS_DARWIN
|
#ifdef Q_OS_DARWIN
|
||||||
// Skip time machine backup. FIXME: is this best way to detect them?
|
if (i.isVirtual)
|
||||||
if (i.mountpointLabels.size() && i.mountpointLabels.front() == "Time Machine Backups")
|
|
||||||
continue;
|
continue;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
QString deviceNamePlusSize = QString::fromStdString(i.device)+":"+QString::number(i.size);
|
QString deviceNamePlusSize = QString::fromStdString(i.device)+":"+QString::number(i.size);
|
||||||
|
if (i.isReadOnly)
|
||||||
|
deviceNamePlusSize += "ro";
|
||||||
drivesInNewList.insert(deviceNamePlusSize);
|
drivesInNewList.insert(deviceNamePlusSize);
|
||||||
|
|
||||||
if (!_drivelist.contains(deviceNamePlusSize))
|
if (!_drivelist.contains(deviceNamePlusSize))
|
||||||
|
@ -95,7 +97,7 @@ void DriveListModel::processDriveList(std::vector<Drivelist::DeviceDescriptor> l
|
||||||
changes = true;
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ public:
|
||||||
void stopPolling();
|
void stopPolling();
|
||||||
|
|
||||||
enum driveListRoles {
|
enum driveListRoles {
|
||||||
deviceRole = Qt::UserRole + 1, descriptionRole, sizeRole, isUsbRole, isScsiRole, mountpointsRole
|
deviceRole = Qt::UserRole + 1, descriptionRole, sizeRole, isUsbRole, isScsiRole, isReadOnlyRole, mountpointsRole
|
||||||
};
|
};
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
50
main.qml
50
main.qml
|
@ -615,24 +615,12 @@ ApplicationWindow {
|
||||||
Keys.onSpacePressed: {
|
Keys.onSpacePressed: {
|
||||||
if (currentIndex == -1)
|
if (currentIndex == -1)
|
||||||
return
|
return
|
||||||
|
selectDstItem(currentItem)
|
||||||
dstpopup.close()
|
|
||||||
imageWriter.setDst(currentItem.device, currentItem.size)
|
|
||||||
dstbutton.text = currentItem.description
|
|
||||||
if (imageWriter.readyToWrite()) {
|
|
||||||
writebutton.enabled = true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Accessible.onPressAction: {
|
Accessible.onPressAction: {
|
||||||
if (currentIndex == -1)
|
if (currentIndex == -1)
|
||||||
return
|
return
|
||||||
|
selectDstItem(currentItem)
|
||||||
dstpopup.close()
|
|
||||||
imageWriter.setDst(currentItem.device, currentItem.size)
|
|
||||||
dstbutton.text = currentItem.description
|
|
||||||
if (imageWriter.readyToWrite()) {
|
|
||||||
writebutton.enabled = true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -694,10 +682,21 @@ ApplicationWindow {
|
||||||
verticalAlignment: Text.AlignVCenter
|
verticalAlignment: Text.AlignVCenter
|
||||||
font.family: roboto.name
|
font.family: roboto.name
|
||||||
text: {
|
text: {
|
||||||
var txt = "<p><font size='4'>"+description+" - "+(size/1000000000).toFixed(1)+" GB"+"</font></p>"
|
var sizeStr = (size/1000000000).toFixed(1)+" GB";
|
||||||
|
var txt;
|
||||||
|
if (isReadOnly) {
|
||||||
|
txt = "<p><font size='4' color='grey'>"+description+" - "+sizeStr+"</font></p>"
|
||||||
|
txt += "<font color='grey'>"
|
||||||
|
if (mountpoints.length > 0) {
|
||||||
|
txt += qsTr("Mounted as %1").arg(mountpoints.join(", "))+" "
|
||||||
|
}
|
||||||
|
txt += qsTr("[WRITE PROTECTED]")+"</font>"
|
||||||
|
} else {
|
||||||
|
txt = "<p><font size='4'>"+description+" - "+sizeStr+"</font></p>"
|
||||||
if (mountpoints.length > 0) {
|
if (mountpoints.length > 0) {
|
||||||
txt += "<font color='grey'>"+qsTr("Mounted as %1").arg(mountpoints.join(", "))+"</font>"
|
txt += "<font color='grey'>"+qsTr("Mounted as %1").arg(mountpoints.join(", "))+"</font>"
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return txt;
|
return txt;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -718,12 +717,7 @@ ApplicationWindow {
|
||||||
}
|
}
|
||||||
|
|
||||||
onClicked: {
|
onClicked: {
|
||||||
dstpopup.close()
|
selectDstItem(model)
|
||||||
imageWriter.setDst(device, size)
|
|
||||||
dstbutton.text = description
|
|
||||||
if (imageWriter.readyToWrite()) {
|
|
||||||
writebutton.enabled = true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -988,4 +982,18 @@ ApplicationWindow {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function selectDstItem(d) {
|
||||||
|
if (d.isReadOnly) {
|
||||||
|
onError(qsTr("SD card is write protected.<br>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
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue