From: Masahiro S. ()
<sa...@to...> - 2003-07-19 05:19:11
|
さかい%テストで失敗してさらに現実逃避に拍車が… です。 From: Masao Mutoh <mu...@hi...> Subject: Re: [ruby-gnome2-devel-ja] enum/flags のクラス化 Date: Sat, 19 Jul 2003 03:17:45 +0900 > むとうです。 > > 連絡遅れてすみません。ちと仕事で徹夜してました(^^;)。 お疲れ様です。 > On Thu, 17 Jul 2003 15:29:50 +0900 (JST) > Masahiro Sakai (酒井政裕) <sa...@to...> wrote: > > 現状をまとめると、 > > > > * 互換性にはそれなりに気を配ったので、 > > これまで動作した大抵のコードは動作しなくなったりはしないはず > > 互換性を残してというのは、今までのものはそのまま残して > 新たに定義したこちらと併用するというイメージでしょうか。 > 2つあると、ドキュメントが大変になりそうな気が....(T_T)。 これまでのものをそのまま残して……というよりは ユーザーのコードのことをあまり気にせずに、 こっそり徐々に移行していく事が出来るというイメージです。 > > > とりあえず、手元では以下のような事が出来るようになっています。 > > > > > > require 'gtk2' > > > Gtk::Window::Type = GLib::Type['GtkWindowType'].to_class > > > > > > p Gtk::Window::Type.values > > > #=> [#<Gtk::Window::Type value=0 name="GTK_WINDOW_TOPLEVEL" nick="toplevel">, > > > # #<Gtk::Window::Type value=1 name="GTK_WINDOW_POPUP" nick="popup">] > > > > > > p Gtk::Window::Type::TOPLEVEL > > > #=> #<Gtk::Window::Type value=0 name="GTK_WINDOW_TOPLEVEL" nick="toplevel"> > > これ、どういう風に使うのでしょうか。 > > Gtk::Window.new(Gtk::Window::Type::TOPLEVEL) > > と書くイメージでよろしいですか? はい。 また、 w = Gtk::Window.new w.get_property("type") 等としたときも、整数ではなくこのオブジェクトが返るようになります。 > この認識で良いとして、 > 技術的にはコーディングの作業を少なくしたりできそうですし、ユーザ的にも > 定数値の分類を、irb等から簡単に見つけることができるのが便利そうですね。 > > ただ、ちと定数値が長くなりすぎてるような気もしないでもないです。 > やはり、上記の場合は、 > Gtk::Window.new(Gtk::Window::TOPLEVEL) > がいっぱいいっぱいの長さじゃないでしょうか(あくまでも私の感覚ですが)。 同感です。 # 「::」を打つのって案外億劫なんですよね (^^; 自動的に定義される定数名は上記のとおりなんですが、 実際にユーザの使う定数名についてはこれから議論して、 これまで通りの名前をaliasとして用意しようと考えていました。 > 定数値は今までと変更無しの > Gtk::Window::TOPLEVEL > Gtk::Window::POPUP > > のような感じでアクセスできて、その実、以下のように変わってるってのは > どうでしょうか? > > p Gtk::Window::TOPLEVEL > #=> #<GtkWindowType value=0 name="GTK_WINDOW_TOPLEVEL" nick="toplevel"> > > この1番目のGtkWindowTypeの部分でソートできれば、見た目上もイイでしょうし。 この1番目の部分にクラス名以外のものが入っているのは、 ユーザーを混乱させませんか? > --- > コーディング上は、Cレベルでrb_define_constしてたところ辺りを > ざっくり削除して、 > > G_DEF_CONST("GtkWindowType"); > > とか書けたりしたら、それだけでもかなり便利になるような気がします。 > #ここでは自動化はしない方がRuby/GTKの好きなクラスにEnumsを配置できるので > #良いような気がします。 今調べてみたところ、PyGtkでは pyg_enum_add_constants(PyObject *module, GType enum_type, const gchar *strip_prefix) という関数を使って定数を定義しているようです。 これにならって、 rbg_enum_add_constants(GTYPE2CLASS(GTK_TYPE_WINDOW), GTK_TYPE_WINDOW_TYPE, "GTK_WINDOW_") のように書けるようにするのが良さそうな気がして来ました。 また、下でむとうさんが書いているように、共通部分を自動的に見付けるよう にして、"GTK_WINDOW_"を明示的に指定しないで済むようにするのも良いかも 知れません。 > あ、そうそう、一つ気になったのですが、上記例のTOPLEVELって、 > どのように抽出してるのでしょうか。その前のGtkWindowTypeから同じ部分を > 削除してます? > (イメージ) > GtkWindowType -> GTK_WINDOW_TYPE -> GTK_WINDOW_まで同じ > だから削除 以下のような構造体でglibから情報を引き出せるので、 value_nickをupcaseしたものを使ってます。 struct _GEnumClass { GTypeClass g_type_class; gint minimum; gint maximum; guint n_values; GEnumValue *values; }; struct _GEnumValue { gint value; gchar *value_name; gchar *value_nick; }; -- 酒井 政裕 / Masahiro Sakai |