Merge lp:~larryprice/libertine-scope/no-apps into lp:libertine-scope

Proposed by Larry Price
Status: Merged
Approved by: Christopher Townsend
Approved revision: 57
Merged at revision: 48
Proposed branch: lp:~larryprice/libertine-scope/no-apps
Merge into: lp:libertine-scope
Prerequisite: lp:~larryprice/libertine-scope/minor-cmake-updates
Diff against target: 210 lines (+87/-11)
6 files modified
libertine-scope/query.cpp (+45/-2)
libertine-scope/query.h (+4/-0)
tests/fake_container.cpp (+0/-1)
tests/fake_libertine.cpp (+0/-6)
tests/fake_libertine.h (+2/-2)
tests/test_query.cpp (+36/-0)
To merge this branch: bzr merge lp:~larryprice/libertine-scope/no-apps
Reviewer Review Type Date Requested Status
Christopher Townsend Approve
Libertine CI Bot continuous-integration Approve
Review via email: mp+297244@code.launchpad.net

Commit message

Show a message when no apps are available due to filters or no apps installed.

Description of the change

Show a message when no apps are available due to filters or no apps installed.

To post a comment you must log in.
54. By Larry Price

Merge

Revision history for this message
Libertine CI Bot (libertine-ci-bot) wrote :

FAILED: Continuous integration, rev:53
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/31/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/37
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/21
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/21
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/21
    FAILURE: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/21/console
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/31/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/37
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/38
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/38
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/31
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/31/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/31
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/31/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/31
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/31/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/31
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/31/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/31/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Libertine CI Bot (libertine-ci-bot) wrote :

PASSED: Continuous integration, rev:54
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/33/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/39
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/23
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/23
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/23
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/23
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/33/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/39
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/40
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/40
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/33
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/33/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/33
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/33/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/33
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/33/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/33
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/33/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/33/rebuild

review: Approve (continuous-integration)
55. By Larry Price

Show different messages based on filters or no apps available.

56. By Larry Price

style update

Revision history for this message
Libertine CI Bot (libertine-ci-bot) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Libertine CI Bot (libertine-ci-bot) wrote :
review: Needs Fixing (continuous-integration)
57. By Larry Price

Fixing hint string locations

Revision history for this message
Libertine CI Bot (libertine-ci-bot) wrote :

PASSED: Continuous integration, rev:57
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/37/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/44
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/26
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/26
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/26
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/26
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/37/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/44
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/45
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/45
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/38
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/38/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/38
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/38/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/38
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/38/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/38
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/38/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/37/rebuild

review: Approve (continuous-integration)
Revision history for this message
Christopher Townsend (townsend) wrote :

