2017-07-17 9 views
2

Gibt es eine Möglichkeit, den FileChooserDialog so einzurichten, dass er sowohl Dateien als auch Ordner auswählt?GTK FileChooserDialog Dateien auswählen UND Ordner (Vala)

Ich weiß, dass es die FileChooserAction OPEN und SELECT_FOLDER gibt, aber sie sind exklusiv.

PD: Ich will nicht zwei Tasten, ich weiß schon, wie das geht. Ich möchte die Routen aller ausgewählten Elemente (Dateien und Ordner) mit derselben Schaltfläche abrufen.

Antwort

3

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:

widget

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 
+0

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

+0

@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 ... –

+0

@bcedu check my edit ... es ist jetzt ok –

Verwandte Themen