Restaurer l'ordre d'une sidebar
Flo
Membre
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?:
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?:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Je reviendrai me parler quand j'aurai un peu plus avancé
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.
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.
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).
Je vais faire ma petite tambouille et je reviens pleurer si ça ne marche pas !