diff --git a/Modules/devinfo/devicelisting.cpp b/Modules/devinfo/devicelisting.cpp index b05c132..401e065 100644 --- a/Modules/devinfo/devicelisting.cpp +++ b/Modules/devinfo/devicelisting.cpp @@ -1,223 +1,224 @@ /* * devicelisting.cpp * * Copyright (C) 2009 David Hubner * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "devicelisting.h" #include DeviceListing::DeviceListing(QWidget *parent, InfoPanel *info, DevInfoPlugin *stat) : QTreeWidget(parent) , iPanel(info) , status(stat) { // // Check nic changes // nicSig = new NicSignals(); // connect(nicSig,SIGNAL(nicActivatedOrDisconnected()),this,SLOT(networkingChangedSlot())); // // Check if clicked connect(this, &DeviceListing::itemActivated, this, &DeviceListing::itemActivatedSlot); // Check if item is added connect(Solid::DeviceNotifier::instance(), &Solid::DeviceNotifier::deviceAdded, this, &DeviceListing::deviceAddedSlot); // Check if item is removed connect(Solid::DeviceNotifier::instance(), &Solid::DeviceNotifier::deviceRemoved, this, &DeviceListing::deviceRemovedSlot); setWhatsThis(i18nc("Device Listing Whats This", "Shows all the devices that are currently listed.")); createMenuActions(); setHeaderLabels(QStringList(i18n("Devices"))); populateListing(); + setSortingEnabled(true); } DeviceListing::~DeviceListing() { //delete nicSig; clear(); } void DeviceListing::createMenuActions() { colAct = new QAction(i18n("Collapse All"), this); connect(colAct, &QAction::triggered, this, &DeviceListing::collapseAllDevicesSlot); expAct = new QAction(i18n("Expand All"), this); connect(expAct, &QAction::triggered, this, &DeviceListing::expandAllDevicesSlot); allAct = new QAction(i18n("Show All Devices"), this); connect(allAct, &QAction::triggered, this, &DeviceListing::showAllDevicesSlot); relAct = new QAction(i18n("Show Relevant Devices"), this); connect(relAct, &QAction::triggered, this, &DeviceListing::showRelevantDevicesSlot); } void DeviceListing::contextMenuEvent(QContextMenuEvent *event) { QMenu menu(this); menu.addAction(colAct); menu.addAction(expAct); menu.addAction(allAct); menu.addAction(relAct); menu.exec(event->globalPos()); } QTreeWidgetItem *DeviceListing::createListItems(const Solid::DeviceInterface::Type &type) { switch (type) { case Solid::DeviceInterface::Processor: return new SolProcessorDevice(type); case Solid::DeviceInterface::StorageDrive: return new SolStorageDevice(type); case Solid::DeviceInterface::Camera: return new SolCameraDevice(type); case Solid::DeviceInterface::PortableMediaPlayer: return new SolMediaPlayerDevice(type); case Solid::DeviceInterface::Battery: return new SolBatteryDevice(type); default: return new SolDevice(type, i18nc("unknown device type", "Unknown")); } } void DeviceListing::populateListing(const show showStatus) { const Solid::DeviceInterface::Type needHardware[] = { Solid::DeviceInterface::Processor, Solid::DeviceInterface::StorageDrive, Solid::DeviceInterface::Battery, Solid::DeviceInterface::PortableMediaPlayer, Solid::DeviceInterface::Camera }; clear(); for (unsigned int i = 0; i < (sizeof(needHardware)/sizeof(Solid::DeviceInterface::Type)); i++) { QTreeWidgetItem *tmpDevice = createListItems(needHardware[i]); deviceMap[needHardware[i]] = static_cast(tmpDevice); if ((tmpDevice->childCount() > 0) || (showStatus == ALL)) { addTopLevelItem(tmpDevice); } } } void DeviceListing::itemActivatedSlot(QTreeWidgetItem *listItemIn, const int columnIn) { Q_UNUSED(columnIn); SolDevice *listItem = static_cast(listItemIn); if (listItem->isDeviceSet()) { iPanel->setTopInfo(listItem->deviceIcon(), listItem->device()); QVListLayout *bottomLay = listItem->infoPanelLayout(); if (!bottomLay) { return; } iPanel->setBottomInfo(bottomLay); } else { status->updateStatus(i18nc("no device UDI", "None")); } } void DeviceListing::deviceAddedSlot(const QString &udi) { SolidHelper *solhelp = new SolidHelper(); const QList list = Solid::Device::allDevices(); foreach (const Solid::Device &dev, list) { if (dev.udi() == udi) { Solid::DeviceInterface::Type deviceType = solhelp->deviceType(&dev); QTreeWidgetItem *parent = getTreeWidgetItemFromUdi(this, dev.parentUdi()); // Incase of bad index if (deviceMap[deviceType] == nullptr) { QTreeWidgetItem *topItem = topLevelItem(0); if (topItem == 0) { delete solhelp; return; } deviceMap[deviceType] = static_cast(topItem); } switch (deviceType) { case Solid::DeviceInterface::Processor: new SolProcessorDevice(deviceMap[deviceType], dev); break; case Solid::DeviceInterface::Camera: new SolCameraDevice(deviceMap[deviceType], dev); break; case Solid::DeviceInterface::PortableMediaPlayer: new SolMediaPlayerDevice(deviceMap[deviceType], dev); break; case Solid::DeviceInterface::Battery: new SolBatteryDevice(deviceMap[deviceType], dev); break; case Solid::DeviceInterface::StorageDrive: new SolStorageDevice(deviceMap[deviceType], dev, SolStorageDevice::NOCHILDREN); break; case Solid::DeviceInterface::StorageVolume: if (parent == nullptr) { break; } new SolVolumeDevice(parent, dev); break; default: break; } } } delete solhelp; } void DeviceListing::deviceRemovedSlot(const QString &udi) { const QTreeWidgetItem *item = getTreeWidgetItemFromUdi(this, udi); if (item == nullptr) { return; } delete item; } void DeviceListing::collapseAllDevicesSlot() { collapseAll(); } void DeviceListing::expandAllDevicesSlot() { expandAll(); } void DeviceListing::showAllDevicesSlot() { populateListing(ALL); } void DeviceListing::showRelevantDevicesSlot() { populateListing(RELEVANT); } diff --git a/Modules/devinfo/soldevice.cpp b/Modules/devinfo/soldevice.cpp index d7c0cd4..1b91129 100644 --- a/Modules/devinfo/soldevice.cpp +++ b/Modules/devinfo/soldevice.cpp @@ -1,155 +1,180 @@ /* * soldevice.cpp * * Copyright (C) 2009 David Hubner * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "soldevice.h" #include // Con SolDevice::SolDevice(const Solid::DeviceInterface::Type &type) : QTreeWidgetItem() , deviceSet(false) { deviceTypeHolder = type; setText(0, Solid::DeviceInterface::typeToString(type)); } SolDevice::SolDevice(QTreeWidgetItem *parent) : QTreeWidgetItem(parent) , deviceSet(false) { deviceTypeHolder = Solid::DeviceInterface::Unknown; } SolDevice::SolDevice(const Solid::DeviceInterface::Type &type, const QString &typeName) : QTreeWidgetItem() , deviceSet(false) { deviceTypeHolder = type; setText(0, typeName); setDefaultListing(type); } SolDevice::SolDevice(QTreeWidgetItem *parent, const Solid::Device &device) : QTreeWidgetItem(parent) , tiedDevice(device) { deviceTypeHolder = Solid::DeviceInterface::Unknown; deviceSet = device.isValid(); setDefaultDeviceText(); setDefaultDeviceIcon(); setDefaultDeviceToolTip(); } //Sets void SolDevice::setDefaultListing(const Solid::DeviceInterface::Type &type) { createDeviceChildren(this, QString(), type); } void SolDevice::setDefaultDeviceText() { QString ddtString = i18nc("unknown device", "Unknown"); if (deviceSet) { ddtString = tiedDevice.product(); if (tiedDevice.isDeviceInterface(Solid::DeviceInterface::StorageVolume) || tiedDevice.isDeviceInterface(Solid::DeviceInterface::Battery)) { QString label = SolDevice::udi().section(QStringLiteral("/"), -1, -1); if (!label.isEmpty()) { ddtString = label; } } } setText(0, ddtString); } void SolDevice::setDefaultDeviceIcon() { QIcon ddiString = QIcon::fromTheme(QStringLiteral("kde")); if (deviceSet) { ddiString = QIcon(tiedDevice.icon()); } setDeviceIcon(ddiString); } void SolDevice::setDefaultDeviceToolTip() { QString ddttString = i18nc("Default device tooltip", "A Device"); if (deviceSet) { ddttString = tiedDevice.description(); } setDeviceToolTip(ddttString); } void SolDevice::setDeviceIcon(const QIcon &icon) { setIcon(0, icon); } void SolDevice::setDeviceText(const QString &text) { setText(0, text); } void SolDevice::setDeviceToolTip(const QString &toolTipText) { setToolTip(0, toolTipText); } // Gets QVListLayout *SolDevice::infoPanelLayout() { deviceInfoLayout = new QVListLayout(); return deviceInfoLayout; } QIcon SolDevice::deviceIcon() const { return icon(0); } Solid::DeviceInterface::Type SolDevice::deviceType() const { return deviceTypeHolder; } Solid::Device *SolDevice::device() { return &tiedDevice; } QString SolDevice::udi() const { return tiedDevice.udi(); } // Is bool SolDevice::isDeviceSet() { return deviceSet; } + +bool SolDevice::operator< ( const QTreeWidgetItem & other ) const +{ + const SolDevice * otherDevice = dynamic_cast(&other); + if (otherDevice) { + if (deviceType() != otherDevice->deviceType()) { + return deviceType() < otherDevice->deviceType(); + } + switch (deviceType()) { + case Solid::DeviceInterface::Processor: { + const Solid::Processor *left = tiedDevice.as(); + const Solid::Processor *right = otherDevice->tiedDevice.as(); + // Processors are sorted in ascending order, so this is reversed + return left->number() > right->number(); + } + case Solid::DeviceInterface::StorageVolume: { + // Storage volumes are sorted in ascending order (i.e. sda, sda1, sda2...) + return text(0) > other.text(0); + } + default: + break; + } + } + return text(0) < other.text(0); +} diff --git a/Modules/devinfo/soldevice.h b/Modules/devinfo/soldevice.h index ebd2769..78ae77a 100644 --- a/Modules/devinfo/soldevice.h +++ b/Modules/devinfo/soldevice.h @@ -1,126 +1,127 @@ /* * soldevice.h * * Copyright (C) 2009 David Hubner * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef SOLDEVICE #define SOLDEVICE //QT #include #include #include //Solid #include #include #include #include #include #include #include #include #include #include //KDE // Local #include "qvlistlayout.h" class QVListLayout; class SolDevice : public QTreeWidgetItem { public: SolDevice(const Solid::DeviceInterface::Type &); SolDevice(const Solid::DeviceInterface::Type &, const QString &); SolDevice(QTreeWidgetItem *); SolDevice(QTreeWidgetItem *, const Solid::Device &); QIcon deviceIcon() const; Solid::Device *device(); Solid::DeviceInterface::Type deviceType() const; template const IFace *interface() { if (deviceSet) { IFace *dev = tiedDevice.as(); if (!dev) { qDebug() << "Device unable to be cast to correct device"; } return dev; } else { return nullptr; } } template const IFace *interface(const Solid::Device &device) { IFace *dev = device.as(); if (!dev) { qDebug() << "Device unable to be cast to correct device"; } return dev; } template void createDeviceChildren( QTreeWidgetItem *treeParent, const QString &parentUid, const Solid::DeviceInterface::Type &type) { const QList list = Solid::Device::listFromType(type, parentUid); foreach (const Solid::Device &dev, list) { new IFace(treeParent, dev); } } void setDeviceIcon(const QIcon &); void setDeviceToolTip(const QString &); virtual QVListLayout *infoPanelLayout(); virtual void addItem(const Solid::Device &dev) { new SolDevice(this, dev); } virtual void refreshName() { setDefaultDeviceText(); } QString udi() const; bool isDeviceSet(); + bool operator< (const QTreeWidgetItem & other) const; protected: void setDeviceText(const QString &); virtual void setDefaultDeviceToolTip(); virtual void setDefaultDeviceText(); virtual void setDefaultDeviceIcon(); virtual void setDefaultListing(const Solid::DeviceInterface::Type &); bool deviceSet; QVListLayout *deviceInfoLayout; Solid::DeviceInterface::Type deviceTypeHolder; Solid::Device tiedDevice; }; #endif //SOLDEVICE