Ok, looks good to me.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'libertine-scope/query.cpp'
--- libertine-scope/query.cpp 2016-06-13 21:11:38 +0000
+++ libertine-scope/query.cpp 2016-06-14 16:50:00 +0000
@@ -35,8 +35,6 @@
3535
36namespace36namespace
37{37{
38static const auto NO_X_APPS_DESCRIPTION = _("Update filters or use the Libertine GUI to install applications.");
39static const auto NO_X_APPS_TITLE = _("No X Apps available");
40static const auto ROOT_DEPT_TITLE = _("X Apps");38static const auto ROOT_DEPT_TITLE = _("X Apps");
41static const auto HIDDEN_DEPT_TITLE = _("Hidden X Apps");39static const auto HIDDEN_DEPT_TITLE = _("Hidden X Apps");
42static const auto DESCRIPTION_FIELD = "description";40static const auto DESCRIPTION_FIELD = "description";
@@ -94,9 +92,28 @@
94 }92 }
95 }93 }
96)";94)";
95
96
97static const auto CATEGORY_HINT = R"(
98 {
99 "schema-version": 1,
100 "template": {
101 "category-layout": "grid",
102 "card-size": "large",
103 "card-layout": "horizontal"
104 },
105 "components": {
106 "title": "title"
107 }
108 }
109)";
97} // anonymous namespace110} // anonymous namespace
98111
99112
113std::string const Query::NO_RESULTS_HINT = _("No XApps available. Install new applications with the Libertine Manager.");
114std::string const Query::ALL_RESULTS_FILTERED_HINT = _("All XApps hidden. Reset filters or check the Hidden XApps department.");
115
116
100Query::117Query::
101Query(usc::CannedQuery const& query,118Query(usc::CannedQuery const& query,
102 usc::SearchMetadata const& metadata,119 usc::SearchMetadata const& metadata,
@@ -172,6 +189,18 @@
172189
173190
174void Query::191void Query::
192show_hint(usc::SearchReplyProxy const& reply,
193 std::string const& reason) const
194{
195 auto hint_category = reply->register_category("hint", "", "", usc::CategoryRenderer(CATEGORY_HINT));
196 usc::CategorisedResult res(hint_category);
197 res.set_uri(usc::CannedQuery(query()).to_uri());
198 res.set_title(reason);
199 reply->push(res);
200}
201
202
203void Query::
175run(usc::SearchReplyProxy const& reply)204run(usc::SearchReplyProxy const& reply)
176{205{
177 if (!hidden_->empty())206 if (!hidden_->empty())
@@ -187,6 +216,8 @@
187 }216 }
188217
189 QRegExp search_query(QString::fromStdString(query().query_string()), Qt::CaseInsensitive);218 QRegExp search_query(QString::fromStdString(query().query_string()), Qt::CaseInsensitive);
219 bool has_no_apps = true,
220 all_filtered = true;
190221
191 for (auto const& container: libertine_->get_container_list())222 for (auto const& container: libertine_->get_container_list())
192 {223 {
@@ -197,6 +228,7 @@
197228
198 for (auto const& app: container->app_launchers())229 for (auto const& app: container->app_launchers())
199 {230 {
231 has_no_apps = false;
200 if (!(search_query.isEmpty() || QString::fromStdString(app.name()).contains(search_query)))232 if (!(search_query.isEmpty() || QString::fromStdString(app.name()).contains(search_query)))
201 {233 {
202 continue;234 continue;
@@ -239,6 +271,17 @@
239 {271 {
240 return;272 return;
241 }273 }
274
275 all_filtered = false;
242 }276 }
243 }277 }
278
279 if (has_no_apps)
280 {
281 show_hint(reply, NO_RESULTS_HINT);
282 }
283 else if (all_filtered)
284 {
285 show_hint(reply, ALL_RESULTS_FILTERED_HINT);
286 }
244}287}
245288
=== modified file 'libertine-scope/query.h'
--- libertine-scope/query.h 2016-06-13 21:11:38 +0000
+++ libertine-scope/query.h 2016-06-14 16:50:00 +0000
@@ -45,9 +45,13 @@
45 void45 void
46 run(unity::scopes::SearchReplyProxy const& reply) override;46 run(unity::scopes::SearchReplyProxy const& reply) override;
4747
48 static std::string const NO_RESULTS_HINT;
49 static std::string const ALL_RESULTS_FILTERED_HINT;
50
48private:51private:
49 QStringList get_hidden_department() const;52 QStringList get_hidden_department() const;
50 QStringList make_filters(unity::scopes::SearchReplyProxy const& reply) const;53 QStringList make_filters(unity::scopes::SearchReplyProxy const& reply) const;
54 void show_hint(unity::scopes::SearchReplyProxy const& reply, std::string const& reason) const;
51 void parse_blacklist(const std::string& data_dir);55 void parse_blacklist(const std::string& data_dir);
5256
53 Libertine::UPtr libertine_;57 Libertine::UPtr libertine_;
5458
=== modified file 'tests/fake_container.cpp'
--- tests/fake_container.cpp 2016-06-09 15:07:27 +0000
+++ tests/fake_container.cpp 2016-06-14 16:50:00 +0000
@@ -42,7 +42,6 @@
42 }42 }
43};43};
4444
45
46FakeContainer::45FakeContainer::
47FakeContainer(std::string const& json_string)46FakeContainer(std::string const& json_string)
48: Container("fake-container", "fake-container")47: Container("fake-container", "fake-container")
4948
=== modified file 'tests/fake_libertine.cpp'
--- tests/fake_libertine.cpp 2016-01-19 00:16:56 +0000
+++ tests/fake_libertine.cpp 2016-06-14 16:50:00 +0000
@@ -25,12 +25,6 @@
25}25}
2626
2727
28FakeLibertine::
29~FakeLibertine()
30{
31}
32
33
34Libertine::ContainerList const& FakeLibertine::28Libertine::ContainerList const& FakeLibertine::
35get_container_list() const29get_container_list() const
36{30{
3731
=== modified file 'tests/fake_libertine.h'
--- tests/fake_libertine.h 2016-01-19 21:10:09 +0000
+++ tests/fake_libertine.h 2016-06-14 16:50:00 +0000
@@ -27,9 +27,9 @@
27: public Libertine27: public Libertine
28{28{
29public:29public:
30 ~FakeLibertine();30 virtual ~FakeLibertine() = default;
3131
32 Libertine::ContainerList const&32 virtual Libertine::ContainerList const&
33 get_container_list() const override;33 get_container_list() const override;
3434
35 static Libertine::UPtr35 static Libertine::UPtr
3636
=== modified file 'tests/test_query.cpp'
--- tests/test_query.cpp 2016-06-13 18:06:36 +0000
+++ tests/test_query.cpp 2016-06-14 16:50:00 +0000
@@ -101,6 +101,12 @@
101}101}
102102
103103
104MATCHER_P(ResultTitleMatch, title, "")
105{
106 return arg.contains("title") && arg["title"] == unity::scopes::Variant(title);
107}
108
109
104class TestQueryFixture : public ::testing::Test110class TestQueryFixture : public ::testing::Test
105{111{
106public:112public:
@@ -250,4 +256,34 @@
250 }, hidden, blacklist);256 }, hidden, blacklist);
251 query.run(proxy);257 query.run(proxy);
252}258}
259
260
261TEST_F(TestQueryFixture, showsHintWhenAllAppsFiltered)
262{
263 expect_registry();
264
265 EXPECT_CALL(reply, register_category("hint", "", "", testing::_)).WillOnce(testing::Return(category));
266 EXPECT_CALL(reply, push(testing::Matcher<unity::scopes::CategorisedResult const&>(ResultTitleMatch(Query::ALL_RESULTS_FILTERED_HINT)))).WillOnce(testing::Return(true));
267
268 EXPECT_CALL(*hidden, app_is_hidden(testing::_)).WillRepeatedly(testing::Return(true));
269
270 Query query(canned_query, metadata, []() {
271 return FakeLibertine::make_fake(LIBERTINE_OUTPUT_WITH_APPS);
272 }, hidden, blacklist);
273 query.run(proxy);
274}
275
276
277TEST_F(TestQueryFixture, showsHintWhenNoAppsInContainer)
278{
279 expect_registry();
280
281 EXPECT_CALL(reply, register_category("hint", "", "", testing::_)).WillOnce(testing::Return(category));
282 EXPECT_CALL(reply, push(testing::Matcher<unity::scopes::CategorisedResult const&>(ResultTitleMatch(Query::NO_RESULTS_HINT)))).WillOnce(testing::Return(true));
283
284 Query query(canned_query, metadata, []() {
285 return FakeLibertine::make_fake("");
286 }, hidden, blacklist);
287 query.run(proxy);
288}
253} // anonymous namespace289} // anonymous namespace

Subscribers

People subscribed via source and target branches