File indexing completed on 2024-05-12 05:38:47

0001 /*
0002  *  SPDX-FileCopyrightText: 2021 Tomaz Canabrava <tcanabrava@kde.org>
0003  *  SPDX-FileCopyrightText: 2023 Jakob Petsovits <jpetso@petsovits.com>
0004  *
0005  *  SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0006  */
0007 
0008 #include "PowerButtonActionModel.h"
0009 
0010 #include <powerdevilenums.h>
0011 #include <powerdevilpowermanagement.h>
0012 
0013 #include <KLocalizedString>
0014 
0015 #include <type_traits> // std::is_same_v, std::underlying_type_t
0016 
0017 PowerButtonActionModel::PowerButtonActionModel(QObject *parent, PowerDevil::PowerManagement *pm, std::initializer_list<PowerDevil::PowerButtonAction> actions)
0018     : QAbstractListModel(parent)
0019 {
0020     for (PowerDevil::PowerButtonAction action : actions) {
0021         appendAction(action, pm);
0022     }
0023 }
0024 
0025 void PowerButtonActionModel::appendAction(PowerDevil::PowerButtonAction action, PowerDevil::PowerManagement *pm)
0026 {
0027     switch (action) {
0028     case PowerDevil::PowerButtonAction::NoAction:
0029         m_data.append(Data{
0030             .name = i18n("Do nothing"),
0031             .iconName = "dialog-cancel-symbolic",
0032             .value = qToUnderlying(PowerDevil::PowerButtonAction::NoAction),
0033         });
0034         break;
0035 
0036     case PowerDevil::PowerButtonAction::Sleep:
0037         if (pm->canSuspend()) {
0038             m_data.append(Data{
0039                 .name = i18nc("Suspend to RAM", "Sleep"),
0040                 .iconName = "system-suspend-symbolic",
0041                 .value = qToUnderlying(PowerDevil::PowerButtonAction::Sleep),
0042             });
0043         }
0044         break;
0045 
0046     case PowerDevil::PowerButtonAction::Hibernate:
0047         if (pm->canHibernate()) {
0048             m_data.append(Data{
0049                 .name = i18n("Hibernate"),
0050                 .iconName = "system-suspend-hibernate-symbolic",
0051                 .value = qToUnderlying(PowerDevil::PowerButtonAction::Hibernate),
0052             });
0053         }
0054         break;
0055 
0056     case PowerDevil::PowerButtonAction::Shutdown:
0057         m_data.append(Data{
0058             .name = i18nc("Power down the computer", "Shut down"),
0059             .iconName = "system-shutdown-symbolic",
0060             .value = qToUnderlying(PowerDevil::PowerButtonAction::Shutdown),
0061         });
0062         break;
0063 
0064     case PowerDevil::PowerButtonAction::LockScreen:
0065         m_data.append(Data{
0066             .name = i18n("Lock screen"),
0067             .iconName = "system-lock-screen-symbolic",
0068             .value = qToUnderlying(PowerDevil::PowerButtonAction::LockScreen),
0069         });
0070         break;
0071 
0072     case PowerDevil::PowerButtonAction::PromptLogoutDialog:
0073         m_data.append(Data{
0074             .name = i18n("Show logout screen"),
0075             .iconName = "system-log-out-symbolic",
0076             .value = qToUnderlying(PowerDevil::PowerButtonAction::PromptLogoutDialog),
0077         });
0078         break;
0079 
0080     case PowerDevil::PowerButtonAction::TurnOffScreen:
0081         m_data.append(Data{
0082             .name = i18n("Turn off screen"),
0083             .iconName = "preferences-desktop-screensaver-symbolic",
0084             .value = qToUnderlying(PowerDevil::PowerButtonAction::TurnOffScreen),
0085         });
0086         break;
0087 
0088     case PowerDevil::PowerButtonAction::ToggleScreenOnOff:
0089         m_data.append(Data{
0090             .name = i18n("Toggle screen on/off"),
0091             .iconName = "osd-shutd-screen-symbolic",
0092             .value = qToUnderlying(PowerDevil::PowerButtonAction::TurnOffScreen),
0093         });
0094         break;
0095     }
0096 }
0097 
0098 QVariant PowerButtonActionModel::data(const QModelIndex &index, int role) const
0099 {
0100     if (index.row() > m_data.size()) {
0101         return {};
0102     }
0103 
0104     switch (role) {
0105     case Icon:
0106         return QIcon::fromTheme(m_data[index.row()].iconName);
0107     case Name:
0108         return m_data[index.row()].name;
0109     case Value:
0110         static_assert(std::is_same_v<decltype(Data::value), std::underlying_type_t<PowerDevil::PowerButtonAction>>);
0111         return m_data[index.row()].value;
0112     case IconName:
0113         return m_data[index.row()].iconName;
0114     default:
0115         return {};
0116     }
0117 }
0118 
0119 int PowerButtonActionModel::rowCount(const QModelIndex &parent) const
0120 {
0121     Q_UNUSED(parent);
0122     return static_cast<int>(m_data.size());
0123 }
0124 
0125 QHash<int, QByteArray> PowerButtonActionModel::roleNames() const
0126 {
0127     return QHash<int, QByteArray>{{Icon, "icon"}, {Name, "name"}, {Value, "value"}, {IconName, "iconName"}};
0128 }