/*
* Copyright (C) 2012, 2013 Canonical, Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include
#include "libhud_client_stub.h"
/* Schema that is used in the DeeModel representing
the results */
static const gchar * results_model_schema[] = {
"v", /* Command ID */
"s", /* Command Name */
"a(ii)", /* Highlights in command name */
"s", /* Description */
"a(ii)", /* Highlights in description */
"s", /* Shortcut */
"u", /* Distance */
"b", /* Parameterized */
};
DeeModel *resultsModel = 0;
GMenuModel *parametrizedActionModel = 0;
GActionGroup *parametrizedActionGroup = 0;
static void hud_client_query_class_init(HudClientQueryClass *klass);
static void hud_client_query_init(HudClientQuery *self);
G_DEFINE_TYPE(HudClientQuery, hud_client_query, G_TYPE_OBJECT)
static void hud_client_query_init(HudClientQuery * /*self*/)
{
}
static void hud_client_query_class_init(HudClientQueryClass * /*klass*/)
{
HudClientStub::m_querySignalToolbarUpdated = g_signal_new (HUD_CLIENT_QUERY_SIGNAL_TOOLBAR_UPDATED,
HUD_CLIENT_TYPE_QUERY,
G_SIGNAL_RUN_LAST,
0, /* offset */
nullptr, nullptr, /* Accumulator */
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0, G_TYPE_NONE);
}
HudClientQuery *hud_client_query_new(const gchar *query)
{
HudClientStub::m_lastSetQuery = QString::fromUtf8(query);
HudClientStub::m_query = HUD_CLIENT_QUERY(g_object_new(HUD_CLIENT_TYPE_QUERY, nullptr));
return HudClientStub::m_query;
}
DeeModel *hud_client_query_get_results_model(HudClientQuery *cquery)
{
Q_ASSERT(cquery == HudClientStub::m_query);
Q_UNUSED(cquery);
if (!resultsModel) {
resultsModel = dee_sequence_model_new();
dee_model_set_schema_full(resultsModel, results_model_schema, G_N_ELEMENTS(results_model_schema));
GVariant * columns[G_N_ELEMENTS(results_model_schema) + 1];
columns[0] = g_variant_new_variant(g_variant_new_uint64(0));
columns[1] = g_variant_new_string("Help");
columns[2] = g_variant_new_array(G_VARIANT_TYPE("(ii)"), nullptr, 0);
columns[3] = g_variant_new_string("Get Help");
columns[4] = g_variant_new_array(G_VARIANT_TYPE("(ii)"), nullptr, 0);
columns[5] = g_variant_new_string("");
columns[6] = g_variant_new_uint32(3);
columns[7] = g_variant_new_boolean(false);
columns[8] = nullptr;
dee_model_append_row(resultsModel, columns);
columns[0] = g_variant_new_variant(g_variant_new_uint64(1));
columns[1] = g_variant_new_string("About");
columns[3] = g_variant_new_string("Show About");
dee_model_append_row(resultsModel, columns);
columns[0] = g_variant_new_variant(g_variant_new_uint64(2));
columns[1] = g_variant_new_string("Foo");
columns[3] = g_variant_new_string("Show Foo");
columns[7] = g_variant_new_boolean(true);
dee_model_append_row(resultsModel, columns);
columns[0] = g_variant_new_variant(g_variant_new_uint64(3));
columns[1] = g_variant_new_string("Bar");
columns[3] = g_variant_new_string("Show Bar");
columns[7] = g_variant_new_boolean(false);
dee_model_append_row(resultsModel, columns);
columns[0] = g_variant_new_variant(g_variant_new_uint64(4));
columns[1] = g_variant_new_string("FooBar");
columns[3] = g_variant_new_string("Show FooBar");
dee_model_append_row(resultsModel, columns);
columns[0] = g_variant_new_variant(g_variant_new_uint64(5));
columns[1] = g_variant_new_string("UltraFooBar");
columns[3] = g_variant_new_string("Show UltraFooBar");
dee_model_append_row(resultsModel, columns);
}
return resultsModel;
}
void hud_client_query_execute_toolbar_item(HudClientQuery *cquery, HudClientQueryToolbarItems item, guint timestamp)
{
Q_ASSERT(cquery == HudClientStub::m_query);
Q_UNUSED(timestamp);
Q_UNUSED(cquery);
HudClientStub::m_lastExecutedToolbarItem = item;
}
void hud_client_query_set_query(HudClientQuery *cquery, const char *query)
{
Q_ASSERT(cquery == HudClientStub::m_query);
Q_UNUSED(cquery);
HudClientStub::m_lastSetQuery = QString::fromUtf8(query);
}
void hud_client_query_execute_command(HudClientQuery *cquery, GVariant *command_key, guint timestamp)
{
Q_ASSERT(cquery == HudClientStub::m_query);
Q_UNUSED(cquery);
Q_UNUSED(timestamp);
for (uint i = 0; i < dee_model_get_n_rows(resultsModel); ++i) {
DeeModelIter *iter = dee_model_get_iter_at_row(resultsModel, i);
if (!dee_model_get_bool(resultsModel, iter, 7)) {
GVariant *it_command = dee_model_get_value(resultsModel, iter, 0);
if (g_variant_equal (command_key, it_command)) {
HudClientStub::m_lastExecutedCommandRow = i;
g_variant_unref(it_command);
return;
}
g_variant_unref(it_command);
}
}
HudClientStub::m_lastExecutedCommandRow = -1;
}
HudClientParam *hud_client_query_execute_param_command(HudClientQuery *cquery, GVariant *command_key, guint timestamp)
{
Q_ASSERT(cquery == HudClientStub::m_query);
Q_UNUSED(cquery);
Q_UNUSED(timestamp);
for (uint i = 0; i < dee_model_get_n_rows(resultsModel); ++i) {
DeeModelIter *iter = dee_model_get_iter_at_row(resultsModel, i);
if (dee_model_get_bool(resultsModel, iter, 7)) {
GVariant *it_command = dee_model_get_value(resultsModel, iter, 0);
if (g_variant_equal (command_key, it_command)) {
HudClientStub::m_lastExecutedParametrizedCommandRow = i;
g_variant_unref(it_command);
// No need to create a real HudClientParam since it's always passed down to us
return (HudClientParam *)g_object_new(G_TYPE_OBJECT, nullptr);
}
g_variant_unref(it_command);
}
}
HudClientStub::m_lastExecutedParametrizedCommandRow = -1;
return nullptr;
}
void hud_client_query_voice_query(HudClientQuery *cquery)
{
Q_ASSERT(cquery == HudClientStub::m_query);
Q_UNUSED(cquery);
// TODO We are not testing voice queries yet
}
gboolean hud_client_query_toolbar_item_active(HudClientQuery *cquery, HudClientQueryToolbarItems item)
{
Q_ASSERT(cquery == HudClientStub::m_query);
Q_UNUSED(cquery);
if (item == HUD_CLIENT_QUERY_TOOLBAR_HELP)
return HudClientStub::m_helpToolbarItemEnabled;
return true;
}
GMenuModel *hud_client_param_get_model(HudClientParam *param)
{
Q_UNUSED(param);
if (!parametrizedActionModel) {
GMenu *menu = g_menu_new();
GMenuItem *item = g_menu_item_new("Item1Label", nullptr);
g_menu_item_set_attribute_value(item, "parameter-type", g_variant_new_string("slider"));
g_menu_item_set_attribute_value(item, "min", g_variant_new_double(10));
g_menu_item_set_attribute_value(item, "max", g_variant_new_double(80));
g_menu_item_set_attribute_value(item, "live", g_variant_new_boolean(true));
g_menu_item_set_attribute_value(item, "value", g_variant_new_double(75));
g_menu_item_set_attribute_value(item, "action", g_variant_new_string("costAction"));
g_menu_append_item (menu, item);
parametrizedActionModel = G_MENU_MODEL(menu);
}
return parametrizedActionModel;
}
void hud_client_param_send_cancel(HudClientParam *param)
{
Q_UNUSED(param);
g_clear_object(¶metrizedActionModel);
parametrizedActionModel = 0;
HudClientStub::m_lastParametrizedCommandCommited = false;
}
static void on_signal_activated (GSimpleAction *action, GVariant *parameter, gpointer /*user_data*/)
{
// Only double for the moment
HudClientStub::m_activatedActions.insert(g_action_get_name(G_ACTION(action)), QVariant(g_variant_get_double(parameter)));
}
GActionGroup *hud_client_param_get_actions(HudClientParam *param)
{
Q_UNUSED(param);
if (!parametrizedActionGroup) {
GSimpleActionGroup *actionGroup = g_simple_action_group_new();
GSimpleAction *action = g_simple_action_new("costAction", G_VARIANT_TYPE_DOUBLE);
g_action_map_add_action(G_ACTION_MAP(actionGroup), G_ACTION(action));
g_signal_connect (action, "activate", G_CALLBACK (on_signal_activated), nullptr);
parametrizedActionGroup = G_ACTION_GROUP(actionGroup);
}
return parametrizedActionGroup;
}
void hud_client_param_send_commit(HudClientParam *param)
{
Q_UNUSED(param);
g_object_unref(parametrizedActionGroup);
parametrizedActionGroup = 0;
g_clear_object(¶metrizedActionModel);
parametrizedActionModel = 0;
HudClientStub::m_lastParametrizedCommandCommited = true;
}