通常我们在Scope的设计中,我们可以通过搜寻在query中发生一个请求.事实上,我们也可以在我们的preview中通过按钮的方式来发生一个query请求,并生成显示结果.在今天的文章中,我们将讲述如何在preview中发生一个请求.
1)请求的种类
我们可以通过"
CannedQuery"中如下的两个API来生产我们需要的query请求:
- set_query_string (std::string const &query_str)
- set_user_data (Variant const &value)
上面的这两个API的区别在于前面一个API可以在搜索框里输入我们所需要的字符串再进行搜索.对于set_user_data来说,它的搜索的字符串已经在传人的参数中,我们可以直接进行解析,并使解析的参数成为我们API请求的一部分.对于这种情况,通常我们不需要再进行搜索.
下面我们通过实际的例子来展示如果使用.
2)set_query_string
在我们的preview中,我们加入如下的代码:
preview.cpp
sc::CannedQuery new_query(SCOPE_INSTALL_NAME);
std::string str("carousel");
new_query.set_query_string(str);
builder1.add_tuple({
{"id", Variant("user_videos")},
{"label", Variant("Show query string")},
{"uri", Variant(new_query.to_uri())}
});
从上面的代码中可以看出来我们在query中预先设置了一个字符串"carousel".在我们的query中,我们通过如下的代码来识别这种情况:
query.cpp
void Query::run(sc::SearchReplyProxy const& reply) {
try {
// Let's first check the query string
const sc::CannedQuery &query(sc::SearchQueryBase::query());
// Get the query string
string query_string = query.query_string();
QString queryStr = QString::fromStdString(query_string);
qDebug() << "query: " << queryStr;
if ( queryStr.startsWith("carousel") ) {
qDebug() << "it is from the preview";
int count = images_.count();
auto cat = reply->register_category( "Carousel", "Carousel" ,
"", sc::CategoryRenderer(CAT_RENDERER9) );
for ( int i = 0; i < count; i ++ ) {
pushResult( reply, &cat, i);
}
}
....
}
在上面的代码中,我们可以对有carousel字符串进行匹配,如果请求德尔是以这个为开始的字符串,我们做分别的处理.运行我们的Scope:
当我们在preivew中点击"Show query string"的时候,我们的query显示的图片如右图所示.在搜寻框中显示"carousel"字样.并显示我们所需要的carousel图片.我们也可以在输入框中接着输入我们所需要的任何一个字符串,只要前面的几个字符串是"carousel"即可.
3)set_user_data
在我们的preview中,我们写上如下的代码:
preview.cpp
sc::CannedQuery new_query1(SCOPE_INSTALL_NAME);
new_query1.set_user_data(Variant("num=" + std::to_string(4)));
builder1.add_tuple({
{"id", Variant("user_videos")},
{"label", Variant("User data")},
{"uri", Variant(new_query1.to_uri())}
});
在这里,我们把搜寻的代码中直接写入所需要搜索的参数,我们可以在query中进行解析,并展示结果:
query.cpp
void Query::run(sc::SearchReplyProxy const& reply) {
try {
// Let's first check the query string
const sc::CannedQuery &query(sc::SearchQueryBase::query());
// Get the query string
string query_string = query.query_string();
QString queryStr = QString::fromStdString(query_string);
qDebug() << "query: " << queryStr;
if (sc::SearchQueryBase::query().has_user_data()) {
string userdata = sc::SearchQueryBase::query().user_data().get_string();
qDebug() << "it has user data in it";
cerr << "user_data: " << userdata << endl;
const std::string prefix("num=");
if (!userdata.compare(0, prefix.size(), prefix)) {
qDebug() << "prefix is found!";
std::string num = userdata.substr(prefix.size());
cerr << "num: " << num << endl;
int number = num.back() - '0';
qDebug() << "number: " << number;
// Let's display a vertical-journal according to the number
auto cat = reply->register_category( "vertical-journal", "vertical-journal" ,
"", sc::CategoryRenderer(CAT_RENDERER12) );
for ( int i = 0; i < number; i ++ ) {
pushResult( reply, &cat, i);
}
}
}
...
}
在上面,我们通过检测有没有user_data.如果有,我们也做分别的处理.这种情况和上面的那种情况不之处在于我们不需要再输入任何额外的参数给我们的搜索,因为我们可以通过解析user_data来得到搜寻所需要的所有的参数.运行我们的scope:
在上面,我们可以点击"User data"按钮来直接进入到我们的query界面.我们不需要输入任何的参数.当前显示我们输入的4个grid图片.