[Ada+Gtk] Gtkada Ctree ou Tree Folder.... difficultés

Gtkada Ctree ou Tree Folder.... difficultés [Ada+Gtk] - Ada - Programmation

Marsh Posté le 09-06-2011 à 05:39:19    

Bonjour,
Je suis amateur en programmation, et j'ai peu d'expérience en graphique.
J'essaye de fair avec GtkAda, un arbre bianire à l'aide  de Gtk.Ctree.
 
J'ai créé la fenêtre, et le ctree, et j'arrive tant bien que mal à construire un truc, mais :
J'ai pas le texte associé à chaque noeud.
J'ai pas l'image associée à chaque noeud.
Je voudrais vider l'arbre, je sais pas comment.
Bref, j'aurais besoin que quelqu'un jette un oeil à mon code.
 
Screen_shot : http://hfr-rehost.net/thumb/self/pic/6273cef3eefd2a42f3c9443e5a8e159c14e1992b.jpeg
 
 
 
 
Ce programme construit un arbre binaire contenant les réel 0.0 ou 1.0.
En gros pour 0.0 on ajoute à gauche, pour 1.0 on ajoute à droite.
Bref, j'ai un arbre bianire.
Je voudrais construire le tree folder à l'image de mon arbre bianire.
 
L'alogo général pour une itération après initialisation
 - on ajoute le nouveau noeud.
 - on appelle une fonction récursive de rétropropagation pour reconstruire l'arbre.
 
Voici la procédure récursive en question :
 

Code :
  1. procedure Unfree(Main_Window : in out Main_Window_type) is
  2.      Saved_Node : Node_Access := Main_Window.Next;
  3.      Save_Ctree_Node : Gtk.Ctree.Gtk_Ctree_Node;
  4.  
  5.      Text : Interfaces.C.Strings.Chars_Ptr_Array (Title'Range);
  6.      Style : Gtk.Style.Gtk_Style;
  7.      Tmp_Color : Gdk.Color.Gdk_Color;
  8.  
  9.      use type Gtk_Ctree_Line_Style;
  10.  
  11.   begin
  12.      Main_Window.Save_Left := Main_Window.Locale_Value;
  13.      Main_Window.Save_Right := Main_Window.Locale_Value;
  14.      if Main_Window.Next.Left /= null then
  15.         Main_Window.Next := Main_Window.Next.Left;
  16.         Unfree(Main_Window);
  17.      end if;
  18.  
  19.      Main_Window.Locale_Value := Main_Window.Save_Left;
  20.      Main_Window.Next := Saved_Node;
  21.      declare
  22.         procedure Get_Input(Pattern : in Positive;
  23.                             Input   : out Node_Set;
  24.                             Desired : out Node_Set) is
  25.         begin
  26.            Input := (Main_Window.next.Node.Value(1), Main_Window.Save_left);
  27.            Desired := (1 => 0.0);
  28.         end Get_Input;
  29.  
  30.         package Binary_NN is new REM_NN(Num_Input_Nodes => 2,
  31.                                         Num_Hidden_Nodes => 2,
  32.                                         Num_Output_Nodes => 1,
  33.                                         Num_Patterns => 1,
  34.                                         New_Random_Weights => False,
  35.                                         Input_To_Output_Connections => False,
  36.                                         Weight_File_Name => "node 1.wgt",
  37.                                         Get_Input => Get_Input);
  38.         Response : Node_Set(1..1);
  39.  
  40.      begin
  41.  
  42.         Binary_NN.Respond(1, Response);
  43.         Main_Window.Locale_Value := Response(1);
  44.  
  45.         if Main_Window.Locale_Value > 0.5 then
  46.            Main_Window.Locale_Value := 1.0;
  47.         else
  48.            Main_Window.Locale_Value := 0.0;
  49.         end if;
  50.         Main_Window.Next.Node.Value(1) := Main_Window.Locale_Value;
  51.      end;
  52.  
  53.  
  54.      -- Ajouter un noeud Ctree
  55.  
  56.  
  57.      Main_Window.parent := Gtk.Ctree.Insert_Node
  58.        (Main_Window.Ctree,
  59.         Parent => Main_Window.Parent,
  60.         Sibling => Main_Window.Sibling,
  61.         Text => Text,
  62.         Spacing => 5,
  63.         Pixmap_Closed => Pixmap1,
  64.         Mask_Closed => Mask1,
  65.         Pixmap_Opened => Pixmap2,
  66.         Mask_Opened => Mask2,
  67.         Is_Leaf => False,
  68.         Expanded => False);
  69.  
  70.      if Main_Window.Locale_Value = 1.0 then
  71.         Node_Set_Text(Main_Window.Ctree, Main_Window.Parent, 50, "Right" );
  72.      else
  73.         Node_Set_Text(Main_Window.Ctree, Main_Window.Parent, 50, "Left" );
  74.      end if;
  75.      Ctree_Style_Row_Data.Node_Set_Row_Data
  76.        (Main_Window.Ctree, Node => Main_Window.parent, Data => Style);
  77.  
  78.      if Gtk.Ctree.Get_Line_Style (Main_Window.Ctree) = Ctree_Lines_Tabbed then
  79.         Gtk.Ctree.Node_Set_Row_Style
  80.           (Main_Window.Ctree, Node => Main_Window.parent, Style => Style);
  81.      end if;
  82.      Free (Text);
  83.  
  84.      if Main_Window.Locale_Value = 1.0 then
  85.         put('1');
  86.      else
  87.         put('0');
  88.      end if;
  89.  
  90.      if Main_Window.Next.Right /= null then
  91.         Main_Window.Next := Main_Window.Next.Right;
  92.         Unfree(Main_Window);
  93.      end if;
  94.      Main_Window.Next := Saved_Node;
  95.   end Unfree;


 
Procedure d'initialisation (la parrtie sur l'initialisation du Ctree) :
 

