PHP GTK vol2
Publié par Sebastien Dudek il y a 3 mois
Dans notre dernier tutoriel [lien] nous avons découvert PHP-GTK.
Mais cela n'était qu'une introduction assez peu parlante. Nous allons maintenant développer notre première application disposant d’un réel intérêt ! Comme vous le savez votre serviteur, moi même, vous a déjà proposé des articles sur Ming (extension PHP permettant de générer du flash) [lien1][lien2]. Nous allons donc faire d'une pierre deux coups et créer un petit utilitaire pour Ming :Lors de la génération d’animation flash avec Ming, on peut utiliser des fonts spécifiques au format FDB. Il existe deux utilitaires en ligne de commande permettant de générer ces fichiers à partir de font TTF :
- Tt2fft : transforme une font TTF en font FFT (format de fichier utilisé dans les templates flash)
- MakeFDB : transforme une font FFT en font FDB.
Le but principal de ce tutorial sera un « frontend » pour ces deux utilitaires. PHP-GTK étant multi plateforme, nous allons faire en sorte que notre outil le soit aussi. Ainsi nous agirons différement selon que nous serons sous Windows ou Linux.
- Windows : Téléchargez http://blue.ribbon.to/~harpy/ming/jaming/win/jaming-win.zip. Les deux utilitaires se trouvent avec les sources du frontend.
- Linux : Si vous utilisez Linux, vous devez maîtriser un minimum la compilation d’application. L’outil MakeFDB se trouve dans les sources de la librairie Ming. Pour TTF2FFT, les sources se trouvent à l’adresse suivante : http://blue.ribbon.to/~harpy/ming/jaming/ttf2fft.tar.gz

