Retournement de fenêtre à  la Widget

LeChatNoirLeChatNoir Membre, Modérateur
11:44 modifié dans API AppKit #1
Salut à  tous,
Eh oui, après qques mois d'absences, je me recolle à  mon projet qui avance plus que doucement (quand je vois le projet de Mala(de), on peut dire qu'il n'avance pratiquement pas :-)).

Je réfléchis à  une fonctionnalité que j'aimerai ajouter à  mon client FTP (bon ok, faudrait d'abord que je finalise le client mais j'anticipe).

Ca consisterait à  pouvoir activer facilement le serveur FTP de Mac OS X via une interface graphique. Et comme j'aimerai faire simple, l'idée serait simplement d'avoir possibilité de retourner la fenêtre principale de mon client comme un widget et de l'autre côté de la fenêtre, d'avoir la possibilité de "régler" le serveur FTP (genre démarrer le serveur et avec Leopard, peut être aller plus loin (réglage des droits, etc)).

Au final, ma question est donc la suivante : est il facile de faire cela sur une fenêtre Cocoa standard ? J'avoue ne pas avoir réfléchis à  la question et je sais que vous n'aimez pas trop ça mais je me disais que peut être que les cadors du forum connaissent dèjà  un moyen...  ::)

Merci d'avance,

