在Ubuntu Scope的模版中利用attributes来显示额外的信息

我在昨天的文章中介绍了我设计的优酷Scope。在今天的练习中,我将对它的模版做一些小的改动,利用模版中的attributes项使得它的显示更加生动。

如果感兴趣的朋友,可以在如下的地址下载最新的youku scope:

git clone https://gitcafe.com/ubuntu/youku_keywords.git

首先,我们在query.cpp中对它的模版做如下的改动:

query.cpp

const std::string NORMAL_TEMPLATE = R"(
{
  "schema-version": 1,
  "template": {
    "category-layout": "grid",
    "card-size": "medium",
    "overlay": false
  },
  "components": {
    "title": "title",
    "subtitle": "subtitle",
    "art" : {
      "field": "art",
      "aspect-ratio": 2.0
    },
    "attributes": {
        "field": "attributes",
        "max-count": 2
    }
  }
}
)";

在这个模版中,我们添加了如下的项:

    "attributes": {
        "field": "attributes",
        "max-count": 2
    }

我们可以利用这个项来显示一些我们所感兴趣的东西。

query.cpp

void Query::do_normal_search(sc::SearchReplyProxy const& reply) {
    try {
        // Start by getting information about the query
        const sc::CannedQuery &query(sc::SearchQueryBase::query());

        // Get the query string
        string query_string = query.query_string();

        // Populate current weather category

        // the Client is the helper class that provides the results
        // without mixing APIs and scopes code.
        // Add your code to retreive xml, json, or any other kind of result
        // in the client.

        Client::DataList datalist;
        datalist = client_.getData(query_string);

        CategoryRenderer rdrGrid(NORMAL_TEMPLATE);
        auto grid = reply->register_category("youku", "Normal", "", rdrGrid);

        for (const Client::Data &data : datalist) {
            CategorisedResult catres(grid);

            catres.set_uri(data.link);
            catres.set_title(data.title);
            catres.set_art(data.image);

            QString likes = QString("%1 %2").arg(qstr(u8"\u261d "),qstr(data.up_count));
            QString views = QString("%1 %2").arg(qstr(u8"   \u261f "),qstr(data.down_count));
            std::string both = qstr("%1 %2").arg(likes,views).toStdString();
            sc::VariantBuilder builder;
            builder.add_tuple({
                {"value", Variant(both)}
            });
            builder.add_tuple({
                {"value", Variant("")}
            });
            catres["attributes"] = builder.end();

            // Push the result
            if (!reply->push(catres)) {
                // If we fail to push, it means the query has been cancelled.
                // So don't continue;
                return;
            }
        }

    } catch (domain_error &e) {
        // Handle exceptions being thrown by the client API
        cerr << e.what() << endl;
        reply->error(current_exception());
    }

在上面,我们添加了如下的句子:

        QString likes = QString("%1 %2").arg(qstr(u8"\u261d "),qstr(data.up_count));
        QString views = QString("%1 %2").arg(qstr(u8"   \u261f "),qstr(data.down_count));
        std::string both = qstr("%1 %2").arg(likes,views).toStdString();
        sc::VariantBuilder builder;
        builder.add_tuple({
           {"value", Variant(both)}
        });
        builder.add_tuple({
           {"value", Variant("")}
        });
        catres["attributes"] = builder.end();

这里的2个字符表示的是特定的字符(向上和向下的手势)。通过这样的改动,我们可以得到如下的显示:

从上面的图片中可以看出来,对于每部视频的下面,多了一项显示有多少人喜欢,有多少人讨厌这部视频。

整个项目的源码在: git clone https://gitcafe.com/ubuntu/youku_attributes.git

时间: 2024-12-08 15:56:01

在Ubuntu Scope的模版中利用attributes来显示额外的信息的相关文章

细细品味Ubuntu Scope中的category renderer模版

当我第一次接触Ubuntu Scope时,我发现这个Category Renderer太神奇.它可以把我们想要的数据很简单而直接的方式呈现给我们.但是由于资料的限制,我们很难知道它最终的显示的形式是什么样的.我们可以在我们的英文的网站的文章"Customization and branding"找到一下信息.但是总觉得意犹未尽,加之没有代码,有时很难理解它到底讲的是什么.在这篇文章中,我们来详细地介绍各种模版,并看看它们的显示格式.详细这对广大的开发者来说非常有用.我们可以修改这些模版

如何在Ubuntu Scope中利用Filter来更加精准地提高搜索的质量

在Ubuntu的Scope,目前正在研发一个新的Filter的功能.我们可以在我们的开发者网站找到有关filter的更多的信息.在那里你可以看到一些关于filter的介绍,但是真正地入手去利用它还是有一定的难度的.今天在我们的例程中,我们来具体展示如何利用filter实现更好的搜索.在实际的应用中,比如我们可以通过filter来实现如下的ctrip的Scope:     在上面的中间的图中,我们可以看到"重庆"被选中了,在第二个列中,我们可以使用我们的department来进行从一个城

如何在Ubuntu Scope中定义设置变量并读取

在本遍文章中,我们来讲解怎么对我们的Ubuntu Scope进行设置.对Scope而言,有些时候我们希望能够使用设置来改变我们的显示,或对我们的搜索进行重新定义.关于更多Scope的开发,请参阅网站:http://developer.ubuntu.com/scopes/ 1)首先创建一个最基本的Scope 我们首先打开SDK,并选择"Unity Scope"模版.我们选择一个项目的名称为"settingscope": 接下来,我们选择"Empty scop

使用golang来设计我们的Ubuntu Scope

我们知道golang越来越被很多的开发者来开发应用.go语言也可以用于开发Ubuntu Scope.在今天的教程中,我们将详细介绍如何使用go语言来开发我们的Scope.这对于很多的不太熟悉C/C++的开发者来说,无疑是一个福音.对我来说,这个语言也是比较新的.如果大家想学习golang的话,建议大家阅读"Go by Example". IDE选择 由于一些原因,目前我们的Ubuntu SDK并没有支持go语言的Scope的开发.可喜的是,我们可以使用Command Line来完成我们

如何在Ubuntu手机click包中打入第三方应用库

由于Ubuntu手机平台安全的限制,在Ubuntu手机的应用中我们只能访问自己的空间.如果我们所需要访问的文件不存在于我们应用所在的空间,我们是没有办法访问到的.我们的应用只能访问系统提供的库.如果系统没有所需要的库的话,我们通过可以通过如下的方法实现: 在我的应用中把应用的所需要的第三方的源码放入到我的应用项目中,并形成plugin(通常是C++代码)从而被应用调用 在我们的应用中把第三方的库打包进我们的应用包中,并在我的plugin(通常是C++代码)中调用,进而被应用调用 我们可以选择Ub

C++ 类模板三(类模版中的static关键字)

//类模版中的static关键字 #include<iostream> using namespace std; /* 类模板本质上是c++编译器根据类型参数创建了不同的类, c++编译器在利用类模板生成类的时候会为每个类生成一个static变量 那么对于类中的static关键字就非常好理解了 static关键字修饰的变量是属于类的 同一个类的对象共享类的static静态变量 类模板中的static修饰的变量数据类型必须是确定的 不可以是类型参数 因为静态变量在类对象之前初始化 这时候还没有通

JSP中利用Properties读写配置文件

JSP中利用Properties读写配置文件 java 代码: package com.reason.test; import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.Outp

Linux中利用extundelete恢复误删除的数据

利用extundelete工具恢复磁盘误删除的数据 原理: 简单介绍下关于inode的知识.在Linux下可以通过"ls -id"命令来查看某个文件或者目录的inode值,例如查看根目录的inode值,可以输入: [[email protected] Server-100 shell]# ls -id / 2 / 在利用extundelete恢复文件时并不依赖特定文件格式,首先extundelete会通过文件系统的inode信息(根目录的inode一般为2) 来获得当前文件系统下所有文

8. Smarty3:模版中的内置函数

smarty3中对内置函数的改动比较大,添加了许多新的功能:变量声明,表达式,流程控制,函数,数组等.但是建议不要在模版中去使用过于复杂的逻辑,而是要尽量将一些程序设计逻辑写到PHP中,并在模版中采用非常简单的语法即可调用.通常只在模版中进行一些如变量输出,流程判断及数组遍历等操作即可. 1. 变量声明 在模版中声明变量或用来在模版运行时为模版变量赋值,这是在Smarty3中新增的功能. 使用{assign},在模版运行时为模版变量或数组元素赋值 和在赋值时使用一些表达式 {$var=...}是