0052: MVC V – A ComboBox with Integers
This time around, we’re going to change things up in two ways:
- the
ListStore
will have two columns, but only one will be visible in theComboBox
, and - we’ll be displaying integers instead of text in the
ComboBox
.
A Two-column ListStore
I talked about the two-column ListStore
in the introduction to this series and touched on the requirements for ListStore
s in general last time, but here’s a brief review…
A ListStore
needs:
- data to stuff into rows, and
- an array of data types, one for each column.
So what we did last time, we just do it twice to get two columns. And what’s the second column for if we don’t see it in the ComboBox
? Whatever extra data you may want to have associated with the items that do show. Here’s the DayListStore
class:
class DayListStore : ListStore
{
string[] days = ["Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
int[] dayNumbers = [1, 2, 3, 4, 5, 6, 7];
GType[] columnTypes = [GType.STRING, GType.INT];
TreeIter treeIter;
int dayColumn = 0, numberColumn = 1;
this()
{
string day;
int number;
super(columnTypes);
foreach(ulong i; 0..days.length)
{
day = days[i];
number = lettersInDays[i];
treeIter = createIter();
setValue(treeIter, dayColumn, day);
setValue(treeIter, numberColumn, number);
}
} // this()
} // class DayListStore
We have three arrays in the initialization section:
days
- our string data,dayNumbers
– the integer data, andcolumnTypes
– an array ofGType
data types.
The constructor is pretty much the same as before except that in the foreach()
loop we extract a bit of data from each of the two data arrays and make the call to setValue()
twice, once for each column.
The DayComboBox
In the initialization section of the DayComboBox
, we have:
class DayComboBox : ComboBox
{
private:
bool entryOn = false;
DayListStore _dayListStore;
CellRendererText cellRendererText;
int visibleColumn = 1;
int activeItem = 0;
A couple of things I’ll point out here…
First…
Even though the data in our ListStore
is integers, we’re using a CellRendererText
. We follow through in the initialization section where we declare it:
CellRendererText cellRendererText;
And in these three lines from the constructor where we instantiate it, pack it into the ComboBox
, and deal with the attributes:
cellRendererText = new CellRendererText();
packStart(cellRendererText, false);
addAttribute(cellRendererText, "text", visibleColumn);
Second…
In the initialization section, the visibleColumn
variable is set to 1
, not 0
as it was before. This is where the decision is made as to which column is shown in the ComboBox
.
And if you look at those lines from the constructor, you’ll see that addAttribute()
is where the visible column is set.
The rest of the constructor is the same and the callback is almost identical except that it calls an extra function to write to the terminal. Because there’s nothing remarkable about it, I’ll leave you to explore it on your own if you’re so inclined.
Conclusion
And that’s how to use integers in a ComboBox
. Join us next time for a peek into the mysteries of ComboBox
es with images.
Comments? Questions? Observations?
Did we miss a tidbit of information that would make this post even more informative? Let's talk about it in the comments.
- come on over to the D Language Forum and look for one of the gtkDcoding announcement posts,
- drop by the GtkD Forum,
- follow the link below to email me, or
- go to the gtkDcoding Facebook page.
You can also subscribe via RSS so you won't miss anything. Thank you very much for dropping by.
© Copyright 2024 Ron Tarrant