File indexing completed on 2024-04-28 05:46:31
0001 /* 0002 SPDX-FileCopyrightText: 2010 Volker Lanz <vl@fidra.de> 0003 SPDX-FileCopyrightText: 2014-2020 Andrius Štikonas <andrius@stikonas.eu> 0004 0005 SPDX-License-Identifier: GPL-3.0-or-later 0006 */ 0007 0008 #include "gui/devicepropsdialog.h" 0009 #include "gui/devicepropswidget.h" 0010 0011 #include "gui/smartdialog.h" 0012 0013 #include <core/device.h> 0014 #include <core/diskdevice.h> 0015 #include <core/partitiontable.h> 0016 #include <core/smartstatus.h> 0017 0018 #include <util/capacity.h> 0019 #include <util/helpers.h> 0020 0021 #include <KConfigGroup> 0022 #include <KLocalizedString> 0023 #include <KSharedConfig> 0024 0025 #include <QDialogButtonBox> 0026 #include <QPointer> 0027 #include <QPushButton> 0028 #include <QStyle> 0029 0030 /** Creates a new DevicePropsDialog 0031 @param parent pointer to the parent widget 0032 @param d the Device to show properties for 0033 */ 0034 DevicePropsDialog::DevicePropsDialog(QWidget* parent, Device& d) : 0035 QDialog(parent), 0036 m_Device(d), 0037 m_DialogWidget(new DevicePropsWidget(this)) 0038 { 0039 mainLayout = new QVBoxLayout(this); 0040 setLayout(mainLayout); 0041 mainLayout->addWidget(&dialogWidget()); 0042 setWindowTitle(xi18nc("@title:window", "Device Properties: <filename>%1</filename>", device().deviceNode())); 0043 0044 setupDialog(); 0045 setupConnections(); 0046 0047 KConfigGroup kcg(KSharedConfig::openConfig(), QStringLiteral("devicePropsDialog")); 0048 restoreGeometry(kcg.readEntry<QByteArray>("Geometry", QByteArray())); 0049 0050 } 0051 0052 /** Destroys a DevicePropsDialog */ 0053 DevicePropsDialog::~DevicePropsDialog() 0054 { 0055 KConfigGroup kcg(KSharedConfig::openConfig(), QStringLiteral("devicePropsDialog")); 0056 kcg.writeEntry("Geometry", saveGeometry()); 0057 } 0058 0059 void DevicePropsDialog::setupDialog() 0060 { 0061 dialogButtonBox = new QDialogButtonBox; 0062 okButton = dialogButtonBox->addButton(QDialogButtonBox::Ok); 0063 cancelButton = dialogButtonBox->addButton(QDialogButtonBox::Cancel); 0064 mainLayout->addWidget(dialogButtonBox); 0065 okButton->setEnabled(false); 0066 cancelButton->setFocus(); 0067 cancelButton->setDefault(true); 0068 connect(dialogButtonBox, &QDialogButtonBox::accepted, this, &DevicePropsDialog::accept); 0069 connect(dialogButtonBox, &QDialogButtonBox::rejected, this, &DevicePropsDialog::reject); 0070 0071 QString type = QStringLiteral("---"); 0072 QString maxPrimaries = QStringLiteral("---"); 0073 0074 if (device().partitionTable() != nullptr) { 0075 type = (device().partitionTable()->isReadOnly()) 0076 ? xi18nc("@label device", "%1 (read only)", device().partitionTable()->typeName()) 0077 : device().partitionTable()->typeName(); 0078 maxPrimaries = QStringLiteral("%1/%2").arg(device().partitionTable()->numPrimaries()).arg(device().partitionTable()->maxPrimaries()); 0079 0080 dialogWidget().partTableWidget().setReadOnly(true); 0081 dialogWidget().partTableWidget().setPartitionTable(device().partitionTable()); 0082 0083 if (device().partitionTable()->type() == PartitionTable::msdos) 0084 dialogWidget().radioCylinderBased().setChecked(true); 0085 else if (device().partitionTable()->type() == PartitionTable::msdos_sectorbased) 0086 dialogWidget().radioSectorBased().setChecked(true); 0087 else 0088 dialogWidget().hideTypeRadioButtons(); 0089 } else { 0090 dialogWidget().partTableWidget().setVisible(false); 0091 dialogWidget().hideTypeRadioButtons(); 0092 } 0093 0094 dialogWidget().type().setText(type); 0095 dialogWidget().capacity().setText(Capacity::formatByteSize(device().capacity())); 0096 dialogWidget().totalSectors().setText(QLocale().toString(device().totalLogical())); 0097 0098 if (device().type() == Device::Type::Disk_Device) { 0099 0100 const DiskDevice& disk = dynamic_cast<const DiskDevice&>(device()); 0101 0102 dialogWidget().primariesMax().setText(maxPrimaries); 0103 dialogWidget().logicalSectorSize().setText(Capacity::formatByteSize(disk.logicalSectorSize())); 0104 dialogWidget().physicalSectorSize().setText(Capacity::formatByteSize(disk.physicalSectorSize())); 0105 if (device().smartStatus().isValid()) { 0106 if (device().smartStatus().status()) { 0107 dialogWidget().smartStatusText().setText(xi18nc("@label SMART disk status", "good")); 0108 dialogWidget().smartStatusIcon().setPixmap(QIcon::fromTheme(QStringLiteral("dialog-ok")) 0109 .pixmap(QApplication::style()->pixelMetric(QStyle::PixelMetric::PM_SmallIconSize))); 0110 0111 } else { 0112 dialogWidget().smartStatusText().setText(xi18nc("@label SMART disk status", "BAD")); 0113 dialogWidget().smartStatusIcon().setPixmap(QIcon::fromTheme(QStringLiteral("dialog-warning")) 0114 .pixmap(QApplication::style()->pixelMetric(QStyle::PixelMetric::PM_SmallIconSize))); 0115 } 0116 } else { 0117 dialogWidget().smartStatusText().setText(xi18nc("@label", "(unknown)")); 0118 dialogWidget().smartStatusIcon().setVisible(false); 0119 dialogWidget().buttonSmartMore().setVisible(false); 0120 } 0121 } else { 0122 if (device().type() == Device::Type::LVM_Device) 0123 dialogWidget().type().setText(xi18nc("@label device", "LVM Volume Group")); 0124 else if (device().type() == Device::Type::SoftwareRAID_Device) 0125 dialogWidget().type().setText(xi18nc("@label device", "Software RAID Device")); 0126 else 0127 dialogWidget().type().setText(xi18nc("@label device", "Volume Manager Device")); 0128 //TODO: add Volume Manger Device info 0129 dialogWidget().smartStatusText().setVisible(false); 0130 dialogWidget().smartStatusIcon().setVisible(false); 0131 dialogWidget().buttonSmartMore().setVisible(false); 0132 } 0133 0134 setMinimumSize(dialogWidget().size()); 0135 resize(dialogWidget().size()); 0136 } 0137 0138 void DevicePropsDialog::setupConnections() 0139 { 0140 connect(&dialogWidget().radioSectorBased(), &QRadioButton::toggled, this, &DevicePropsDialog::setDirty); 0141 connect(&dialogWidget().radioCylinderBased(), &QRadioButton::toggled, this, &DevicePropsDialog::setDirty); 0142 connect(&dialogWidget().buttonSmartMore(), &QPushButton::clicked, this, &DevicePropsDialog::onButtonSmartMore); 0143 } 0144 0145 void DevicePropsDialog::setDirty(bool) 0146 { 0147 okButton->setEnabled(true); 0148 okButton->setDefault(true); 0149 } 0150 0151 bool DevicePropsDialog::cylinderBasedAlignment() const 0152 { 0153 return dialogWidget().radioCylinderBased().isChecked(); 0154 } 0155 0156 bool DevicePropsDialog::sectorBasedAlignment() const 0157 { 0158 return dialogWidget().radioSectorBased().isChecked(); 0159 } 0160 0161 void DevicePropsDialog::onButtonSmartMore(bool) 0162 { 0163 QPointer<SmartDialog> dlg = new SmartDialog(this, device()); 0164 dlg->exec(); 0165 delete dlg; 0166 }