20 #include "rootactionstate.h"
21 #include "indicators.h"
23 #include <unitymenumodel.h>
32 RootActionState::RootActionState(QObject *parent)
33 : ActionStateParser(parent),
38 RootActionState::~RootActionState()
42 UnityMenuModel* RootActionState::menu()
const
47 void RootActionState::setMenu(UnityMenuModel* menu)
51 m_menu->disconnect(
this);
56 connect(m_menu, SIGNAL(rowsInserted(
const QModelIndex&,
int,
int)), SLOT(onModelRowsAdded(
const QModelIndex&,
int,
int)));
57 connect(m_menu, SIGNAL(rowsRemoved(
const QModelIndex&,
int,
int)), SLOT(onModelRowsRemoved(
const QModelIndex&,
int,
int)));
58 connect(m_menu, SIGNAL(dataChanged(
const QModelIndex&,
const QModelIndex&,
const QVector<int>&)), SLOT(onModelDataChanged(
const QModelIndex&,
const QModelIndex&,
const QVector<int>&)));
60 connect(m_menu, SIGNAL(destroyed()), SLOT(reset()));
67 void RootActionState::onModelRowsAdded(
const QModelIndex& parent,
int start,
int end)
70 if (start == 0 && end >= 0) {
75 void RootActionState::onModelRowsRemoved(
const QModelIndex& parent,
int start,
int end)
78 if (start == 0 && end >= 0) {
83 void RootActionState::onModelDataChanged(
const QModelIndex& topLeft,
const QModelIndex& bottomRight,
const QVector<int>& roles)
86 if (!topLeft.isValid() || !bottomRight.isValid()) {
90 if (topLeft.row() <= 0 && bottomRight.row() >= 0) {
95 void RootActionState::reset()
97 m_cachedState.clear();
100 Q_EMIT menuChanged();
104 void RootActionState::updateActionState()
106 if (m_menu && m_menu->rowCount() > 0) {
107 ActionStateParser* oldParser = m_menu->actionStateParser();
108 m_menu->setActionStateParser(
this);
110 m_cachedState = m_menu->get(0,
"actionState").toMap();
112 m_menu->setActionStateParser(oldParser);
114 m_cachedState.clear();
119 bool RootActionState::isValid()
const
121 return m_menu && m_menu->rowCount() > 0;
124 QString RootActionState::title()
const
126 if (!isValid())
return QString();
128 return m_cachedState.value(
"title", QVariant::fromValue(QString())).toString();
131 QString RootActionState::leftLabel()
const
133 if (!isValid())
return QString();
135 return m_cachedState.value(
"pre-label", QVariant::fromValue(QString())).toString();
138 QString RootActionState::rightLabel()
const
140 if (!isValid())
return QString();
142 return m_cachedState.value(
"label", QVariant::fromValue(QString())).toString();
145 QStringList RootActionState::icons()
const
147 if (!isValid())
return QStringList();
149 return m_cachedState.value(
"icons", QVariant::fromValue(QStringList())).toStringList();
152 QString RootActionState::accessibleName()
const
154 if (!isValid())
return QString();
156 return m_cachedState.value(
"accessible-desc", QVariant::fromValue(QString())).toString();
159 bool RootActionState::indicatorVisible()
const
161 if (!isValid())
return false;
163 return m_cachedState.value(
"visible", QVariant::fromValue(
true)).toBool();
166 static QString iconUri(GIcon *icon)
170 if (G_IS_THEMED_ICON (icon)) {
171 const gchar*
const* iconNames = g_themed_icon_get_names (G_THEMED_ICON (icon));
173 QStringList iconNameList;
174 for (uint index = 0; iconNames[index] !=
nullptr; index++) {
175 iconNameList << iconNames[index];
178 if (!iconNameList.empty()) {
179 uri = QString(
"image://theme/%1").arg(iconNameList.join(
","));
182 else if (G_IS_FILE_ICON (icon)) {
185 file = g_file_icon_get_file (G_FILE_ICON (icon));
186 if (g_file_is_native (file)) {
189 fileuri = g_file_get_path (file);
190 uri = QString(fileuri);
195 else if (G_IS_BYTES_ICON (icon)) {
200 data = g_bytes_get_data (g_bytes_icon_get_bytes (G_BYTES_ICON (icon)), &size);
201 base64 = g_base64_encode ((
const guchar *) data, size);
203 uri = QString(
"data://");
212 QVariant RootActionState::toQVariant(GVariant* state)
const
218 if (g_variant_is_of_type(state, G_VARIANT_TYPE_VARDICT)) {
224 g_variant_iter_init (&iter, state);
225 while (g_variant_iter_loop (&iter,
"{sv}", &key, &vvalue))
227 QString str = QString::fromUtf8(key);
228 if (str ==
"icon" && !qmap.contains(
"icons")) {
232 GIcon *gicon = g_icon_deserialize (vvalue);
234 icons << iconUri(gicon);
235 g_object_unref (gicon);
237 qmap.insert(
"icons", icons);
239 }
else if (str ==
"icons") {
243 if (g_variant_is_of_type(vvalue, G_VARIANT_TYPE(
"av"))) {
246 g_variant_iter_init (&iter, vvalue);
247 while (g_variant_iter_loop (&iter,
"v", &val))
250 GIcon *gicon = g_icon_deserialize (val);
252 icons << iconUri(gicon);
253 g_object_unref (gicon);
258 qmap.insert(
"icons", icons);
261 qmap.insert(str, ActionStateParser::toQVariant(vvalue));
265 return QVariant::fromValue(qmap);
267 }
else if (g_variant_is_of_type (state, G_VARIANT_TYPE (
"(sssb)"))) {
272 char* accessible_name;
276 g_variant_get(state,
"(sssb)", &label,
281 qmap[
"label"] = label ? QString::fromUtf8(label) :
"";
282 qmap[
"accessible-desc"] = accessible_name ? QString::fromUtf8(accessible_name) :
"";
283 qmap[
"visible"] = visible;
285 gicon = g_icon_new_for_string (icon,
nullptr);
287 qmap[
"icons"] = QStringList() << iconUri(gicon);
288 g_object_unref (gicon);
291 if (label) g_free(label);
292 if (icon) g_free(icon);
293 if (accessible_name) g_free(accessible_name);
295 return QVariant::fromValue(qmap);
297 return ActionStateParser::toQVariant(state);