とみたです。

On Sun, 23 Jul 2000 15:49:06 +0900
MUTOH Masao <mutoh / highway.ne.jp> wrote:

> 本メーリングリストにメールを出すのは初めてです。
> 内容に不備があればご指摘ください。

ruby-ext の方がいいかも。ということで ruby-ext に送ります。

> FileSelectionでディレクトリを選択し、結果をテキストボックス
> 等に表示したい
> 
> と思ったのですが、FileSelectionでは(少なくともデフォルトでは)
> ファイル選択欄も表示されてしまいます。
> 
> 機能的には、その状態でディレクトリのみ選択すればget_filename
> でディレクトリを取得できるので良いと言えば良いのですが、
> ユーザの混乱を避けるために、できればディレクトリ選択欄のみを
> 表示(あるいは選択)させたいと思います。

Gtk::FileSelectoin が file_list を返すことができれば、それを hide
すればいいんですけど、今の Ruby/Gtk ではできないですね。

ということで rbgtkwindow.c を変更してみました。これを使えば、次の
ようにしてできます。

------------------------------------------------------------------
require 'gtk'

fs = Gtk::FileSelection.new("select directory")
fs.signal_connect(Gtk::Widget::SIGNAL_DESTROY_EVENT) do destroy end
fs.ok_button.signal_connect(Gtk::Button::SIGNAL_CLICKED) do    
    printf("filename = %s\n", fs.get_filename)
end
fs.show_all
fs.file_list.parent.hide

Gtk.main
------------------------------------------------------------------


--- rbgtkwindow.c.orig	Thu Jun 15 23:39:00 2000
+++ rbgtkwindow.c	Mon Jul 24 00:23:56 2000
@@ -329,6 +329,36 @@
 }
 
 static VALUE
+fsel_dir_list(self)
+    VALUE self;
+{
+    VALUE dir_list = rb_iv_get(self, "dir_list");
+
+    if (NIL_P(dir_list)) {
+	GtkWidget *w = GTK_FILE_SELECTION(get_widget(self))->dir_list;
+	dir_list = make_widget(gCList, w);
+	rb_iv_set(self, "dir_list", dir_list);
+    }
+
+    return dir_list;
+}
+
+static VALUE
+fsel_file_list(self)
+    VALUE self;
+{
+    VALUE file_list = rb_iv_get(self, "file_list");
+
+    if (NIL_P(file_list)) {
+	GtkWidget *w = GTK_FILE_SELECTION(get_widget(self))->file_list;
+	file_list = make_widget(gCList, w);
+	rb_iv_set(self, "file_list", file_list);
+    }
+
+    return file_list;
+}
+
+static VALUE
 fsel_show_fileop_buttons(self)
     VALUE self;
 {
@@ -355,6 +385,8 @@
     rb_define_method(gFileSel, "cancel_button", fsel_cancel_button, 0);
     rb_define_method(gFileSel, "help_button", fsel_help_button, 0);
     rb_define_method(gFileSel, "action_area", fsel_action_area, 0);
+    rb_define_method(gFileSel, "dir_list", fsel_dir_list, 0);
+    rb_define_method(gFileSel, "file_list", fsel_file_list, 0);
     rb_define_method(gFileSel, "show_fileop_buttons", fsel_show_fileop_buttons, 0);
     rb_define_method(gFileSel, "hide_fileop_buttons", fsel_hide_fileop_buttons, 0);
 }

---
とみたまさひろ <tommy / tmtm.org> http://www.tmtm.org
日本MySQLユーザ会 http://www.mysql.gr.jp