Réponses

  • schlumschlum Membre
    11:44 modifié #2
    Regarde du côté de CGSFlip... Je n'ai pas plus d'infos  :(

    Sinon :
    http://www.objective-cocoa.org/forum/index.php/topic,1071.0.html
  • LeChatNoirLeChatNoir Membre, Modérateur
    11:44 modifié #3
    Ok merci.
    Ca fait tellement longtemps que j'en ai même oublié la recherche ! Sorry...

    Bon ben j'ai déjà  pas mal d'info avec tes liens. Je regarde et vous tiens au jus.

    A+
  • Eddy58Eddy58 Membre
    juin 2007 modifié #4
    J'ai ce code qui traine dans mon DD... ::)

    Méthode d'animation à  la Dashboard :
    <br />-(void)animateWindow:(NSWindow*)win effect:(CGSTransitionType)fx direction:(CGSTransitionOption)dir duration:(float)dur <br />{ <br />&nbsp; &nbsp;// declare our variables&nbsp; <br />&nbsp; &nbsp;int handle; <br />&nbsp; &nbsp;CGSTransitionSpec spec; <br />&nbsp; &nbsp; <br />&nbsp; &nbsp;// assign our transition handle <br />&nbsp; &nbsp;handle = -1; <br />&nbsp; &nbsp; <br />&nbsp; &nbsp;// specify our specifications <br />&nbsp; &nbsp;spec.unknown1=0; <br />&nbsp; &nbsp;spec.type=fx; <br />&nbsp; &nbsp;spec.option=dir; <br />&nbsp; &nbsp;spec.option |= (1&lt;&lt;7); <br />&nbsp; &nbsp;spec.backColour=NULL; <br />&nbsp; &nbsp;spec.wid=[win windowNumber]; <br />&nbsp; &nbsp; <br />&nbsp; &nbsp;// Let's get a connection <br />&nbsp; &nbsp;CGSConnection cgs= _CGSDefaultConnection(); <br />&nbsp; &nbsp; <br />&nbsp; &nbsp;// Create a transition <br />&nbsp; &nbsp;CGSNewTransition(cgs, &amp;spec, &amp;handle); <br />&nbsp; &nbsp; <br />&nbsp; &nbsp;// Redraw the window to update the &quot;new&quot; state (new screen) <br />&nbsp; &nbsp;[win display]; <br />&nbsp; &nbsp;if (fx == CGSNone) <br />&nbsp; &nbsp; &nbsp; dur = 0.f; // if no transition effect, no need to have a duration, (it would be strange to wait for nothin&#39;)<br />&nbsp; &nbsp; <br />&nbsp; &nbsp;/* Pass the connection, handle, <br />&nbsp; &nbsp; &nbsp; * and duration to apply the animation <br />&nbsp; &nbsp; &nbsp; */ <br />&nbsp; &nbsp;CGSInvokeTransition(cgs, handle, dur); <br />&nbsp; &nbsp;/* We need to wait for the transition to finish <br />&nbsp; &nbsp; &nbsp; * before we get rid of it, otherwise we'll get <br />&nbsp; &nbsp; &nbsp; * all sorts of nasty errors <br />&nbsp; &nbsp; &nbsp; */ <br />&nbsp; &nbsp;usleep((useconds_t)(dur*1000000)); <br />&nbsp; &nbsp;/* Finally, release all our variables */ <br />&nbsp; &nbsp; <br />&nbsp; &nbsp;CGSReleaseTransition(cgs, handle); <br />&nbsp; &nbsp;handle=0; <br />}<br />
    


    Exemple d'appel :
    <br />&nbsp; &nbsp; &nbsp; &nbsp;  [window setContentView:versoView];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[self animateWindow:window effect:CGSFlip direction:CGSLeft duration:1.0]; <br />
    

  • MalaMala Membre, Modérateur
    11:44 modifié #5
    Grillé par Eddy!  :)

    Moi je suis reparti d'un bout de code d'un projet nommé fancy et implémentant une classe nommée AnimatingTabView mais je n'arrive pas retrouver la page web de l'auteur. Par contre, j'avais fait des modifs car il y avait des pertes mémoires à  cause de CoreImage et dans mon cas je voulais en plus faire pivoter ma view et non la fenêtre entière (mais du coup le code ne fonctionne plus avec une fenêtre).
  • LeChatNoirLeChatNoir Membre, Modérateur
    11:44 modifié #6
    Salut,
    J'ai pris le code d'Eddy et ça marche presque bien.
    J'ai eu des pb de compilation résolus en incluant le CGS......h qui va bien.

    Ensuite, pour l'appel, j'ai simplement fait une outlet vers la fenêtre et j'ai lié ça sous IB. Et là , surprise, toutes le fenêtres à  l'écran se retournent !

    Je suis donc plutot passé par un [[NSApplication sharedApplication] window] et là , c'est mieux. Y a que ma fenêtre qui se retourne. Quelqu'un peut m'expliquer ce comportement étrange ?

    2eme pb : le setContentView. Dans un projet de test, j'ai ajouté sous IB une Custom view dans laquelle j'ai mis qques controles juste pour voir. J'ai lié une outlet vers cette view et hop, je fais mon setContentView.
    La vue initiale reste pourtant à  l'écran et la nouvelle n'apparait pas. Par contre, les controles de la vue intiale ne répondent plus...

    Bref, je comprend pas trop où ça déconne....

    Dernière question : je me demande si ce code fonctionnerait sous Panther...

    Merci de votre aide !
  • MalaMala Membre, Modérateur
    juin 2007 modifié #7
    dans 1182425742:

    Simplement fait une outlet vers la fenêtre et j'ai lié ça sous IB. Et là , surprise, toutes le fenêtres à  l'écran se retournent !

    C'est très surprenant. J'utilise le même code qu'Eddy pour faire un effet cube entre mes deux éditeurs et ça marche bien. Je n'ai qu'une window dans laquelle j'ai mis un NSTabView sans bordures ni entête. Pour switcher d'un plan à  un autre je fais un truc du genre:
    <br />&nbsp; &nbsp; int clickedSegment = [sender selectedSegment];<br /><br />&nbsp; &nbsp; if( clickedSegment == [_OutletMainTabView indexOfTabViewItem:[_OutletMainTabView selectedTabViewItem]] )<br />&nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; return;<br />&nbsp; &nbsp; }<br /><br />&nbsp; &nbsp; [_OutletMainTabView selectTabViewItemAtIndex:clickedSegment];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; if( clickedSegment == 1)<br />&nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; // Show the interface editor<br />&nbsp; &nbsp; &nbsp; &nbsp; [self animateWindow:self&nbsp; effect:CGSCube direction:CGSLeft duration:0.4]; <br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; else<br />&nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; // Show the processing editor<br />&nbsp; &nbsp; &nbsp; &nbsp; [self animateWindow:self&nbsp; effect:CGSCube direction:CGSRight duration:0.4];<br />&nbsp; &nbsp; }<br />
    

    Avec un sender qui est un NSSegmentedCell.

    dans 1182425742:

    Dernière question : je me demande si ce code fonctionnerait sous Panther...

    Les effets de ce genre sont Tiger only.

  • LeChatNoirLeChatNoir Membre, Modérateur
    11:44 modifié #8
    Là , c'est du code de la sous classe de ta window apparemment.
    Moi j'ai mis ça dans un objet à  moi qui n'a rien à  voir avec la Window... C'est l'outlet qu'il a pas l'air d'aimer...

    Pour Tiger Only, je suis surpris car c'est pas du CoreImage... Mais bon, tant pis, vu la rapidité de progression de mon projet, le jour où je sortirai une beta, Apple s'appellera peut être Google, Tiger sera mort et le protocole FTP n'existera sans doute plus  ;)
  • MalaMala Membre, Modérateur
    11:44 modifié #9
    dans 1182426854:

    Moi j'ai mis ça dans un objet à  moi qui n'a rien à  voir avec la Window...

    Oui pardon, j'ai oublié de précisé.

    dans 1182426854:

    Pour Tiger Only, je suis surpris car c'est pas du CoreImage...

    Et CoreImage n'est pas tiger only?  :P Tu voulais sans doute dire CoreGraphics. Ce serait effectivement à  vérifier mais je de gros doutes dans la mesure où ces effets au niveau de l'OS sont arrivés avec Tiger.

  • 11:44 modifié #10
    Je pense que ça n'empêche pas à  un utilisateur de Panther de faire tourner ton App. Il aura pas les animations CG mais bon.
    Pour un de mes logiciels j'avais implémenté CGSCube, CGSFlip, .. enfin tout CGSPrivate quoi. Donc j'ai mis Mac OS X 10.4 minimum. Mais un utilisateur qui est sous Panther m'a dit que ça marchait chez lui, sauf l'animation.. à  vérifier
  • LeChatNoirLeChatNoir Membre, Modérateur
    11:44 modifié #11
    dans 1182428931:


    Et CoreImage n'est pas tiger only?  :P Tu voulais sans doute dire CoreGraphics. Ce serait effectivement à  vérifier mais je de gros doutes dans la mesure où ces effets au niveau de l'OS sont arrivés avec Tiger.




    ben voui, CoreImage est bien Tiger Only mais je disais que c'était PAS du CoreImage... ;-) Sinon, ok, je tenterai peut être un test un de ces 4 (ma frangine est encore Panther de mémoire....).
  • MalaMala Membre, Modérateur
    11:44 modifié #12
    Faut que j'arrête la bibine moi.  :p
  • LeChatNoirLeChatNoir Membre, Modérateur
    11:44 modifié #13
    Si c'est ce qui te fait avancer, surtout pas !  :p
    :-))))
  • LeChatNoirLeChatNoir Membre, Modérateur
    11:44 modifié #14
    bon ben finalement, tout marche bien.
    Ca avait un comportement tout bizzare parce que j'avais mis mes IBOutlet en dehors des accolades !!!! Comme si c'était des méthodes !
    Trop nul....  :crackboom:-
  • NseaProtectorNseaProtector Membre
    11:44 modifié #15
    J'ai mis une NSTabView dans ma fenêtre avec 2 vues (recto et verso) et j'ai rajouté un peu de code pour inversé mes 2 vues...

    - (IBAction)turn:(id)sender{<br />	// declare everything<br />	int index;<br />	index=[MesVues indexOfTabViewItem:[MesVues selectedTabViewItem]];<br />	NSLog(@&quot;index avant %d&quot;,index);<br />	index= index ^1; //inversion via xor<br />	NSLog(@&quot;index apres %d&quot;,index);<br />	[MesVues selectTabViewItem:[MesVues tabViewItemAtIndex:index]];<br />	int handle=-1;<br />	CGSTransitionSpec spec;<br /><br />	spec.unknown1=0;<br />	spec.type=CGSCube;<br />	spec.option=CGSLeft | (1&lt;&lt;7);<br />	spec.backColour=0;<br />	spec.wid=[self windowNumber];<br /><br />	CGSConnection cgs= _CGSDefaultConnection();<br /><br />	// Create a transition<br />	CGSNewTransition(cgs, &amp;spec, &amp;handle);<br /><br />	// Redraw the window<br />	[self display];<br /><br />	/* Pass the connection, handle,<br />	&nbsp;  and duration to apply the animation */<br />	CGSInvokeTransition(cgs, handle, 1);<br /><br />	/* We need to wait for the transition to finish<br />	&nbsp; before we get rid of it */<br />	usleep((useconds_t)(1000000));<br /><br />//	Release our variables<br />	CGSReleaseTransition(cgs, handle);<br />	handle=0;<br />}<br />
    

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