UnityLenses
Dev Week -- Unity Lenses! -- davidcalle & mhr3 -- Tue, Jan 31st, 2012
1 [19:01] <davidcalle> Hello everyone, I'm David Callé
2 [19:01] <mhr3> Hi there, i'm Michal Hruby
3 [19:02] <davidcalle> We are going to introduce you to Unity lenses, how they work, what they do.
4 [19:02] <davidcalle> And... most importantly, how to make them.
5 [19:02] <mhr3> so let's get to it
6 [19:03] <davidcalle> A lens is basically a plugin for the Dash. To display data to the user.
7 [19:04] <davidcalle> And scopes are search engines for the lens, to bring the data.
8 [19:04] <ClassBot> calmpitbull asked: What is the best way to get started with programing unity lenses and scopes
9 [19:05] <mhr3> calmpitbull, you're just about to learn that :)
10 [19:06] <davidcalle> A lens is mostly an architecture
11 [19:07] <davidcalle> Categories and filters, used to guide the user through the data
12 [19:07] <ClassBot> pawel_st asked: ​ I've asked this on one of the previous session, but maybe you can give a more detailed answer here... Why did you choose to have daemons for all lenses? Seems to lead to more and more resources usage as new lenses are added? Why not spawn lenses on demand, or do something similar to be more resource-friendly?
13 [19:08] <mhr3> pawel_st, the reason is to be able to easily add and remove lenses
14 [19:09] <mhr3> pawel_st, this way one can easily replace the default apps lens with something they like
15 [19:09] <mhr3> or any other of course
16 [19:09] <mhr3> and the default daemons are very light, so it shouldn't be an issue atm
17 [19:10] <ClassBot> gaberlunzie asked: ​ are there any obstacles to lens displaying online data? My askubuntu lens turns up empty except for the "Ask a question" action ...
18 [19:10] <davidcalle> There shouldn't be any obstacles. It just uses http calls.
19 [19:11] <mhr3> gaberlunzie, perhaps a bug in the lens :)
20 [19:11] <mhr3> feel free to file it
21 [19:11] <ClassBot> pawel_st asked: ​ There is a nice initiative for simplifying lens/scopes development - Singlet project. Are there plans to make it available by default in Ubuntu? Or anything similar?
22 [19:12] <mhr3> ok, so let's continue with the session
23 [19:12] <davidcalle> Singlet is currently being turned into a Quickly template
24 [19:13] <mhr3> once we have a lens that displays data in particular categories and provides filters, we implement scope(s) which provide data
25 [19:14] <mhr3> a couple of guidelines about when to implement lenses vs scopes can be found at https://wiki.ubuntu.com/Unity/Lenses/Guidelines
26 [19:14] <mhr3> but let's make this more fun and actually look at a sample lens and scope
27 [19:14] <mhr3> the unity-lens-sample project on Launchpad has a couple of these available (https://code.launchpad.net/unity-lens-sample/)
28 [19:15] <mhr3> so I suppose everyone likes python, so let's take a look at that one
29 [19:15] <mhr3> if you want to get it, run `bzr branch lp:~unity-team/unity-lens-sample/python-5.0`
30 [19:16] <mhr3> the 5.0 indicates that this lens is for libunity-5.0 (which is in precise)
31 [19:16] <mhr3> if you're on oneiric and dont have unity ppas enabled, 4.0 is for you
32 [19:17] <mhr3> so, http://bazaar.launchpad.net/~unity-team/unity-lens-sample/python-5.0/view/head:/unity-lens-sample is the lens code
33 [19:17] <mhr3> and david as the author will explain details :)
34 [19:18] <davidcalle> As you can see, the lens code is quite small.
35 [19:18] <ClassBot> fantasti1001 asked: what programming language do i need to know to make lenses?
36 [19:18] <davidcalle> The first important thing is to declare your lens:
37 [19:18] <davidcalle> BUS_NAME = "net.launchpad.lens.sample"
38 [19:19] <mhr3> fantasti1001, you can pick python / c / vala (or javascript experimentally)
39 [19:19] <davidcalle> The name is rather arbitrary, but it illustrates the purpose of the lens
40 [19:19] <davidcalle> fantasti1001, Python, C, Vala, and even Javascript now (which is rather experimental)
41 [19:20] <davidcalle> Then, we define a few constants for the lens:
42 [19:20] <ClassBot> AlanBell asked: will there be an "accounts" dialog or something for lenses that require authentication credentials to be entered (a bit like Empathy or Gwibber has)
43 [19:20] <davidcalle> It's dbus path : self._lens = Unity.Lens.new ("/net/launchpad/lens/sample", "sample")
44 [19:21] <davidcalle> We also want to define the search hint (the text in the empty search bar)
45 [19:21] <davidcalle> self._lens.props.search_hint = "Search"
46 [19:21] <mhr3> AlanBell, that's up to the individual apps right now, ideally they'd integrate with the system's "online account"
47 [19:22] <davidcalle> We can also choose to have the lens icon visible in the search bar. If not, it will still be available via its shortcut.
48 [19:22] <davidcalle> self._lens.props.visible = True;
49 [19:22] <davidcalle> Then, one of the most important thing is to have the lens visible in the Home Dash.
50 [19:22] <davidcalle> Or not.
51 [19:22] <davidcalle> self._lens.props.search_in_global = True;
52 [19:23] <davidcalle> If you are looking at the code right now (http://bazaar.launchpad.net/~unity-team/unity-lens-sample/python-5.0/view/head:/unity-lens-sample)
53 [19:23] <davidcalle> You can see, that we also define the categories, which have a name, an icon, and a renderer.
54 [19:24] <davidcalle> The renderer is the way the Dash will display the results.
55 [19:24] <mhr3> you can see all the properties here http://developer.ubuntu.com/api/ubuntu-12.04/python/Unity-5.0.html#Unity.Lens
56 [19:25] <davidcalle> Two renderers are currently available : the "vertical" and the "horizontal", they both display an icon, and a text for each result. But the horizontal can also dsiaply a second text called the comment.
57 [19:26] <davidcalle> Here, I've defined two categories, using a different renderer.
58 [19:26] <davidcalle> The filters are next on our list of things to define. You can find a list in the code.
59 [19:27] <davidcalle> http://imagebin.org/index.php?mode=image&id=196573
60 [19:27] <mhr3> there you can see the various renderers in action ^^
61 [19:27] <davidcalle> Here is a screenshot of our sample lens, using the two renderers (the second one is hidden at the bottom)
62 [19:29] <davidcalle> Now that we have a lens. We need a scope to provide the data.
63 [19:29] <mhr3> right, but before that, please notice some of the system necessities for getting lens running
64 [19:30] <mhr3> at the bottom of the lens sample you can see requesting DBus name
65 [19:30] <mhr3> you need to do this, so unity can talk to the lens
66 [19:30] <mhr3> and the name need to be equal to what you .lens file says
67 [19:30] <mhr3> more details on that can be found at https://wiki.ubuntu.com/Unity/Lenses
68 [19:30] <mhr3> or https://wiki.ubuntu.com/mhr3/Lenses (for the latest 5.0 version)
69 [19:31] <mhr3> and now, let's take a look at the scope
70 [19:31] <mhr3> so here we have it > http://bazaar.launchpad.net/~unity-team/unity-lens-sample/python-5.0/view/head:/unity-scope-wikipedia
71 [19:32] <mhr3> this is an example of remote scope, that doesn't live directly inside the lens, but is an external process
72 [19:32] <mhr3> you can create scope for any existing lens by just adding your .scope file into the lens directory
73 [19:32] <mhr3> more on that again at the wiki mentioned earlier
74 [19:32] <mhr3> but let's look at the code
75 [19:33] <mhr3> commonality is again the requesting of dbus name, which is necessary for remote scopes
76 [19:33] <mhr3> but doesn't need to be there for internal lens scopes
77 [19:34] <mhr3> and then you just create a Scope instance ->
78 [19:34] <mhr3> self.scope = Unity.Scope.new ("/net/launchpad/scope/information/wikipedia")
79 [19:34] <mhr3> you specify a few properties again
80 [19:34] <mhr3> like the search-in-global etc
81 [19:34] <mhr3> (full list http://developer.ubuntu.com/api/ubuntu-12.04/python/Unity-5.0.html#Unity.Scope)
82 [19:35] <mhr3> and most importantly you connect to the search-changed signal
83 [19:35] <mhr3> self.scope.connect ("search-changed", self.on_search_changed)
84 [19:35] <mhr3> this mean that everytime the user changes the search string this method will be invoked
85 [19:35] <mhr3> and it's where you should do the actual search
86 [19:36] <mhr3> the signal has a couple of parameters:
87 [19:36] <mhr3> def on_search_changed (self, scope, search, search_type, cancellable):
88 [19:36] <mhr3> important is the search, which is a LensSearch instance
89 [19:36] <mhr3> http://developer.ubuntu.com/api/ubuntu-12.04/python/Unity-5.0.html#Unity.LensSearch
90 [19:37] <mhr3> and this holds the data about the search
91 [19:37] <mhr3> like the actual search_string
92 [19:37] <mhr3> the scopes have a two results models which you need to update during the search
93 [19:38] <mhr3> the correct results model is always stored in search.results_model
94 [19:38] <mhr3> as you can see in http://bazaar.launchpad.net/~unity-team/unity-lens-sample/python-5.0/view/head:/unity-scope-wikipedia#L33
95 [19:38] <ClassBot> pawel_st asked: ​ Is caching results of lens search possible via the framework, or is this something one needs to implement for his lens?
96 [19:39] <mhr3> depends what you want to do
97 [19:39] <mhr3> results from previous search are always available in the model
98 [19:40] <mhr3> that's why you see model.clear() call here http://bazaar.launchpad.net/~unity-team/unity-lens-sample/python-5.0/view/head:/unity-scope-wikipedia#L35
99 [19:40] <mhr3> so it's up to you how are you going to use that
100 [19:41] <mhr3> so once we get results for the query the user wants, we append those to the model
101 [19:41] <mhr3> as you can see in http://bazaar.launchpad.net/~unity-team/unity-lens-sample/python-5.0/view/head:/unity-scope-wikipedia#L81
102 [19:42] <mhr3> the models we are talking about are part of the Dee library (see it's reference @ http://developer.ubuntu.com/api/ubuntu-12.04/python/Dee-1.0.html )
103 [19:42] <mhr3> and there's a specific data the model expects
104 [19:42] <mhr3> for results it's uri, icon, category id, mimetype, display name, comment and dnd_uri
105 [19:43] <mhr3> so you add results to the model and once you're done, you just call search.finished() on the LensSearch instance
106 [19:44] <mhr3> the user can then click on any of results
107 [19:44] <mhr3> and if you picked some standard uri (like http://...) unity can just launch it in the browser for example
108 [19:44] <mhr3> but if your lens is doing something special
109 [19:45] <mhr3> you can use your own uris, and if you connect to the activate_uri signal of the scope you'll be notified when the user activated them, so you can do whatever you want
110 [19:45] <mhr3> and that's the basics
111 [19:45] <mhr3> questions?
112 [19:46] <ClassBot> kanliot asked: do lenses require unity and ubuntu?
113 [19:46] <davidcalle> They do.
114 [19:46] <davidcalle> Not Ubuntu, but at least Unity.
115 [19:46] <mhr3> well unity is what controls them
116 [19:46] <mhr3> you could implement your own ui
117 [19:46] <mhr3> but there's nothing in existence that would do that
118 [19:47] <mhr3> not that i know of anyway :)
119 [19:47] <davidcalle> If you want to look at various code examples
120 [19:48] <davidcalle> https://code.launchpad.net/onehundredscopes
121 [19:48] <davidcalle> It's a lot of scopes and lenses branches, doing very different things, from talking to web API, to looking into user folders.
122 [19:48] <mhr3> if you're wondering about the changes that were made in latest Unity-5.0 (and therefore really advanced stuff) feel free to look at http://www.grillbar.org/wordpress/?p=585
123 [19:49] <ClassBot> Ceno asked: is there any difference in performance between the various languages we can program lens/scopes in?
124 [19:50] <ClassBot> There are 10 minutes remaining in the current session.
125 [19:51] <mhr3> Ceno, good question
126 [19:51] <mhr3> we dont really have any scientific data to suggest one way or the other
127 [19:52] <mhr3> of course theoretically languages that don't need garbage collector and such things ought to be faster :)
128 [19:52] <mhr3> but mostly the slowest part of lens is talking to a webservice which is slow anyway :)
129 [19:52] <mhr3> if they are talking to a webservice of course :)
130 [19:52] <ClassBot> mfisch asked: is there a recommended IRC channel where lens-writers can discuss things?
131 [19:53] <davidcalle> #ubuntu-unity is the place for that
132 [19:53] <mhr3> mfisch, ^^ thats the place
133 [19:53] <ClassBot> Ceno asked: I might have missed something, and if I did I apologize, but how do you go from these 2 pieces of code, one for lens one for scope, to actually testing the thing live in Unity?
134 [19:54] <mhr3> there's a README file in the directory ;)
135 [19:54] <mhr3> basically you copy the .lens and .scope files to specific directories and restart unity
136 [19:55] <mhr3> http://bazaar.launchpad.net/~unity-team/unity-lens-sample/python-5.0/view/head:/README
137 [19:55] <davidcalle> A lens daemon comes with a .lens files, the scope daemon with a .scope file. Their content is pretty much self explicit.
138 [19:55] <davidcalle> s/files/file
139 [19:55] <ClassBot> There are 5 minutes remaining in the current session.
140 [19:56] <davidcalle> They both need to go in /usr/share/unity/lenses/<lens name>
141 [19:56] <davidcalle> The daemons can be anywhere.
142 [19:56] <davidcalle> An important thing :
143 [19:57] <davidcalle> To start a new lens. You need to restart unity (unity --restart or setsid unity)
144 [19:57] <davidcalle> Just once, to make it learn about the new lens.
145 [19:58] <ClassBot> mhall119 asked: once I have a lens or scope, how do I get it into Software Center?
146 [19:58] <davidcalle> But for the scopes, you just need to restart the lens daemon.
147 [19:59] <mhr3> i'm afraid we won't cover software center in this session
148 [19:59] <ClassBot> jincreator asked: Is it possible to extract and use lens at user's home directory, not /usr/share/... ?
149 [19:59] <davidcalle> mhall119, you package your lens, then submit the package to https://myapps.developer.ubuntu.com
150 [20:00] <mhr3> jincreator, unfortunately not, unity only checks /usr/share/unity/lenses directory
151 [20:00] <mhr3> Ok, seems like we're out of time, thanks everyone for attending!
MeetingLogs/devweek1201/UnityLenses (last edited 2012-02-01 11:18:44 by dholbach)