18#include "SessionsModel.h"
19#include <QtCore/QDebug>
20#include <QtCore/QFile>
21#include <QtCore/QLoggingCategory>
22#include <QtCore/QSortFilterProxyModel>
24Q_LOGGING_CATEGORY(SessionsModelLogger,
"lomiri.plugins.LightDM.SessionsModel")
26QHash<
int, QByteArray> SessionsModel::roleNames()
const
31int SessionsModel::rowCount(
const QModelIndex& parent)
const
33 return m_model->rowCount(parent);
36QList<QUrl> SessionsModel::iconSearchDirectories()
const
38 return m_iconSearchDirectories;
41void SessionsModel::setIconSearchDirectories(
const QList<QUrl> searchDirectories)
45 QList<QUrl> localList = {};
46 Q_FOREACH(
const QUrl& searchDirectory, searchDirectories)
48 localList.append(searchDirectory.toLocalFile());
50 m_iconSearchDirectories = localList;
51 Q_EMIT iconSearchDirectoriesChanged();
54QUrl SessionsModel::iconUrl(
const QString sessionKey)
const
56 const QStringList imgExtensions {
"svg",
"png" };
57 for (
const QUrl& searchDirectory : m_iconSearchDirectories)
59 for (
const QString& imgExt : imgExtensions)
62 QString customIconUrl = searchDirectory.toString(QUrl::StripTrailingSlash) +
63 "/custom_" + sessionKey +
"_badge." + imgExt;
64 QString iconUrl = searchDirectory.toString(QUrl::StripTrailingSlash) +
65 "/" + sessionKey +
"_badge." + imgExt;
67 QFile customIconFile(customIconUrl);
68 QFile iconFile(iconUrl);
69 if (customIconFile.exists()) {
70 qCWarning(SessionsModelLogger) <<
"Found custom session badge icon: " << customIconUrl;
71 return QUrl(customIconUrl);
72 }
else if (iconFile.exists()) {
73 qCWarning(SessionsModelLogger) <<
"Found session badge icon: " << iconUrl;
76 qCWarning(SessionsModelLogger) <<
"Failed to find icon file: " << iconUrl;
80 if (imgExt ==
"png") {
82 qCWarning(SessionsModelLogger) <<
"Trying legacy mechanism for finding an appropriate icon file.";
86 QString path = searchDirectory.toString(QUrl::StripTrailingSlash) +
"/";
87 bool iconFound =
false;
88 if (sessionKey ==
"ubuntu" || sessionKey ==
"ubuntu-2d") {
89 path +=
"ubuntu_badge.png";
92 sessionKey ==
"gnome-classic" ||
93 sessionKey ==
"gnome-flashback-compiz" ||
94 sessionKey ==
"gnome-flashback-metacity" ||
95 sessionKey ==
"gnome-shell" ||
96 sessionKey ==
"gnome-wayland" ||
99 path +=
"gnome_badge.png";
101 }
else if (sessionKey ==
"plasma") {
102 path +=
"kde_badge.png";
104 }
else if (sessionKey ==
"xterm") {
105 path +=
"recovery_console_badge.png";
107 }
else if (sessionKey ==
"remote-login") {
108 path +=
"remote_login_help.png";
112 if (QFile(path).exists() && iconFound) {
113 qCWarning(SessionsModelLogger) <<
"Using session badge icon: " << path <<
" for session type: " << sessionKey;
121 qCWarning(SessionsModelLogger) <<
"No suitable icon found! Falling back to unknown_badge.png icon.";
122 return QUrl(
"./graphics/session_icons/unknown_badge.png");
125QVariant SessionsModel::data(
const QModelIndex& index,
int role)
const
128 case SessionsModel::IconRole:
129 return iconUrl(m_model->data(index, QLightDM::SessionsModel::KeyRole).toString());
131 return m_model->data(index, role);
135SessionsModel::SessionsModel(QObject* parent)
136 : LomiriSortFilterProxyModelQML(parent)
139 m_model =
new QLightDM::SessionsModel(
this);
140 m_roleNames = m_model->roleNames();
141 m_roleNames[IconRole] =
"icon_url";
144 auto snapRoot = QFile::decodeName(qgetenv(
"SNAP"));
145 if (!snapRoot.isEmpty()) {
146 for (
int i = 0; i < m_iconSearchDirectories.size(); i++) {
147 m_iconSearchDirectories[i] = snapRoot + m_iconSearchDirectories[i].path();
152 setSortCaseSensitivity(Qt::CaseInsensitive);
153 setSortLocaleAware(
true);
154 setSortRole(Qt::DisplayRole);