Différences
Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente | ||
utilisateurs:quent57:tutoriel:singlet_unity_lens [Le 27/01/2013, 20:09] quent57 créée |
utilisateurs:quent57:tutoriel:singlet_unity_lens [Le 11/09/2022, 13:13] (Version actuelle) moths-art Suppression des espaces en fin de ligne (détecté et corrigé via le bot wiki-corrector (https://forum.ubuntu-fr.org/viewtopic.php?id=2067892) |
||
---|---|---|---|
Ligne 2: | Ligne 2: | ||
Il est conseillé de déjà consulter ce tutoriel, pour acquérir les bases, cette pages expliquera comment utiliser plus en profondeur la librairie singlet | Il est conseillé de déjà consulter ce tutoriel, pour acquérir les bases, cette pages expliquera comment utiliser plus en profondeur la librairie singlet | ||
===== Aperçus des fonctionnalités disponibles ===== | ===== Aperçus des fonctionnalités disponibles ===== | ||
- | L'idée d'ici est de créer une lense et un scope qui montrent toutes les possibilités à disposition par les lens et scope unity. | + | L'idée d'ici est de créer une lense et un scope qui montrent toutes les possibilités à disposition par les lens et scope unity, et au passage de comprendre comment utiliser et comment fonctionne singlet. |
- | Il sera facilement compilable pour pouvoir réellement tester toutes les possibilités et afin d'avoir un affichage a jour. | + | |
- | Ce tutoriel ne contiendra donc pas d'images qui risquerai de rapidement devenirs obsolètes. | + | Le projet sera facilement compilable pour pouvoir réellement visualiser et tester toutes les possibilités de des lenses unity. |
+ | Ce tutoriel ne contiendra pas d'images qui risquerai de rapidement devenirs obsolètes. | ||
+ | |||
+ | Nous nous appuierons sur singlet, une librairie que permet de créer plus facilement des lens et scope unity. | ||
- | Nous nous appuirons sur singlet, une librairie que permet de créer plus facilement des lens et scope unity. | ||
==== Création d'un projet ==== | ==== Création d'un projet ==== | ||
<code bash> | <code bash> | ||
- | quickly create unity-lens ubuntu-fr-tutorial | + | quickly create unity-lens tutorial |
</code> | </code> | ||
- | Maintenant utilisons cette nouvelle lens : | + | Maintenant utilisons cette nouvelle lens : |
<code bash> | <code bash> | ||
- | cd ubuntu-fr-tutorial | + | cd tutorial |
sudo quickly install | sudo quickly install | ||
quickly run | quickly run | ||
Ligne 23: | Ligne 25: | ||
==== Les types de catégories ==== | ==== Les types de catégories ==== | ||
- | Nous avons actuellement un catégorie d'affichée : | + | Nous avons actuellement une seul catégorie d'affichée. |
- | * ListViewCategory | + | |
- | Ouvrir le fichier ubuntu_fr_tutorial/__init__.py | + | Ouvrir le fichier |
+ | tutorial/__init__.py | ||
- | On observe dans ce fichier | + | On observe dans ce fichier |
example_category = ListViewCategory("Examples", 'help') | example_category = ListViewCategory("Examples", 'help') | ||
Cela correspond donc à cette catégorie. | Cela correspond donc à cette catégorie. | ||
Ligne 34: | Ligne 36: | ||
Nous allons la renommer et ajouter tous les types connus. | Nous allons la renommer et ajouter tous les types connus. | ||
- | La doc officielle des type de catégories ((http://developer.ubuntu.com/api/ubuntu-12.04/python/Unity-5.0.html#Unity.CategoryRenderer)) nous propose 4 types : | + | La doc officielle des type de catégories ((http://developer.ubuntu.com/api/ubuntu-12.04/python/Unity-5.0.html#Unity.CategoryRenderer)) nous propose 4 types : |
* VERTICAL_TILE | * VERTICAL_TILE | ||
* HORIZONTAL_TILE | * HORIZONTAL_TILE | ||
* LIST_TILE | * LIST_TILE | ||
* FLOW | * FLOW | ||
- | Mais singlet que 2 : | + | Mais singlet que 2 : |
- | * IconViewCategory (VERTICAL_TILE) | + | * IconViewCategory (VERTICAL_TILE) |
* ListViewCategory (HORIZONTAL_TILE) | * ListViewCategory (HORIZONTAL_TILE) | ||
- | remplacer cette ligne pas les suivantes, la méthode permet de peupler une catégorie : | + | remplacer cette ligne par ce code, la méthode permet de peupler une catégorie : |
<code python> | <code python> | ||
list_view_category = ListViewCategory("ListViewCategory", 'help') | list_view_category = ListViewCategory("ListViewCategory", 'help') | ||
Ligne 67: | Ligne 69: | ||
</code> | </code> | ||
- | Remplaçons le contenu de la méthode search par : | + | Remplaçons le contenu de la méthode search par : |
<code python> | <code python> | ||
self.populate_category(self.list_view_category, results) | self.populate_category(self.list_view_category, results) | ||
Ligne 73: | Ligne 75: | ||
</code> | </code> | ||
- | Et comme on parle français et qu'on a envie de pouvoir mettre des accents utf-8, ajouter un première ligne du fichier : | + | Et comme on parle français et qu'on a envie de pouvoir mettre des accents utf-8, ajouter un première ligne du fichier : |
<code ptyhon> | <code ptyhon> | ||
# -*-coding:utf-8 -* | # -*-coding:utf-8 -* | ||
</code> | </code> | ||
+ | Testez ! | ||
- | Alors ok, ça fonctionne et on observe 2 types de catégorie, essayons quand memes les autres (singlet nous le permet, et c'est tant mieux !) ! | + | Alors ok, ça fonctionne et on observe 2 types de catégorie, essayons quand même les autres (singlet nous le permet, et c'est tant mieux !) ! |
<code python> | <code python> | ||
Ligne 90: | Ligne 93: | ||
</code> | </code> | ||
- | Nous ajouterons aussi les 2 imports suivants : | + | Nous ajouterons aussi les 2 imports suivants : |
<code python> | <code python> | ||
from singlet.lens.category import Category | from singlet.lens.category import Category | ||
Ligne 98: | Ligne 101: | ||
Testez ! | Testez ! | ||
- | Bon, ok on comprend pourquoi il n'étaient pas inclus par défaut, je ne vois pas de différence avec IconViewCategory, mais ca valais le coup de tester. | + | Bon, ok on comprend pourquoi il n'étaient pas inclus par défaut, je ne vois pas de différence avec IconViewCategory, mais ça valais le coup de tester. |
Ligne 105: | Ligne 108: | ||
En effet, ce sont juste des membre de notre classe ! </note> | En effet, ce sont juste des membre de notre classe ! </note> | ||
- | Il utilise pour cela l'introspection : | + | Il utilise pour cela l'introspection ((singlet/lens.base.py)) : |
<code python> | <code python> | ||
for aName, a in attrs.items(): | for aName, a in attrs.items(): | ||
Ligne 128: | Ligne 131: | ||
</code> | </code> | ||
- | On vois ici que elif isinstance(a, Unity.Category): trouve toute les catégories de notre classe | + | On vois ici que elif isinstance(a, Unity.Category): trouve toute les catégories de notre classe :) |
+ | |||
+ | Le code ci dessus montre aussi pourquoi nous avons accès aux variables de class dans notre object (self.categorie), en réalité ces membres sont injectés dans l'objet (cf code ci dessus), et ce sont uniquement les id des catégories qui sont accessible a travers ces membres ! | ||
+ | |||
+ | |||
+ | On voit aussi un autre détail, on peux définir une certaine variable category_order . | ||
+ | On vas donc essayer de la définir pour afficher nos catégories dans le meme ordre que ci dessus, car ce n'est pas le cas. | ||
+ | |||
+ | Pour cela, ajouter dans la classe Meta : | ||
+ | <code python> | ||
+ | category_order=['list_view_category','icon_view_category','list_tile_category','flow_category'] | ||
+ | </code> | ||
+ | Réinstaller la lens, la lancer, on a bien nos catégories dans le bon ordre :) | ||
+ | |||
+ | |||
+ | ==== Les filtres ==== | ||
+ | On vois ci dessus que l'on peux aussi définir des filtres | ||
+ | |||
+ | Suivant la doc, voici l'arborescence des classes : | ||
+ | * Unity.Filter | ||
+ | * Unity.RatingsFilter | ||
+ | * Unity.OptionsFilter | ||
+ | * Unity.RadioOptionFilter | ||
+ | * Unity.CheckOptionFilterCompact | ||
+ | * Unity.CheckOptionFilter | ||
+ | * Unity.MultiRangeFilter | ||
+ | |||
+ | Voila qui est intéressant, testons donc tous ces filtres ! | ||
+ | |||
+ | On ajoutera aussi l'import : | ||
+ | <code pyhon> | ||
+ | from gi.overrides.Gio import Gio | ||
+ | </code> | ||
+ | |||
+ | Alors, quelques éléments a savoir a propos des filtres, je n'ai aucune référence pour ces affirmations a pars mes propres essais : | ||
+ | - On ne peux pas ajouter d'entré a un filtre après l'avoir ajouté en tant que filtre ! | ||
+ | |||
+ | C'est très important car cela signifie que si on ajoute ces filtres en tant que membre de la classe, il *faut* qu'ils aient déja tous leur éléments ! | ||
+ | |||
+ | Donc je propose d'ajouter cette fonction *en dessus* de la classe : | ||
+ | <code python> | ||
+ | def populate_option_filter(option_filter): | ||
+ | for i in xrange(3): | ||
+ | title="Filtre"+str(i) | ||
+ | option_filter.add_option(title,title, Gio.ThemedIcon.new("input-keyboard-symbolic")) | ||
+ | </code> | ||
+ | |||
+ | ensuite, ajouter en dessous des catégories non filtres : | ||
+ | <code python> | ||
+ | ratings_filter = Unity.RatingsFilter.new("ratings_filter", | ||
+ | "Unity.RatingsFilter", | ||
+ | Gio.ThemedIcon.new("input-keyboard-symbolic"), | ||
+ | True) | ||
+ | radio_option_filter = Unity.RadioOptionFilter.new("radio_option_filter", | ||
+ | "Unity.RadioOptionFilter", | ||
+ | Gio.ThemedIcon.new("input-keyboard-symbolic"), | ||
+ | True) | ||
+ | check_option_compact_filter = Unity.CheckOptionFilterCompact.new("check_option_compact_filter", | ||
+ | "Unity.CheckOptionFilterCompact", | ||
+ | Gio.ThemedIcon.new("input-keyboard-symbolic"), | ||
+ | True) | ||
+ | check_option_filter = Unity.CheckOptionFilter.new("check_option_filter", | ||
+ | "Unity.CheckOptionFilter", | ||
+ | Gio.ThemedIcon.new("input-keyboard-symbolic"), | ||
+ | True) | ||
+ | multi_range_filter = Unity.MultiRangeFilter.new("multi_range_filter", | ||
+ | "Unity.MultiRangeFilter", | ||
+ | Gio.ThemedIcon.new("input-keyboard-symbolic"), | ||
+ | True) | ||
+ | populate_option_filter(radio_option_filter) | ||
+ | populate_option_filter(check_option_compact_filter) | ||
+ | populate_option_filter(check_option_filter) | ||
+ | populate_option_filter(multi_range_filter) | ||
+ | #rating no need to be fillful | ||
+ | </code> | ||
+ | |||
+ | Ok, on peux observer les différence :) | ||
+ | Pour récupérer les valeurs des filtres et pour en ajouter a posteriori, singlet n'est pas encore pres, nous allons donc devoir attendre un peu. |