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

在本遍文章中,我们来讲解怎么对我们的Ubuntu Scope进行设置。对Scope而言,有些时候我们希望能够使用设置来改变我们的显示,或对我们的搜索进行重新定义。关于更多Scope的开发,请参阅网站:http://developer.ubuntu.com/scopes/

1)首先创建一个最基本的Scope

我们首先打开SDK,并选择“Unity Scope”模版。我们选择一个项目的名称为“settingscope”:

接下来,我们选择“Empty scope”。这样我们就创建了我们的一个最基本的scope了。

2)加入代码来完成设置功能

首先,我们打开项目中的“data”文件夹,并创建一个如下的文件名:

com.ubuntu.developer.liu-xiao-guo.settingscope_settingscope-settings.ini

注意这个文件名和Scope的设置文件

com.ubuntu.developer.liu-xiao-guo.settingscope_settingscope.ini

只有细小的差别。只是在它的后面加上“-settings"即可。记住千万不要改变这个规则。注意这个文件名和项目的名称的不同而不同

为了能够对这个文件进行设置和安装,我们也同时需要对“data”目录下的“CMakeLists.txt”文件加入如下的内容:

configure_file(
  "com.ubuntu.developer.liu-xiao-guo.settingscope_settingscope-settings.ini"
  "${CMAKE_BINARY_DIR}/src/com.ubuntu.developer.liu-xiao-guo.settingscope_settingscope-settings.ini"
)

INSTALL(
  FILES "${CMAKE_BINARY_DIR}/src/com.ubuntu.developer.liu-xiao-guo.settingscope_settingscope-settings.ini"
  DESTINATION "${SCOPE_INSTALL_DIR}"
)

这样我们的设置文件就可以安装到目标中了。下面,我们可以对我们的设置文件进行配置。打开我们的设置文件:

[location]
type = string
defaultValue = London
displayName = Location


[distanceUnit]
type = list
defaultValue = 1
displayName = Distance Unit
displayName[de] = Entfernungseinheit
displayValues = Kilometers;Miles
displayValues[de] = Kilometer;Meilen


[age]
type = number
defaultValue = 23
displayName = Age


[enabled]
type = boolean
defaultValue = true
displayName = Enabled


# Setting without a default value
[color]
type = string
displayName = Color


[limit]
type = number
defaultValue = 20
displayName = 搜寻条数

在这里,我们定义了一些设置的名称,比如“location”。它被定义为“string”,同时它还有一个默认的值“London”。显示的提示为“Location”,当然我们也可以把它修改为“位置”(对中文而言)。

为了能够在应用中访问我们,我们可以修改我们的代码如下:

