From d196e674e10dc2a2d353cfcc3cdabf03d029eea5 Mon Sep 17 00:00:00 2001 From: Michele Calgaro Date: Tue, 7 Feb 2023 17:08:23 +0900 Subject: hwmanager: add LMB menu based on storage devices. Signed-off-by: Michele Calgaro --- kcontrol/hwmanager/hwdevicetray.cpp | 200 +++++++++++++++++++++++++++--------- 1 file changed, 153 insertions(+), 47 deletions(-) (limited to 'kcontrol/hwmanager/hwdevicetray.cpp') diff --git a/kcontrol/hwmanager/hwdevicetray.cpp b/kcontrol/hwmanager/hwdevicetray.cpp index f76acd033..d48738256 100644 --- a/kcontrol/hwmanager/hwdevicetray.cpp +++ b/kcontrol/hwmanager/hwdevicetray.cpp @@ -54,11 +54,16 @@ #include "hwdevicetray_configdialog.h" -// Storage Device Action Type -// use 'int' as underlying type to avoid exposing a bunch of unnecessary -// enums/structs in the class header file private methods' signature +#include +using namespace std; + +map m = {{1, 'a'}, {3, 'b'}, {5, 'c'}, {7, 'd'}}; + +// Storage Device Action namespace SDActions { + // use 'int' as underlying type to avoid exposing a bunch of unnecessary + // enums/structs in the class header file private methods' signature enum Type : int { Open = 1, @@ -71,8 +76,31 @@ namespace SDActions Properties }; + struct Details + { + const char *iconName; + const char *actionName; + const char *collectionName; + }; + // Allows to use a for loop to iterate over all action types static const Type All[] = { Open, Mount, Unmount, Unlock, Lock, Eject, SafeRemove, Properties }; + + static const TQMap populateMap() + { + TQMap map; + map[Open] = { "window-new", I18N_NOOP("Open"), "open_menu" }; + map[Mount] = { "drive-harddisk-mounted", I18N_NOOP("Mount"), "mount_menu" }; + map[Unmount] = { "drive-harddisk-unmounted", I18N_NOOP("Unmount"), "unmount_menu" }; + map[Unlock] = { "decrypted", I18N_NOOP("Unlock"), "unlock_menu" }; + map[Lock] = { "encrypted", I18N_NOOP("Lock"), "lock_menu" }; + map[Eject] = { "player_eject", I18N_NOOP("Eject"), "eject_menu" }; + map[SafeRemove] = { "player_safe_removal", I18N_NOOP("Safe remove"), "safe_remove_menu" }; + map[Properties] = { "edit", I18N_NOOP("Properties"), "properties_menu" }; + return map; + } + + static const TQMap Data = populateMap(); } // Storage Device Action Menu Entry, representing an action @@ -106,11 +134,11 @@ public: TDEAction *m_quitAction; TDEAction *m_shortcutKeysAction; KHelpMenu *m_helpMenu; + TDEPopupMenu *m_LMBMenu; TDEPopupMenu *m_RMBMenu; - int m_menuEntryIdx; TQMap m_actionMenuEntryMap; - TQMap m_RMBActionMap; + TQMap m_RMBActionMenuMap; TQMap m_knownDiskDevices; @@ -125,7 +153,7 @@ HwDeviceSystemTray::HwDeviceSystemTray(TQWidget *parent, const char *name) d->m_hardwareNotifierContainer = new TDEPassivePopupStackContainer(); connect(d->m_hardwareNotifierContainer, TQT_SIGNAL(popupClicked(KPassivePopup*, TQPoint, TQString)), this, TQT_SLOT(devicePopupClicked(KPassivePopup*, TQPoint, TQString))); - InitRMBMenu(); + initMenus(); setPixmap(KSystemTray::loadIcon("hwinfo")); setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); @@ -200,7 +228,8 @@ void HwDeviceSystemTray::mousePressEvent(TQMouseEvent* e) switch (e->button()) { case Qt::LeftButton: - + populateLMBMenu(); + d->m_LMBMenu->popup(e->globalPos()); break; case Qt::MidButton: @@ -259,31 +288,18 @@ bool HwDeviceSystemTray::isMonitoredDevice(TDEStorageDevice* sdevice) sdevice->isDiskOfType(TDEDiskDeviceType::Camera))); } -void HwDeviceSystemTray::configChanged() { - // -} - -void HwDeviceSystemTray::InitRMBMenu() +void HwDeviceSystemTray::initMenus() { + // RMB menu d->m_RMBMenu = contextMenu(); // Device actions - d->m_RMBActionMap.insert(SDActions::Open, new TDEActionMenu(i18n("Open"), - SmallIcon("window-new", TQIconSet::Automatic), actionCollection(), "open_menu")); - d->m_RMBActionMap.insert(SDActions::Mount, new TDEActionMenu(i18n("Mount"), - SmallIcon("drive-harddisk-mounted", TQIconSet::Automatic), actionCollection(), "mount_menu")); - d->m_RMBActionMap.insert(SDActions::Unmount, new TDEActionMenu(i18n("Unmount"), - SmallIcon("drive-harddisk-unmounted", TQIconSet::Automatic), actionCollection(), "unmount_menu")); - d->m_RMBActionMap.insert(SDActions::Unlock, new TDEActionMenu(i18n("Unlock"), - SmallIcon("decrypted", TQIconSet::Automatic), actionCollection(), "unlock_menu")); - d->m_RMBActionMap.insert(SDActions::Lock, new TDEActionMenu(i18n("Lock"), - SmallIcon("encrypted", TQIconSet::Automatic), actionCollection(), "lock_menu")); - d->m_RMBActionMap.insert(SDActions::Eject, new TDEActionMenu(i18n("Eject"), - SmallIcon("player_eject", TQIconSet::Automatic), actionCollection(), "eject_menu")); - d->m_RMBActionMap.insert(SDActions::SafeRemove, new TDEActionMenu(i18n("Safe remove"), - SmallIcon("player_safe_removal", TQIconSet::Automatic), actionCollection(), "safe_remove_menu")); - d->m_RMBActionMap.insert(SDActions::Properties, new TDEActionMenu(i18n("Properties"), - SmallIcon("edit", TQIconSet::Automatic), actionCollection(), "properties_menu")); + for (const SDActions::Type &actionType : SDActions::All) + { + SDActions::Details ad = SDActions::Data[actionType]; + d->m_RMBActionMenuMap.insert(actionType, new TDEActionMenu(i18n(ad.actionName), + SmallIcon(ad.iconName, TQIconSet::Automatic), actionCollection(), ad.collectionName)); + } // Global Configuration d->m_deviceManagerAction = new TDEAction(i18n("Show Device Manager..."), SmallIconSet("kcmpci"), @@ -295,19 +311,38 @@ void HwDeviceSystemTray::InitRMBMenu() d->m_helpMenu = new KHelpMenu(this, TDEGlobal::instance()->aboutData(), false, actionCollection()); d->m_helpMenu->menu()->connectItem(KHelpMenu::menuHelpContents, this, TQT_SLOT(slotHelpContents())); d->m_quitAction = actionCollection()->action(KStdAction::name(KStdAction::Quit)); + + // LMB menu + d->m_LMBMenu = new TDEPopupMenu(this); } -void HwDeviceSystemTray::AddDeviceToRMBMenu(TDEStorageDevice *sdevice, const int type) +void HwDeviceSystemTray::AddDeviceToLMBMenu(TDEStorageDevice *sdevice, const int type, + TDEActionMenu *actionMenu, int &actionMenuIdx) { - TQString friendlyName = !sdevice->diskLabel().isEmpty() ? sdevice->diskLabel() : sdevice->friendlyName(); + TQString friendlyName = !sdevice->diskLabel().isEmpty() ? + sdevice->diskLabel() : sdevice->friendlyName(); TQString uuid = !sdevice->diskUUID().isEmpty() ? sdevice->diskUUID() : sdevice->systemPath(); SDActions::Type actionType = (SDActions::Type)type; - TDEActionMenu *actionMenu = d->m_RMBActionMap[actionType]; + SDActions::Details ad = SDActions::Data[actionType]; + actionMenu->popupMenu()->insertItem(SmallIcon(ad.iconName), i18n(ad.actionName), actionMenuIdx); + actionMenu->popupMenu()->connectItem(actionMenuIdx, this, + TQT_SLOT(slotExecuteDeviceAction(int))); + d->m_actionMenuEntryMap[actionMenuIdx++] = { actionType, uuid }; +} + +void HwDeviceSystemTray::AddDeviceToRMBMenu(TDEStorageDevice *sdevice, const int type, int &actionMenuIdx) +{ + TQString friendlyName = !sdevice->diskLabel().isEmpty() ? + sdevice->diskLabel() : sdevice->friendlyName(); + TQString uuid = !sdevice->diskUUID().isEmpty() ? sdevice->diskUUID() : sdevice->systemPath(); + SDActions::Type actionType = (SDActions::Type)type; + TDEActionMenu *actionMenu = d->m_RMBActionMenuMap[actionType]; actionMenu->popupMenu()->insertItem(sdevice->icon(TDEIcon::SizeSmall), - i18n("%1 (%2)").arg(friendlyName, sdevice->deviceNode()), d->m_menuEntryIdx); - actionMenu->popupMenu()->connectItem(d->m_menuEntryIdx, this, TQT_SLOT(slotExecuteDeviceAction(int))); + i18n("%1 (%2)").arg(friendlyName, sdevice->deviceNode()), actionMenuIdx); + actionMenu->popupMenu()->connectItem(actionMenuIdx, this, + TQT_SLOT(slotExecuteDeviceAction(int))); actionMenu->setEnabled(true); - d->m_actionMenuEntryMap[d->m_menuEntryIdx++] = { actionType, uuid }; + d->m_actionMenuEntryMap[actionMenuIdx++] = { actionType, uuid }; } void HwDeviceSystemTray::contextMenuAboutToShow(TDEPopupMenu *menu) @@ -317,14 +352,14 @@ void HwDeviceSystemTray::contextMenuAboutToShow(TDEPopupMenu *menu) for (const SDActions::Type &actionType : SDActions::All) { - TDEActionMenu *actionMenu = d->m_RMBActionMap[actionType]; + TDEActionMenu *actionMenu = d->m_RMBActionMenuMap[actionType]; actionMenu->popupMenu()->clear(); actionMenu->setEnabled(false); actionMenu->unplug(d->m_RMBMenu); } d->m_actionMenuEntryMap.clear(); - d->m_menuEntryIdx = 0; + int actionMenuIdx = 0; // Find all storage devices and add them to the popup menus TDEHardwareDevices *hwdevices = TDEGlobal::hardwareDevices(); @@ -334,15 +369,16 @@ void HwDeviceSystemTray::contextMenuAboutToShow(TDEPopupMenu *menu) TDEStorageDevice *sdevice = static_cast(hwdevice); if (isMonitoredDevice(sdevice)) { - if (sdevice->isDiskOfType(TDEDiskDeviceType::LUKS) || sdevice->isDiskOfType(TDEDiskDeviceType::OtherCrypted)) + if (sdevice->isDiskOfType(TDEDiskDeviceType::LUKS) || + sdevice->isDiskOfType(TDEDiskDeviceType::OtherCrypted)) { if (sdevice->isDiskOfType(TDEDiskDeviceType::UnlockedCrypt)) { - AddDeviceToRMBMenu(sdevice, SDActions::Lock); + AddDeviceToRMBMenu(sdevice, SDActions::Lock, actionMenuIdx); } else { - AddDeviceToRMBMenu(sdevice, SDActions::Unlock); + AddDeviceToRMBMenu(sdevice, SDActions::Unlock, actionMenuIdx); } } @@ -350,27 +386,27 @@ void HwDeviceSystemTray::contextMenuAboutToShow(TDEPopupMenu *menu) { if (sdevice->mountPath().isEmpty()) { - AddDeviceToRMBMenu(sdevice, SDActions::Mount); + AddDeviceToRMBMenu(sdevice, SDActions::Mount, actionMenuIdx); } else { - AddDeviceToRMBMenu(sdevice, SDActions::Unmount); + AddDeviceToRMBMenu(sdevice, SDActions::Unmount, actionMenuIdx); } // Mounted and unmounted disks can also be opened - AddDeviceToRMBMenu(sdevice, SDActions::Open); + AddDeviceToRMBMenu(sdevice, SDActions::Open, actionMenuIdx); } if (sdevice->checkDiskStatus(TDEDiskDeviceStatus::Removable) || sdevice->checkDiskStatus(TDEDiskDeviceStatus::Hotpluggable)) { - AddDeviceToRMBMenu(sdevice, SDActions::Eject); + AddDeviceToRMBMenu(sdevice, SDActions::Eject, actionMenuIdx); - AddDeviceToRMBMenu(sdevice, SDActions::SafeRemove); + AddDeviceToRMBMenu(sdevice, SDActions::SafeRemove, actionMenuIdx); } - AddDeviceToRMBMenu(sdevice, SDActions::Properties); + AddDeviceToRMBMenu(sdevice, SDActions::Properties, actionMenuIdx); } } @@ -378,10 +414,10 @@ void HwDeviceSystemTray::contextMenuAboutToShow(TDEPopupMenu *menu) d->m_RMBMenu->insertTitle(SmallIcon("drive-harddisk-unmounted"), i18n("Storage Device Actions"), 0); for (const SDActions::Type &actionType : SDActions::All) { - TDEActionMenu *actionMenu = d->m_RMBActionMap[actionType]; + TDEActionMenu *actionMenu = d->m_RMBActionMenuMap[actionType]; if (actionMenu->isEnabled()) { - actionMenu->plug(d->m_RMBMenu, (int)actionType); + actionMenu->plug(d->m_RMBMenu); } } @@ -397,6 +433,76 @@ void HwDeviceSystemTray::contextMenuAboutToShow(TDEPopupMenu *menu) d->m_quitAction->plug(menu); } +void HwDeviceSystemTray::populateLMBMenu() +{ + d->m_LMBMenu->clear(); + d->m_LMBMenu->insertTitle(SmallIcon("drive-harddisk-unmounted"), i18n("Storage Devices"), 0); + + d->m_actionMenuEntryMap.clear(); + int actionMenuIdx = 0; + + // Find all storage devices and add them to the popup menus + TDEHardwareDevices *hwdevices = TDEGlobal::hardwareDevices(); + TDEGenericHardwareList diskDeviceList = hwdevices->listByDeviceClass(TDEGenericDeviceType::Disk); + for (TDEGenericDevice *hwdevice = diskDeviceList.first(); hwdevice; hwdevice = diskDeviceList.next()) + { + TDEStorageDevice *sdevice = static_cast(hwdevice); + if (isMonitoredDevice(sdevice) && + (sdevice->isDiskOfType(TDEDiskDeviceType::LUKS) || + sdevice->isDiskOfType(TDEDiskDeviceType::OtherCrypted) || + sdevice->checkDiskStatus(TDEDiskDeviceStatus::Mountable) || + sdevice->checkDiskStatus(TDEDiskDeviceStatus::Removable) || + sdevice->checkDiskStatus(TDEDiskDeviceStatus::Hotpluggable))) + { + TQString friendlyName = !sdevice->diskLabel().isEmpty() ? + sdevice->diskLabel() : sdevice->friendlyName(); + TDEActionMenu *actionMenu = new TDEActionMenu(i18n("%1 (%2)").arg(friendlyName, + sdevice->deviceNode()), sdevice->icon(TDEIcon::SizeSmall)); + + if (sdevice->checkDiskStatus(TDEDiskDeviceStatus::Mountable)) + { + // Mounted and unmounted disks can also be opened + AddDeviceToLMBMenu(sdevice, SDActions::Open, actionMenu, actionMenuIdx); + + if (sdevice->mountPath().isEmpty()) + { + AddDeviceToLMBMenu(sdevice, SDActions::Mount, actionMenu, actionMenuIdx); + } + else + { + AddDeviceToLMBMenu(sdevice, SDActions::Unmount, actionMenu, actionMenuIdx); + } + } + + if (sdevice->isDiskOfType(TDEDiskDeviceType::LUKS) || + sdevice->isDiskOfType(TDEDiskDeviceType::OtherCrypted)) + { + if (sdevice->isDiskOfType(TDEDiskDeviceType::UnlockedCrypt)) + { + AddDeviceToLMBMenu(sdevice, SDActions::Lock, actionMenu, actionMenuIdx); + } + else + { + AddDeviceToLMBMenu(sdevice, SDActions::Unlock, actionMenu, actionMenuIdx); + } + } + + + if (sdevice->checkDiskStatus(TDEDiskDeviceStatus::Removable) || + sdevice->checkDiskStatus(TDEDiskDeviceStatus::Hotpluggable)) + { + AddDeviceToLMBMenu(sdevice, SDActions::Eject, actionMenu, actionMenuIdx); + + AddDeviceToLMBMenu(sdevice, SDActions::SafeRemove, actionMenu, actionMenuIdx); + } + + AddDeviceToLMBMenu(sdevice, SDActions::Properties, actionMenu, actionMenuIdx); + + actionMenu->plug(d->m_LMBMenu); + } + } +} + void HwDeviceSystemTray::slotExecuteDeviceAction(int parameter) { TQString uuid = d->m_actionMenuEntryMap[parameter].uuid; -- cgit v1.2.1