]> git.llucax.com Git - z.facultad/75.52/treemulator.git/blob - viewer/view_btree.cpp
Agrego creación de árbol con claves variables en la UI.
[z.facultad/75.52/treemulator.git] / viewer / view_btree.cpp
1
2 #include "view_btree.h"
3 #include "view_btree_data.h"
4 #include <sigc++/slot.h>
5
6 double ViewBTree::byte_to_pixels = 0;
7
8 ViewBTree::ViewBTree (Canvas::Group *parent, std::string filename):Canvas::Group (*parent, 0, 0),
9         BTree (filename, 64)
10 {
11         /* TODO : hace que el arbol se abra de un archivo ya creado o que se
12          * cree afuera
13          */
14         for (int i=0; i<=64; i++) {
15                 ClaveFija c(i);
16
17                 AddKey (c);
18         }
19
20         byte_to_pixels  = NODE_WIDTH/64; // TODO : 64 == BlockSize
21
22         AddNode (0);
23 }
24
25 void ViewBTree::AddNode (uint num)
26 {
27         if (node_placed[num]) {
28                 std::cout << "WARNING : Tratando de agregar de nuevo el nodo " << num << std::endl;
29                 return;
30         }
31
32         node_placed[num] = true;
33         /* Muestro la raiz */
34         double y = 0;
35         uchar *node = ReadBlock (num);
36
37         BTreeNodeHeader node_h;
38         ReadNodoHeader (node, &node_h);
39
40         if (num == 0) {
41                 max_level = node_h.level;
42         } else {
43                 y = (max_level - node_h.level)*(NODE_HEIGHT+10);
44         }
45
46         std::list<BTreeData *> keys = ReadKeys (node, node_h);
47
48         ViewNode *vnode = new ViewNode (this, num, node_h, keys);
49         vnode->property_y () = y;
50         vnode->property_x () = pos_x[node_h.level];
51         pos_x[node_h.level] += NODE_WIDTH+10;
52         vnode->signal_selected().connect ( sigc::mem_fun (*this, &ViewBTree::on_item_selected) );
53
54         std::list<uint> childs = vnode->getChilds ();
55         std::list<uint>::iterator hit = childs.begin ();
56         while (hit != childs.end ()) {
57                 if ((*hit) == 0) {
58                         std::cout << "WARNING : Referencia a 0 encontrada!!" << std::endl;
59                         hit = childs.end ();
60                         continue;
61                 }
62                 AddNode (*hit);
63                 hit++;
64         }
65 }
66
67 void ViewBTree::on_item_selected (BTreeData *data, uint num)
68 {
69         BTreeNodeHeader node_h;
70         uchar *node;
71         
72         node = ReadBlock (num);
73         ReadNodoHeader (node, &node_h);
74         delete [] node;
75
76         std::cout << "Emit SignalSelected" << std::endl;
77         m_signal_selected (data, node_h);
78 }
79
80 ViewBTree::type_signal_selected ViewBTree::signal_selected ()
81 {
82         return m_signal_selected;
83 }
84