]> gitweb.factorcode.org Git - factor.git/commitdiff
file-picker: adding start of cross-platform file-picker.
authorJohn Benediktsson <mrjbq7@gmail.com>
Mon, 15 Dec 2014 23:16:41 +0000 (15:16 -0800)
committerJohn Benediktsson <mrjbq7@gmail.com>
Mon, 15 Dec 2014 23:16:41 +0000 (15:16 -0800)
extra/file-picker/file-picker.factor [new file with mode: 0644]
extra/file-picker/linux/linux.factor [new file with mode: 0644]
extra/file-picker/linux/platforms.txt [new file with mode: 0644]
extra/file-picker/macosx/macosx.factor [new file with mode: 0644]
extra/file-picker/macosx/platforms.txt [new file with mode: 0644]
extra/file-picker/windows/platforms.txt [new file with mode: 0644]
extra/file-picker/windows/windows.factor [new file with mode: 0644]

diff --git a/extra/file-picker/file-picker.factor b/extra/file-picker/file-picker.factor
new file mode 100644 (file)
index 0000000..d5bc6c4
--- /dev/null
@@ -0,0 +1,7 @@
+USING: accessors sequences system vocabs ;
+IN: file-picker
+
+HOOK: open-file-dialog os ( -- paths )
+HOOK: save-file-dialog os ( path -- paths )
+
+os name>> "file-picker." prepend require
diff --git a/extra/file-picker/linux/linux.factor b/extra/file-picker/linux/linux.factor
new file mode 100644 (file)
index 0000000..9ad1138
--- /dev/null
@@ -0,0 +1,56 @@
+USING: alien.c-types alien.data alien.strings alien.syntax
+destructors file-picker gobject-introspection.standard-types
+gtk.ffi io.encodings.string io.encodings.utf8 kernel system ;
+IN: file-picker.linux
+
+<PRIVATE
+
+LIBRARY: gtk
+
+FUNCTION: GtkWidget* gtk_file_chooser_dialog_new (
+    gchar* title,
+    GtkWindow* parent,
+    GtkFileChooserAction action,
+    gchar* first_button_text,
+    gint* first_button_response,
+    gchar* second_button_text,
+    gint* second_button_response,
+    void* sentinel ) ;
+
+: <gtk-file-chooser-dialog> ( title action -- dialog )
+    [
+        utf8 encode
+        f
+        GTK_FILE_CHOOSER_ACTION_OPEN
+        "Cancel" utf8 encode
+        GTK_RESPONSE_CANCEL int <ref>
+    ] [
+        utf8 encode
+        GTK_RESPONSE_ACCEPT int <ref>
+        f
+        gtk_file_chooser_dialog_new
+        &gtk_widget_destroy
+    ] bi* ;
+
+: run-and-get-filename ( dialog -- path/f )
+    dup gtk_dialog_run GTK_RESPONSE_ACCEPT = [
+        gtk_file_chooser_get_filename alien>native-string
+    ] [
+        drop f
+    ] if ;
+
+PRIVATE>
+
+M: linux open-file-dialog
+    [
+        "Open File" "Open" <gtk-file-chooser-dialog>
+        run-and-get-filename
+    ] with-destructors ;
+
+M: linux save-file-dialog
+    [
+        "Save File" "Save" <gtk-file-chooser-dialog>
+        dup t gtk_file_chooser_set_do_overwrite_confirmation
+        dup rot gtk_file_chooser_set_filename drop
+        run-and-get-filename
+    ] with-destructors ;
diff --git a/extra/file-picker/linux/platforms.txt b/extra/file-picker/linux/platforms.txt
new file mode 100644 (file)
index 0000000..a08e1f3
--- /dev/null
@@ -0,0 +1 @@
+linux
diff --git a/extra/file-picker/macosx/macosx.factor b/extra/file-picker/macosx/macosx.factor
new file mode 100644 (file)
index 0000000..490c908
--- /dev/null
@@ -0,0 +1,6 @@
+USING: cocoa.dialogs file-picker system ;
+IN: file-picker.macosx
+
+M: macosx open-file-dialog open-panel ;
+
+M: macosx save-file-dialog save-panel ;
diff --git a/extra/file-picker/macosx/platforms.txt b/extra/file-picker/macosx/platforms.txt
new file mode 100644 (file)
index 0000000..6e806f4
--- /dev/null
@@ -0,0 +1 @@
+macosx
diff --git a/extra/file-picker/windows/platforms.txt b/extra/file-picker/windows/platforms.txt
new file mode 100644 (file)
index 0000000..8e1a559
--- /dev/null
@@ -0,0 +1 @@
+windows
diff --git a/extra/file-picker/windows/windows.factor b/extra/file-picker/windows/windows.factor
new file mode 100644 (file)
index 0000000..d8a9dfa
--- /dev/null
@@ -0,0 +1 @@
+IN: file-picker.windows