Création d'une GUI à  partir d'un exec

crashraycrashray Membre
09:54 modifié dans API AppKit #1
Je souhaiterais des renseignements sur comment créer une GUI pour utiliser plus facilement un programme qui n'est disponible que dans le terminale.
Quels langages de programmation me conseillez-vous ? Assez simple avec des entrées diverses de fichiers et des options pour chaque fichier. Puis à  la fin, la création de la "ligne du terminale" et donc peut-être l'appel du terminale.

C'est pour faire un appel final à  la fin du type :
mkvmerge -o "nomdufilm.mkv" -d "video.mp4" -a "audiofr.m4a" -a "audioeng.m4a" ....

Le manuel d'utilisation du programme est là  : MKVMERGE

Pour l'instant on m'a dit le mieux c cocoa avec un code en objectif-c ou java et Interface Builder pour la GUI.

Il existe actuellement une gui pour windows, donc je pense essayer de réaliser une chose similaire.
Voilà  quelques screenshots :
mmg.png
ajout2.pnglang.png

Réponses

  • 09:54 modifié #2
    Le mieux est effectivement de faire la GUI, et à  partir de là  tu peux appeler ton utilitaire en ligne de commande. Tous les langages étant capable de faire des appels à  des utilitaires en ligne de commande, reste maintenant à  voir ce que tu veux utiliser. Cocoa est évidemment assez bien, mais très dur à  apprendre (une fois qu'on a passé le début par contre, c'est génial). Ceci dit, si tu dois faire du multiplateforme, c'est pas top du tout, et là  tu peux utiliser Eclipse (java - évite le java/cocoa) ou RealBasic.
  • crashraycrashray Membre
    09:54 modifié #3
    Je veux pas faire de multi-plateforme vu qu'un logiciel très bien existe sous pc.

    J'ai des bases en java j'en ai fait un peu en fac. Mais bon je sais vraiment pas par quoi commencer.
    Je vais essayer de calquer la GUI de windows. Le mieux c que je commence à  créer une interface avec interface builder ?
  • 09:54 modifié #4
    Le mieux c'est que tu mettes ce projet en suspens, et que tu commences par le début avec un bouquin ou des tutos d'intro (sur projectomega.org - section o'reilly). Déjà  avec les tutos tu auras sans doute un peu de mal pour assimiler les nouveaux concepts, alors je ne te conseille pas de te "compliquer" la vie en rajoutant en plus la conception de ton soft.
  • crashraycrashray Membre
    09:54 modifié #5
    C'est impressionnant de simplicité. J'ai commencé quelques tutos où j'ai créer ma première appli.
    Vraiment puissant.
    Je vais commencer par un plus petit truc, c'est une GUI pour mkvextract de ce type : 2004-09-28_230703.gif

    Je vais continuer les tutos pour voir si il parle d'appel à  des executables.
  • tabliertablier Membre
    09:54 modifié #6
    Pour des problèmes de ce genre, j'ai utilisé AppleScript studio et des appels du type "do shell script..."
    J'ai trouvé que c'était un bon moyen de débuter. J'ai très vite trouvé des limites à  applescript, exp: la lenteur dans les opérations longues.
    Je travaille maintenant en C et Objective-C, même si ce n'est pas toujours facile (beaucoup de choses à  apprendre).

    petit conseil:  jetez un oeil sur "Apple Human Interface Guidelines" et donnez un look et des fonctionalités de type "Mac" à  votre appli.
  • AliGatorAliGator Membre, Modérateur
    février 2006 modifié #7
    Oulà , AppleScript Studio (ASS) est très pratique pour qui vient d'AppleScript et veut rajouter une interface graphique (avec Interface Builder) à  son script.

    Mais dans le cas présent autant faire directement les appels à  la ligne de commande en Objective-C, plutôt que de faire un appel à  un AppleScript qui fait un appel à  la ligne de commande  :o

    Il me semble (pas sûr mais je crois) que tu as des exemples fournis dans le dossier /Developer/Examples pour faire ça, ça pourrait t'inspirer.

    - Tu peux très bien le faire en C pur (l'Objective-C étant une extension du C), par exemple avec un appel à  la fonction [tt]system[/tt] (taper "man 3 system" dans le terminal pour avoir de l'aide sur cette fonction C)
    - Ou, si tu connais, fork() + execve()
    - Mais le mieux du mieux c'est quand même d'utiliser NSTask pour executer ton appli, plus complet et plus encapsulé :
    NSTask *theTask = [ [ NSTask alloc ] init ];<br /><br />[ theTask setLaunchPath:@&quot;/bin/ls&quot; ]; // le chemin vers ta commande<br />[ theTask setArguments:[ NSArray arrayWithObjects:@&quot;-l&quot;,nil ] ]; // les arguments à  passer à  ta commande<br />[ theTask launch ]; // executer la commande<br /><br />[ theTask release ]; // libération de la mémoire (on a fait alloc+init, on doit faire le release)
    
    Et si tu veux récupérer la sortie envoyée par la ligne de commande, utiliser NSPipe en plus (et l'affecter à  setStandardError: et setStandardOutput: de ta NSTask), puis utiliser fileHandleForReading sur ta NSPipe pour récupérer un fileHandle, pour pouvoir lire la sortie standard comme si c'était un fichier normal.

    Un exemple sur Cocoa Dev Central
  • crashraycrashray Membre
    09:54 modifié #8
    Merci AliGator.
    C'est exactement ce qu'il me fallait  <3 .<br />En fait ici :
    [ theTask setArguments:[ NSArray arrayWithObjects:@&quot;-l&quot;,nil ] ]; // les arguments à  passer à  ta commande
    

    Les arguments c'est -l ??
    Chez moi mon mkvextract est dans /usr/local/bin/

    Donc je mettrais :
    NSTask *theTask = [ [ NSTask alloc ] init ];<br /><br />[ theTask setLaunchPath:@&quot;/usr/local/bin/mkvextract&quot; ];<br />[ theTask setArguments:[ NSArray arrayWithObjects:@&quot;tracks xx&quot;,nil ] ];<br />[ theTask launch ];<br />[ theTask release ];<br />
    

    Et je voudrais changer le xx en fonction des "cases" cochés.
    Donc si la vidéo est coché, ajouter 1:video.rm (le .rm est en fonction des résultats de mkvmerge -i).
    Comment récupérer les données de mkvmerge -i :
    $ mkvmerge -i v.mkv<br />File 'v.mkv': container: Matroska<br />Track ID 1: video (V_MS/VFW/FOURCC, DIV3)<br />Track ID 2: audio (A_MPEG/L3)
    

    Et avec ça il faut que je crée mes lignes de mon tableau à  cocher.
  • BruBru Membre
    09:54 modifié #9
    dans 1139490473:

    Et je voudrais changer le xx en fonction des "cases" cochés.
    Donc si la vidéo est coché, ajouter 1:video.rm (le .rm est en fonction des résultats de mkvmerge -i).
    Comment récupérer les données de mkvmerge -i :
    $ mkvmerge -i v.mkv<br />File 'v.mkv': container: Matroska<br />Track ID 1: video (V_MS/VFW/FOURCC, DIV3)<br />Track ID 2: audio (A_MPEG/L3)
    

    Et avec ça il faut que je crée mes lignes de mon tableau à  cocher.


    Un truc comme ça peut convenir :

    <br />NSTask *mvkmerge;<br />NSFileHandle *fh;<br />NSData *dat;<br />NSString *str;<br />MSMutableString *mstr;<br /><br />// initilialisation de la tâche<br />mvkmerge=[[NSTask alloc] init];<br />[mvkmerge setLaunchPath:@&quot;/usr/local/bin/mkvmerge&quot;];<br />[mvkmerge setArguments:[NSArray arrayWithObjects:@&quot;-1&quot;, @&quot;v.mkv&quot;, nil]];<br />[mvkmerge setStandardOutput:[NSPipe pipe]];<br /><br />// lancement de la tâche<br />[mvkmerge launch];<br /><br />// allocation de la chaà®ne qui recevra la sortie de la commande<br />mstr=[[NSMutableString alloc] init];<br /><br />// récupération du descripteur de fichier lié à  la sortie<br />fh=[[mvkmerge standardOutput] fileHandleForReading];<br /><br />// lecture des données en sortie<br />dat=[fh availableData];<br />while ([dat length]&gt;0)<br />{<br />&nbsp; &nbsp; // transformation des données en chaà®ne<br />&nbsp; &nbsp; str=[[NSString alloc] initWithData:dat encoding:NSASCIIStringEncoding];<br /><br />&nbsp; &nbsp; // ajout de la chaà®ne dans la chaà®ne de réception de la sortie<br />&nbsp; &nbsp; [mstr appendString:str];<br /><br />&nbsp; &nbsp; // nettoyage et boucle suivante<br />&nbsp; &nbsp; [str release];<br />&nbsp; &nbsp; dat=[fh availableData];<br />}<br /><br />// nettoyage<br />[mvkmerge release];<br /><br />// fin : la sortie est dans la chaà®ne mstr !<br />NSLog(@&quot;%@&quot;, mstr);<br />
    


    En sortie, la chaà®ne mstr doit contenir :
    [tt]@File 'v.mkv': container: Matroska\nTrack ID 1: video (V_MS/VFW/FOURCC, DIV3)\nTrack ID 2: audio (A_MPEG/L3)[/tt]

    En utilisant toutes les méthodes de parsing présentes dans la classe NSString, tu pourras facilement éclater cette chaà®ne en tableau, puis récupérer une indication précise à  l'intérieur (comme l'ID de la piste par exemple).

    .
  • AliGatorAliGator Membre, Modérateur
    09:54 modifié #10
    Oui alors attention : le setArguments prend un tableau (NSArray) comment paramètre.

    Ce tableau, pour l'exemple, je l'ai créé à  la volée, avec [tt][NSArray arrayWithObjects:@-l,nil][/tt].
    Cette instruction crée un tableau qui contient l'unique élément "-l", unique argument que j'ai voulu passer à  la fonction.

    Si tu veux passer plusieurs arguments à  la fonction, il faut créer un tableau avec autant d'éléments que d'arguments ! Et non pas remplacer simplement mon "-l" par tes arguments séparés par des espaces.
    Le constructeur de commodité arrayWithObjects prend argument une liste d'arguments séparés par des virgules, et dont le dernier doit être obligatoirement nil.

    Donc par exemple : [tt][NSArray arrayWithObjects:@argument1,@argument2,@argument3,nil][/tt]

    Voilà . Après il suffit de passer ce NSArray (tableau d'arguments) à  [tt]setArguments:[/tt] de ta tâche theTask. Ce qu'on fait souvent dans la foulée dans la même ligne.

    Toutes les infos dans la doc Apple

    Après pour le reste, il te suffit de suivre les indications de bru pour récupérer le résultat renvoyé par ta NSTask, c'est tout plein de commentaiers et clair donc tu devrais t'en sortir (le code peut avoir l'air impressionnant mais compacté sans les commentaires il l'est moins :))
  • crashraycrashray Membre
    09:54 modifié #11
    Voilà  j'ai créer l'interface, maintenant il faut que je crée mes outlets et actions. Si vous pouviez me conseillez (NSTextField...)
    Pour les 2 cases Browse, je mets quoi pour aller chercher dans le disques dur les deux fichiers ?
    Je lie mes 2 boutons aux field correspondant. Mes 2 cases du bas vont être relié quasiment avec tout les deux field des "browse", le tableau avec les pistes cochés et le bouton extract.
    Et sinon les bouton check all et uncheck all uniquement avec le tableau.

    J'ai mis ce que j'ai fait ici : http://smile.fr.free.fr/Logiciels/mkvextract.zip
  • BruBru Membre
    09:54 modifié #12
    dans 1139668096:

    Voilà  j'ai créer l'interface, maintenant il faut que je crée mes outlets et actions. Si vous pouviez me conseillez (NSTextField...)
    Pour les 2 cases Browse, je mets quoi pour aller chercher dans le disques dur les deux fichiers ?
    Je lie mes 2 boutons aux field correspondant. Mes 2 cases du bas vont être relié quasiment avec tout les deux field des "browse", le tableau avec les pistes cochés et le bouton extract.
    Et sinon les bouton check all et uncheck all uniquement avec le tableau.

    J'ai mis ce que j'ai fait ici : http://smile.fr.free.fr/Logiciels/mkvextract.zip


    Déjà , avant de penser aux outlets et actions, il faut créer une classe contrôleur...

    .
  • crashraycrashray Membre
    09:54 modifié #13
    Je crée une sous Classe de NSDocument que j'appelle Controller ?
    Ou je glisse un cube vert dans le fenêtre où y'a fil owner et 2 autres trucs
  • BruBru Membre
    09:54 modifié #14
    Hoy... hoy...

    Dans IB, fenêtre MainMenu.nib
    -> clique l'onglet "Classes"
    -> dans le sélecteur, sélectionne la classe "NSObject"
    -> fais un clic droit sur "NSObject" et choisis "Subclass NSObject"
    -> une nouvelle classe "MyObject" apparait : renomme la en "controleur" (par exemple)
    -> sélectionne cette nouvelle classe
    -> fais un clic droit, et choisis "Instantiate..."

    Normalement, un nouveau "cube bleu" apparaà®t dans l'onglet "Instances".
    Il faudra que tu ajoutes les outlets et les actions à  ce "cube".

    Pour ajouter outlets et action : à  nouveau tu vas dans l'onglet "Classes", puis tu sélectionnes et cliques droit sur ta classe contrôleur que tu viens de créer, et tu choisis "Add outlet" et "Add action".

    .
  • crashraycrashray Membre
    09:54 modifié #15
    Merci , c'est ce qu'il faisait dans les tutos.
    Mais j'avais remarqué des "cubes verts et bleus" dans la fenêtre avec les différentes interfaces donc je me suis dit peut-être qu'il avait ajouté ça à  une nouvelle version.
  • Eddy58Eddy58 Membre
    09:54 modifié #16
    dans 1139683997:

    Mais j'avais remarqué des "cubes verts et bleus"

    Les cubes verts c'est pour les bindings et Core Data. Tu n'en est pas encore rendu là  je pense. ;)
  • crashraycrashray Membre
    février 2006 modifié #17
    dans 1139681167:

    Hoy... hoy...

    Dans IB, fenêtre MainMenu.nib
    -> clique l'onglet "Classes"
    -> dans le sélecteur, sélectionne la classe "NSObject"
    -> fais un clic droit sur "NSObject" et choisis "Subclass NSObject"
    -> une nouvelle classe "MyObject" apparait : renomme la en "controleur" (par exemple)
    -> sélectionne cette nouvelle classe
    -> fais un clic droit, et choisis "Instantiate..."

    Normalement, un nouveau "cube bleu" apparaà®t dans l'onglet "Instances".
    Il faudra que tu ajoutes les outlets et les actions à  ce "cube".

    Pour ajouter outlets et action : à  nouveau tu vas dans l'onglet "Classes", puis tu sélectionnes et cliques droit sur ta classe contrôleur que tu viens de créer, et tu choisis "Add outlet" et "Add action".

    .

    Ok c'est fait ;)
    Voilà  ce que je compte crée comme outlets. J'imagine qu'il faut crée tous ses outlets avant de s'attaquer aux actions ?
    OUTLET
    fichierField (fichier de départ)
    repField (dossier de destination)
    tracksArray (le tableau avec les pistes du fichiers obtenu avec mkvmerge -i)
    faut-il un autre outlet pour les cases cochés ?
    pisteField (case en bas à  gauche avec la future ligne de commande pour des pistes sons-vidéos-soustitre)
    jointField (case en bas à  droite avec la future ligne de commande pour des fichiers joints)
    Sur le controller :
    setfichier
    setrep
    setcheck

    euh les set se sont généralement des actions ? Ou les actions se sont des connections  ???
  • Eddy58Eddy58 Membre
    février 2006 modifié #18
    Les méthodes commençant par "set" sont réservées aux accesseurs. J'appelerais plutot tes méthodes fichierBrowse, repBrowse et checkAll par exemple. Sinon, dans IB les actions se relient en partant du contrôle jusqu'à  l'instance désirée. Par exemple, de ton bouton "Check All" jusqu'à  ton contôleur. :)
Connectez-vous ou Inscrivez-vous pour répondre.