From: Ricardo Markiewicz Date: Fri, 23 Sep 2005 17:22:15 +0000 (+0000) Subject: Separo la vista del Nodo y pongo algo de logica de posicionamiento. X-Git-Tag: 1_0-pre1~116 X-Git-Url: https://git.llucax.com/z.facultad/75.52/treemulator.git/commitdiff_plain/37c9b25e38617bead7998f82531d5e3131a4d7b7?ds=inline Separo la vista del Nodo y pongo algo de logica de posicionamiento. --- diff --git a/viewer/view_btree.cpp b/viewer/view_btree.cpp index a73f396..f62e931 100644 --- a/viewer/view_btree.cpp +++ b/viewer/view_btree.cpp @@ -1,6 +1,8 @@ #include "view_btree.h" #include "view_btree_data.h" + +double ViewBTree::byte_to_pixels = 0; ViewBTree::ViewBTree (Canvas::Group *parent, std::string filename):Canvas::Group (*parent, 0, 0), BTree (filename, 64) @@ -14,9 +16,6 @@ ViewBTree::ViewBTree (Canvas::Group *parent, std::string filename):Canvas::Group AddKey (c); } - Canvas::Rect *rect = new Canvas::Rect (*this, 0, 0, NODE_WIDTH, NODE_HEIGHT); - rect->property_fill_color() = "gray"; - byte_to_pixels = NODE_WIDTH/64; // TODO : 64 == BlockSize AddNode (0); @@ -39,45 +38,57 @@ void ViewBTree::AddNode (uint num) std::list keys = ReadKeys (node, node_h); - double header_w = byte_to_pixels * sizeof (BTreeNodeHeader); - double x = 0; + ViewNode *vnode = new ViewNode (this, num, node_h, keys); + vnode->property_y () = y; + vnode->property_x () = pos_x[node_h.level]; + pos_x[node_h.level] += NODE_WIDTH+10; + + std::list childs = vnode->getChilds (); + std::list::iterator hit = childs.begin (); + while (hit != childs.end ()) { + AddNode (*hit); + hit++; + } +} + +ViewNode::ViewNode (Canvas::Group *parent, uint num, BTreeNodeHeader &header, std::list &keys) + : Canvas::Group (*parent) +{ + double header_w = ViewBTree::byte_to_pixels * sizeof (BTreeNodeHeader); + + /* Fondo */ + Canvas::Rect *fondo = new Canvas::Rect (*this, 0, 0, NODE_WIDTH, NODE_HEIGHT); + fondo->property_fill_color() = "gray"; + fondo->property_outline_color() = "black"; - Canvas::Rect *view_header = new Canvas::Rect (*this, x, y, x+header_w, y+NODE_HEIGHT); - view_header->property_fill_color() = "blue"; + /* Header */ + Canvas::Rect *h = new Canvas::Rect (*this, 0, 0, header_w, NODE_HEIGHT); + h->property_fill_color() = "blue"; + h->property_outline_color() = "black"; /* Numero de nodo */ std::string node_num; std::stringstream ss; ss << num; ss >> node_num; - new Canvas::Text (*this, header_w/2, y+NODE_HEIGHT/2, node_num); + new Canvas::Text (*this, header_w/2, NODE_HEIGHT/2, node_num); - x += header_w; + double x = header_w; - /* Cuento los hijos para saber como centrarlos más adelante */ - std::list hijos; - std::list::iterator it = keys.begin (); while (it != keys.end ()) { BTreeData *data = (*it); - double w = byte_to_pixels * data->Size (); + double w = ViewBTree::byte_to_pixels * data->Size (); - ViewBTreeData *v = ViewBTreeData::Create (data, this, x, y, w+x, y+NODE_HEIGHT); + ViewBTreeData *v = ViewBTreeData::Create (data, this, x, 0, w+x, NODE_HEIGHT); x += w; it++; - if (dynamic_cast(data)) { - BTreeChildData *child = dynamic_cast(data); - hijos.push_back (child->getChild ()); + if (!dynamic_cast(data)) { + /* Si no es un dato de una hoja, tiene hijos */ + hijos.push_back (data->getChild ()); } } - - - std::list::iterator hit = hijos.begin (); - while (hit != hijos.end ()) { - AddNode (*hit); - hit++; - } } diff --git a/viewer/view_btree.h b/viewer/view_btree.h index a03af2b..bd4f22c 100644 --- a/viewer/view_btree.h +++ b/viewer/view_btree.h @@ -16,13 +16,24 @@ class ViewBTree : public Canvas::Group, public BTree { public: ViewBTree (Canvas::Group *parent, std::string filename); + static double byte_to_pixels; protected: - int byte_to_pixels; int max_level; /* Lo saco de la raiz */ + /* Posicion X por nivel */ + std::map pos_x; void AddNode (uint num); }; +class ViewNode : public Canvas::Group { + public: + ViewNode (Canvas::Group *parent, uint num, BTreeNodeHeader &header, std::list &keys); + + std::list& getChilds () { return hijos; } + private: + std::list hijos; +}; + #endif