void Query::run(sc::SearchReplyProxy const& reply) {

    // Read the settings
    initScope();

    try {
        // Start by getting information about the query
        const sc::CannedQuery &query(sc::SearchQueryBase::query());

        // Trim the query string of whitespace
        string query_string = alg::trim_copy(query.query_string());

        Client::ResultList results;
        if (query_string.empty()) {
            // If the string is empty, pick a default
            results = client_.search("default");
        } else {
            // otherwise, use the search string
            results = client_.search(query_string);
        }

        // Register a category
        auto cat = reply->register_category("results", "Results", "",
                                            sc::CategoryRenderer(CATEGORY_TEMPLATE));

        for (const auto &result : results) {
            sc::CategorisedResult res(cat);

            cerr << "it comes here: " << m_limit << endl;

            // We must have a URI
            res.set_uri(result.uri);

            // res.set_title(result.title);
            res.set_title( m_location );
            res["subtitle"] = std::to_string(m_limit);

            // Set the rest of the attributes, art, description, etc
            res.set_art(result.art);
            res["description"] = result.description;

            // Push the result
            if (!reply->push(res)) {
                // 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());
    }
}

void Query::initScope()
{
    unity::scopes::VariantMap config = settings();  // The settings method is provided by the base class
    if (config.empty())
        cerr << "CONFIG EMPTY!" << endl;

    m_location = config["location"].get_string();     // Prints "London" unless the user changed the value
    cerr << "location: " << m_location << endl;

    m_limit = config["limit"].get_double();
    cerr << "limit: " << m_limit << endl;
}

这里“initScope”在“Run”中被调用。在InitScope中,我们通过“settings()”来读取设置的值。为了显示的方便,我们在“Run”中,也对读取的值进行简单的显示:

            // res.set_title(result.title);
            res.set_title( m_location );
            res["subtitle"] = std::to_string(m_limit);

我们重新运行我们的Scope,并可以看到如下的图片:

   

我们也可以在我们的Application Output窗口中看到设置的变化:

整个项目的源码可以在如下的地址下载:

bzr branch lp:~liu-xiao-guo/debiantrial/settingscope

更多阅读可以参考 http://developer.ubuntu.com/api/devel/ubuntu-14.10/cplusplus/unity-scopes/index.html#scopesettings

时间: 2024-09-28 02:37:44

如何在Ubuntu Scope中定义设置变量并读取的相关文章

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

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

如何在switch case中定义变量(不用花括号)

这个周末有幸见到了几位神交已久的库友(天天/迪迪/丁丁),大家一起扯了些有的没的,很开森! 天天考了我一个问题,在C语言里面,如何在switch case中定义一个变量?要求是不用花括号. 这个问题是背景是,下面的代码是编译不过的,因为在case后面不能直接定义变量. switch (v) {    case 1:       int a;       get_value_of_xx(&a);       set_yy(a);       break;    case 2:       //do

javascript在私有作用域中定义私有变量和私有函数 (1)

javascript没有私有成员,但是有私有变量,所有对戏那个属性都是公有的 任何在函数中定义的变量,都可以认为是私有变量,因为函数内部不能访问. 私有变量包括:函数的参数.局部变量.函数内部定义的其他函数 - 在私有作用域中定义私有变量和私有函数 function MyObject(){ //私有变量和私有函数 var privateVariable=10; function privateFunction(params) { return false } //特权方法----有权访问私有变量

【Javascript】: for循环中定义的变量在for循环体外也有效

for循环中定义的变量在for循环体外也有效 <script> (function(){ var a = 111; for(var i=0;i<5;i++){ var carl = 111; console.log(i); } alert("carl is:"+carl); })(); </script> 结果: carl is:111

Objective-c中定义成员变量

ios定义成员变量的方法: 如果只是内部访问,完全可以直接用_xxx(下划线),无需自己定义,编译器会自动生成 如果需要外部访问这个变量,可以用 @property xxx ; @synthesize xxx = _xxx ,这样,编译器会自动生成 get,set函数 :可以很明确的表明这是一个向外部提供set.get方法的属性. http://www.tairan.com/archives/194 Objective-c中定义成员变量

ES6 class类中定义私有变量

ES6 class类中定义私有变量 class类的不足 看起来, es6 中 class 的出现拉近了 JS 和传统 OOP 语言的距离.但是,它仅仅是一个语法糖罢了,不能实现传统 OOP 语言一样的功能.在其中,比较大的一个痛点就是私有变量问题. 何为私有变量?私有变量就是只能在类内部访问的变量,外部无法访问的变量.在开发中,很多变量或方法你不想其他人访问,可以定义为私有变量,防止被其他人使用.在 Java 中,可以使用 private 实现私有变量,但是可惜的是, JS 中并没有该功能. 来

倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)如何在TwinCAT Scope中做变量监控

为了更好的监控变量,可以打开ScopeView即变量监控器 ? 添加一个Scope View,然后右击添加一个Channel ? 我们在之前登录的时候可以选择Run-Time的端口(默认是801) ? 这里变量监控也要设置获取的端口是801的端口(一共最大可以使用四个端口) ? 用同样的方法添加对其他变量的监控,注意点击Reload可以刷新程序中的所有变量,然后单击变量可以将当前变量作为要监控的变量放到当前的Channel中 ? 对于某个Channel,可以修改该变量的名字,显示的图形(折线图的

利用video PreviewWidget在Ubuntu Scope中播放video

在先前的例程中,我们探讨了如何利用audio PreviewWidget在Scope中播放音乐.在这篇文章中,我们将介绍如何使用videoPreviewWidget来播放一个video. 我们首先来下载我在上一篇文章中的例程: git clone https://gitcafe.com/ubuntu/scopetemplates_audio.git 为了加入video PreviewWidget,我在我们的例程中加入了如下的句子: query.cpp r["videoSource"]

shell脚本中定义路径变量出现的BUG

=========================================================================== if 语句中的定义路径变量 引发命令的PATH路径改变出现的bug 问题 原脚本文件:inotify +rsync 实时共享 #!/bin/bash PATH=/data/ IP=172.16.1.41 cd $PATH &&\ 切换到一个新的变量中了 /usr/bin/inotifywait -mrq --format '%w%f' -e