Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| utilisateurs:quent57:tutoriel:singlet_unity_lens [Le 28/01/2013, 07:20] – quent57 | utilisateurs:quent57:tutoriel:singlet_unity_lens [Le 02/02/2013, 15:54] (Version actuelle) – [Les types de catégories] quent57 | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | ====== Création d'une lentilles (lens) pour unity ====== | ||
| + | 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 ===== | ||
| + | L' | ||
| + | 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' | ||
| + | |||
| + | Nous nous appuierons sur singlet, une librairie que permet de créer plus facilement des lens et scope unity. | ||
| + | |||
| + | ==== Création d'un projet ==== | ||
| + | |||
| + | <code bash> | ||
| + | quickly create unity-lens tutorial | ||
| + | </ | ||
| + | |||
| + | Maintenant utilisons cette nouvelle lens : | ||
| + | <code bash> | ||
| + | cd tutorial | ||
| + | sudo quickly install | ||
| + | quickly run | ||
| + | </ | ||
| + | Et aller voir dans le Tableau de Bord (Dash) | ||
| + | |||
| + | ==== Les types de catégories ==== | ||
| + | |||
| + | Nous avons actuellement une seul catégorie d' | ||
| + | |||
| + | Ouvrir le fichier | ||
| + | tutorial/ | ||
| + | |||
| + | On observe dans ce fichier | ||
| + | example_category = ListViewCategory(" | ||
| + | Cela correspond donc à cette catégorie. | ||
| + | |||
| + | Nous allons la renommer et ajouter tous les types connus. | ||
| + | |||
| + | La doc officielle des type de catégories ((http:// | ||
| + | * VERTICAL_TILE | ||
| + | * HORIZONTAL_TILE | ||
| + | * LIST_TILE | ||
| + | * FLOW | ||
| + | Mais singlet que 2 : | ||
| + | * IconViewCategory | ||
| + | * ListViewCategory (HORIZONTAL_TILE) | ||
| + | |||
| + | remplacer cette ligne par ce code, la méthode permet de peupler une catégorie : | ||
| + | <code python> | ||
| + | list_view_category = ListViewCategory(" | ||
| + | icon_view_category = IconViewCategory(" | ||
| + | | ||
| + | | ||
| + | def populate_category(self, | ||
| + | for i in xrange(15): | ||
| + | results.append(' | ||
| + | ' | ||
| + | | ||
| + | " | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | results.append(' | ||
| + | ' | ||
| + | category, | ||
| + | " | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | </ | ||
| + | |||
| + | Remplaçons le contenu de la méthode search par : | ||
| + | <code python> | ||
| + | self.populate_category(self.list_view_category, | ||
| + | self.populate_category(self.icon_view_category, | ||
| + | </ | ||
| + | |||
| + | 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> | ||
| + | # -*-coding: | ||
| + | </ | ||
| + | |||
| + | Testez ! | ||
| + | |||
| + | 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> | ||
| + | list_tile_category = Category(" | ||
| + | flow_category = Category(" | ||
| + | </ | ||
| + | <code python> | ||
| + | self.populate_category(self.list_tile_category, | ||
| + | self.populate_category(self.flow_category, | ||
| + | </ | ||
| + | |||
| + | Nous ajouterons aussi les 2 imports suivants : | ||
| + | <code python> | ||
| + | from singlet.lens.category import Category | ||
| + | from gi.overrides.Unity import Unity | ||
| + | </ | ||
| + | |||
| + | Testez ! | ||
| + | |||
| + | Bon, ok on comprend pourquoi il n' | ||
| + | |||
| + | |||
| + | <note help> | ||
| + | |||
| + | En effet, ce sont juste des membre de notre classe ! </ | ||
| + | |||
| + | Il utilise pour cela l' | ||
| + | <code python> | ||
| + | for aName, a in attrs.items(): | ||
| + | if isinstance(a, | ||
| + | new_class._meta.scope_dict[aName] = a | ||
| + | if not hasattr(meta, | ||
| + | new_class._meta.scope_order.append(aName) | ||
| + | |||
| + | elif isinstance(a, | ||
| + | new_class._meta.category_dict[aName] = a | ||
| + | if not hasattr(meta, | ||
| + | new_class._meta.category_order.append(aName) | ||
| + | setattr(new_class, | ||
| + | |||
| + | elif isinstance(a, | ||
| + | new_class._meta.filter_dict[aName] = a | ||
| + | if not hasattr(meta, | ||
| + | new_class._meta.filter_order.append(aName) | ||
| + | |||
| + | else: | ||
| + | setattr(new_class, | ||
| + | </ | ||
| + | |||
| + | On vois ici que elif isinstance(a, | ||
| + | |||
| + | Le code ci dessus montre aussi pourquoi nous avons accès aux variables de class dans notre object (self.categorie), | ||
| + | |||
| + | |||
| + | 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=[' | ||
| + | </ | ||
| + | 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' | ||
| + | * Unity.Filter | ||
| + | * Unity.RatingsFilter | ||
| + | * Unity.OptionsFilter | ||
| + | * Unity.RadioOptionFilter | ||
| + | * Unity.CheckOptionFilterCompact | ||
| + | * Unity.CheckOptionFilter | ||
| + | * Unity.MultiRangeFilter | ||
| + | |||
| + | Voila qui est intéressant, | ||
| + | |||
| + | On ajoutera aussi l' | ||
| + | <code pyhon> | ||
| + | from gi.overrides.Gio import Gio | ||
| + | </ | ||
| + | |||
| + | 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' | ||
| + | |||
| + | 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' | ||
| + | <code python> | ||
| + | def populate_option_filter(option_filter): | ||
| + | for i in xrange(3): | ||
| + | title=" | ||
| + | option_filter.add_option(title, | ||
| + | </ | ||
| + | |||
| + | ensuite, ajouter en dessous des catégories non filtres : | ||
| + | <code python> | ||
| + | ratings_filter = Unity.RatingsFilter.new(" | ||
| + | " | ||
| + | | ||
| + | True) | ||
| + | radio_option_filter = Unity.RadioOptionFilter.new(" | ||
| + | " | ||
| + | | ||
| + | True) | ||
| + | check_option_compact_filter = Unity.CheckOptionFilterCompact.new(" | ||
| + | " | ||
| + | | ||
| + | True) | ||
| + | check_option_filter = Unity.CheckOptionFilter.new(" | ||
| + | " | ||
| + | | ||
| + | True) | ||
| + | multi_range_filter = Unity.MultiRangeFilter.new(" | ||
| + | " | ||
| + | | ||
| + | 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 | ||
| + | </ | ||
| + | |||
| + | 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. | ||
