Sign up

How to change color of each cell according to cell name

I'd like to change color of each cell according to cell name.

Here is what I've done so far.

import gtk.Main;
import gtk.MainWindow;
import gtk.Box;
import gtk.TreeView;
import gtk.TreeViewColumn;
import gtk.CellRendererText;
import gtk.ListStore;
import gtk.TreeModel;
import gtk.TreeIter;
import gtk.CellRenderer;

import std.stdio;

struct Color
{
    string name;
    string description;
}

class MyWindow: MainWindow
{
    this()
    {
        super("TreeView example");

        setSizeRequest(500, 200);

        Color[] colors;

        colors ~= Color("Green", "This should be green");
        colors ~= Color("Red", "This should be red");
        colors ~= Color("Blue",  "This should be blue");

        auto tree = new TreeView();
        auto dataModel = new ListStore([GType.STRING, GType.STRING]);

        auto nameColumn = new TreeViewColumn();
        nameColumn.setTitle("Color");
        auto colorNameCell = new CellRendererText();
        nameColumn.packStart(colorNameCell, true);
        tree.appendColumn(nameColumn);

        auto descriptionColumn = new TreeViewColumn();
        descriptionColumn.setTitle("Description");
        auto colorDescriptionCell = new CellRendererText();
        descriptionColumn.packStart(colorDescriptionCell, true);
        tree.appendColumn(descriptionColumn);

        auto iter = dataModel.createIter();

        foreach (color; colors)
        {
            dataModel.setValue(iter, 0, color.name);
            dataModel.setValue(iter, 1, color.description);
            dataModel.append(iter);
        }

        nameColumn.setCellDataFunc(colorNameCell, cast (GtkTreeCellDataFunc)  &renderColor, null, null);

        tree.setModel(dataModel);

        add(tree);
        showAll();
    }

    static extern(C) void renderColor(GtkTreeViewColumn * treeColumn, GtkCellRenderer * cell,
                                      GtkTreeModel * gtkModel, GtkTreeIter * iter, void * data)
    {
        auto model = new TreeModel(gtkModel, false);
        auto iterator = new TreeIter(iter, false);
        auto cellRenderer = new CellRenderer(cell, false);

        string colorName = model.getValue(iterator, 0).dupString();
        writeln(colorName);

        // cellRenderer.foreground = "red";
    }
}

void main(string[] args)
{
    Main.init(args);
    auto mywindow = new MyWindow();
    Main.run();
}

For example if colorName starts with "r" I'd like to change this cell color to red. If it starts with "g" I'd like to change cell color to green.

I was expecting to find a method similiar to this but
there isn't.

cellRenderer.foreground = "red";

Re: How to change color of each cell according to cell name

On 01/29/2017 12:34 PM, Erdem wrote:

I'd like to change color of each cell according to cell name.

Here is what I've done so far.

import gtk.Main;
import gtk.MainWindow;
import gtk.Box;
import gtk.TreeView;
import gtk.TreeViewColumn;
import gtk.CellRendererText;
import gtk.ListStore;
import gtk.TreeModel;
import gtk.TreeIter;
import gtk.CellRenderer;

import std.stdio;

struct Color
{
    string name;
    string description;
}

class MyWindow: MainWindow
{
    this()
    {
        super("TreeView example");

        setSizeRequest(500, 200);

        Color[] colors;

        colors ~= Color("Green", "This should be green");
        colors ~= Color("Red", "This should be red");
        colors ~= Color("Blue",  "This should be blue");

        auto tree = new TreeView();
        auto dataModel = new ListStore([GType.STRING, GType.STRING]);

        auto nameColumn = new TreeViewColumn();
        nameColumn.setTitle("Color");
        auto colorNameCell = new CellRendererText();
        nameColumn.packStart(colorNameCell, true);
        tree.appendColumn(nameColumn);

        auto descriptionColumn = new TreeViewColumn();
        descriptionColumn.setTitle("Description");
        auto colorDescriptionCell = new CellRendererText();
        descriptionColumn.packStart(colorDescriptionCell, true);
        tree.appendColumn(descriptionColumn);

        auto iter = dataModel.createIter();

        foreach (color; colors)
        {
            dataModel.setValue(iter, 0, color.name);
            dataModel.setValue(iter, 1, color.description);
            dataModel.append(iter);
        }

        nameColumn.setCellDataFunc(colorNameCell, cast (GtkTreeCellDataFunc)  &renderColor, null, null);

        tree.setModel(dataModel);

        add(tree);
        showAll();
    }

    static extern(C) void renderColor(GtkTreeViewColumn * treeColumn, GtkCellRenderer * cell,
                                      GtkTreeModel * gtkModel, GtkTreeIter * iter, void * data)
    {
        auto model = new TreeModel(gtkModel, false);
        auto iterator = new TreeIter(iter, false);
        auto cellRenderer = new CellRenderer(cell, false);

        string colorName = model.getValue(iterator, 0).dupString();
        writeln(colorName);

        // cellRenderer.foreground = "red";
    }
}

void main(string[] args)
{
    Main.init(args);
    auto mywindow = new MyWindow();
    Main.run();
}

For example if colorName starts with "r" I'd like to change this cell color to red. If it starts with "g" I'd like to change cell color to green.

I was expecting to find a method similiar to this but
there isn't.

cellRenderer.foreground = "red";

You can set the background color and other properties with the
setProperty function.

cellRenderer.setProperty("cell-background", "red");

Re: How to change color of each cell according to cell name

On Sun, 29 Jan 2017 14:47:10 +0100, Mike Wey wrote:

You can set the background color and other properties with the
setProperty function.

cellRenderer.setProperty("cell-background", "red");

Thanks.