#include "../src/pixmaps/form.xpm" #include "../src/pixmaps/label.xpm" #define CELLRENDERER_INDENT 0 #include "resource.h" #include "cellrenderer-icontext.h" #if CELLRENDERER_INDENT #include "cellrenderer-indent.h" #endif #include #include #include #include #include namespace Guikachu { namespace GUI { class ResourceTree: public Gtk::TreeView { Gtk::TreeModelColumn col_res; Glib::RefPtr treestore; Gtk::TreeRow resource_tree; public: ResourceTree (); void add_resource (Resource *res); void row_activated_cb (const Gtk::TreeModel::Path &path, Gtk::TreeView::Column *col); private: void cell_cb (Gtk::CellRenderer *cell, const Gtk::TreeModel::iterator &iter) const; }; } } using namespace Guikachu::GUI; using namespace Guikachu; ResourceTree::ResourceTree () { Gtk::TreeModel::ColumnRecord cols; cols.add (col_res); treestore = Gtk::TreeStore::create (cols); set_model (treestore); set_headers_visible (false); #if CELLRENDERER_INDENT CellRendererIndent::setup_view (*this, "", sigc::mem_fun (*this, &ResourceTree::cell_cb)); #else Gtk::TreeView::Column *column = new Gtk::TreeView::Column (""); CellRendererIconText *cell = new CellRendererIconText; column->pack_start (*manage (cell), true); column->set_cell_data_func (*cell, sigc::mem_fun (*this, &ResourceTree::cell_cb)); append_column(*manage (column)); #endif Gtk::TreeRow root_tree = *(treestore->append ()); root_tree[col_res] = 0; resource_tree = *(treestore->append (root_tree.children ())); resource_tree[col_res] = 0; signal_row_activated ().connect (sigc::mem_fun (*this, &ResourceTree::row_activated_cb)); } void ResourceTree::cell_cb (Gtk::CellRenderer *cell, const Gtk::TreeModel::iterator &iter) const { Resource *res = (*iter)[col_res]; CellRendererIconText *cell_text = dynamic_cast (cell); g_return_if_fail (cell_text); if (res && res->get_icon ()) cell_text->property_pixbuf () = Gdk::Pixbuf::create_from_xpm_data (res->get_icon ()); else cell_text->property_pixbuf () = Glib::RefPtr (); cell_text->property_text () = res ? res->get_id () : "Placeholder"; cell_text->property_editable () = true; } void ResourceTree::add_resource (Resource *res) { Gtk::TreeRow row = *(treestore->append (resource_tree.children ())); row[col_res] = res; } void ResourceTree::row_activated_cb (const Gtk::TreeModel::Path &path, Gtk::TreeView::Column *col) { Gtk::TreeModel::iterator iter = treestore->get_iter (path); if (iter == treestore->children ().begin ()) { std::cout << "Root activate" << std::endl; return; } if ((*iter)[col_res]) { Resource *res = (*iter)[col_res]; res->activate (); } } int main (int argc, char **argv) { Gtk::Main m (argc, argv); Gtk::Window w; ResourceTree tree; tree.show (); w.add (tree); tree.add_resource (new Resource ("Res1", form_xpm)); tree.add_resource (new Resource ("Res2", label_xpm)); tree.add_resource (new Resource ("Res3", form_xpm)); tree.add_resource (new Resource ("Res4")); tree.add_resource (new Resource ("Res5")); tree.add_resource (new Resource ("Res6", form_xpm)); tree.expand_all (); m.run (w); return 0; }