Bindings pour IKImageBrowserView

Philippe49Philippe49 Membre
novembre 2007 modifié dans API AppKit #1
La doc d'Image Kit présente l'utilisation des IKImageBrowserView en utilisant un protocole de type data-source.
Ce document (très simple) en donne une lecture version bindings.

remarques :
mise à  jour le 4 novembre
Les méthodes dealloc() sont à  rajouter
Mac OS X 10.5, novembre 2007
Sans garantie de l'auteur, merci de signaler les erreurs/imprécisions/améliorations





[Fichier joint supprimé par l'administrateur]

Réponses

  • laurrislaurris Membre
    13:42 modifié #2
    Merci pour ce tuto !

    J'en ai pondu un petit projet que voici.
    J'ai rajouté quelques "goudises" : le filtrage à  partir du nom  de fichier et le réagencement/suppression des images.

    [Fichier joint supprimé par l'administrateur]
  • Philippe49Philippe49 Membre
    13:42 modifié #3
    Je vois que tu as poursuivi avec le déplacement des images.

    Comme toi je ne vois pas comment intercepter ce moveItems autrement que par la data-source.
    Quand une vue comme ce IKImageBrowserView réalise un réagencement des images elle envoie le message à  sa data-source. Quelle est la meilleure façon d'intercepter le message ? 

    Je suis en train d'étudier la version d'une catégorie sur le NSArrayController pour rester dans l'esprit controller, en déclarant ce contrôleur comme data-source ...
  • laurrislaurris Membre
    13:42 modifié #4
    J'ai suivi la doc d'Apple. C'est sans doute la seule façon d'implémenter le reordering/removing.

    Si tu veux intercepter le résultat sur le model, tu peux aussi observer le NSArrayController bindé avec "arrangedObjects" en keyPath (pas essayé).
    Tout dépend du but recherché.
  • Philippe49Philippe49 Membre
    novembre 2007 modifié #5
    dans 1194107383:

    J'ai suivi la doc d'Apple. C'est sans doute la seule façon d'implémenter le reordering/removing.


    je le pense aussi.

    Voici la solution avec une catégorie sur NSArrayController, voir la suite du tuto (2) ..
    <br />@implementation NSArrayController (IKImageBrowserDataSource)<br />- (BOOL)imageBrowser:(IKImageBrowserView *) aBrowser <br />            moveItemsAtIndexes: (NSIndexSet *)indexes <br />            toIndex:(NSUInteger)destinationIndex<br />{<br />	NSUInteger offset=[indexes countOfIndexesInRange:NSMakeRange(0,destinationIndex)];<br />	NSUInteger newDestinationIndex=destinationIndex-offset;<br />	[self setSelectionIndexes:indexes];<br />	NSArray * objects=[[self selectedObjects] copy];<br />	[self remove:self];<br />	for(id object in objects){<br />		[self insertObject:object  atArrangedObjectIndex:newDestinationIndex++];<br />	}<br />	[objects release];<br />	return YES;<br />}<br />@end<br />
    


    Pour remove, il suffit de connecter à  remove: du NSArrayController
  • Philippe49Philippe49 Membre
    13:42 modifié #6
    La suite du tuto avec la suppression et le déplacement de la sélection dans le browser.







    [Fichier joint supprimé par l'administrateur]
  • Philippe49Philippe49 Membre
    novembre 2007 modifié #7
    La suite avec les idées de goodies de Laurris.
    (dont NSSearchField bindé pour présenter une partie des images) 





    [Fichier joint supprimé par l'administrateur]
  • laurrislaurris Membre
    13:42 modifié #8
    merci Philippe,

    Est-ce que tu as essayé de binder la selection à  une IKImageView ? J'ai l'impression, et c'est une grosse déception, que contrairement à  NSImageView, il n'y a pas de binding "data" ou "value" pour IKImageView. En plus je ne vois pas comment récupérer la selection du IKImageBrowser pour l'injecter à  la main dans une IKImageView.
  • Philippe49Philippe49 Membre
    13:42 modifié #9
    dans 1194193492:

    merci Philippe,

    Est-ce que tu as essayé de binder la selection à  une IKImageView ? J'ai l'impression, et c'est une grosse déception, que contrairement à  NSImageView, il n'y a pas de binding "data" ou "value" pour IKImageView. En plus je ne vois pas comment récupérer la selection du IKImageBrowser pour l'injecter à  la main dans une IKImageView.


    Non, je vais essayer ...

    Une question sur le binding du NSSearchField : sais-tu l'utilité et les précautions à  prendre pour le champ "Display Name" ?
  • laurrislaurris Membre
    novembre 2007 modifié #10
    dans 1194194235:

    Une question sur le binding du NSSearchField : sais-tu l'utilité et les précautions à  prendre pour le champ "Display Name" ?


    C'est le label qui apparait quand on veut choisir un critère de sélection en cliquant à  gauche du searchfield. Que je sache , ça peut être n'importe quoi.

    Edit: je viens de m'apercevoir que ce label n'apparait pas. J'imagine que c'est le sens de ta question. Le filtrage par contre marche bien.
    Si on ajoute un second critère, là  les deux aparaissent. Bizarre, je ne me souviens pas de ce comportement avec 10.4.
  • neckarosneckaros Membre
    13:42 modifié #11
    Merci pour ce tuto très bien réalisé.
    J'ai qu'un seul problème c'est comment intégrer le drag & drop.
    En ne passant par le bindings j'avais très bien réussi mais là  sa bloque.
    J'ai pourtant bien lié le delegate a une classe (de type NSObjet) avec - (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
    {<br />&nbsp; &nbsp; NSData*			data = nil;<br />&nbsp; &nbsp; NSPasteboard*	pasteboard = [sender draggingPasteboard];<br />	<br />	// Look for paths on the pasteboard.<br />&nbsp; &nbsp; if ([[pasteboard types] containsObject:NSURLPboardType]) <br />&nbsp; &nbsp; &nbsp; &nbsp; data = [pasteboard dataForType:NSURLPboardType];<br />	<br />&nbsp; &nbsp; if (data)<br />	{<br />		NSString* errorDescription;<br />		<br />		// Retrieve&nbsp; paths.<br />&nbsp; &nbsp; &nbsp; &nbsp; NSArray* filenames = [NSPropertyListSerialization propertyListFromData:data <br />															&nbsp; mutabilityOption:kCFPropertyListImmutable <br />																		format:nil <br />															&nbsp; errorDescription:&amp;errorDescription];<br />		<br />		// Add paths to the data source.<br />&nbsp; &nbsp; &nbsp; &nbsp; NSInteger i, n;<br />&nbsp; &nbsp; &nbsp; &nbsp; n = [filenames count];<br />&nbsp; &nbsp; &nbsp; &nbsp; for (i = 0; i &lt; n; i++)<br />		{<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [self addAnImageWithURLDrop:[filenames objectAtIndex:i]];<br />			<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />		<br />		// Make the image browser reload the data source.<br />&nbsp; &nbsp; &nbsp; &nbsp; [self updateDatasource];<br />&nbsp; &nbsp; }<br />	<br />	// Accept the drag operation.<br />	return YES;<br />}
    

    Mais rien n'y fait. Je suis autodidacte donc j'ai peut-être raté quelque chose de gros comme une maison mais si vous pouviez m'aider s'a m'aiderai beaucoup :)

    Pour le moveItems même problème pourtant comme dit ici j'ai subclassé mon NSArrayController je l'ai lié comme data source en plus du binding avec dedans la fonction donnée plus haut et pourtant rien ne move :(

    Merci d'avance
  • Philippe49Philippe49 Membre
    13:42 modifié #12
    dans 1218537919:

    Mais rien n'y fait. Je suis autodidacte donc j'ai peut-être raté quelque chose de gros comme une maison mais si vous pouviez m'aider s'a m'aiderai beaucoup :)

    Dans le genre gros comme une maison, il y a la property supportsDragAndDrop, amis là  c'est un immeuble  :)

    dans 1218537919:

    Pour le moveItems même problème pourtant comme dit ici j'ai subclassé mon NSArrayController je l'ai lié comme data source en plus du binding avec dedans la fonction donnée plus haut et pourtant rien ne move :(

    data-source + bindings , cela doit faire mal ... On fait l'un ou l'autre

    dans 1218537919:

    {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [self addAnImageWithURLDrop:[filenames objectAtIndex:i]];<br />			<br />&nbsp; &nbsp; &nbsp; &nbsp; [self updateDatasource];<br />
    



    1) Tu es donc dans la classe du NSArrayController : As-tu correctement donné la classe dans le nib ?
    2) Le mécanisme du binding n'a pas l'air de fonctionner par le simple addAnImageWithURLDrop:, il faut le déclencher en l'encadrant par des méthodes signalant au binding d'être activé.
    (autre solution : faire le addObject sur la NSMutableArray qui sert de model au NSArrayController)

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