RuleEditor

laurrislaurris Membre
mars 2007 modifié dans Vos applications #1
RuleEditor est un framework pour OS 10.4 + composé d'une classe principale PSRuleEditor, sous-classe de NSView.
Il s'agit de refaire l'élément d'interface que l'on peut trouver dans la fonction Spotlight du Finder pour filtrer des fichiers. L'idée est de pouvoir l'utiliser dans n'importe quelle application compatible Tiger.
Il y a plusieurs mois, j'avais pondu un truc du même genre (criteriaView) mais qui s'était avéré peu pratique d'utilisation. Dans criteriaView, il y avait un système de chargement de nibs, avec des bindings dedans. Dans RuleEditor, rien de tout celà . Les éléments sont créés et détruits dans le code, et on peut y accéder à  l'aide de méthodes dédiées. La création des éléments (criterion) est paramétrable du coté "client" grace à  un delegate, ce qui permet une plus grande flexibilité d'utilisation.
Il y a aussi un support pour les prédicates en cours d'élaboration.

Pour l'instant, le framework est en version beta mais déjà  assez avancé pour le faire fonctionner  dans une appli. Je bosse encore à  la mise en place de ce projet et à  la création d'une page web et d'une doc, mais en attendant voici un avant goût ici:

EDIT: code dispo ici: http://code.google.com/p/ruleeditor/ >> onglet Source

On peut télécharger une appli test linkée au framework pour avoir une idée du bidule (attention beta= bugs !).
Si certains sont intéressés et souhaitent participer au projet, ils peuvent d'ores et déjà  me le faire savoir ici ou par mail. Je crois bien que lorsque j'avais posté CriteriaView (le brouillon précédent), il y avait déjà  eu des réponses dans ce sens, donc ça marche toujours pour moi. En particulier s'ils s'y connaisent en drag'n drop de vues ou en Ib palette parce que ce sont des choses que j'aimerais faire à  l'avenir.

Dès que j'aurais finalisé le problème de la licence et de la doc je donnerai plus d'infos ici même, avec un lien vers le code source.

A+.
RuleEditor.jpg


