File indexing completed on 2024-05-19 16:31:58
0001 /* 0002 * SPDX-FileCopyrightText: 2009 David Hubner <hubnerd@ntlworld.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 * 0006 */ 0007 0008 #include "soldevicetypes.h" 0009 0010 #include <solid/battery.h> 0011 #include <solid/camera.h> 0012 #include <solid/deviceinterface.h> 0013 #include <solid/portablemediaplayer.h> 0014 #include <solid/processor.h> 0015 #include <solid/storageaccess.h> 0016 #include <solid/storagedrive.h> 0017 #include <solid/storagevolume.h> 0018 0019 #include <QProgressBar> 0020 #include <QStorageInfo> 0021 0022 // kde 0023 #include <KCapacityBar> 0024 #include <KFormat> 0025 0026 #include "qvlistlayout.h" 0027 0028 // ---- Processor 0029 0030 SolProcessorDevice::SolProcessorDevice(QTreeWidgetItem *parent, const Solid::Device &device) 0031 : SolDevice(parent, device) 0032 { 0033 deviceTypeHolder = Solid::DeviceInterface::Processor; 0034 setDefaultDeviceText(); 0035 } 0036 0037 SolProcessorDevice::SolProcessorDevice(const Solid::DeviceInterface::Type &type) 0038 : SolDevice(type) 0039 { 0040 deviceTypeHolder = Solid::DeviceInterface::Processor; 0041 0042 setDeviceIcon(QIcon::fromTheme(QStringLiteral("cpu"))); 0043 setDeviceText(i18n("Processors")); 0044 setDefaultListing(type); 0045 } 0046 0047 void SolProcessorDevice::setDefaultListing(const Solid::DeviceInterface::Type &type) 0048 { 0049 createDeviceChildren<SolProcessorDevice>(this, QString(), type); 0050 } 0051 0052 void SolProcessorDevice::setDefaultDeviceText() 0053 { 0054 const Solid::Processor *prodev = interface<const Solid::Processor>(); 0055 0056 if (!prodev) { 0057 return; 0058 } 0059 setText(0, i18n("Processor %1", QString::number(prodev->number()))); 0060 } 0061 0062 QVListLayout *SolProcessorDevice::infoPanelLayout() 0063 { 0064 QStringList labels; 0065 const Solid::Processor *prodev = interface<const Solid::Processor>(); 0066 0067 if (!prodev) { 0068 return nullptr; 0069 } 0070 deviceInfoLayout = new QVListLayout(); 0071 0072 QStringList extensions; 0073 const Solid::Processor::InstructionSets insSets = prodev->instructionSets(); 0074 0075 if (insSets & Solid::Processor::IntelMmx) { 0076 extensions << i18n("Intel MMX"); 0077 } 0078 if (insSets & Solid::Processor::IntelSse) { 0079 extensions << i18n("Intel SSE"); 0080 } 0081 if (insSets & Solid::Processor::IntelSse2) { 0082 extensions << i18n("Intel SSE2"); 0083 } 0084 if (insSets & Solid::Processor::IntelSse3) { 0085 extensions << i18n("Intel SSE3"); 0086 } 0087 if (insSets & Solid::Processor::IntelSsse3) { 0088 extensions << i18n("Intel SSSE3"); 0089 } 0090 if (insSets & Solid::Processor::IntelSse41) { 0091 extensions << i18n("Intel SSE4.1"); 0092 } 0093 if (insSets & Solid::Processor::IntelSse42) { 0094 extensions << i18n("Intel SSE4.2"); 0095 } 0096 if (insSets & Solid::Processor::Amd3DNow) { 0097 extensions << i18n("AMD 3DNow!"); 0098 } 0099 if (insSets & Solid::Processor::AltiVec) { 0100 extensions << i18n("ATI IVEC"); 0101 } 0102 if (extensions.isEmpty()) { 0103 extensions << i18nc("no instruction set extensions", "None"); 0104 } 0105 0106 labels << i18n("Processor Number: ") << InfoPanel::friendlyString(QString::number(prodev->number())) << i18n("Max Speed: ") 0107 << InfoPanel::friendlyString(QString::number(prodev->maxSpeed())) << i18n("Supported Instruction Sets: ") << extensions.join(QLatin1String("\n")); 0108 0109 deviceInfoLayout->applyQListToLayout(labels); 0110 return deviceInfoLayout; 0111 } 0112 0113 // ---- Storage 0114 0115 SolStorageDevice::SolStorageDevice(QTreeWidgetItem *parent, const Solid::Device &device, const storageChildren &c) 0116 : SolDevice(parent, device) 0117 { 0118 deviceTypeHolder = Solid::DeviceInterface::StorageDrive; 0119 setDefaultDeviceText(); 0120 0121 if (c == CREATECHILDREN) { 0122 createDeviceChildren<SolVolumeDevice>(this, device.udi(), Solid::DeviceInterface::StorageVolume); 0123 } 0124 } 0125 0126 SolStorageDevice::SolStorageDevice(const Solid::DeviceInterface::Type &type) 0127 : SolDevice(type) 0128 { 0129 deviceTypeHolder = Solid::DeviceInterface::StorageDrive; 0130 0131 setDeviceIcon(QIcon::fromTheme(QStringLiteral("drive-harddisk"))); 0132 setDeviceText(i18n("Storage Drives")); 0133 setDefaultListing(type); 0134 } 0135 0136 void SolStorageDevice::setDefaultListing(const Solid::DeviceInterface::Type &type) 0137 { 0138 createDeviceChildren<SolStorageDevice>(this, QString(), type); 0139 } 0140 0141 void SolStorageDevice::setDefaultDeviceText() 0142 { 0143 const Solid::StorageDrive *stodev = interface<const Solid::StorageDrive>(); 0144 if (!stodev) { 0145 return; 0146 } 0147 0148 QString storageType; 0149 switch (stodev->driveType()) { 0150 case Solid::StorageDrive::HardDisk: 0151 storageType = i18n("Hard Disk Drive"); 0152 break; 0153 case Solid::StorageDrive::CompactFlash: 0154 storageType = i18n("Compact Flash Reader"); 0155 break; 0156 case Solid::StorageDrive::SmartMedia: 0157 storageType = i18n("Smart Media Reader"); 0158 break; 0159 case Solid::StorageDrive::SdMmc: 0160 storageType = i18n("SD/MMC Reader"); 0161 break; 0162 case Solid::StorageDrive::CdromDrive: 0163 storageType = i18n("Optical Drive"); 0164 break; 0165 case Solid::StorageDrive::MemoryStick: 0166 storageType = i18n("Memory Stick Reader"); 0167 break; 0168 case Solid::StorageDrive::Xd: 0169 storageType = i18n("xD Reader"); 0170 break; 0171 default: 0172 storageType = i18n("Unknown Drive"); 0173 } 0174 0175 QString deviceText = storageType; 0176 setDeviceText(deviceText); 0177 } 0178 0179 QVListLayout *SolStorageDevice::infoPanelLayout() 0180 { 0181 QStringList labels; 0182 const Solid::StorageDrive *stodev = interface<const Solid::StorageDrive>(); 0183 0184 if (!stodev) { 0185 return nullptr; 0186 } 0187 deviceInfoLayout = new QVListLayout(); 0188 0189 QString bus; 0190 switch (stodev->bus()) { 0191 case Solid::StorageDrive::Ide: 0192 bus = i18n("IDE"); 0193 break; 0194 case Solid::StorageDrive::Usb: 0195 bus = i18n("USB"); 0196 break; 0197 case Solid::StorageDrive::Ieee1394: 0198 bus = i18n("IEEE1394"); 0199 break; 0200 case Solid::StorageDrive::Scsi: 0201 bus = i18n("SCSI"); 0202 break; 0203 case Solid::StorageDrive::Sata: 0204 bus = i18n("SATA"); 0205 break; 0206 case Solid::StorageDrive::Platform: 0207 bus = i18nc("platform storage bus", "Platform"); 0208 break; 0209 default: 0210 bus = i18nc("unknown storage bus", "Unknown"); 0211 } 0212 0213 labels << i18n("Bus: ") << bus << i18n("Hotpluggable?") << InfoPanel::convertTf(stodev->isHotpluggable()) << i18n("Removable?") 0214 << InfoPanel::convertTf(stodev->isRemovable()); 0215 0216 deviceInfoLayout->applyQListToLayout(labels); 0217 return deviceInfoLayout; 0218 } 0219 0220 // ---- Volume 0221 0222 SolVolumeDevice::SolVolumeDevice(QTreeWidgetItem *parent, const Solid::Device &device) 0223 : SolDevice(parent, device) 0224 { 0225 deviceTypeHolder = Solid::DeviceInterface::StorageVolume; 0226 } 0227 0228 SolVolumeDevice::SolVolumeDevice(const Solid::DeviceInterface::Type &type) 0229 : SolDevice(type) 0230 { 0231 deviceTypeHolder = Solid::DeviceInterface::StorageVolume; 0232 0233 setDefaultListing(type); 0234 } 0235 0236 void SolVolumeDevice::setDefaultListing(const Solid::DeviceInterface::Type &type) 0237 { 0238 createDeviceChildren<SolVolumeDevice>(this, QString(), type); 0239 } 0240 0241 QVListLayout *SolVolumeDevice::infoPanelLayout() 0242 { 0243 QStringList labels; 0244 KCapacityBar *usageBar = nullptr; 0245 0246 const Solid::StorageVolume *voldev = interface<const Solid::StorageVolume>(); 0247 const Solid::StorageAccess *accdev = interface<const Solid::StorageAccess>(); 0248 0249 if (!voldev) { 0250 return nullptr; 0251 } 0252 deviceInfoLayout = new QVListLayout(); 0253 0254 QString usage; 0255 switch (voldev->usage()) { 0256 case Solid::StorageVolume::Unused: 0257 usage = i18n("Unused"); 0258 break; 0259 case Solid::StorageVolume::FileSystem: 0260 usage = i18n("File System"); 0261 break; 0262 case Solid::StorageVolume::PartitionTable: 0263 usage = i18n("Partition Table"); 0264 break; 0265 case Solid::StorageVolume::Raid: 0266 usage = i18n("Raid"); 0267 break; 0268 case Solid::StorageVolume::Encrypted: 0269 usage = i18n("Encrypted"); 0270 break; 0271 default: 0272 usage = i18nc("unknown volume usage", "Unknown"); 0273 } 0274 0275 labels << i18n("File System Type: ") << InfoPanel::friendlyString(voldev->fsType()) << i18n("Label: ") 0276 << InfoPanel::friendlyString(voldev->label(), i18n("Not Set")) << i18n("Volume Usage: ") << usage << i18n("UUID: ") 0277 << InfoPanel::friendlyString(voldev->uuid()); 0278 0279 if (accdev) { 0280 const QString mountPoint = accdev->filePath(); 0281 0282 labels << QStringLiteral("--") << i18n("Mounted At: ") << InfoPanel::friendlyString(mountPoint, i18n("Not Mounted")); 0283 0284 if (!mountPoint.isEmpty()) { 0285 QStorageInfo storageInfo(mountPoint); 0286 0287 labels << i18n("Volume Space:"); 0288 0289 usageBar = new KCapacityBar(); 0290 qint64 size = 0; 0291 if (storageInfo.isValid() && storageInfo.isReady() && (size = storageInfo.bytesTotal()) > 0) { 0292 const auto freeSpace = storageInfo.bytesFree(); 0293 const auto usedSpace = size - freeSpace; 0294 const auto usedPercent = static_cast<int>((usedSpace * 100) / size); 0295 usageBar->setValue(usedPercent); 0296 usageBar->setText(i18nc("Available space out of total partition size (percent used)", 0297 "%1 free of %2 (%3% used)", 0298 KFormat().formatByteSize(freeSpace), 0299 KFormat().formatByteSize(size), 0300 usedPercent)); 0301 } else { 0302 usageBar->setValue(0); 0303 usageBar->setText(i18n("No data available")); 0304 } 0305 } 0306 } 0307 0308 deviceInfoLayout->applyQListToLayout(labels); 0309 if (usageBar) { 0310 deviceInfoLayout->addWidget(usageBar); 0311 } 0312 0313 return deviceInfoLayout; 0314 } 0315 0316 // Media Player 0317 0318 SolMediaPlayerDevice::SolMediaPlayerDevice(QTreeWidgetItem *parent, const Solid::Device &device) 0319 : SolDevice(parent, device) 0320 { 0321 deviceTypeHolder = Solid::DeviceInterface::PortableMediaPlayer; 0322 } 0323 0324 SolMediaPlayerDevice::SolMediaPlayerDevice(const Solid::DeviceInterface::Type &type) 0325 : SolDevice(type) 0326 { 0327 deviceTypeHolder = Solid::DeviceInterface::PortableMediaPlayer; 0328 0329 setDeviceIcon(QIcon::fromTheme(QStringLiteral("multimedia-player"))); 0330 setDeviceText(i18n("Multimedia Players")); 0331 setDefaultListing(type); 0332 } 0333 0334 void SolMediaPlayerDevice::setDefaultListing(const Solid::DeviceInterface::Type &type) 0335 { 0336 createDeviceChildren<SolMediaPlayerDevice>(this, QString(), type); 0337 } 0338 0339 QVListLayout *SolMediaPlayerDevice::infoPanelLayout() 0340 { 0341 QStringList labels; 0342 const Solid::PortableMediaPlayer *mpdev = interface<const Solid::PortableMediaPlayer>(); 0343 0344 if (!mpdev) { 0345 return nullptr; 0346 } 0347 deviceInfoLayout = new QVListLayout(); 0348 0349 labels << i18n("Supported Drivers: ") << mpdev->supportedDrivers() << i18n("Supported Protocols: ") << mpdev->supportedProtocols(); 0350 0351 deviceInfoLayout->applyQListToLayout(labels); 0352 return deviceInfoLayout; 0353 } 0354 0355 // Camera 0356 0357 SolCameraDevice::SolCameraDevice(QTreeWidgetItem *parent, const Solid::Device &device) 0358 : SolDevice(parent, device) 0359 { 0360 deviceTypeHolder = Solid::DeviceInterface::Camera; 0361 } 0362 0363 SolCameraDevice::SolCameraDevice(const Solid::DeviceInterface::Type &type) 0364 : SolDevice(type) 0365 { 0366 deviceTypeHolder = Solid::DeviceInterface::Camera; 0367 0368 setDeviceIcon(QIcon::fromTheme(QStringLiteral("camera-web"))); 0369 setDeviceText(i18n("Cameras")); 0370 setDefaultListing(type); 0371 } 0372 0373 void SolCameraDevice::setDefaultListing(const Solid::DeviceInterface::Type &type) 0374 { 0375 createDeviceChildren<SolCameraDevice>(this, QString(), type); 0376 } 0377 0378 QVListLayout *SolCameraDevice::infoPanelLayout() 0379 { 0380 QStringList labels; 0381 const Solid::Camera *camdev = interface<const Solid::Camera>(); 0382 0383 if (!camdev) { 0384 return nullptr; 0385 } 0386 deviceInfoLayout = new QVListLayout(); 0387 0388 labels << i18n("Supported Drivers: ") << camdev->supportedDrivers() << i18n("Supported Protocols: ") << camdev->supportedProtocols(); 0389 0390 deviceInfoLayout->applyQListToLayout(labels); 0391 return deviceInfoLayout; 0392 } 0393 0394 // Battery 0395 0396 SolBatteryDevice::SolBatteryDevice(QTreeWidgetItem *parent, const Solid::Device &device) 0397 : SolDevice(parent, device) 0398 { 0399 deviceTypeHolder = Solid::DeviceInterface::Battery; 0400 } 0401 0402 SolBatteryDevice::SolBatteryDevice(const Solid::DeviceInterface::Type &type) 0403 : SolDevice(type) 0404 { 0405 deviceTypeHolder = Solid::DeviceInterface::Battery; 0406 0407 setDeviceIcon(QIcon::fromTheme(QStringLiteral("battery"))); 0408 setDeviceText(i18n("Batteries")); 0409 setDefaultListing(type); 0410 } 0411 0412 void SolBatteryDevice::setDefaultListing(const Solid::DeviceInterface::Type &type) 0413 { 0414 createDeviceChildren<SolBatteryDevice>(this, QString(), type); 0415 } 0416 0417 QVListLayout *SolBatteryDevice::infoPanelLayout() 0418 { 0419 QStringList labels; 0420 const Solid::Battery *batdev = interface<const Solid::Battery>(); 0421 0422 if (!batdev) { 0423 return nullptr; 0424 } 0425 deviceInfoLayout = new QVListLayout(); 0426 0427 QString type; 0428 switch (batdev->type()) { 0429 case Solid::Battery::PdaBattery: 0430 type = i18n("PDA"); 0431 break; 0432 case Solid::Battery::UpsBattery: 0433 type = i18n("UPS"); 0434 break; 0435 case Solid::Battery::PrimaryBattery: 0436 type = i18n("Primary"); 0437 break; 0438 case Solid::Battery::MouseBattery: 0439 type = i18n("Mouse"); 0440 break; 0441 case Solid::Battery::KeyboardBattery: 0442 type = i18n("Keyboard"); 0443 break; 0444 case Solid::Battery::KeyboardMouseBattery: 0445 type = i18n("Keyboard + Mouse"); 0446 break; 0447 case Solid::Battery::CameraBattery: 0448 type = i18n("Camera"); 0449 break; 0450 case Solid::Battery::PhoneBattery: 0451 type = i18n("Phone"); 0452 break; 0453 case Solid::Battery::MonitorBattery: 0454 type = i18nc("Screen", "Monitor"); 0455 break; 0456 case Solid::Battery::GamingInputBattery: 0457 type = i18nc("Wireless game pad or joystick battery", "Gaming Input"); 0458 break; 0459 default: 0460 type = i18nc("unknown battery type", "Unknown"); 0461 } 0462 0463 QString state; 0464 switch (batdev->chargeState()) { 0465 case Solid::Battery::Charging: 0466 state = i18n("Charging"); 0467 break; 0468 case Solid::Battery::Discharging: 0469 state = i18n("Discharging"); 0470 break; 0471 case Solid::Battery::FullyCharged: 0472 state = i18n("Fully Charged"); 0473 break; 0474 default: 0475 state = i18n("No Charge"); 0476 } 0477 0478 labels << i18n("Battery Type: ") << type << i18n("Charge Status: ") << state << i18n("Charge Percent: "); 0479 0480 deviceInfoLayout->applyQListToLayout(labels); 0481 0482 QProgressBar *chargePercent = new QProgressBar(); 0483 chargePercent->setMaximum(100); 0484 chargePercent->setValue(batdev->chargePercent()); 0485 chargePercent->setEnabled(batdev->isPresent()); 0486 0487 deviceInfoLayout->addWidget(chargePercent); 0488 0489 return deviceInfoLayout; 0490 }