ListCtrl.get_selections broken?


#1

Hi again,

may it be that ListCtrl.get_selections is broken? Or did I misunderstand
sth. in the docs?

I’m always getting 0 as the size of the returned array while
get_selected_item_count is reporting the correct number.

See the attachment or the following lines for a program that
demonstrates this.

require ‘wx’
include Wx

class MyFrame < Frame
def initialize
super nil, -1, “ListCtrl Error”

@list = ListCtrl.new(self, -1, DEFAULT_POSITION, DEFAULT_SIZE,

LC_REPORT)
@list.insert_column(0, ‘abc’)

li = ListItem.new()
li.set_state LIST_STATE_SELECTED

li.set_text '123'
@list.insert_item(li)
li.set_text '234'
@list.insert_item(li)
li.set_text '345'
@list.insert_item(li)
li.set_text '456'
@list.insert_item(li)


puts @list.get_selected_item_count # --> 4
puts @list.get_selections.size     # --> 0

end
end

class MyApp < App
def on_init
f = MyFrame.new
f.show
end
end

MyApp.new.main_loop

I hope I’m doing something wrong.

Cheers,
Christian.


#2

Christian Schmidt wrote:

I’m always getting 0 as the size of the returned array while
get_selected_item_count is reporting the correct number.

It works OK for me. I think the problem is the way you are adding items
to the list.

@list = ListCtrl.new(self, -1, DEFAULT_POSITION, DEFAULT_SIZE,

LC_REPORT)

Note - this can be written ListCtrl.new(self, :style => LC_REPORT). You
almost never need to use the clumsy ‘DEFAULT_POSITION’, ‘DEFAULT_SIZE’
etc. Use named arguments and these will be taken care of.

li = ListItem.new()
li.set_state 

li.set_text '123'
@list.insert_item(li)
li.set_text '234'
@list.insert_item(li)

Your problem is here, I think. Each ListItem object represents a unique
object in the list. The row it’s in is identified by an attribute ‘id’.
However, you’re adding the same object multiple times. Do it like this
instead, creating a new ListItem for each:

li = Wx::ListItem.new
li.state = LIST_STATE_SELECTED
li.id = 0 # For row 0
li.text = ‘123’
@list.insert_item li

alex


#3

Alex F. wrote:

Note - this can be written ListCtrl.new(self, :style => LC_REPORT). You
almost never need to use the clumsy ‘DEFAULT_POSITION’, ‘DEFAULT_SIZE’
etc. Use named arguments and these will be taken care of.

This is great! I’ve always been annoyed by that, since I practically
never need to explicitly set those using sizer based layout.

li = ListItem.new()
li.set_state 

li.set_text '123'
@list.insert_item(li)
li.set_text '234'
@list.insert_item(li)

I didn’t use the ListItem helper-class in the original program. Just
wanted to make it easier for you to reproduce the problem by selecting
the items at startup. I was using @list.insert_item(pos, ‘item’) and
@list.set_item(pos, col, ‘property’) originally.

Your problem is here, I think. Each ListItem object represents a unique
object in the list. The row it’s in is identified by an attribute ‘id’.
However, you’re adding the same object multiple times. Do it like this
instead, creating a new ListItem for each:

li = Wx::ListItem.new
li.state = LIST_STATE_SELECTED
li.id = 0 # For row 0
li.text = ‘123’
@list.insert_item li

I’ve been playing around with this now. I thought, it might also be a
problem of references getting lost somewhere. So I modified it as
follows:

@li1 = ListItem.new()
@li1.set_state LIST_STATE_SELECTED
@li1.set_text '123'
@li1.id = 0
@list.insert_item(@li1)

@li2 = ListItem.new()
@li2.set_state LIST_STATE_SELECTED
@li2.id = 1
@li2.set_text '234'
@list.insert_item(@li2)

...

But still no luck: get_selections.size == 0!

Christian.