Die Dateiauswahl-Aktion unterscheidet sich von dem, was Sie möchten. Ich denke, Sie sind nach der set_select_multiple()
Methode oder der select_multiple
Eigenschaft (beide geerbt von der Gtk.FileChooser-Schnittstelle). Sie können die Methoden get_filenames()
oder get_uris()
verwenden, je nach Ihren Anforderungen.
Der standardmäßige GtkFileChooserDialog erlaubt nur die Auswahl von Ordnern und Dateien, wenn Sie sich auf der Registerkarte "Zuletzt" befinden, aber sobald Sie einen normalen Ordner verwenden, können Sie dies nicht tun.
Um dies zu erreichen, müssen Sie Gtk.FileChooserWidget verwenden, indem Sie eine Lösung erstellen oder ein neues Widget erstellen (zB Unterklasse Gtk.FileChooserWidget oder Gtk.Dialog).
Ich habe ein einfaches Beispiel erstellt, das so funktioniert, wie Sie möchten und das Sie ganz einfach an Ihre Bedürfnisse anpassen können.
Der folgende Code basiert auf Valadoc.org Gtk. FileChooserWidget Seite, die tut, was Sie fragen:
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;
}
}
Compile mit:
valac --pkg gtk+-3.0 Gtk.FileChooserDialog.vala
Nachdem Sie wählen, wählen die Anwendung Ihre Auswahl an die Konsole gedruckt wird:
Dumps (Pfad teilweise ersetzt durch ...
):
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
In diesem Beispiel kann ich mehrere Elemente im Dialogfeld auswählen, aber wenn einer davon ein Ordner ist, funktioniert die Schaltfläche "Öffnen" nicht. Es funktioniert nur, wenn alle ausgewählten Elemente reguläre Dateien sind. – bcedu
@bcedu Ich habe es versucht und es hat funktioniert, aber ich ging wieder zu überprüfen, es ist fehlgeschlagen. Wenn Sie in den letzten Dateien Ordner und Dateien haben, können Sie dies tun, aber wenn es in einem normalen Ordner ist, funktioniert es nicht. Scheint, dass das Dialogfeld nicht sicher sein kann, wenn Sie zu diesem Ordner navigieren oder es auswählen möchten, das eine Art Logik ist. Ich werde mich darum kümmern ... –
@bcedu check my edit ... es ist jetzt ok –