Réponses

  • aranaudaranaud Membre
    23:21 modifié #2
    J'ai pu l'essayer car je n'ai pas un mac intel.  :'(
  • laurrislaurris Membre
    23:21 modifié #3
    dans 1156680998:

    J'ai pu l'essayer car je n'ai pas un mac intel.  :'(


    C'est bizarre parce je l'ai compilé sous macintel mais avec i386 et ppc dans le build setting "achitectures".
    Quand je fais "lipo -info <exectutable>" il me dit bien que c'est un universal binary.

    Est-ce que la console te dit quelque chose de spécial quand tu essaye de lancer l'appli ?
  • aranaudaranaud Membre
    23:21 modifié #4
    Non, j'ai aucun message dans la console mais dans le finder.

    [Fichier joint supprimé par l'administrateur]
  • regattaregatta Membre
    23:21 modifié #5
    C'est bon, il n'y a plus le message !
  • laurrislaurris Membre
    23:21 modifié #6
    Recommence le téléchargement. Je crois que quand j'ai uploadé mon fichier quelque chose a déconné la première fois. Tu as dû le télécharger juste avant que je ne corrige le problème.
    Désolé pour le désagrément.
  • aranaudaranaud Membre
    23:21 modifié #7
    Ok, sa fonctionne.
  • laurrislaurris Membre
    mars 2007 modifié #8
    [size=12pt]J'ai mis à  jour le site. On peut désormais télécharger un projet Xcode complet qui montre comment intégrer le framework à  une appli.
    En dehors des amélioration du framework lui-même (qui reste en beta), le projet et l'appli qui va avec permettent de:
    - Filtrer une table en presque live avec RuleEditor et son predicate associé (on peut rafraichir le prédicate avec le boutton ad hoc)
    - Ajouter un contrôle perso à  RuleEditor en fonction du choix des critères. Ici un NSSlider mais on peut ajouter n'importe quelle NSView en théorie.
    - Voir comment fonctionne le delegate qui permet d'afficher les lignes. (3 methodes requises)
    - Inclus, une doc des methodes et constantes utilisées.

    Si vous avez des bugs à  signaler ou juste un commentaire, le mieux est de le faire ici en attendant que je mette en place le système de bug report (trac).

    Bon assez parlé, rulez jeunesse.


    [/size]
  • laurrislaurris Membre
    mars 2007 modifié #9
    En attendant que je refasse le site web (qui n'est pas très sexy je sais mais c'est la faute à  ce ?#@§ d'iWeb), voici une nouvelle version pour tester RuleEditor.Pour l'instant, le principal défaut est que les critérions sont créés avec un delegate. Outre que l'uilisation peut paraitre un peu complexe, on ne peut pas pour l'instant spécifier un prédicate ou un prédicate multiple (NSCompoundPredicate) et demander à  RuleEditor d'afficher les criterions en conséquence. Pour résumer, on peut récupérer un prédicate en output mais pas réutiliser le même en input. c'est assez génant si on veut modifier une règle qui a déja été créée auparavant.

    Si ça intéresse du monde je pourrais m'y remettre et bosser sur cette fonctionnalité (bien pratique ).

    Le fichier joint contient le projet xcode de l'application test AVEC(*) le source du framework + l'éxécutable seul + une documentation détaillée.

    (*) contrairement à  la version sur le site web.

    A consommer et commenter sans modération. A venir: un plugin pour Interface Builder. Stay tuned.
  • GilGil Membre
    23:21 modifié #10
    Bonjour,
    Merci pour la mise à  disposition de votre projet.
    Je me permets de vous signaler un problème concernant les architectures : vous avez définit "$(NATIVE_ARCH) ppc" (informations du projet), ce qui marche sous Intel mais pas sous PPC.
    La solution serait de définir les architectures "$(NATIVE_ARCH)" en Debug et "ppc i386" en Release.
    Cordialement,
    Gil.
  • laurrislaurris Membre
    23:21 modifié #11
    Salut Gil et merci pour ce conseil. J'ai modifié les configs en Debug= $(NATIVE_ARCH) et Release = " ppc i386". Si le SCM marche correctement, un SCM>Update project devrait faire l'affaire.

    Cependant je ne comprends pas bien pourquoi un  "$(NATIVE_ARCH) ppc", même inapproprié, ne marcherais pas sur ppc. Normalement ça donnerait ppc & ppc = ppc, non ? Je me demande si le problème ne viendrait pas plutôt du SDK utilisé: 10.4u qui n'est peut-être pas installé sur toutes les versions xCode pour 10.4.
  • laurrislaurris Membre
    janvier 2007 modifié #12
    Hello!, juste un petit mot en passant pour dire:

    1/ Bonne année à  tous, pleine de réussite pour vos objectifs plus ou moins C.

    2/ RuleEditor change d'adresse. On peut désormais le trouver chez Googlecode: http://code.google.com/p/ruleeditor/

    On peut toujours avoir acces au code grâce à  leur dépot subversion (cf l'onglet source). N'hésitez pas à  y aller, ça brule pas . C'est un petit projet qui n'est pas encore totalement aboutit mais qui à  mon avis se révèlera très utile quand Leopard sera sorti. Les developpeurs verront les nouveaux UI inclus dans 10.5, seront tout contents de les utiliser dans leurs applis mais désespérément déçus de ne pouvoir en faire bénéficier les utilisateurs  nombreux qui n'auront pas Leopard. Alors intervient RuleEditor qui rend le concept de NSRuleEditor (10.5) rétro-compatible pour 10.4.

    Les contributions sont donc bienvenues d'autant que googlecode comporte une section pour la notification des bugs très facile d'emploi. Ais-je précisé que je donnerai facilement des droits de "commiter" pour subversion ? non ? voilà .

    A+.
  • laurrislaurris Membre
    février 2007 modifié #13
    Amis codeurs,
    RuleEditor a désormais atteint une maturité suffisante pour être utilisé dans une application.
    Il reste encore quelques fonctionnalités à  peaufiner. Notamment l'intégration avec CoreData. Ne serait-il pas enthousiasmant de pouvoir créer des règles à  partir des attributs d'une entité CoreData ? Je ne maà®trise pas asez CoreData pour arriver à  une solution parfaite. Aussi, je fais appel à  des plus expérimentés que moi pour implémenter cette possibilité.

    Si vous voulez faire un tour sur http://code.google.com/p/ruleeditor/ et télécharger le code, bien vous en prenne.
    Vous noterez dans la classe PSRuleEditorTemplate une méthode:
    + (NSArray *)templatesWithAttributeKeyPaths:(NSArray *)keyPaths inEntityDescription:(NSEntityDescription *)entityDescription
    
    pour, en gros, extraire les NSExpression (sous-parties d'un NSPredicate) à  partir d'une entité. Il n'y a plus qu'à  remplir avec le code adéquat.
    Vos idées ou suggestions sont bienvenues (je rame).

    A+. Laurris.

  • fouffouf Membre
    23:21 modifié #14
    En fait j'étais en train de chercher un truc équivalent pour les programme sur lequel je suis en train de travailler et donc si tu veux bien, je vais utiliser ce que tu as fait. Je regarderais ca se soir (ou demain matin) ...
  • laurrislaurris Membre
    23:21 modifié #15
    dans 1172698742:

    Je regarderais ca se soir (ou demain matin) ...


    See you.
  • fouffouf Membre
    23:21 modifié #16
    J'ai regardé ton code et en particulier la TestApp et j'aurais quelques questions.

    D'après ce que j'ai compris, chaque critère peut avoir des descendant dans l'arborescence  (d'ou les méthodes de delegate
    - (int)ruleEditor:(PSRuleEditor *)editor numberOfChildrenForCriterion:(id)criterion withRowType:(int)rowType (1)
    
    et
    - (id)ruleEditor:(PSRuleEditor *)editor child:(int)index forCriterion:(id)criterion withRowType:(int)rowType (2)
    

    Ces descendants vont être tous les types de critères possibles et imaginables (en fait les clés pour la racine puis les types et modes de comparaisons pour les différentes clés) De plus, l'appel a la seconde methode va permettre de mettre en place les vues (plus exactement les editeurs) pour chaque critère. Cette vue va être récupérée par la méthode
    - (id)ruleEditor:(PSRuleEditor *)editor displayValueForCriterion:(id)criterion inRow:(int)row (3)
    
    Enfin, on génére le NSPredicate associé a la vue à  partir de la méthode
    - (NSDictionary*)ruleEditor:(PSRuleEditor*)editor predicatePartsForCriterion:(id)criterion withDisplayValue:(id)value inRow:(int)row (4)
    
    .

    En fait, si l'on veut avoir de nouveau critères, il suffit d'éditer le fichier criteria.plist que tu as mis dans l'appli ... (Pour le fonctionnement de la vue elle-meme, je n'ai pas très bien regardé, mais ca a l'air pas mal du tout ;) )

    Par contre, l'aurais besoin de pouvoir avoir des NSMenu pour les critères (à  la place d'un NSTextField). Si je ne me trompe le mieux serait d'implémenter la création de ce NSMenu dans la méthode (2) à  partir de nouvelles clés dans le fichier plist. Je vais essayer de faire ca aujourd'hui ;)
  • laurrislaurris Membre
    mars 2007 modifié #17
    Tout à  fait !
    Sachant que les 3 premières méthodes sont obligatoires (affichage) et la dernière optionnelle. Concernant le type retourné par la méthode (3), il peut être NSString ou n'importe quoi qui descend de NSView.
    NSMenuItem *devrait* être permis ... mais ne l'est pas pour l'instant pour la bonne raison que je ne vois pas ce que ça amènerait en plus par rapport à  NSString. Si tu as une opinion là  dessus, ça m'intéresse  ;)

    Sinon, fouf, un doute m'étreint: tu parles de la target TestApp, or le nom actuel est PSRuleEditorTestApp. Est-ce que par hasard tu aurais téléchargé le fichier que j'ai uploadé dans un message plus haut ? Si oui, je te conseille de récupérer plutôt la version actuelle à  googlecode et regarder la section "issues" pour voir les priorités de travail (ya aussi une doc !).

    A+ Laurris.


  • fouffouf Membre
    23:21 modifié #18
    Bon, j'ai essayé et ca marche pas mal.
    J'arrive donc a créer des NSPopUpButton a la place des textFields ou des pickers avec un menu et tout le bazard. Par contre, j'ai un pb au niveau de l'affichage (cf captures d'écran).

    Quand j'utilise le code "standard" (cad :
    NSPopUpArrowPosition pos = NSPopUpArrowAtBottom;<br />			if (MAC_OS_X_VERSION_MAX_ALLOWED &lt;= MAC_OS_X_VERSION_10_4){		<br />				ArrowCell *arrowCell = [[ArrowCell alloc] init];<br />				[arrowCell setArrowImage:[editor arrowImage]];<br />				[view setCell:arrowCell];<br />				[arrowCell release];<br />				pos = NSPopUpNoArrow;<br />			}<br />			[view setFont:[NSFont systemFontOfSize:FONT_SIZE]];<br />			[[view cell] setBezelStyle:NSRoundRectBezelStyle];<br />			[[view cell] setArrowPosition:pos];
    
    ), ca me fait le décalage, et quand je commente la ligne [view setCell:arrowCell];, ca m'enlève le décalage, mais évidemment, je n'ai plus les flèches (y compris quand je commente aussi la ligne pos = NSPopUpNoArrow; ou que je remplace NSPopUpNoArrow par autre chose).

    Pourrais-tu me dire comment tu as fait pour les autres popup, pasque en fait, je n'ai pas trouvé dans ton code ;)

    PS : si tu pouvais me passer une addresse AIM ou MSN ca serait super ;)

    [Fichier joint supprimé par l'administrateur]
  • laurrislaurris Membre
    mars 2007 modifié #19
    Question: comment tu le créé le popup de droite ?
    Si comme je le suppose tu le crée dans le delegate avec les methodes (2) ou (3) alors je comprends d'où vient le souci de centrage (Criterion.m).
    Mais normalement, tu n'as pas besoin de créer toi-même le popup. Il suffit qu'un criterion parent ait plusieurs enfants, c'est à  dire que
    (- (int)ruleEditor:(PSRuleEditor *)editor numberOfChildrenForCriterion:(id)criterion withRowType:(int)rowType
    
    ait une valeur >1 pour que le popup soit créé automatiquement à  condition que la méthode (3) renvoie un string.
    La création au nveau du delegate n'a d'interêt que dans des cas particulier. Exemple: un popup avec des images dans les menus ou bien un popup avec des inter-menus. Sinon, pour un popup normal, c'est tout cuit.

    J'ai mis mon adresse Im dans mon profil. Appelle-moi et je te montrerai comment faire ta règle plus haut en ajoutant juste une entrée dans criteria.plist.

    Nota Bene: La raison d'être du code que tu cites c'est qu'il y a un BUG dans le popup "plastic" sous 10.4 qui fout la flèche n'importe où.
  • fouffouf Membre
    mars 2007 modifié #20
    Bon, j'ai fin par réussir a faire ces menus avec un minimun de modif (je crois que je n'ai rajouté qu'une seule ligne de code) et ca marche nickel-chrome.
    Encore 2 truc qui me chagrinent : les + a droite de la vue qui sont "mangés" et un pb avec la NSScrollView (en fait faire un resize automatique qui permet d'avoir une frame dans la scrollview adaptée cad ni trop grande, ni trop petite ...).

    Je reposte dès que j'ai terminé ;)

    [edit]
    Ayez, ai terminé (pour les plus, c'est juste une histoire de taille d'image). Bon, bah je crois que je vais pouvoir retourné à  mon programme principal ;)

    Merci beaucoup Laurris pour ton travail.
Connectez-vous ou Inscrivez-vous pour répondre.