Slider à trois boutons
Céroce
Membre, Modérateur
Bonjour à tous,
Je cherche à reproduire un type spécial de sliders, tels qu'on les trouve dans iPhoto, par exemple (voir la copie d'écran en bas).
Je ne sais pas trop comment m'y prendre, sachant que ce slider à trois curseurs possède forcément trois valeurs et trois cibles.
Voilà les solutions auxquelles je pense:
1) Créer une sous-classe de NSSliderCell et l'utiliser avec trois NSSliders
Cette solution me paraà®t la plus facile. Il suffirait de superposer les trois NSSliders.
La solution présente deux inconvénients:
- il faut désactiver le clic sur la "barre"
- il faut empêcher dans la couche modèle que le curseur blanc ait une valeur inférieure à celle du curseur gris, etc.
2) Créer une sous-classe de NSCell et NSControl
Cette solution paraà®t plus propre, mais plus difficile. Vais-je parvenir facilement à ajouter trois cibles ?
Bref, je vous demande vos avis et conseils.
Je cherche à reproduire un type spécial de sliders, tels qu'on les trouve dans iPhoto, par exemple (voir la copie d'écran en bas).
Je ne sais pas trop comment m'y prendre, sachant que ce slider à trois curseurs possède forcément trois valeurs et trois cibles.
Voilà les solutions auxquelles je pense:
1) Créer une sous-classe de NSSliderCell et l'utiliser avec trois NSSliders
Cette solution me paraà®t la plus facile. Il suffirait de superposer les trois NSSliders.
La solution présente deux inconvénients:
- il faut désactiver le clic sur la "barre"
- il faut empêcher dans la couche modèle que le curseur blanc ait une valeur inférieure à celle du curseur gris, etc.
2) Créer une sous-classe de NSCell et NSControl
Cette solution paraà®t plus propre, mais plus difficile. Vais-je parvenir facilement à ajouter trois cibles ?
Bref, je vous demande vos avis et conseils.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Ca peut être une cell composée de 3 NSButtonCells (tes 3 triangles) et tu codes leur possibilité de déplacement le long de la barre, en t'assurant lors de ce déplacement que le curseur déplacé reste dans ses bornes autorisées.
Par contre, pourquoi dois-je sous-classer NSButtonCell et pas NSSliderCell ?
http://developer.snowmintcs.com/controls/smdoubleslider/
Reste à extrapoler pour 3 boutons.
Si tu voulais faire ta solution 1, c'est à dire si j'ai bien suivi avec 3 sliders superposés en fait... ça fait un peu surchargé je trouve, ça te ferait non seulement trois boutons déplaçables, mais aussi et surtout 3 tracks (pistes) les unes sur les autres, non ?
Et d'ailleurs dans ce cas si tu fais comme ça, puisqu'alors tes sliders se superposeraient, tes events de clic risquent d'être mal gérés, seul le slider dessiné au dessus pouvant intercepter les events de clic...
Pour ça que superposer 3 sliders me semble la porte ouverte aux problèmes en tout genres, et risque d'être bien plus compliqué au final que la solution 1
(Bon après, je dis ça, je dis rien, je crois n'avoir jamais sous-classé de NSCell sous OSX de toute façon, et ça fait un bail que j'ai pas fait de prog OSX depuis que je me suis mis à l'iPhone ^^ qui n'a pas ce concept de NSCells, donc bon)
Je vous remercie encore.
Je vais regarder le code de SMDoubleSlider (j'avais fait une recherche sur le web, mais difficile de trouver les bons termes), et je posterai le résultat de mes investigations.
Je ne vais malheureusement pas pouvoir développer mon expertise dans le domaine du sous-classage des NSControl, parce que j'en suis arrivé à la conclusion que la moitié des methodes de NSControl (doubleValue, etc.) n'ont plus de sens avec un slider à trois curseurs. Du coup, j'ai créé une vue perso.
Et en plus, je suis certain que c'est ce que fait Apple dans iPhoto.
En cadeau, un premier jet qui fonctionne à peu près, uniquement avec les bindings, je n'ai pas développé la partie Actions.
J'ai corrigé le problème. Effectivement, il faut utiliser la position absolue de la souris, plutôt que le delta.
J'en ai profité pour ajouter une propriété "enabled" ainsi que quelques contrôles sur les valeurs.
P.S.: Finalement, je ne vais sûrement pas l'utiliser dans mon projet... j'ai mieux.