X-Git-Url: https://git.llucax.com/z.facultad/75.52/treemulator.git/blobdiff_plain/c8b8148848e31e0e39a01ed45c19ccc0d0702a34..8d4a4f4d97c0275c9275e1934db6ffabbbbcffa5:/viewer/view_node.cpp?ds=sidebyside diff --git a/viewer/view_node.cpp b/viewer/view_node.cpp index 0092dc0..c29d43f 100644 --- a/viewer/view_node.cpp +++ b/viewer/view_node.cpp @@ -1,19 +1,22 @@ #include "view_node.h" -ViewNode::ViewNode (Canvas::Group *parent, uint num, BTreeNodeHeader &header, std::list &keys) +ViewNode::ViewNode (Canvas::Group *parent, uint num, uint padre, BTreeNodeHeader &header, std::list &keys) : Canvas::Group (*parent) { + last_selected = NULL; double header_w = ViewBTree::byte_to_pixels * sizeof (BTreeNodeHeader); this->num = num; + this->padre = padre; /* Fondo */ - Canvas::Rect *fondo = new Canvas::Rect (*this, 0, 0, NODE_WIDTH, NODE_HEIGHT); - fondo->property_fill_color() = "gray"; - fondo->property_outline_color() = "black"; + int w1 = (int)(ViewBTree::node_width / 512.0f); + int used_width = 0; + + double y = 0; /* Header */ - Canvas::Rect *h = new Canvas::Rect (*this, 0, 0, header_w, NODE_HEIGHT); + Canvas::Rect *h = new Canvas::Rect (*this, 0, 0, header_w, ViewBTree::node_height); h->property_fill_color() = "blue"; h->property_outline_color() = "black"; @@ -22,30 +25,56 @@ ViewNode::ViewNode (Canvas::Group *parent, uint num, BTreeNodeHeader &header, st std::stringstream ss; ss << num; ss >> node_num; - new Canvas::Text (*this, header_w/2, NODE_HEIGHT/2, node_num); + new Canvas::Text (*this, header_w/2, ViewBTree::node_height/2, node_num); double x = header_w; + y = 0; std::list::iterator it = keys.begin (); while (it != keys.end ()) { BTreeData *data = (*it); double w = ViewBTree::byte_to_pixels * data->Size (); - ViewBTreeData *v = ViewBTreeData::Create (data, this, x, 0, w+x, NODE_HEIGHT); + ViewBTreeData *v = ViewBTreeData::Create (data, this, x, y, w+x, y+ViewBTree::node_height); v->signal_clicked ().connect ( sigc::mem_fun (this , &ViewNode::on_item_clicked )); + v->signal_double_clicked ().connect ( sigc::mem_fun (this , &ViewNode::on_item_activated )); x += w; + used_width += w; + if (x >= 512) { + x = 0; + y += ViewBTree::node_height + 5; + } it++; + datas.push_back (v); + if (!dynamic_cast(data)) { /* Si no es un dato de una hoja, tiene hijos */ - hijos.push_back (data->getChild ()); + hijos.push_back (data->GetChild ()); } } + w1 = ViewBTree::node_width - used_width; + if (w1 > 0) { + fondo = new Canvas::Rect (*this, x, y, x+w1, ViewBTree::node_height+y); + fondo->property_fill_color() = "gray"; + fondo->property_outline_color() = "black"; + } } -void ViewNode::on_item_clicked (BTreeData *data) +void ViewNode::on_item_clicked (BTreeData *data, ViewBTreeData *s) { - m_signal_selected (data, num); + if (last_selected) + if (s != last_selected) + last_selected->SetSelected (false); + last_selected = s; + m_signal_selected (data, num, this); +} + +void ViewNode::on_item_activated (BTreeData *data, ViewBTreeData *s) +{ + /* Solo activo los que tienen hijos */ + if (dynamic_cast (data) == NULL) + m_signal_activated (data, num, this); } ViewNode::type_signal_selected ViewNode::signal_selected () @@ -53,3 +82,31 @@ ViewNode::type_signal_selected ViewNode::signal_selected () return m_signal_selected; } +ViewNode::type_signal_activated ViewNode::signal_activated () +{ + return m_signal_activated; +} + +void ViewNode::SetSelected (bool b) +{ + if (last_selected) { + last_selected->SetSelected (b); + } +} + +void ViewNode::HighliteKey (Clave &k) +{ + std::list::iterator it; + + it = datas.begin (); + while (it != datas.end ()) { + if ((*(*it)) == k) { + if (last_selected) + last_selected->SetSelected (false); + last_selected = *it; + last_selected->SetSelected (true); + } + it++; + } +} +