From 5756df53b06d35707d2af742f71cb81a40c4a032 Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Thu, 24 Oct 2019 10:21:16 +0200 Subject: Add setMarkup for GtkTextBuffer --- src/Gtk/Internal.dcl | 4 ++++ src/Gtk/Internal.icl | 47 +++++++++++++++++++++++++++++++++++++++++++++++ src/Gtk/Widgets.dcl | 5 +++-- src/Gtk/Widgets.icl | 23 ++++++++++++++++++----- 4 files changed, 72 insertions(+), 7 deletions(-) diff --git a/src/Gtk/Internal.dcl b/src/Gtk/Internal.dcl index 94c9bc1..8ffe98e 100644 --- a/src/Gtk/Internal.dcl +++ b/src/Gtk/Internal.dcl @@ -67,7 +67,11 @@ gtk_style_context_add_provider :: !Pointer !Pointer !Int !.a -> .a gtk_style_context_add_provider_for_screen :: !Pointer !Pointer !Int !.a -> .a gtk_style_context_remove_class :: !Pointer !String !.a -> .a +gtk_text_buffer_delete :: !Pointer !{#Int} !{#Int} !.a -> .a +gtk_text_buffer_get_start_iter :: !Pointer !.a -> (!{#Int}, !.a) +gtk_text_buffer_get_end_iter :: !Pointer !.a -> (!{#Int}, !.a) gtk_text_buffer_insert_at_cursor :: !Pointer !String !Int !.a -> .a +gtk_text_buffer_insert_markup :: !Pointer !{#Int} !String !.a -> .a gtk_text_buffer_set_text :: !Pointer !String !Int !.a -> .a gtk_text_view_new :: !.a -> (!Pointer, !.a) diff --git a/src/Gtk/Internal.icl b/src/Gtk/Internal.icl index a4a503f..dab7f62 100644 --- a/src/Gtk/Internal.icl +++ b/src/Gtk/Internal.icl @@ -292,11 +292,49 @@ where ccall gtk_style_context_remove_class "ps:V:A" } +gtk_text_buffer_delete :: !Pointer !{#Int} !{#Int} !.a -> .a +gtk_text_buffer_delete buffer start end env = + delete buffer (get_array_pointer start) (get_array_pointer end) env +where + delete :: !Pointer !Pointer !Pointer !.a -> .a + delete _ _ _ _ = code { + ccall gtk_text_buffer_delete "ppp:V:A" + } + +gtk_text_buffer_get_start_iter :: !Pointer !.a -> (!{#Int}, !.a) +gtk_text_buffer_get_start_iter buffer env + # iter = createArray (IF_INT_64_OR_32 10 14) 0 /* large enough to hold GtkTextIter */ + = (iter, get buffer (get_array_pointer iter) env) +where + get :: !Pointer !Pointer !.a -> .a + get _ _ _ = code { + ccall gtk_text_buffer_get_start_iter "pp:V:A" + } + +gtk_text_buffer_get_end_iter :: !Pointer !.a -> (!{#Int}, !.a) +gtk_text_buffer_get_end_iter buffer env + # iter = createArray (IF_INT_64_OR_32 10 14) 0 /* large enough to hold GtkTextIter */ + = (iter, get buffer (get_array_pointer iter) env) +where + get :: !Pointer !Pointer !.a -> .a + get _ _ _ = code { + ccall gtk_text_buffer_get_end_iter "pp:V:A" + } + gtk_text_buffer_insert_at_cursor :: !Pointer !String !Int !.a -> .a gtk_text_buffer_insert_at_cursor buffer string len env = code { ccall gtk_text_buffer_insert_at_cursor "psI:V:A" } +gtk_text_buffer_insert_markup :: !Pointer !{#Int} !String !.a -> .a +gtk_text_buffer_insert_markup buffer iter string env = + insert buffer (get_array_pointer iter) (packString string) (size string) env +where + insert :: !Pointer !Int !String !Int !.a -> .a + insert _ _ _ _ _ = code { + ccall gtk_text_buffer_insert_markup "pIsI:V:A" + } + gtk_text_buffer_set_text :: !Pointer !String !Int !.a -> .a gtk_text_buffer_set_text buffer string len env = code { ccall gtk_text_buffer_set_text "psI:V:A" @@ -384,3 +422,12 @@ gtk_window_set_transient_for :: !Pointer !Pointer !.a -> .a gtk_window_set_transient_for window parent env = code { ccall gtk_window_set_transient_for "pp:V:A" } + +get_array_pointer :: !{#Int} -> Pointer +get_array_pointer arr = get arr + IF_INT_64_OR_32 24 12 +where + get :: !{#Int} -> Pointer + get _ = code { + push_a_b 0 + pop_a 1 + } diff --git a/src/Gtk/Widgets.dcl b/src/Gtk/Widgets.dcl index bfed0c6..1140c75 100644 --- a/src/Gtk/Widgets.dcl +++ b/src/Gtk/Widgets.dcl @@ -106,8 +106,9 @@ stopSpinner :: !GtkSpinner -> GtkM GtkSpinner :: GtkTextBuffer -insertAtCursor :: !String !GtkTextBuffer -> GtkM () -setText :: !String !GtkTextBuffer -> GtkM () +setText :: !String !GtkTextBuffer -> GtkM GtkTextBuffer +setMarkup :: !String !GtkTextBuffer -> GtkM GtkTextBuffer +insertAtCursor :: !String !GtkTextBuffer -> GtkM GtkTextBuffer :: GtkTextView instance gtkWidget GtkTextView diff --git a/src/Gtk/Widgets.icl b/src/Gtk/Widgets.icl index adb655e..b7e4798 100644 --- a/src/Gtk/Widgets.icl +++ b/src/Gtk/Widgets.icl @@ -200,11 +200,24 @@ stopSpinner spinner = toState (gtk_spinner_stop spinner) >>| pure spinner :: GtkTextBuffer :== Pointer -insertAtCursor :: !String !GtkTextBuffer -> GtkM () -insertAtCursor s buffer = toState (gtk_text_buffer_insert_at_cursor buffer s (size s)) - -setText :: !String !GtkTextBuffer -> GtkM () -setText s buffer = toState (gtk_text_buffer_set_text buffer s (size s)) +setText :: !String !GtkTextBuffer -> GtkM GtkTextBuffer +setText s buffer = + toState (gtk_text_buffer_set_text buffer s (size s)) >>| + pure buffer + +setMarkup :: !String !GtkTextBuffer -> GtkM GtkTextBuffer +setMarkup s buffer = + toStateR (gtk_text_buffer_get_start_iter buffer) >>= \start -> + toStateR (gtk_text_buffer_get_end_iter buffer) >>= \end -> + toState (gtk_text_buffer_delete buffer start end) >>| + toStateR (gtk_text_buffer_get_start_iter buffer) >>= \start -> + toState (gtk_text_buffer_insert_markup buffer start s) >>| + pure buffer + +insertAtCursor :: !String !GtkTextBuffer -> GtkM GtkTextBuffer +insertAtCursor s buffer = + toState (gtk_text_buffer_insert_at_cursor buffer s (size s)) >>| + pure buffer :: GtkTextView :== Pointer -- cgit v1.2.3