Le code source
Pour permettre un développement plus efficace, j’ai adopté une programmation orientée objet. Dans un premier temps, nous allons décrire les différentes classes, la création de l’interface graphique, les différentes fonctions du cœur de l’application puis la jonction entre les éléments réactifs et ces fonctions. Vous pouvez télécharger le code source ici : FDBBuilder
Les élements réactifs
note : Avant de commencer veuillez noter que nous basons notre code sur PHP4.La classe "champ texte"
Cette classe permet la saisie d’un texte sur une seule ligne.
- La méthode « GetText() permet d’obtenir le texte spécifié par l’utilisateur.
- La méthode « SetText() permet de mettre à jour le texte de ce composant.
- La méthode « GetHandle() sera utilisé pour insérer l’instance de l’objet dans l’interface graphique.
- <?php
- class TextInput
- {
- function TextInput()
- {
- $this->Obj = &new GtkEntry();
- }
- {
- return $this->Obj->get_text();
- }
- function SetText($NewText)
- {
- $this->Obj->set_text($NewText);
- }
- function GetHandle()
- {
- return $this->Obj;
- }
- }
- ?>
La classe bouton
Lorsque l’on créé un bouton, on définit trois choses :- On spécifie son nom,
- on spécifie son action lorsque l’on clique dessus,
- on spécifie l’aide contextuelle qui apparaît lorsque l’utilisateur laisse sa souris plusieurs secondes dessus.
Grâce à <?php $this->Obj->connect('clicked', $Action);?> on associe l’état cliqué à l’action spécifiée. Dans les quatre dernières ligne de la méthode Button, on créé notre aide contextuelle en spécifiant un délais de 200 ms avant son apparition.
- <?php
- class Button
- {
- function Button($Name, $Action, $ToolTipString)
- {
- $this->Obj = &new GtkButton($Name);
- /* On spécifie la fonction qui sera appelée lorsque l'on clique sur le bouton */
- $this->Obj->connect('clicked', $Action);
- // Si on laisse la souris sur le bouton plus de 200 ms,
- // une aide apparaîtra pour informer sur l'action du bouton
- $this->ToolTips[$Name] = &new GtkTooltips();
- $this->ToolTips[$Name]->set_delay(200);
- $this->ToolTips[$Name]->set_tip($this->Obj, $ToolTipString, '');
- $this->ToolTips[$Name]->enable();
- }
- function GetHandle()
- {
- return $this->Obj;
- }
- }
- ?>
La classe zone texte
Notre champ texte permet la saisie d’un texte sur plusieurs lignes. Dans la méthode SetText(), on est obligé en premier lieu d’effacer ce que contient notre objet puis d’insérer notre texte. Sans cette procédure, notre méthode reviendrait à faire appel à AddText();.
- <?php
- class TextArea
- {
- function TextArea()
- {
- $this->Obj = &new GtkText();
- }
- {
- return $this->Obj->get_text();
- }
- function SetText($NewText)
- {
- // Si on ne detruit pas le texte courant,
- // le nouveau texte sera concaténé à l'ancien
- $this->Obj->delete_text(0, -1);
- $this->Obj->insert(null, null, null, $NewText);
- }
- function AddText($NewText)
- {
- $this->Obj->insert(null, null, null, $NewText);
- }
- function SetEditable($Status)
- {
- $this->Obj->set_editable($Status);
- }
- function GetHandle()
- {
- return $this->Obj;
- }
- }
- ?>
Le coeur de l'application
Gestion de la selection de la font
Lorsque la police a été sélectionnée, on utilise ttf2fft pour afficher les informations contenues dans cette police. Dans cette méthode, on récupère le chemin et le nom de la font. On concatène ces deux informations pour permettre à GetFontInformation de nous retourner les informations attendues. Pour terminer, on insère ces informations dans le champ texte prévu à cet effet.- <?php
- function FileSelectionOkAction()
- {
- global $FileSelection;
- global $MyTextInput;
- global $ConvertionResult;
- $FileSelection->hide();
- $SelectionText = $FileSelection->selection_text;
- $FileDirectory = $FFT_FontPath;
- $SelectionEntry = $FileSelection->selection_entry;
- $FileName = $SelectionEntry->get_text();
- $FilePath = $FileDirectory . "/" . $FileName;
- $MyTextInput->SetText($FilePath);
- GetFontInformation($FilePath);
- $ConvertionResult->SetText("Convertion Result");
- }
- ?>
Les informations sur la font
Cette fonction est appelée par la fonction FileSelectionOkAction().
On utilise l’outil ttf2fft avec l’option –l. Pour éxécuter la ligne de commande on se sert de la fonction PHP exec(). Celle-ci stock les retours sous forme d'un tableau de chaîne de caractère. Par la suite, on concatène chaque chaîne de caractère séparée par un retour ligne pour intégrer un minimum de mise en page. Une fois fait, on insère notre nouvelle chaîne de caractère dans notre zone de texte prévu à cet effet.
La convertion de la font
Cette fonction exécute la conversion de la font sélectionnée.Dans un premier temps, on vérifie que tous les paramètres requis ont été spécifiés par l’utilisateur. Ensuite, on utilise TTF2FFT et MakeFdb pour convertir la font. Pour chaque étape on insère les informations retournées par les outils dans le champ texte prévu à cet effet pour informer l’utilisateur de l’avancement de la conversion. Une fois terminée, on efface le fichier .fft qui a été généré durant la conversion mais qui ne nous est d’aucune utilité.
- <?php
- function Convert()
- {
- global $MyTextInput;
- global $CharmapNumberInput;
- global $FaceNumberInput;
- global $ConvertionResult;
- $TTF_FontPath = $MyTextInput->GetText();
- $CharMapNumber = $CharmapNumberInput->GetText();
- $FaceNumber = $FaceNumberInput->GetText();
- msg_box("Oh no ....", 2, "No font selected", "Ok", 2);
- msg_box("Oh no.....", 2, "You must select a charmap number", "OK", 2);
- msg_box("Oh no.....", 2, "You must select a face number", "OK", 2);
- else
- {
- $CommandLine = "ttf2fft.exe "" . $TTF_FontPath . "/" -o "" . $FFT_FontPath."/"";
- else
- $CommandLine = "ttf2fft /"" . $TTF_FontPath . "/" -o /"" . $FFT_FontPath."/"";
- if ($CharMapNumber != "")
- $CommandLine .= " -e " . $CharMapNumber;
- if ($FaceNumber != "")
- $CommandLine .= " -f " . $FaceNumber;
- $Result = "##########################\n ####### TTF to FFT #######\n##########################\n";
- foreach ($TabResult as $elem)
- {
- $Result .= $elem."\n";
- }
- $ConvertionResult->SetText($Result);
- $CommandLine = "MakeFdb.exe /"" . $FFT_FontPath . "/"";
- else
- $CommandLine = "MakeFdb /"" . $FFT_FontPath . "/"";
- $Result = "\n\n##########################\n ####### FFT to FDB #######\n##########################\n";
- foreach ($TabResult as $elem)
- {
- $Result .= $elem."\n";
- }
- $ConvertionResult->AddText($Result);
- $CommandLine = "del /"" . $FFT_FontPath . "/"";
- }
- }
- ?>
Mise en place de l'interface utilisateur.
Après avoir créé chaque élément réactif, il faut les inclure dans la fenêtre principale. Comme nous l'avons vu dans le premier tutorial, l'inclusion de chaque élément a son importance dans la disposition finale.Note : Pour faciliter cette étape, je vous recommande d'utiliser des box.
Les différentes box
- <?php
- $GeneralButtonsBox = & new GtkHBox();
- $GeneralButtonsBox->set_spacing(5);
- $GeneralButtonsBox->set_border_width(10);
- $BrowseBox = & new GtkHBox();
- $BrowseBox->set_spacing(5);
- $BrowseBox->set_border_width(10);
- $OptionsBox = & new GtkHBox();
- $OptionsBox->set_spacing(5);
- $OptionsBox->set_border_width(10);
- $TextAreasBox = & new GtkVBox();
- $TextAreasBox->set_spacing(5);
- $TextAreasBox->set_border_width(10);
- $VerticalBox = & new GtkVBox();
- $VerticalBox->set_spacing(5);
- $VerticalBox->set_border_width(0);
- ?>
Les éléments réactifs et informatifs.
Pour rendre l'interface graphique un peu plus jolie on va intègré une pixmap "PHPTEAM". Pour cela on utilise la classe GtkPixmap qui requiert une pixmap et un mask BMP que l'on obtient depuis un fichier xpm grâce à la méthode pixmap_create_from_xpm().
- <?php
- $MyBrowseButton = new Button("Browse", 'Browse', "Select a font to convert");
- $MyConvertButton = new Button("Convert", 'Convert', "Convert the font");
- $MyExitButton = new Button("Exit", 'Quit', "Exit The Application");
- $FaceNumberLabel = & new GTKLabel("Face Number: ");
- $FaceNumberInput = new TextInput();
- $CharmapNumberLabel = &new GTKLabel("Charmap number: ");
- $CharmapNumberInput = new TextInput();
- $FontInfo = new TextArea();
- $FontInfo->SetEditable(false);
- $FontInfo->SetText("Font Information");
- $ConvertionResult = new TextArea();
- $ConvertionResult->SetEditable(false);
- $ConvertionResult->SetText("Convertion Result");
- $PhpTeamImage = & new GtkPixmap($pixmap, $mask);
- ?>
Disposition des éléments
C'est la partie déterminante pour disposer nos éléments dans l'interface utilisateur.
Un bouton dans une box qui elle même se retrouve à l'intérieur d'une box.
Note : Amusez vous à changer l'ordre d'ajout des différentes box dans la VerticalBox pour mieux comprendre le principe.
- <?php
- $BrowseBox->add($MyBrowseButton->GetHandle());
- $GeneralButtonsBox->add($MyConvertButton->GetHandle());
- $GeneralButtonsBox->add($MyExitButton->GetHandle());
- $OptionsBox->add($FaceNumberLabel);
- $OptionsBox->add($FaceNumberInput->GetHandle());
- $OptionsBox->add($CharmapNumberLabel);
- $OptionsBox->add($CharmapNumberInput->GetHandle());
- $TextAreasBox->add($FontInfo->GetHandle());
- $TextAreasBox->add($ConvertionResult->GetHandle());
- $VerticalBox->add($PhpTeamImage);
- $VerticalBox->add($BrowseBox);
- $VerticalBox->add($OptionsBox);
- $VerticalBox->add($TextAreasBox);
- $VerticalBox->add($GeneralButtonsBox);
- $window->add($VerticalBox);
- ?>
Conclusion.
Et voila notre première application de réalisée. Vous êtes maintenant fin prêt à développer tout type d'application. Cependant développer une application de cette façon implique beaucoup de travail. Heuresement il existe une possibilité de le faire simplement via Glade.Glade est une librairie pour GTK qui permet de définir l'interface graphique en XML et comporte même un RAD. Donc la prochaine étape sera la réécriture de notre application avec Glade.
Les liens.
Feed RSS du site sur PHP-gtk :http://gtk.php.net/news.rss
Les utilitaires pour la création des fonts sous windows : http://blue.ribbon.to/~harpy/ming/jaming/win/jaming-win.zip
Les utilitaires pour la création des fonts sous Linux : http://blue.ribbon.to/~harpy/ming/jaming/ttf2fft.tar.gz
Le site de ming :http://ming.sourceforge.net/
Remerciements.
J'en profite pour remercier cyruss qui gère le site depuis plusieurs années et je vous conseille son livre sur lequel j'ai fait un peu de relecture : "PHP 5 avancé" aux editions Eyrolles.Allez hop un petit logo pour lui faire un peu de pub :