Code :
  1. Text := "Root" + "";
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.      Gtk.Style.Gtk_New (Style);
  9.      Gdk.Color.Set_Rgb (Tmp_Color, Red => 0, Green => 45_000, Blue => 55_000);
  10.      Gtk.Style.Set_Base (Style,
  11.                          State_Type => State_Normal,
  12.                          Color => Tmp_Color);
  13.      Ctree_Style_Row_Data.Node_Set_Row_Data
  14.        (Main_Window.Ctree, Node => Main_Window.Parent, Data => Style);
  15.  
  16.      if Gtk.Ctree.Get_Line_Style (Main_Window.Ctree) = Ctree_Lines_Tabbed then
  17.         Gtk.Ctree.Node_Set_Row_Style (Main_Window.Ctree, Node => Main_Window.Parent, Style => Style);
  18.      end if;
  19.      Main_Window.Parent := Gtk.Ctree.Insert_Node (Main_Window.Ctree,
  20.                                                   Parent => Gtk.Ctree.Null_Ctree_Node,
  21.                                                   Sibling => Gtk.Ctree.Null_Ctree_Node,
  22.                                                   Text => Text,
  23.                                                   Spacing => 5,
  24.                                                   Pixmap_Closed => Pixmap1,
  25.                                                   Mask_Closed => Mask1,
  26.                                                   Pixmap_Opened => Pixmap2,
  27.                                                   Mask_Opened => Mask2,
  28.                                                   Is_Leaf => False,
  29.                                                   Expanded => True);
  30.      Free (Text);
  31.      Put_Line(" : Sibling...Done...." );
  32.      Ctree_Style_Row_Data.Node_Set_Row_Data
  33.        (Main_Window.Ctree, Node => Main_Window.Sibling, Data => Style);
  34.  
  35.      if Gtk.Ctree.Get_Line_Style (Main_Window.Ctree) = Ctree_Lines_Tabbed then
  36.         Gtk.Ctree.Node_Set_Row_Style
  37.           (Main_Window.Ctree, Node => Main_Window.Sibling, Style => Style);
  38.      end if;
  39.      Free (Text);
  40.  
  41.      Gtk.Ctree.Thaw (Main_Window.Ctree);


 
Mon problème je pense en premier lieu serait de comprendre le fonctionnement de Gtk.Ctree.Insert_Node.
Je dois mettre éventuellement deux dossier dans un. et ainsi de suite.
 
Merci pour votre aide.

Reply

Marsh Posté le 09-06-2011 à 05:39:19   

Reply

Marsh Posté le 09-06-2011 à 12:08:31    

Bonjour,
 
j'ai pas fait grand chose depuis ce matin.
J'ai un peu épuré mon code Gtk, ça tourne mieux. Je n'ai toujours pas les image ni le texte associé au noeud mais c'est un détail.
Je planche maintenant sur la méthode pour construire et reconstruire le Ctree avec mon arbre.
Comme je l'ai peut-être dit un peu courtement, je compte construire l'arbre dans la procédure récussive Unfree qui parcours l'arbre pour le mettre à jour après l'ajout d'un noeud.
 
Pour le moment j'ajoute simplement chaque noeud au noeud précédent.
Il faut que je trouve comment reproduire mon arbre avec Ctree.
Mais je ne sais pas si de par ma fonction récursive Unfree ce soit possible ou pas.
Et j'ai aucune idée de comme gruger si non.

Reply

Marsh Posté le 09-06-2011 à 12:16:35    

FInalement tu n'es pas parti sur Qt.
Je me demande si CTree n'est pas l'ancienne version à ne plus utiliser, et qu'il faudrait utiliser GtkTreeView.
En ada j'en sais rien, c'est peut-etre encore wrappé sur l'ancienne version...

Reply

Marsh Posté le 09-06-2011 à 12:23:32    

Finalement non. j'ai voulue installer QtAda, ça a foiré, j'ai pas insisté.
 
Oui, j'ai pas fait gaffe, à propos de Ctree :

Code :
  1. --  <description>
  2. --  This widget is deprecated. Use Gtk.Tree_View instead.


 
Merci GrosBoc.
 
edit quoi qu'il en soit je reste sur Ctree, je préfère en fait.


Message édité par Profil supprimé le 09-06-2011 à 12:31:29
Reply

Marsh Posté le 09-06-2011 à 19:02:38    

Bonjour, ou re...
 
J'ai réussi à faire un arbre. Mais je pense pas que ce soit le bon.
Au cas ou, je ne sais si finalement, ma recherche de facilité facilitera la lecture ; Néanmoins, je vous poste mes sources pour ceux et celles qui désirraient tester le programme : http://www.toofiles.com/fr/oip/doc [...] 10tar.html
 
J'ai essentiellement Trois problèmes : 1) construire l'abre du Ctree à l'image de celui construit par ailleurs ; 2) Réinitialiser le Ctree ; 3) Le scroll horizontal ne fonctionne pas.


Message édité par Profil supprimé le 09-06-2011 à 19:03:21
Reply

Marsh Posté le 09-06-2011 à 20:41:54    

Point 2) done.
Il suffisait de déplacer l'initialisation du Ctree, dans chacune des boucle diteration dans la tache Process.
Ca fonctionne beaucoup mieux du coup.


Message édité par Profil supprimé le 09-06-2011 à 20:42:18
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed