Slider à  trois boutons

CéroceCéroce Membre, Modérateur
janvier 2010 modifié dans API AppKit #1
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.

Réponses

  • AliGatorAliGator Membre, Modérateur
    20:08 modifié #2
    La solution 2 me parait la plus propre, la plus customisable, et la plus adaptée.
    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.
  • CéroceCéroce Membre, Modérateur
    20:08 modifié #3
    Merci pour ta réponse Ali. Je vais étudier ça.

    Par contre, pourquoi dois-je sous-classer NSButtonCell et pas NSSliderCell ?
  • MalaMala Membre, Modérateur
    20:08 modifié #4
    Une source d'inspiration:
    http://developer.snowmintcs.com/controls/smdoubleslider/

    Reste à  extrapoler pour 3 boutons.
  • AliGatorAliGator Membre, Modérateur
    20:08 modifié #5
    Ben je sais pas trop, pour moi NSSliderCell c'est un slider complet, c'est à  dire le bouton du slider (celui que tu déplaces) et sa piste (le dessin de la barre qui indique le min et le max et le long de laquelle se déplace ton slider)
    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)
  • CéroceCéroce Membre, Modérateur
    20:08 modifié #6
    @Ali: Je n'ai jamais fait ce genre de choses, pas même changer le look d'un bouton, c'est pourquoi je n'ai absolument aucune idée de la manière de commencer. Et c'est pas la doc d'Apple qui va m'aider.

    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.
  • CéroceCéroce Membre, Modérateur
    janvier 2010 modifié #7
    Bon, en ayant bien regardé le code de SMDoubleSlider, il m'apparaà®t que sous-classer NSSlider est très compliqué " ne serait-ce que parce que la doc d'Apple sur le sujet est inexistante, comme d'habitude. Les gens de SnowMint ont dû y passer plusieurs jours. Je préfère consacrer ce temps à  ajouter des fonctionnalités à  mon application; mes clients acquiesceront.

    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.
  • 20:08 modifié #8
    Juste un conseil d'ergonomie, fait en sorte que ça suive vraiment le pointeur de la souris. Là  par exemple si je déplace le curseur de gauche tout à  gauche, je fais forcément sortir ma souris de la fenêtre à  force de vouloir aller à  gauche. Mais ducoup si je reste toujours avec la souris enfoncée et que je reviens vers la droite, le slider bouge quand même. En fait, il faudrait faire ça en fonction de la position de la souris dans la vue et non pas en fonction de son simple déplacement.
  • CéroceCéroce Membre, Modérateur
    20:08 modifié #9
    Comme indiqué, il s'agissait d'un premier jet.
    J'ai corrigé le problème. Effectivement, il faut utiliser la position absolue de la souris, plutôt que le delta.
  • CéroceCéroce Membre, Modérateur
    20:08 modifié #10
    Ehm, oui c'est mieux si je donne aussi la mà j !

    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.

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