File: PowerButtonActionModel.cpp

package info (click to toggle)
powerdevil 4%3A6.5.4-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 10,680 kB
  • sloc: cpp: 13,284; xml: 1,911; python: 1,204; sh: 19; makefile: 10
file content (132 lines) | stat: -rw-r--r-- 4,382 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
 *  SPDX-FileCopyrightText: 2021 Tomaz Canabrava <tcanabrava@kde.org>
 *  SPDX-FileCopyrightText: 2023 Jakob Petsovits <jpetso@petsovits.com>
 *
 *  SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
 */

#include "PowerButtonActionModel.h"

#include <powerdevilenums.h>
#include <powerdevilpowermanagement.h>

#include <KLocalizedString>

#include <type_traits> // std::is_same_v, std::underlying_type_t

using namespace Qt::StringLiterals;

PowerButtonActionModel::PowerButtonActionModel(QObject *parent, PowerDevil::PowerManagement *pm, std::initializer_list<PowerDevil::PowerButtonAction> actions)
    : QAbstractListModel(parent)
{
    for (PowerDevil::PowerButtonAction action : actions) {
        appendAction(action, pm);
    }
}

void PowerButtonActionModel::appendAction(PowerDevil::PowerButtonAction action, PowerDevil::PowerManagement *pm)
{
    switch (action) {
    case PowerDevil::PowerButtonAction::NoAction:
        m_data.append(Data{
            .name = i18n("Do nothing"),
            .iconName = u"dialog-cancel-symbolic"_s,
            .value = qToUnderlying(PowerDevil::PowerButtonAction::NoAction),
        });
        break;

    case PowerDevil::PowerButtonAction::Sleep:
        if (pm->canSuspend()) {
            m_data.append(Data{
                .name = i18nc("Suspend to RAM", "Sleep"),
                .iconName = u"system-suspend-symbolic"_s,
                .value = qToUnderlying(PowerDevil::PowerButtonAction::Sleep),
            });
        }
        break;

    case PowerDevil::PowerButtonAction::Hibernate:
        if (pm->canHibernate()) {
            m_data.append(Data{
                .name = i18n("Hibernate"),
                .iconName = u"system-suspend-hibernate-symbolic"_s,
                .value = qToUnderlying(PowerDevil::PowerButtonAction::Hibernate),
            });
        }
        break;

    case PowerDevil::PowerButtonAction::Shutdown:
        m_data.append(Data{
            .name = i18nc("Power down the computer", "Shut down"),
            .iconName = u"system-shutdown-symbolic"_s,
            .value = qToUnderlying(PowerDevil::PowerButtonAction::Shutdown),
        });
        break;

    case PowerDevil::PowerButtonAction::LockScreen:
        m_data.append(Data{
            .name = i18n("Lock screen"),
            .iconName = u"system-lock-screen-symbolic"_s,
            .value = qToUnderlying(PowerDevil::PowerButtonAction::LockScreen),
        });
        break;

    case PowerDevil::PowerButtonAction::PromptLogoutDialog:
        m_data.append(Data{
            .name = i18n("Show logout screen"),
            .iconName = u"system-log-out-symbolic"_s,
            .value = qToUnderlying(PowerDevil::PowerButtonAction::PromptLogoutDialog),
        });
        break;

    case PowerDevil::PowerButtonAction::TurnOffScreen:
        m_data.append(Data{
            .name = i18n("Turn off screen"),
            .iconName = u"preferences-desktop-screensaver-symbolic"_s,
            .value = qToUnderlying(PowerDevil::PowerButtonAction::TurnOffScreen),
        });
        break;

    case PowerDevil::PowerButtonAction::ToggleScreenOnOff:
        m_data.append(Data{
            .name = i18n("Toggle screen on/off"),
            .iconName = u"osd-shutd-screen-symbolic"_s,
            .value = qToUnderlying(PowerDevil::PowerButtonAction::TurnOffScreen),
        });
        break;
    }
}

QVariant PowerButtonActionModel::data(const QModelIndex &index, int role) const
{
    if (index.row() < 0 || index.row() >= m_data.size()) {
        return {};
    }

    switch (role) {
    case Icon:
        return QIcon::fromTheme(m_data[index.row()].iconName);
    case Name:
        return m_data[index.row()].name;
    case Value:
        static_assert(std::is_same_v<decltype(Data::value), std::underlying_type_t<PowerDevil::PowerButtonAction>>);
        return m_data[index.row()].value;
    case IconName:
        return m_data[index.row()].iconName;
    default:
        return {};
    }
}

int PowerButtonActionModel::rowCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent);
    return static_cast<int>(m_data.size());
}

QHash<int, QByteArray> PowerButtonActionModel::roleNames() const
{
    return QHash<int, QByteArray>{{Icon, "icon"_ba}, {Name, "name"_ba}, {Value, "value"_ba}, {IconName, "iconName"_ba}};
}

#include "moc_PowerButtonActionModel.cpp"