Création d'une GUI à partir d'un exec
crashray
Membre
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 :
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 :
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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 ?
Vraiment puissant.
Je vais commencer par un plus petit truc, c'est une GUI pour mkvextract de ce type :
Je vais continuer les tutos pour voir si il parle d'appel à des executables.
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.
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
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é : 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
C'est exactement ce qu'il me fallait .<br />En fait ici :
Les arguments c'est -l ??
Chez moi mon mkvextract est dans /usr/local/bin/
Donc je mettrais :
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 :
Et avec ça il faut que je crée mes lignes de mon tableau à cocher.
Un truc comme ça peut convenir :
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).
.
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 )
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...
.
Ou je glisse un cube vert dans le fenêtre où y'a fil owner et 2 autres trucs
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".
.
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.
Les cubes verts c'est pour les bindings et Core Data. Tu n'en est pas encore rendu là je pense.
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 ???