Sign up

How to get an iterator to the first row in liststore

I try to implement a cellrenderer progress demo like this.

import gtk.Main;
import gtk.MainWindow;
import gtk.Box;
import gtk.ListStore;
import gtk.TreeIter;
import gtk.TreeView;
import gtk.CellRendererText;
import gtk.TreeViewColumn;
import gtk.CellRendererProgress;
import gtk.CellRendererToggle;


import gobject.Value;
import glib.Timeout;


class MyWindow: MainWindow
{
    ListStore model;
    TreeIter iter;

    this()
    {
        super("Cell renderer demo");
        setDefaultSize(200, 200);
        model = new ListStore([GType.STRING, GType.INT, GType.BOOLEAN]);

        void addTask(string name, int percent, bool inverted)
        {
            model.append(iter);
            model.setValue(iter, 0, name);
            model.setValue(iter, 1, percent);
            model.setValue(iter, 2, new Value(inverted));
        }

        addTask("Make soup", 0, false);
        addTask("Write program", 0, false);
        addTask("Go to grocery", 0, false);

        auto view = new TreeView(model);

        auto rendererText = new CellRendererText();
        auto columnText = new TreeViewColumn("Text", rendererText, "text", 0);
        view.appendColumn(columnText);

        auto rendererProgress = new CellRendererProgress();
        auto columnProgress = new TreeViewColumn("Progress", rendererProgress, "value", 1);
        columnProgress.addAttribute(rendererProgress, "inverted", 2);

        view.appendColumn(columnProgress);

        auto rendererToggle = new CellRendererToggle();
        auto columnToggle = new TreeViewColumn("Inverted", rendererToggle, "active", 2);
        view.appendColumn(columnToggle);

        auto timeout = new Timeout(100, &onTimeout, false);


        add(view);
        showAll();
    }

    bool onTimeout()
    {

        auto newValue = model.getValue(iter, 1).getInt() + 1;
        auto iter_ = new TreeIter();

        if (newValue > 100)
        {
            model.iterNext(iter_);
            newValue = model.getValueInt(iter_, 1) + 1;
        }

        import std.stdio: writeln;
        writeln(newValue);

        model.setValue(iter, 1, newValue);
        return true;
    }
}

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

Let's think we have three task. We'd like to do these tasks in order.

After the first task is over, we will move to the second task, at the mean time the progress bar will advance.

But how do we get an iterator to the first item/task in the model? (It is "Make soup" in our example)

Re: How to get an iterator to the first row in liststore

On 02/25/2017 01:22 PM, Erdem wrote:

I try to implement a cellrenderer progress demo like this.

... code ...

Let's think we have three task. We'd like to do these tasks in order.

After the first task is over, we will move to the second task, at the mean time the progress bar will advance.

But how do we get an iterator to the first item/task in the model? (It is "Make soup" in our example)

You can use TreeModel.getIterFirst to get an TreeIter pointing to the
first row.

TreeIter iter;
model.getIterFirst(iter);

// iter now points to the firs row.

Re: How to get an iterator to the first row in liststore

On Sat, 25 Feb 2017 16:30:40 +0100, Mike Wey wrote:

You can use TreeModel.getIterFirst to get an TreeIter pointing to the
first row.
[...]

Thanks.. How about resetting the progress bar. Might there be a better approach to iterate through rows of the model.

import gtk.Main;
import gtk.MainWindow;
import gtk.Box;
import gtk.ListStore;
import gtk.TreeIter;
import gtk.TreeView;
import gtk.CellRendererText;
import gtk.TreeViewColumn;
import gtk.CellRendererProgress;
import gtk.CellRendererToggle;


import gobject.Value;
import glib.Timeout;


class MyWindow: MainWindow
{
    ListStore model;
    TreeIter iter;

    this()
    {
        super("Cell renderer demo");
        setDefaultSize(200, 200);
        model = new ListStore([GType.STRING, GType.INT, GType.BOOLEAN]);

        void addTask(string name, int percent, bool inverted)
        {
            model.append(iter);
            model.setValue(iter, 0, name);
            model.setValue(iter, 1, percent);
            model.setValue(iter, 2, new Value(inverted));
        }

        addTask("Make soup", 0, false);
        addTask("Write program", 0, false);
        addTask("Go to grocery", 0, false);
        model.getIterFirst(iter);


        auto view = new TreeView(model);

        auto rendererText = new CellRendererText();
        auto columnText = new TreeViewColumn("Text", rendererText, "text", 0);
        view.appendColumn(columnText);

        auto rendererProgress = new CellRendererProgress();
        auto columnProgress = new TreeViewColumn("Progress", rendererProgress, "value", 1);
        columnProgress.addAttribute(rendererProgress, "inverted", 2);

        view.appendColumn(columnProgress);

        auto rendererToggle = new CellRendererToggle();
        auto columnToggle = new TreeViewColumn("Inverted", rendererToggle, "active", 2);
        view.appendColumn(columnToggle);

        auto timeout = new Timeout(50, &onTimeout, false);


        add(view);
        showAll();
    }

    bool onTimeout()
    {
        import std.stdio: writeln;

        auto newValue = model.getValueInt(iter, 1) + 1;

        if (newValue > 100)
        {
            model.iterNext(iter);
            if (iter.stamp == 0)
            {
                resetModel();
            }
            newValue = 1;

        }
        // writeln(newValue);

        model.setValue(iter, 1, newValue);
        return true;
    }

    void resetModel()
    {
        model.getIterFirst(iter);

        while (iter.stamp > 0)
        {
            model.setValue(iter, 1, 0);
            model.iterNext(iter);
        }

        model.getIterFirst(iter);

    }
}

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

Re: How to get an iterator to the first row in liststore

On 02/26/2017 04:20 PM, Erdem wrote:

On Sat, 25 Feb 2017 16:30:40 +0100, Mike Wey wrote:

You can use TreeModel.getIterFirst to get an TreeIter pointing to the
first row.
[...]

Thanks.. How about resetting the progress bar. Might there be a better approach to iterate through rows of the model.

...

If you want to reset all of them then probably not.

If you want to keep a reference to a specific row to reset you can use a
TreeRowReference.