Editeur de format d'édition

13»

Réponses

  • wiskywisky Membre
    09:35 modifié #62
    Merci ;)

    Sa fait déjà  plus de 4 ans que je programme en cocoa mais j'en apprend encore ! Il est quasiment inépuisable en ressources ce langage !
    Il est vrais que je restait dans des choses simple et standard.

    J'ai réussi pour le Gras et l'Italique. J'ai déjà  utilisé une toolbarre style pref de mac os x. Je vais réutiliser le code. mais j'aimerais bien que cela soit comme IB.
  • Philippe49Philippe49 Membre
    09:35 modifié #63
    dans 1234364011:

    J'ai réussi pour le Gras et l'Italique. J'ai déjà  utilisé une toolbarre style pref de mac os x. Je vais réutiliser le code. mais j'aimerais bien que cela soit comme IB.


    Va voir le post de Chaps (lien à  mon post précédent), il y répond.
  • wiskywisky Membre
    09:35 modifié #64
    L'interface est ok !
    Maintenant, j'ai mon (mes) document(s), et ma fenêtre de propriété, j'aimerais relier le document au premier plan et la fenêtre des propriété dynamiquement mais je ne sait pas comment faire !
    Binding (j'ai pas encore capter toutes les subtilités mais je sais que ça évite le code glue) ? ou un autre moyen ?
  • Philippe49Philippe49 Membre
    09:35 modifié #65
    Sur les bindings, tu peux d'abord lire ce post avant de te décider

    Sinon le principe de base (personnel..., et même en mode binding) c'est la stratégie
    rafraà®chissement du model => rafraà®chissement de l'UI

    Donc si un changement intervient (par l'UI ou autre), cela provoque d'abord la mise à  jour du model, puis vient ensuite le rafraà®chissement de tous les éléments de l'UI. Peut-être pas le plus économique ... mais relativement sur.

  • wiskywisky Membre
    09:35 modifié #66
    OK, au final j'ai plutôt bien fait de ne pas me jeter sur les bindings ;)

    Bon et biens j'ai des centaines de ligne de code d'accesseur à  faire pour rendre disponible mon inspecteur à  mes documents. A moins qu'il existe un autre moyen permetant au document au premier plan d'accéder au éléments de l'UI de l'inspecteur ?
  • Philippe49Philippe49 Membre
    09:35 modifié #67
    Les accesseurs standards n'ont pas besoin d'être écrits :

    Dans l'interface :
    @property (nonatomic,retain) NSBezierPath * thePath  ;
    @property NSRect contentRect;
    Dans l'implémentation
    @synthesize thePath,contentRect;

    Les accesseurs setThePath:,thepath, setContentRect:, contentRect, et les notations object.thePath et object.contentRect sont alors utilisables.

    et tu as toujours le Key Value Coding :
    [anObject valueForKey:@thePath] et [anObject setValue:apath forKey:@thePath]
  • Philippe49Philippe49 Membre
    février 2009 modifié #68
    Quand à  accéder à  l'inspecteur, je ne le verrais pas dans le sens Model --> Inspecteur mais dans l'autre sens Inspecteur <-- Contrôleur --> Objet courant. Il faut donc qu'à  tout instant le contrôleur de l'UI  et de l'inspecteur pilote la situation.
    Le model ne sert "que de" zone de stockage des données.

    [EDIT] c'est la même chose que la fonction draw du début : ce n'est pas au model de faire la gestion.
    Si tu veux néammois faire ainsi, fait une variable globale à  l'aide d'un singleton [InspectorController sharedInspector]
  • wiskywisky Membre
    09:35 modifié #69
    Merci pour les propriétés. Je ne savais plus comment il fallait faire...
    Je comprend ton idée pour l'inspecteur. J'ai la même. Mais étant donnée que mon application est une "Document Based" il faut que je puisse lié dynamiquement le contrôleur de l'inspecteur et le document en cours !

    Mon idée sur comment faire :
    1- l'inspecteur est un singleton
    2- lors d'un changement de fenêtre, je change la valeur de la variable targetDocument contenu dans le contrôleur l'inspecteur. Cette variable permet de notifier le document du changement d'une valeur.
    3- Le contrôleur de l'inspecteur notifie le document en cours via une fonction de notification.

    Y a t'il plus simple ?
  • Philippe49Philippe49 Membre
    09:35 modifié #70
    dans 1234426141:

    Merci pour les propriétés. Je ne savais plus comment il fallait faire...
    Je comprend ton idée pour l'inspecteur. J'ai la même. Mais étant donnée que mon application est une "Document Based" il faut que je puisse lié dynamiquement le contrôleur de l'inspecteur et le document en cours !

    Certes

    dans 1234426141:

    Mon idée sur comment faire :
    1- l'inspecteur est un singleton
    2- lors d'un changement de fenêtre, je change la valeur de la variable targetDocument contenu dans le contrôleur l'inspecteur. Cette variable permet de notifier le document du changement d'une valeur.
    3- Le contrôleur de l'inspecteur notifie le document en cours via une fonction de notification.

    Y a t'il plus simple ?

    Le problème de la notification à  l'inspecteur du changement de document courant, c'est qu'un inspecteur n'existe pas tout le temps, et on peut éventuellement avoir envie de faire plusieurs inspecteurs.
    Regarde si dans une Document-Based Application il n'y a pas déjà  quelque chose comme activeDocument. De toute façon on doit pouvoir l'obtenir par la fenêtre active de l'application [NSApp mainWindow] qui elle est liée au Document courant.
  • wiskywisky Membre
    09:35 modifié #72
    Merci ! Au final je vais intégrer l'inspecteur à  l'intérieur de la fenêtre du document. Cela sera plus simple (mais plus lourd en mémoire), je ne tiens pas trop à  passer un temps fou sur des "petites choses".
    Il me reste à  faire :
    - Lecture/ecriture des fichiers
    - Export du modèle d'impression
    - Copier/coller
    - Undo
    - Poignées pour la modification à  la souris
    - Vue des propriétés pour chacun des types d'objets
    - à‰diteur de code
    - à‰diteur basic d'image
  • Philippe49Philippe49 Membre
    09:35 modifié #73
    Pour précision, il n'y a rien à  coder, tout est fait :

    NSLog(@%@",[NSApp mainWindow]);
    NSLog(@Document = %@ = %@",self,[[NSApp mainWindow] delegate]);

  • wiskywisky Membre
    09:35 modifié #74
    Me revoilà  !!!

    J'ai un bug assez bizarre!
    J'enregistre le fichier avec NSArchiver qui transforme un NSMutableDictionary en un NSData. Tous les éléments contenu dans le NSMutableDictionary sont conforme avec NSCoding. 

    Maintenant, quand je lit le fichier (suite à  une demande d'ouverture) je dés archive avec NSUnarchiver. Je commence à  lire les données du premier dictionnaire (contenue dans le dico "ROOT") qui contient les infos du document. Là  ça fonctionne. 

    Ensuite je cherche à  charger les objets de la page1. Ca se passe bien sauf lors de la sélection d'un objet ou lors du dessin (le dessin ne se fait pas sans faire planter le programme). Le programme plante et lance le débugguer.

    J'ai fait une vidéo pour montrer ça. Le truc c'est que là  où ça bloque je n'ai aucun problème (visible en tout cas). Il est attendu un NSColor et c'est bien un NSColor qui est en mémoire ! Ce problème ne se produit pas sur un document nouveau (non lut à  partir d'un fichier).

    quelqu'un à  une idée ?  :why?: :why?: :why?:

    La vidéo : rtsp://extranet.sygeste.com/xmlpmc_bug.mp4
    Attention c'est en streaming et de bonne qualité. à‰tant données que la connexion du serveur n'est pas très élevé veuillez être patient et attendre le chargement de la vidéo  ;)
  • Philippe49Philippe49 Membre
    09:35 modifié #75
    dans 1235667180:

    Ensuite je cherche à  charger les objets de la page1. Ca se passe bien sauf lors de la sélection d'un objet ou lors du dessin (le dessin ne se fait pas sans faire planter le programme). Le programme plante et lance le débugguer.

    Bon la vérification bête d'abord : tu fais bien les retain nécessaires en désarchivant ?
  • wiskywisky Membre
    09:35 modifié #76
    Etant donnée que c'est un logiciel sous licence CeCILL je peux montrer le code sans risque de me faire taper sur les doits par mon chef ;)

    Alors cette partie là  du code ne pose aucun problème:
    - (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError<br />{<br />&nbsp; &nbsp; NSDictionary * doc = [NSUnarchiver unarchiveObjectWithData:data];<br />	<br />	NSDictionary * dico = [doc objectForKey:@&quot;InfosDocs&quot;];<br />	<br />	_format= [[dico objectForKey:@&quot;DocFormatPage&quot;] intValue];<br />	_orientation= [[dico objectForKey:@&quot;DocOrientation&quot;] intValue];<br />	_alignPagination= [[dico objectForKey:@&quot;DocAlignPagination&quot;] intValue];<br />	_xPagination= [[dico objectForKey:@&quot;DocXPagination&quot;] intValue];<br />	_yPagination= [[dico objectForKey:@&quot;DocYPagination&quot;] intValue];<br />	_fontIndexPagination= [[dico objectForKey:@&quot;DocFontIndexPagination&quot;] intValue];<br />	_fontSizePagination= [[dico objectForKey:@&quot;DocFontSizePagination&quot;] intValue];<br />	_firstPage= [[dico objectForKey:@&quot;DocFirstPageActive&quot;] boolValue];<br />	_otherPage= [[dico objectForKey:@&quot;DocOtherPageActive&quot;] boolValue];<br />	_lastPage= [[dico objectForKey:@&quot;DocLastPageActive&quot;] boolValue];<br />	_enabledPagination= [[dico objectForKey:@&quot;DocEnablePagination&quot;] boolValue];<br />	_boldFontPagination= [[dico objectForKey:@&quot;DocBoldFontPagination&quot;] boolValue];<br />	_italicFontPagination= [[dico objectForKey:@&quot;DocItalicFontPagination&quot;] boolValue];<br />	_underlineFontPagination= [[dico objectForKey:@&quot;DocUnderlineFontPagination&quot;] boolValue];<br />	_formatPagination= [dico objectForKey:@&quot;DocFormatPagination&quot;];<br />	_colorFontPagination= [dico objectForKey:@&quot;DocColorFontPagination&quot;];<br />
    


    J'ai 4 type d'objet, les traits, les rectangles, les textes (qui surclasse le rectangle) et le tableau qui surclasse également le rectangle. et là  ça pose problème :
    <br />	NSArray * ar = [doc objectForKey:@&quot;Page1&quot;];<br />	int max=[ar count]-1;<br />	int i;<br />	id obj;<br />	<br />	for(i=0;i&lt;=max;i++){<br />		obj = [ar objectAtIndex:i];<br />		if([[obj objectForKey:@&quot;ObjectClassName&quot;] isEqualToString:@&quot;PMCTrait&quot;])<br />			[_page1 addObject:[[PMCTrait alloc] initWithData:[ar objectAtIndex:max-i]] atPlan:0];<br />		if([[obj objectForKey:@&quot;ObjectClassName&quot;] isEqualToString:@&quot;PMCRectangle&quot;]){<br />			PMCRectangle * r = [[PMCRectangle alloc] initWithData:[ar objectAtIndex:max-i]];<br />			NSLog(@&quot;Description : %@&quot;,r);<br />			[_page1 addObject:r atPlan:0];<br />			<br />		}<br />	}
    

    Le trait fonctionne très bien mais lorsque je tente un rectangle ça bug...
    Les couleurs ne reste pas. Peut être que je devrais faire une copie ?
  • wiskywisky Membre
    09:35 modifié #77
    J'ai trouvé !!! euréka !  :p

    C'est tout simplement la ligne de génération d'un objet selon le contenu du fichier:
    PMCRectangle * r = [[PMCRectangle alloc] initWithData:obj];
    

    Là  j'envoi la bonne description au bon type d'objet.

    Il me reste cependant un bug ! La création d'un nouveau rectangle est impossible sur un fichier lu ! C'est encore possible sur un nouveau fichier !
  • wiskywisky Membre
    09:35 modifié #78
    Le bug ne se produit que si je n'ai pas déjà  créer un rectangle dans un nouveau fichier. Le débuggeur dit "EXC_BAD_ACCESS"
  • wiskywisky Membre
    09:35 modifié #79
    J'ai trouvé !

    C'était une histoire de "retain" non fait sur le nom de l'objet.

    Je vous prépare une petite vidéo de démo. C'est loin d'être fini mais cela à  bien avancé !
  • Philippe49Philippe49 Membre
    09:35 modifié #80
    dans 1235669018:

    Bon la vérification bête d'abord : tu fais bien les retain nécessaires en désarchivant ?

    8--)
  • wiskywisky Membre
    09:35 modifié #81
    Bas oui mais c'est pas sur la désarchivation que ça merdait mais sur l'affectation des propriétés au objets. Je faisait une simple affectation sans le retain pour éviter que l'objet soit détruit ;)
    J'ai encore plein d'autre bug (au moins 20) divers et variés. Leur correction viendra avec le temps. Ce logiciel à  beau être sous licence CeCILL il n'est pas très utilisé si ce n'est que je suis le seul  8--)

    Voici une petite vidéo de son fonctionnement. Pour le moment, les modifications à  la souris se limite au déplacement. Cela aide déjà  beaucoup.

    rtsp://app.sygeste.com/PresentationPMC1.mp4
    Comme d'habitude, la connexion n'est pas très rapide et la qualité plutôt bonne (sinon on voit rien).

    Si cela intéresse certaine personne je peux donner des explications ;)
  • wiskywisky Membre
    mars 2009 modifié #82
    Encore une petite vidéo pour montrer l'avancement du développement.

    rtsp://extranet.sygeste.com/Presentation2PMC1.mp4
    [EDIT 19h42 LA VIDEO N'EST PAS ENCORE DISPO]
    [EDIT 20h26 La vidéo est en ligne... J'attends vos retours !]

    Voici ce qui est géré :
    - Gestion complète des objets (ajout, modification, suppression, déplacement avec la souris)
    - Gestion des plans (menu contextuel, outils, glisser-déposer dans la liste des objets)
    - Enregistrement et ouverture d'un fichier

    Il manque :
    - Undo Manager
    - Copier/Coller
    - suppression, déplacement avec le clavier (si vous avez une idée de comment faire ? )
    - poignées sur la sélection + modification via les poignées.
    - export du modèle
    - éditeur de class PHP
Connectez-vous ou Inscrivez-vous pour répondre.