Restaurer l'ordre d'une sidebar

FloFlo Membre
00:30 modifié dans API AppKit #1
Bonjour à  tous,

Pour la couche modèle de ma sidebar (NSOutlineView personnalisée) j'utilise une classe SidebarNode très similaire à  NSTreeNode.

Je souhaite permettre à  l'utilisateur de ré-organiser comme il veut les NSCell de  la sidebar via drag and drog (comme dans XCode par exemple).

J'ai un soucis qui doit être assez fréquent, quand l'utilisateur change l'ordre des SidebarNode, ces changements ne se répercutent pas sur l'ordre des éléments de la base de données. Donc quand je sauvegarde cette dernière, l'ordre n'est pas sauvegardé...

Lors du lancement de l'application, la sidebar est donc construite dans l'ordre dans lequel les éléments on été ajoutés dans la base de données et non celui dans lequel les SidebarNode était au précédent lancement. Quelqu'un aurait-il entendu parlé d'une solution pas trop lourde pour parer à  ce problème ?

J'ai pensé à  ça :
- répercuter tous les changements d'ordre des SidebarNode sur la base de données à  chaque fois.
- sauvegarder l'arbre dans la base de données

:why?:

Réponses

  • FloFlo Membre
    00:30 modifié #2
    ça n'a pas l'air d'inspirer grand monde mon histoire...  :)
  • FloFlo Membre
    00:30 modifié #3
    Bon je continue mon petit monologue, pour l'instant j'ai choisis la méthode de synchroniser la base de données avec les sidebarNodes à  chaque fois que l'utilisateur en change l'ordre.

    Je reviendrai me parler quand j'aurai un peu plus avancé  :)
  • AliGatorAliGator Membre, Modérateur
    00:30 modifié #4
    J'ai pas tout suivi sur le pb, mais pourquoi ne pas prévoir un champ "index" dans la table de ta base de données, index qui indique l'index d'ordre de chaque élément ?
  • FloFlo Membre
    septembre 2009 modifié #5

    J'ai pas tout suivi sur le pb, mais pourquoi ne pas prévoir un champ "index" dans la table de ta base de données, index qui indique l'index d'ordre de chaque élément ?


    J'y ai pensé mais ça me semble plutôt lourd comme solution, imaginons qu'on supprime un élément, il faudrait décaler les index de tous ceux qui sont après ?

    L'idée c'était plutôt de trouver une solution qui ne s'occupe pas de l'ordre des éléments stockés dans la bdd et qui soit capable de reconstruire les sidebarNodes dans l'ordre dans lequel l'utilisateur les a placé tout en les reliant à  leur éléments respectifs dans la bdd.
  • CéroceCéroce Membre, Modérateur
    00:30 modifié #6
    En même temps, il n'y a pas tellement d'autre solution que ce que propose Ali.

    D'habitude dans une BdD, tu n'as aucune garantie que les enregistrements vont rester dans l'ordre de leur création; il se peut que la table soit réorganisée pour gagner en performances. D'expérience, c'est le cas avec Core Data.
  • AliGatorAliGator Membre, Modérateur
    00:30 modifié #7
    Et puis tu n'es pas obligé de faire ça directement avec des chiffres d'ordre.

    D'une part plutôt que de rajouter un champ orderIndex à  ta table, tu peux aussi créer une table dédiée à  la mise en ordre de tes éléments, qui ne contiendra que {id, itemID, orderIndex}. Bon c'est juste pour te dire que la solution existe parce que bon faire une table à  part pour laquelle tu risques de devoir faire un "join" pour quasiment toutes les requêtes je sais pas si ça vaut le coup.

    Mais surtout d'autre part rien ne t'oblige à  avoir les valeurs dans orderIndex qui soient contiguës ! Tu peux tout à  fait avoir dans un premier temps les items A,B,C,D avec un orderIndex de 1,2,3,4 respectivement, puis supprimer C et n'avoir donc que A,B,D restant avec comme orderIndex 1,2,4. Ca ne change rien puisque pour récupérer les items dans l'ordre dans lequel tu veux les afficher, tu feras une requête demandant de trier par orderIndex ("ORDER BY orderIndex" en SQL, ou tri de ton NSArray suivant le keyPath "orderIndex" en CoreData). Ca mènera au bon résultat que tes orderIndex soient contigus ou non ;)
    Après si tu ajoutes un nouvel élément tu pourras l'ajouter par défaut à  la fin, donc avec un orderIndex de 5, sans avoir à  tout retoucher non plus. Par contre si tu modifies l'ordre de tes éléments, il faudra bien sûr réaffecter les orderIndex de chacun de tes items. Au moins à  partir de l'élément avant lequel tu déplaces ton item. Genre tu réplaces ton nouvel item E après B, tu n'as qu'à  modifier l'orderIndex de tous les éléments après B, donc D et E, tu n'as pas besoin de toucher à  l'orderIndex des éléments B et précédents (A et B garderont leur orderIndex).
  • FloFlo Membre
    00:30 modifié #8
    Merci pour ces idées intéressantes !  :)

    Je vais faire ma petite tambouille et je reviens pleurer si ça ne marche pas !  :o

Connectez-vous ou Inscrivez-vous pour répondre.