2017-07-17 31 views
2

FileChooserDialogにファイルとフォルダの両方を選択させる方法はありますか?GTK FileChooserDialogファイルとフォルダを選択する(Vala)

私はFileChooserAction OPENとSELECT_FOLDERがあることを知っていますが、排他的です。

PD:私は2つのボタンが欲しくない、私はすでにこれを行う方法を知っています。私が望むのは、同じボタンを使って選択したすべての要素(ファイルとフォルダの両方)のルートを取得することです。

答えて

3

ファイル選択操作は、必要な操作とは異なります。私はあなたがset_select_multiple()メソッドまたはselect_multipleプロパティ(Gtk.FileChooserインターフェイスから継承)の後にいると思います。

次に、必要に応じてget_filenames()またはget_uris()の方法を使用できます。

デフォルトのGtkFileChooserDialogでは、最近の "タブ"を使用している場合にのみフォルダとファイルを選択できますが、通常のフォルダを使用するとすぐにそのフォルダとファイルを選択できます。

これを実現するには、ソリューションを作成するか、新しいウィジェットを作成することによってGtk.FileChooserWidgetを使用する必要があります(たとえば、Gtk.FileChooserWidgetまたはGtk.Dialogのサブクラス化)。

私はあなたが望むように機能し、必要に応じて簡単に変更できる簡単な例を作成しました。

次のコードはValadoc.org Gtkに基づいています。

public class Application : Gtk.Window { 
    public Application() { 
     // Prepare Gtk.Window: 
     this.window_position = Gtk.WindowPosition.CENTER; 
     this.destroy.connect (Gtk.main_quit); 

     // VBox: 
     Gtk.Box vbox = new Gtk.Box (Gtk.Orientation.VERTICAL, 5); 
     this.add (vbox); 

     // HeaderBar: 
     Gtk.HeaderBar hbar = new Gtk.HeaderBar(); 
     hbar.set_title ("MyFileChooser"); 
     hbar.set_subtitle ("Select Files and Folders"); 

     // HeaderBar Buttons 
     Gtk.Button cancel = new Gtk.Button.with_label ("Cancel"); 
     Gtk.Button select = new Gtk.Button.with_label ("Select"); 

     hbar.pack_start (cancel); 
     hbar.pack_end (select); 

     this.set_titlebar (hbar); 

     // Add a chooser: 
     Gtk.FileChooserWidget chooser = new Gtk.FileChooserWidget (Gtk.FileChooserAction.OPEN); 
     vbox.pack_start (chooser, true, true, 0); 

     // Multiple files can be selected: 
     chooser.select_multiple = true; 

     // Add a preview widget: 
     Gtk.Image preview_area = new Gtk.Image(); 
     chooser.set_preview_widget (preview_area); 
     chooser.update_preview.connect (() => { 
      string uri = chooser.get_preview_uri(); 
      // We only display local files: 
      if (uri.has_prefix ("file://") == true) { 
       try { 
        Gdk.Pixbuf pixbuf = new Gdk.Pixbuf.from_file (uri.substring (7)); 
        Gdk.Pixbuf scaled = pixbuf.scale_simple (150, 150, Gdk.InterpType.BILINEAR); 
        preview_area.set_from_pixbuf (scaled); 
        preview_area.show(); 
       } catch (Error e) { 
        preview_area.hide(); 
       } 
      } else { 
        preview_area.hide(); 
      } 
     }); 

     // HBox: 
     Gtk.Box hbox = new Gtk.Box (Gtk.Orientation.VERTICAL, 5); 
     vbox.pack_start(hbox, false, false, 0); 

     // Setup buttons callbacks 
     cancel.clicked.connect (() => { 
      this.destroy(); 
     }); 

     select.clicked.connect (() => { 
      SList<string> uris = chooser.get_uris(); 
      foreach (unowned string uri in uris) { 
       stdout.printf (" %s\n", uri); 
      } 
      this.destroy(); 
     }); 
    } 

    public static int main (string[] args) { 
     Gtk.init (ref args); 

     Application app = new Application(); 
     app.show_all(); 
     Gtk.main(); 
     return 0; 
    } 
} 

をしてコンパイルします:あなたが選択する選択した後、アプリケーションはコンソールにあなたの選択を印刷します

valac --pkg gtk+-3.0 Gtk.FileChooserDialog.vala

:あなたが求めているものを行いFileChooserWidgetページ、

widget

ダンプ(パスの一部が...に置き換えられました):

file:///.../stackoverflow/3305/1 
file:///.../stackoverflow/3305/2 
file:///.../stackoverflow/3305/3 
file:///.../stackoverflow/3305/Gtk.FileChooserDialog 
file:///.../stackoverflow/3305/Gtk.FileChooserDialog.vala 
file:///.../stackoverflow/3305/Gtk.FileChooserWidget 
file:///.../stackoverflow/3305/Gtk.FileChooserWidget.vala 
file:///.../stackoverflow/3305/img1.jpg 
file:///.../stackoverflow/3305/img2.jpg 
file:///.../stackoverflow/3305/img3.jpg 
file:///.../stackoverflow/3305/Makefile 
+0

この例ではダイアログ内で複数の要素を選択できますが、そのうちの1つがフォルダの場合は[開く]ボタンが機能しません。選択したすべての要素が通常のファイルである場合にのみ機能します。 – bcedu

+0

@bcedu私は試してみましたが、うまくいきましたが、もう一度チェックしましたが、失敗しました。最近のファイルにフォルダやファイルがある場合、それを行うことはできますが、通常のフォルダにあれば動作しません。あなたがそのフォルダに移動したいのか、ロジックのようなものを選択するのかをダイアログが確かめることはできないようだ。私はそれを調べます... –

+0

@bceduは私の編集をチェック...それは今okです –

関連する問題