summaryrefslogtreecommitdiff
path: root/src/Gtk/Widgets.icl
diff options
context:
space:
mode:
authorCamil Staps2019-10-21 22:25:25 +0200
committerCamil Staps2019-10-21 22:25:25 +0200
commitfa2213d9f555d5e9c6915ae4ba6ba78ce87c541d (patch)
tree8c3a95590d2a7e8ea5f7732bcf6a83b7161a0ecc /src/Gtk/Widgets.icl
parentRemove usage of import qualified as, which relies on the itask compiler (diff)
Add support for file choosers
Diffstat (limited to 'src/Gtk/Widgets.icl')
-rw-r--r--src/Gtk/Widgets.icl48
1 files changed, 43 insertions, 5 deletions
diff --git a/src/Gtk/Widgets.icl b/src/Gtk/Widgets.icl
index 117fa49..5c8f1e6 100644
--- a/src/Gtk/Widgets.icl
+++ b/src/Gtk/Widgets.icl
@@ -11,9 +11,8 @@ import Data.Tuple
import System.FilePath
import System._Pointer
+import Gtk
import Gtk.Internal
-import Gtk.State
-import Gtk.Types
:: GtkWidget :== Pointer
@@ -24,6 +23,12 @@ where
toPtr w = w
fromPtr w = w
+show :: !w -> GtkM w | gtkWidget w
+show widget = toState (gtk_widget_show (gtkWidget widget)) >>| pure widget
+
+destroy :: !w -> GtkM () | gtkWidget w
+destroy widget = toState (gtk_widget_destroy (gtkWidget widget))
+
addCSSClass :: !GtkCSSClass !w -> GtkM w | gtkWidget w
addCSSClass (Class cls) widget =
toStateR (gtk_widget_get_style_context (gtkWidget widget)) >>= \context ->
@@ -44,9 +49,6 @@ setMargins {left,top,right,bottom} widget` =
toState (gtk_widget_set_margin_bottom widget bottom) >>|
pure widget`
-show :: !w -> GtkM w | gtkWidget w
-show widget = toState (gtk_widget_show (gtkWidget widget)) >>| pure widget
-
:: GtkContainer :== Pointer
instance gtkWidget GtkContainer where gtkWidget c = c
@@ -62,6 +64,42 @@ addToContainer container widget =
toState (gtk_container_add (gtkContainer container) (gtkWidget widget)) >>|
pure widget
+:: GtkDialog :== Pointer
+
+instance gtkWidget GtkDialog where gtkWidget d = d
+instance gtkContainer GtkDialog where gtkContainer d = d
+instance gtkDialog GtkDialog where gtkDialog d = d
+
+instance ptr GtkDialog
+where
+ toPtr d = d
+ fromPtr d = d
+
+runDialog :: !d -> GtkM GtkResponse | gtkDialog d
+runDialog dialog = fromInt <$> toStateR (gtk_dialog_run (gtkDialog dialog))
+
+getFileWithDialog :: !GtkWindow !GtkFileChooserAction !(Maybe String) -> GtkM (Maybe FilePath)
+getFileWithDialog window action title =
+ toStateR (gtk_file_chooser_dialog_new title window (toInt action) buttons) >>= \dialog ->
+ toState (gtk_dialog_set_default_response dialog (toInt ResponseAccept)) >>|
+ run dialog
+where
+ buttons = map (\(s,r) -> (s,toInt r)) case action of
+ OpenAction -> [("Cancel", ResponseCancel), ("Open", ResponseAccept)]
+ SaveAction -> [("Cancel", ResponseCancel), ("Save", ResponseAccept)]
+ SelectFolderAction -> [("Cancel", ResponseCancel), ("Select", ResponseAccept)]
+ CreateFolderAction -> [("Cancel", ResponseCancel), ("Create", ResponseAccept)]
+
+ run dialog =
+ runDialog dialog >>= \response -> case response of
+ ResponseAccept ->
+ toStateR (gtk_file_chooser_get_filename dialog) >>= \file_name -> case file_name of
+ Just _ -> destroy dialog >>| pure file_name
+ Nothing -> run dialog
+ _ ->
+ destroy dialog >>|
+ pure Nothing
+
:: GtkBox :== Pointer
instance gtkWidget GtkBox where gtkWidget b = b