Forum: Ruby-Gnome 2 Bug in ListStore?

85991f138ede6236f35eb98da22b7b01?d=identicon&s=25 Marvin Gülker (quintus)
on 2013-02-23 20:55
(Received via mailing list)
Attachment: signature.asc (489 Bytes)
Hi there,

I encountered some unexpected behaviour with the Gtk::ListStore class.
Consider the following stand-alone Ruby script:

=========================================
require "gtk2"

model = Gtk::ListStore.new(String, Symbol, Integer)
row = model.append
row[0] = "String"
row[1] = :symbol
row[2] = 10

row2 = model.iter_first
p [row[0], row[1], row[2]]
=========================================

I expected the array to come out as ["String", :symbol, 10], however it
seems that ListStore internally refuses to store symbols (although I
explicitely requested a symbol to be stored). The actual output is:

["String", "symbol", 10]

That is, the symbol has been converted to a string. I’m not sure
whether this is a bug or expected behaviour, but if the latter, I was
unable to find it documented somewhere. Can someone light up this?

OS: Arch Linux 64 bits
Ruby version: ruby 1.9.3p385 (2013-02-06 revision 39114) [x86_64-linux]
ruby-gtk2 version: 1.2.1

Valete,
Marvin
3396e4a3df8a840faec520af8555a400?d=identicon&s=25 Mario Steele (Guest)
on 2013-02-24 04:11
(Received via mailing list)
Hello Quintus,

Looks like there is a bug in the way that Gtk::TreeModel/TreeStore saves
Symbol information, it automatically converts a Symbol to a String
class,
since Symbols are un-mutable Strings.  The easiest method in which to do
this is to subclass TreeModel/TreeStore and save the column information
in
ruby, and properly handle symbols this way:

class MyTreeStore < Gtk::TreeStore
  def initialize(*args)
    @columns = args
    super(*args)
  end

  def [](column)
    if @columns[column] == Symbol
      super(column).to_sym
    else
      super(column)
    end
  end
end

This code will allow you to store symbols, and have them actually be
returned as Symbols when fetching them.  Storage isn't an issue, as in
order to store a Symbol in Gtk, it has to be converted to a String in
the
first place.


hth,

Mario


On Sat, Feb 23, 2013 at 2:36 PM, Quintus <quintus@quintilianus.eu>
wrote:

> row[0] = "String"
>
> Valete,
> ruby-gnome2-devel-en@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/ruby-...
>
>


--
Mario Steele
Fleet Captain
CO - Geo 99
CO - USS T'hy'la
XO - Diplomatic Corps - Second Life
http://www.iftcommand.com/chapters/thyla/
http://www.trekfederation.com
Ee6ffca720cc428d70247dcd7377dd48?d=identicon&s=25 Kouhei Sutou (Guest)
on 2013-02-24 06:57
(Received via mailing list)
Hi,

In <20130223203634.2c1a12f2@quintilianus.eu>
  "[ruby-gnome2-devel-en] Bug in ListStore?" on Sat, 23 Feb 2013
20:36:34 +0100,
  Quintus <quintus@quintilianus.eu> wrote:

> row[2] = 10
>
> That is, the symbol has been converted to a string. Im not sure
> whether this is a bug or expected behaviour, but if the latter, I was
> unable to find it documented somewhere. Can someone light up this?

GObject doesn't have symbol type. So Ruby/GLib2 maps Symbol
to G_TYPE_STRING(*).

(*)
http://developer.gnome.org/gobject/stable/gobject-...

So you get string by the column that is specified as Symbol.

Thanks,
--
kou
0d130f179f85401f248e6ebc2ef8292f?d=identicon&s=25 Eric C. (eric_c)
on 2013-02-24 08:55
I had a similar problem where I wanted to make a subclass of the
"String" class and then store it in a liststore:

class MyString < String

  def initialize(var)
    @var = var

  end


end

When I store instances of this class in a liststore column, it is always
converted into an instance of String not MyString.  You can't subclass
Integer either.

It would be very very helpful if I could subclass these classes.

Thanks,
Eric
85991f138ede6236f35eb98da22b7b01?d=identicon&s=25 Marvin Gülker (quintus)
on 2013-02-24 09:34
(Received via mailing list)
Attachment: signature.asc (489 Bytes)
Am Sun, 24 Feb 2013 14:56:40 +0900 (JST)
schrieb Kouhei Sutou <kou@cozmixng.org>:
>
> So you get string by the column that is specified as Symbol.

Thank you kou :-). So this is kind of expected behaviour... However, I
cant imagine GObject has a type for Ruby objects, which work as
expected:

=============================================
require "gtk2"

class Foo

  def initialize
    @foo = 12
  end

end

model = Gtk::ListStore.new(String, Foo, Integer)
row = model.append
row[0] = "String"
row[1] = Foo.new
row[2] = 10

row2 = model.iter_first
p [row[0], row[1], row[2]]
=============================================

The Foo instance coming out here is exactly the same that I passed in
(it even has the same object_id), so it is possible to store arbitrary
objects into ListStore. Perhaps it is possible to store the Symbol
instance (i.e. the VALUE pointer rather than the ID it maps to) the
same way? Im not sure how ID is defined, but I imagine it to be some
kind of integral value, so another option could be storing it as an
integer probably and converting that back on retrieval?

> Thanks,
> --
> kou

Vale,
Marvin
85991f138ede6236f35eb98da22b7b01?d=identicon&s=25 Marvin Gülker (quintus)
on 2013-02-24 09:38
(Received via mailing list)
Attachment: signature.asc (489 Bytes)
Am Sat, 23 Feb 2013 22:02:52 -0500
schrieb Mario Steele <mario@ruby-im.net>:

> Hello Quintus,

Hi Mario,

> This code will allow you to store symbols, and have them actually be
> returned as Symbols when fetching them.  Storage isn't an issue, as in
> order to store a Symbol in Gtk, it has to be converted to a String in
> the first place.

Thanks for your suggestion, I will use something like this for now. :-)

>
> hth,
>
> Mario

Vale,
Marvin
Please log in before posting. Registration is free and takes only a minute.
Existing account

NEW: Do you have a Google/GoogleMail, Yahoo or Facebook account? No registration required!
Log in with Google account | Log in with Yahoo account | Log in with Facebook account
No account? Register here.