2017-07-17 48 views
2

有什麼辦法讓FileChooserDialog選擇文件和文件夾?GTK FileChooserDialog選擇文件和文件夾(Vala)

我知道有FileChooserAction OPEN和SELECT_FOLDER,但它們是獨佔的。

PD:我不想要兩個按鈕,我已經知道如何做到這一點。我想要的是使用相同的按鈕獲取所有選定元素(包括文件和文件夾)的路由。

回答

3

文件選擇器操作與您想要的不同。我認爲你是在set_select_multiple()方法或select_multiple屬性(都從Gtk.FileChooser接口繼承)之後。

然後,您可以使用方法get_filenames()get_uris(),這取決於您的需要。

默認的GtkFileChooserDialog只允許你選擇文件夾和文件,如果你在最近的「選項卡」,但一旦你使用一個普通的文件夾,它不會讓你這樣做。

爲了達到這個目的,您必須使用Gtk.FileChooserWidget來創建一個解決方案或創建一個新的窗口小部件(例如Gtk.FileChooserWidget或Gtk.Dialog的子類)。

我已經創建了一個簡單的例子,可以根據需要進行工作,並且可以輕鬆更改以滿足您的需求。

以下代碼基於Valadoc.org Gtk。 FileChooserWidget頁面,這確實你問:

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

在您選擇選擇,應用程序將打印選擇到控制檯:

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

該示例允許我在對話框中選擇多個元素,但如果其中一個元素是文件夾,則「打開」按鈕不起作用。它只適用於所有選定的元素都是常規文件的情況。 – bcedu

+0

@bcedu我試過了,它工作,但我再次檢查,它失敗了。如果在最近的文件中有文件夾和文件,您可以這樣做,但如果在普通文件夾中不起作用。似乎如果您想要導航到該文件夾​​或選擇它是哪種邏輯,對話框無法確定。我會研究它... –

+0

@ bcedu檢查我的編輯...現在沒關係 –