Search code examples
c++treeviewgtkmm

How to make a single item bold in TreeView using gtkmm?


It is possible to provide a CellRenderer (Gtk::CellRendererText) when doing an append_column, and in it i can user property_weight to set the weight.

However, this changes the whole column, and my goal is to be able to make a single item bold. Is there a built-in method for doing this?

The requirement is to be able to change an item from regular text to bold at any time.

So if i have:

  Gtk::TreeModel::Row row = *(treeModel->append());
  row[treeColumns.id] = 1;
  row[treeColumns.name] = "[one]";

  Gtk::TreeModel::Row childrow = *(treeModel->append(row.children()));
  childrow[treeColumns.id] = 11;
  childrow[treeColumns.name] = "<b>eleven</b>";

  childrow = *(treeModel->append(row.children()));
  childrow[treeColumns.id] = 12;
  childrow[treeColumns.name] = "twelve";

  row = *(treeModel->append());
  row[treeColumns.id] = 2;
  row[treeColumns.name] = "two";

  //Add the TreeView's view columns:
  treeView->append_column("Name", treeColumns.name);
//  treeView->append_column("ID", treeColumns.id);

    treeView->expand_all();

And then i want the element number 11 to become bold (it currently has HTML tags only to highlight that point), how would i be able to do that?


Solution

  • If you specify your own CellRenderer, then you'll probably also want to specify your own cell_data_func, via set_cell_data_func(): https://developer.gnome.org/gtkmm/stable/classGtk_1_1TreeViewColumn.html#a765296845c9e9757ba405becbbc13d96

    In that callback you can change the cell's properties. It would look something like this:

    MyTreeView::MyTreeView()
    {
      ...
      Gtk::TreeViewColumn view_column = Gtk::manage(new Gtk::TreeViewColumn(_("Name")));
      Gtk::CellRendererText cell = Gtk::manage(new Gtk::CellRendererText());
    
      view_column->pack_start(*cell, false);
      view_column->set_cell_data_func(*cell, sigc::mem_fun(*this, &MyTreeView::on_cell_data_name));
      append_column(view_column);
      ...
    }
    
    
    void MyTreeView::on_cell_data_name(
      Gtk::CellRenderer* renderer,
      const Gtk::TreeModel::iterator& iter)
    {
      //Get the value from the model and show it appropriately in the view:
      Gtk::TreeModel::Row row = *iter;
      int id = row[m_columns.m_col_id];
      Glib::ustring name = row[m_columns.m_col_name];
    
      if (id == SOME_MAGIC_NUMBER)
        name = "<b>" + name + "</b>";
    
      Gtk::CellRendererText* text_renderer = dynamic_cast<Gtk::CellRendererText*>(renderer);
      if(text_renderer)
        text_renderer.property_markup() = name;
      }
    }
    

    Instead of using markup, you might prefer to use the cell renderer's font property.