2 * Copyright 2013 Canonical Ltd.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License as published by
6 * the Free Software Foundation; version 3.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Lesser General Public License for more details.
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 * Nick Dedekind <nick.dedekind@canonical.com>
20#include "rootactionstate.h"
21#include "indicators.h"
23#include <unitymenumodel.h>
32RootActionState::RootActionState(QObject *parent)
33 : ActionStateParser(parent),
38RootActionState::~RootActionState()
41 m_menu->disconnect(this);
42 m_menu->setActionStateParser(NULL);
46UnityMenuModel* RootActionState::menu() const
51void RootActionState::setMenu(UnityMenuModel* menu)
55 m_menu->disconnect(this);
56 m_menu->setActionStateParser(NULL);
61 connect(m_menu, SIGNAL(rowsInserted(const QModelIndex&, int, int)), SLOT(onModelRowsAdded(const QModelIndex&, int, int)));
62 connect(m_menu, SIGNAL(rowsRemoved(const QModelIndex&, int, int)), SLOT(onModelRowsRemoved(const QModelIndex&, int, int)));
63 connect(m_menu, SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&, const QVector<int>&)), SLOT(onModelDataChanged(const QModelIndex&, const QModelIndex&, const QVector<int>&)));
65 connect(m_menu, SIGNAL(destroyed()), SLOT(reset()));
67 m_menu->setActionStateParser(this);
74void RootActionState::onModelRowsAdded(const QModelIndex& parent, int start, int end)
77 if (start == 0 && end >= 0) {
82void RootActionState::onModelRowsRemoved(const QModelIndex& parent, int start, int end)
85 if (start == 0 && end >= 0) {
90void RootActionState::onModelDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight, const QVector<int>& roles)
93 if (!topLeft.isValid() || !bottomRight.isValid()) {
97 if (topLeft.row() <= 0 && bottomRight.row() >= 0) {
102void RootActionState::reset() {
103 m_cachedState.clear();
106 Q_EMIT menuChanged();
110void RootActionState::updateActionState()
112 if (m_menu && m_menu->rowCount() > 0) {
113 m_cachedState = m_menu->get(0, "actionState").toMap();
115 m_cachedState.clear();
120bool RootActionState::isValid() const
122 return m_menu && m_menu->rowCount() > 0;
125QString RootActionState::title() const
127 if (!isValid()) return QString();
129 return m_cachedState.value("title", QVariant::fromValue(QString())).toString();
132QString RootActionState::leftLabel() const
134 if (!isValid()) return QString();
136 return m_cachedState.value("pre-label", QVariant::fromValue(QString())).toString();
139QString RootActionState::rightLabel() const
141 if (!isValid()) return QString();
143 return m_cachedState.value("label", QVariant::fromValue(QString())).toString();
146QStringList RootActionState::icons() const
148 if (!isValid()) return QStringList();
150 return m_cachedState.value("icons", QVariant::fromValue(QStringList())).toStringList();
153QString RootActionState::accessibleName() const
155 if (!isValid()) return QString();
157 return m_cachedState.value("accessible-desc", QVariant::fromValue(QString())).toString();
160bool RootActionState::isVisible() const
162 if (!isValid()) return false;
164 return m_cachedState.value("visible", QVariant::fromValue(true)).toBool();
167static QString iconUri(GIcon *icon)
171 if (G_IS_THEMED_ICON (icon)) {
172 const gchar* const* iconNames = g_themed_icon_get_names (G_THEMED_ICON (icon));
174 QStringList iconNameList;
175 for (uint index = 0; iconNames[index] != NULL; index++) {
176 iconNameList << iconNames[index];
179 if (!iconNameList.empty()) {
180 uri = QString("image://theme/%1").arg(iconNameList.join(","));
183 else if (G_IS_FILE_ICON (icon)) {
186 file = g_file_icon_get_file (G_FILE_ICON (icon));
187 if (g_file_is_native (file)) {
190 fileuri = g_file_get_path (file);
191 uri = QString(fileuri);
196 else if (G_IS_BYTES_ICON (icon)) {
201 data = g_bytes_get_data (g_bytes_icon_get_bytes (G_BYTES_ICON (icon)), &size);
202 base64 = g_base64_encode ((const guchar *) data, size);
204 uri = QString("data://");
213QVariant RootActionState::toQVariant(GVariant* state) const
219 if (g_variant_is_of_type(state, G_VARIANT_TYPE_VARDICT)) {
225 g_variant_iter_init (&iter, state);
226 while (g_variant_iter_loop (&iter, "{sv}", &key, &vvalue))
228 QString str = QString::fromUtf8(key);
229 if (str == "icon" && !qmap.contains("icons")) {
232 // FIXME - should be sending a url.
233 GIcon *gicon = g_icon_deserialize (vvalue);
235 icons << iconUri(gicon);
236 g_object_unref (gicon);
238 qmap.insert("icons", icons);
240 } else if (str == "icons") {
244 if (g_variant_type_is_array(g_variant_get_type(vvalue))) {
247 for (int i = 0, iMax = g_variant_n_children(vvalue); i < iMax; i++) {
248 GVariant *child = g_variant_get_child_value(vvalue, i);
250 // FIXME - should be sending a url.
251 GIcon *gicon = g_icon_deserialize (child);
253 icons << iconUri(gicon);
254 g_object_unref (gicon);
256 g_variant_unref(child);
259 // will overwrite icon.
260 qmap.insert("icons", icons);
263 qmap.insert(str, ActionStateParser::toQVariant(vvalue));
267 return QVariant::fromValue(qmap);
269 } else if (g_variant_is_of_type (state, G_VARIANT_TYPE ("(sssb)"))) {
274 char* accessible_name;
278 g_variant_get(state, "(sssb)", &label,
283 qmap["label"] = label ? QString::fromUtf8(label) : "";
284 qmap["accessible-desc"] = accessible_name ? QString::fromUtf8(accessible_name) : "";
285 qmap["visible"] = visible;
287 gicon = g_icon_new_for_string (icon, NULL);
289 qmap["icons"] = QStringList() << iconUri(gicon);
290 g_object_unref (gicon);
293 if (label) g_free(label);
294 if (icon) g_free(icon);
295 if (accessible_name) g_free(accessible_name);
297 return QVariant::fromValue(qmap);
299 return ActionStateParser::toQVariant(state);
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list