有什麼辦法讓FileChooserDialog選擇文件和文件夾?GTK FileChooserDialog選擇文件和文件夾(Vala)
我知道有FileChooserAction OPEN和SELECT_FOLDER,但它們是獨佔的。
PD:我不想要兩個按鈕,我已經知道如何做到這一點。我想要的是使用相同的按鈕獲取所有選定元素(包括文件和文件夾)的路由。
有什麼辦法讓FileChooserDialog選擇文件和文件夾?GTK FileChooserDialog選擇文件和文件夾(Vala)
我知道有FileChooserAction OPEN和SELECT_FOLDER,但它們是獨佔的。
PD:我不想要兩個按鈕,我已經知道如何做到這一點。我想要的是使用相同的按鈕獲取所有選定元素(包括文件和文件夾)的路由。
文件選擇器操作與您想要的不同。我認爲你是在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
在您選擇選擇,應用程序將打印選擇到控制檯:
轉儲(部分路徑替換爲...
):
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
該示例允許我在對話框中選擇多個元素,但如果其中一個元素是文件夾,則「打開」按鈕不起作用。它只適用於所有選定的元素都是常規文件的情況。 – bcedu
@bcedu我試過了,它工作,但我再次檢查,它失敗了。如果在最近的文件中有文件夾和文件,您可以這樣做,但如果在普通文件夾中不起作用。似乎如果您想要導航到該文件夾或選擇它是哪種邏輯,對話框無法確定。我會研究它... –
@ bcedu檢查我的編輯...現在沒關係 –